グラディウス2の3面 古代惑星のテーマをArduino+YMZ294で鳴らしてみた。
お疲れ様です。高橋です。
グラディウス2の3面、古代惑星のテーマをArduino+YMZ294で鳴らしてみました。
前に買ったスピーカーを2つ増設し、合計3スピーカー。そしてテンポを可変抵抗器で変えられるように少し回路をいじりました。右側の可変抵抗器がテンポ変更用です。スピーカーを増設した事は特に理由はありません。カッコ良さそうだったからやってみました。
(2015/02/04追記) 上記回路図は間違っています。YMZの4番と8番からは、GNDではなく、5Vに流れます。
テンポを変えるには
SMFをYMZ用C言語に変換する際は、kalshagarさんのサイトで公開しているツールを使いますが、下記のような感じに変換されます。
set_ch(ADDR_FREQ_A,79); set_ch(ADDR_FREQ_B,72); set_ch(ADDR_FREQ_C,48); delay(232); set_ch(ADDR_FREQ_A,0); set_ch(ADDR_FREQ_A,67); set_ch(ADDR_FREQ_B,0); set_ch(ADDR_FREQ_C,0); set_ch(ADDR_FREQ_C,55); delay(249);
set_chというメソッドにチャンネルと音程を渡して、音の長さ分delayするという物です。set_chというメソッドを実装する必要があるのと、delayでセットした長さは、意図したテンポにならないため、下記のように改造します。
まずは、set_chメソッドを実装します。中でYMZライブラリの周波数指定メソッドを呼ぶ形にします。
void set_ch(Channel ch, int note) { ymz.SetFrequency(ch, noteFreq[note]); }
そして、 delay部分はuser_delayという感じにArduino側のメソッドを使うのではなく、一度ラップメソッドを呼ぶように修正し、
set_ch(ADDR_FREQ_A,79); set_ch(ADDR_FREQ_B,72); set_ch(ADDR_FREQ_C,48); user_delay(232); set_ch(ADDR_FREQ_A,0); set_ch(ADDR_FREQ_A,67); set_ch(ADDR_FREQ_B,0); set_ch(ADDR_FREQ_C,0); set_ch(ADDR_FREQ_C,55); user_delay(249);
user_delayメソッドを実装します。Arduino側のdelayメソッドはミリ秒指定ですので、これを単純に早くするには割り算すれば良いので、お好みの早さになるように調整します。
void user_delay(int time) { delay(time / 1.8); }
ですが、毎回テンポの調整の都度コンパイル&書き込みするのは面倒。
テンポを可変抵抗器で変更出来るようにする
テンポを変えるには、アナログの何番かで可変抵抗器の値を受け付けて、それを割り算の分子にすれば良いので、下記のように修正します。下記の場合、kalshagarさんのツールが出力したテンポの0.7倍~7倍のテンポ変化が可能となります。
void user_delay(int time) { float input_delay = (float)map(analogRead(A2),0,1023,70,700)/100.0; // delay(time / 1.8); delay(time / input_delay); }
(2015/01/13追記)
スケッチを公開します。
上記スケッチ内で読み込んでいるYMZ294.hは、wp.hrmux.comさんで公開しているYMZ294用ライブラリをArduinoIDEでライブラリ読み込んで下さい。
今のスケッチのままですと音がなっても自然に音が減衰していきませんが、エンベロープを設定すると音が低くなっていきます。YMZ294を買った時についてきたデータシートを見てみると、
こんな感じです。で、wp.hrmux.comさんで公開しているYMZ294用ライブラリにはSetEnvEnableと、SetEnvShapeというメソッドが用意されています。
SetEnvEnableでエンベロープを適用するチャンネルを設定し、SetEnvShapeでどの形にするかを決定します。つまり、こんな感じです。
ymz.SetMixer(CH_A, true); ymz.SetMixer(CH_B, true); ymz.SetMixer(CH_C, true); ymz.SetEnvShape(1, 1, 1, 1);
これで、チャンネルA, B, CをエンベロープONにして、上記データシートの一番下の1, 1, 1, 1の波形にする感じです。
一度試したんですが他の事をやっている間に消してしまいましたが、確かコレで動いたと思います。
以上、よろしくお願い致します。
関連記事
-
-
シャロム グリーク城
お疲れ様です。高橋です。 シャロムから、グリーク城の楽曲です。 名曲で、opの次 …
-
-
グラディウスのメドレーをArduino+YMZ294で演奏してみた。
お疲れ様です。高橋です。 Arduino+YMZ294で、グラディウスの空中戦の …
-
-
異邦人・改 for Arduino+YMZ294
お疲れ様です。高橋です。 先日耳コピした異邦人、なんとなくYMZ294に合わない …
-
-
異邦人をArduino+YMZ294で演奏させてみた
お疲れ様です。高橋です。 Arduino+YMZ294で、久保田早紀の異邦人(1 …
-
-
異邦人/久保田早紀 for Arduino+YMZ294
お疲れ様です。高橋です。 毎日プログラム書くのは疲れるので、今日は耳コピの日です …
-
-
ファイナルファンタジー2 戦闘テーマ1
お疲れ様です。高橋です。 最近耳コピしてなかったので、耳コピしました。 3和音し …
-
-
グラディウス モーニングミュージックをArduino+YMZ294用に耳コピしてみた。
お疲れ様です。高橋です。 アーケード版グラディウスの磁気バブルメモリが暖まるまで …
-
-
シャロム 名前入力画面
お疲れ様です。高橋です。 前回に引き続き、シャロムを耳コピ。 今回は16小節の2 …
-
-
Arduino+YMZでドラクエ2の「Lovesong探して」を鳴らしてみた。
お疲れ様です。高橋です。 先日作った「DQ2 – Lovesong探して」for …
-
-
グラディウスの音楽をArduinoとYMZ294で3和音で鳴らしてみた。
お疲れ様です。高橋です。 先日、「スーパーの焼き芋製造機近くで鳴っている音楽をA …