curious4dev

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

*

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

 

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

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

前に買ったスピーカーを2つ増設し、合計3スピーカー。そしてテンポを可変抵抗器で変えられるように少し回路をいじりました。右側の可変抵抗器がテンポ変更用です。スピーカーを増設した事は特に理由はありません。カッコ良さそうだったからやってみました。

gra201

(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追記)

スケッチを公開します。

gra2_3WithSpeedControl.zip

上記スケッチ内で読み込んでいるYMZ294.hは、wp.hrmux.comさんで公開しているYMZ294用ライブラリをArduinoIDEでライブラリ読み込んで下さい。

今のスケッチのままですと音がなっても自然に音が減衰していきませんが、エンベロープを設定すると音が低くなっていきます。YMZ294を買った時についてきたデータシートを見てみると、

ymz_env

こんな感じです。で、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の波形にする感じです。

一度試したんですが他の事をやっている間に消してしまいましたが、確かコレで動いたと思います。

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

 - 耳コピArduino

  関連記事

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

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

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

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

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

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

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

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

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

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

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

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

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

お疲れ様です。高橋です。 先日「YMZ294で鳴らすためのビッグブリッヂの死闘を …

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

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

Castlevania SotN “Dance of Pales”を耳コピ

お疲れ様です。高橋です。 久々に耳コピ。Castlevania Symphony …

ArduinoでPSG音源(YAMAHA YMZ294)を鳴らしてみた。

お疲れ様です。高橋です。 先日秋葉原にて「Arduino」という物を買ってきまし …