curious4dev

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

*

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

 

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

先日ArduinoでPSG音源 YMZ294を使って単音をピロピロと鳴らしましたが、今日は和音にチャレンジです。

和音を出すためにやる事

Arduino+YMZ294で周波数を使った音を鳴らすためには、

  1. Ch1に周波数440Hzをセット
  2. 1秒待つ
  3. Ch1に周波数0Hzをセット

とする事によって、周波数440Hz(ラ)が1秒出てきます。

和音、例えばドミソを1秒鳴らす場合は、

  1. Ch1に周波数330Hz(ド)をセット
  2. Ch2に周波数370Hz(ミ)をセット
  3. Ch3に周波数392Hz(ソ)をセット
  4. 1秒待つ
  5. Ch1に周波数0Hzをセット
  6. Ch2に周波数0Hzをセット
  7. Ch3に周波数0Hzをセット

って感じです。

非常にかったるい。

楽をするために

MIDIシーケンサーのピアノロールでスラスラ書いた後に、MIDIファイルをYMZで読ませられるようなコードが吐き出てくればいいのに、と思いながら「MIDI YMZ294」というキーワードでググると、ありました。

Tanukino328でYMZ294のテスト演奏」というサイトで同じような事に悩んでおり、解決策も書いてありました。「kalshagar」というサイトで、そのものズバリの「MIDIを読み込んで、Arduino+YMZ294用のソースコードを吐き出すツール」が公開されていました。詳細は上記サイトをご確認下さい。素晴らしいツールです。

手順をまとめると、

まずは、シーケンサーで楽曲を3和音(3トラック)で作成します。

waon01

んで、SMF(or MIDI)ファイルをexportし、上述したkalshagarさんの素敵なアプリで読み込みます。FileメニューでMIDIファイルを選択し、「Start」ボタンを押し、演奏が終わったら「Stop」です。すると画面下部にコードが生成されますので、Vampirization menuでコピーします。

waon02

最後に、Arduino側に生成したコードを貼り付ければokです。

waon03

自動生成されたコードは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

  関連記事

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

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

久々に耳コピ。FF4バトル2

お疲れ様です。高橋です。 超ひさしぶりに耳コピしました。 FF4のバトルテーマ2 …

グラディウス2の3面 古代惑星のテーマをArduino+YMZ294で鳴らしてみた。

お疲れ様です。高橋です。 グラディウス2の3面、古代惑星のテーマをArduino …

グラディウスの音楽をArduinoとYMZ294で3和音で鳴らしてみた。

お疲れ様です。高橋です。 先日、「スーパーの焼き芋製造機近くで鳴っている音楽をA …

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

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

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

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

YMZ294で鳴らすためのビッグブリッヂの死闘を作ってみた。

お疲れ様です。高橋です。 Arduino+YMZ294で鳴らすため、「ビッグブリ …

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

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

異邦人・改 for Arduino+YMZ294

お疲れ様です。高橋です。 先日耳コピした異邦人、なんとなくYMZ294に合わない …

グラディウス モーニングミュージックをArduino+YMZ294用に耳コピしてみた。

お疲れ様です。高橋です。 アーケード版グラディウスの磁気バブルメモリが暖まるまで …