スーパーの焼き芋製造機近くで鳴っている音楽をArduinoとYMZ294で鳴らしてみた。
お疲れ様です。高橋です。
先日ArduinoでPSG音源 YMZ294を使って単音をピロピロと鳴らしましたが、今日は和音にチャレンジです。
和音を出すためにやる事
Arduino+YMZ294で周波数を使った音を鳴らすためには、
- Ch1に周波数440Hzをセット
- 1秒待つ
- Ch1に周波数0Hzをセット
とする事によって、周波数440Hz(ラ)が1秒出てきます。
和音、例えばドミソを1秒鳴らす場合は、
- Ch1に周波数330Hz(ド)をセット
- Ch2に周波数370Hz(ミ)をセット
- Ch3に周波数392Hz(ソ)をセット
- 1秒待つ
- Ch1に周波数0Hzをセット
- Ch2に周波数0Hzをセット
- Ch3に周波数0Hzをセット
って感じです。
非常にかったるい。
楽をするために
MIDIシーケンサーのピアノロールでスラスラ書いた後に、MIDIファイルをYMZで読ませられるようなコードが吐き出てくればいいのに、と思いながら「MIDI YMZ294」というキーワードでググると、ありました。
「Tanukino328でYMZ294のテスト演奏」というサイトで同じような事に悩んでおり、解決策も書いてありました。「kalshagar」というサイトで、そのものズバリの「MIDIを読み込んで、Arduino+YMZ294用のソースコードを吐き出すツール」が公開されていました。詳細は上記サイトをご確認下さい。素晴らしいツールです。
手順をまとめると、
まずは、シーケンサーで楽曲を3和音(3トラック)で作成します。
んで、SMF(or MIDI)ファイルをexportし、上述したkalshagarさんの素敵なアプリで読み込みます。FileメニューでMIDIファイルを選択し、「Start」ボタンを押し、演奏が終わったら「Stop」です。すると画面下部にコードが生成されますので、Vampirization menuでコピーします。
最後に、Arduino側に生成したコードを貼り付ければokです。
自動生成されたコードはset_ch(ADDR_FREQ_A, 81);というメソッドで周波数とチャンネル指定を行っていますので、これのラッパー関数を作ります。(正確には周波数ではなくて、後述する、周波数が格納された配列へのindex(添え字))
void set_ch(Channel ch, int note) { ymz.SetFrequency(ch, noteFreq[note]); }
このnoteFreq[note]という配列は、先日のYMZ294ライブラリのYMZ294.hの中にconstで定義されている周波数の配列です。
const int noteFreq[]={ 0,9,9,10,10,11,12,12,13,14,15,15, 16,17,18,19,21,22,23,25,26,28,29,31, 33,35,37,39,41,44,46,49,52,55,58,62, 65,69,73,78,82,87,93,98,104,110,117,124, 131,139,147,156,165,175,185,196,208,220,233,247, 262,277,294,311,330,349,370,392,415,440,466,494, 523,554,587,622,659,699,740,784,831,880,932,988, 1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976, 2093,2218,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951, 4186,4435,4699,4978,5274,5587,5920,6272,6645,7040,7459,7902, 8372,8870,9397,9956,10548,11175,11840,12544 };
で、もろもろ準備終わって、コンパイル&マイコンへの書き込みを行った結果が、下記となります。
和音が鳴るのですが、3チャンネル目だけがどうしても鳴りません。あと、同じ音程の音を2つ連続で鳴らすと、くっついてしまいます。
くっつく問題はなんとなく対処方法が分かる(周波数0を音の終わりに毎回仕込む。そのためのラッパー関数を作ればOK)んですが、3ch目が鳴らない件は、かなり調べたのですが、あまり解決策が頭に浮かびません。
以上、よろしくお願い致します。
関連記事
-
-
異邦人・改 for Arduino+YMZ294
お疲れ様です。高橋です。 先日耳コピした異邦人、なんとなくYMZ294に合わない …
-
-
異邦人をArduino+YMZ294で演奏させてみた
お疲れ様です。高橋です。 Arduino+YMZ294で、久保田早紀の異邦人(1 …
-
-
ファイナルファンタジー2 戦闘テーマ1
お疲れ様です。高橋です。 最近耳コピしてなかったので、耳コピしました。 3和音し …
-
-
YMZ294で鳴らすためのビッグブリッヂの死闘を作ってみた。
お疲れ様です。高橋です。 Arduino+YMZ294で鳴らすため、「ビッグブリ …
-
-
久々に耳コピ。FF4バトル2
お疲れ様です。高橋です。 超ひさしぶりに耳コピしました。 FF4のバトルテーマ2 …
-
-
Pro Mini互換機でFF2戦闘音楽を使ったYMZ動作試験
お疲れ様です。高橋です。 電子オルゴールの最終形をイメージしてブレッドボード上で …
-
-
シャロム エンディング前
お疲れ様です。高橋です。 またシャロムを耳コピしました。元の世界に戻った直後の曲 …
-
-
「FF5/ビッグブリッヂの死闘」をArduino+YMZ294で鳴らしてみた。
お疲れ様です。高橋です。 先日「YMZ294で鳴らすためのビッグブリッヂの死闘を …
-
-
【完全版】グラディウスメドレー by Arduino+YMZ294
お疲れ様です。高橋です。 前に作ったグラディウスメドレーを増強したものを作りまし …
-
-
音階に合わせてLEDを光らせてみた。
お疲れ様です。高橋です。 主旋律に合わせてLEDを光らせてみる実験を行いました。 …