curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

「FF5/ビッグブリッヂの死闘」をArduino+YMZ294で鳴らしてみた。

 

お疲れ様です。高橋です。

先日「YMZ294で鳴らすためのビッグブリッヂの死闘を作ってみた。」で作った3和音版のビッグブリッヂの死闘をArduinoで鳴らすことが出来ました。

動画で確認した後に、閃きました。動画はiPhoneで撮影してますが、手動デクレッシェンド出来るじゃないか!しかも手動パンも出来る。三次元録音の夜明けに今気づいてしまいましたが、今から追加録画するのは奥さんの機嫌の都合上不可能なので、後日。

アンプを作るための部品を買う

先日の課題であった「音が小さい」問題を解決すべく、アンプに必要な部品を秋葉原の秋月電子で買ってきました。

bri01

今日の秋月電子は2015年の初売出しという事もあり、とても混んでいた感じです。加えて「お楽しみ袋」という3,000円する袋の中にギッシリと部品が入っている物が売っており、あっという間に売り切れていた模様です。私は3,000円分の元をとれる自信が全く無いので、見学だけしてスルーしました。

肝心のアンプ回路に必要な部品は

  • 電解コンデンサ 220μF 1個40円
  • フィルムコンデンサ 0.04μF 10個 100円 (必要なのは1本)
  • 抵抗 10Ω 100本 100円 (必要なのは1本。残りの99本は無駄な抵抗)
  • オペアンプ LM386互換 NHM386BD 1個50円
  • 可変抵抗器 10kΩ 1個40円
  • 可変抵抗器 つまみ 1個20円
  • みの虫クリップ 10本350円
  • ステレオジャック 1個60円

で、合計760円の出費となります。

アンプを組み込む

アンプを組み込む前の回路図がこれです。

ar01

 

そして、アンプとボリューム調整用の可変抵抗器を組み込んだのがこちらです。

bri03

LM386への入力側

LM386はこの絵だと右上から反時計回りに1~8となります。

YMZ294の5番から可変抵抗器の+側に線を伸ばし、-側をGNDに流します。そして、真ん中をLM386の3番の入力に挿します。

電源は6番に挿します。

LM386からの出力側

電解コンデンサの絵が220μFのやつで、アノード側をLM386の5番に挿し、カソード側をスピーカー側に挿します。上の絵だとセラミックコンデンサになってますが、本当はあれはフィルムコンデンサ0.047μFです。これは極性が無いっぽいので、適当にLM386の5番に挿し、反対側に10Ωの抵抗を挟んでGNDに流します。

2番と4番は、そのままGNDに流します。

組込み後のお姿

bri02

ジャンパー線同士が派手な空中戦をしています。抵抗やコンデンサの横をかいくぐり、ピンを挿すのはピンセットじゃないと難しいレベルになってきました。

今回初めてみの虫クリップを買ったのですが、これはとても便利でした。スピーカー無くてもイヤフォンをそのまま挟むだけで音の確認が出来ます。

ステレオジャックを買ったのですが、いらなかったじゃん。。

SMFをYMZ用のコードに変換

ビッグブリッヂの死闘は非常に長い曲なので、普通にシーケンシャルにSMFを作っても、YMZ用のコードに変換後にArduinoの容量制限でコンパイルエラーとなります。

bri04

(先日、上限は32,768バイトと書きましたが、正しくは32,256バイトでした。)

そのため、曲を打ち込んでいる最中、区切りの良い所でマークを打っておきます。

赤く囲っているヤツです。

bri05

SMFを、「SMFからYMZ用C言語に変換する素敵ツール」に流し込むと、上でマークしていたオクターブ7のBが、下のようにチャンネルBの107として出力されます。

bri06

出力されたコードを、マーク毎にメソッド分解します。

そして、コンパイルサイズを圧縮するべく、重複している中身を持つメソッドを使わず、代替可能なメソッドを呼ぶようにします。

