スーパーの焼き芋製造機近くで鳴っている音楽を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目が鳴らない件は、かなり調べたのですが、あまり解決策が頭に浮かびません。
以上、よろしくお願い致します。
関連記事
-
-
シャロム エンディング前
お疲れ様です。高橋です。 またシャロムを耳コピしました。元の世界に戻った直後の曲 …
-
-
グラディウスのメドレーをArduino+YMZ294で演奏してみた。
お疲れ様です。高橋です。 Arduino+YMZ294で、グラディウスの空中戦の …
-
-
グラディウスの音楽をArduinoとYMZ294で3和音で鳴らしてみた。
お疲れ様です。高橋です。 先日、「スーパーの焼き芋製造機近くで鳴っている音楽をA …
-
-
久しぶりに耳コピ。FF4バトルテーマ。
お疲れ様です。高橋です。 とても久しぶりに耳コピしました。ファイナルファンタジー …
-
-
グラディウス モーニングミュージックをArduino+YMZ294用に耳コピしてみた。
お疲れ様です。高橋です。 アーケード版グラディウスの磁気バブルメモリが暖まるまで …
-
-
Pro Mini互換機でFF2戦闘音楽を使ったYMZ動作試験
お疲れ様です。高橋です。 電子オルゴールの最終形をイメージしてブレッドボード上で …
-
-
シャロム オープニング
お疲れ様です。高橋です。 もう30年以上昔、MSX2を持っていた私 …
-
-
Arduino+YMZでドラクエ2の「Lovesong探して」を鳴らしてみた。
お疲れ様です。高橋です。 先日作った「DQ2 – Lovesong探して」for …
-
-
ファイナルファンタジー2 戦闘テーマ1
お疲れ様です。高橋です。 最近耳コピしてなかったので、耳コピしました。 3和音し …
-
-
異邦人・改 for Arduino+YMZ294
お疲れ様です。高橋です。 先日耳コピした異邦人、なんとなくYMZ294に合わない …