void setup() {
  DDRD = 0b11111111;
  pinMode(WRCS_PIN, OUTPUT);
  pinMode(A0_PIN, OUTPUT);
  pinMode(RESET_PIN, OUTPUT);
  ymz.Reset(); 
  ymz.SetMixer(0b111, 0b000);
  ymz.SetVolume(CH_A, 0b00001111);
  ymz.SetFreqBit(CH_A, 0);
  ymz.SetVolume(CH_B, 0b00001111);
  ymz.SetFreqBit(CH_B, 0);
  ymz.SetVolume(CH_C, 0b00001111);
  ymz.SetFreqBit(CH_C, 0);

  playBridge_single();
}

void loop() {
  playBridge_loop();
}

void playBridge_single() {
  play_0101_0604();
  play_0701_0904();
  play_1001_1204();
  play_1802_2002();
  play_0701_0904();
  play_1802_2002();
  play_2003_2101();
  play_2102_2301();
  play_2302_2501();
  play_2502_2801();
  play_2802_2901();
  play_2502_2801();
  play_3202_3301();
  play_3302_5301();
  play_5302_5501();
  play_5502_5701();
  play_5702_5901();
  play_5702_5901();
  play_5302_5501();
}
void playBridge_loop() {
  play_5302_5501();
  play_2502_2801();
  play_2802_2901();
  play_2502_2801();
  play_3202_3301();
  play_3302_5301();
  play_5302_5501();
  play_5502_5701();
  play_5702_5901();
  
}

実機で確認

実機に流して確認したのが、ページ上部の動画です。オペアンプはきちんと仕事をこなし、音量が大きくなりました。

また、LM386の1番と8番を連結させ、途中に10μFを入れてやるとさらに音量が10倍になるのですが、音割れが酷くなり、可変抵抗器での調整に時間が掛かったで、やめました。

低音がノイズだらけです。極端に短い音符を流すとノイズになるのか?原因がわかりません。

ですが、何はともあれ3和音でArduinoの上限一杯まで曲を鳴らすことが出来たので、大満足です。

ボチボチAndroidアプリの開発に戻ります

 

以上、よろしくお願い致します。

 - 耳コピArduino

  関連記事

久しぶりに耳コピ。FF4バトルテーマ。

お疲れ様です。高橋です。 とても久しぶりに耳コピしました。ファイナルファンタジー …

スーパーの焼き芋製造機近くで鳴っている音楽をArduinoとYMZ294で鳴らしてみた。

お疲れ様です。高橋です。 先日ArduinoでPSG音源 YMZ294を使って単 …

FF3のオープニングをArduino+YMZシールドで鳴らしてみた

お疲れ様です。高橋です。 ファイナルファンタジー3のオープニング曲を耳コピし、こ …

異邦人/久保田早紀 for Arduino+YMZ294

お疲れ様です。高橋です。 毎日プログラム書くのは疲れるので、今日は耳コピの日です …

異邦人をArduino+YMZ294で演奏させてみた

お疲れ様です。高橋です。 Arduino+YMZ294で、久保田早紀の異邦人(1 …

音階に合わせてLEDを光らせてみた。

お疲れ様です。高橋です。 主旋律に合わせてLEDを光らせてみる実験を行いました。 …

Arduino+YMZでドラクエ2の「Lovesong探して」を鳴らしてみた。

お疲れ様です。高橋です。 先日作った「DQ2 – Lovesong探して」for …

Pro Mini互換機でFF2戦闘音楽を使ったYMZ動作試験

お疲れ様です。高橋です。 電子オルゴールの最終形をイメージしてブレッドボード上で …

Perfume「未来のミュージアム」をYMZオルゴール用に耳コピ

お疲れ様です。高橋です。 電子オルゴールに投入するための楽曲として、Perfum …

シャロム 名前入力画面

お疲れ様です。高橋です。 前回に引き続き、シャロムを耳コピ。 今回は16小節の2 …