絶対どこかにバグがあると思いますし、機能も不十分なのですが、とりあえず音は鳴りましたのでなんとなく公開してみます。
mmlPSG library
(A tiny MML parserとMetroライブラリを入れないと動きません)
mmlPSGライブラリのPSG_advance関数内でMetroとtiny MML周りの処理をするようにしたので、スケッチはかなり短くなります。
YMZ294のRESET(9番ピン)はArduinoのRESET(3.3Vの隣)につないでおくと、Arduino側のリセットのタイミングで同時にリセットされます。
音は前のスケッチと同じで、ファイナルファンタジーIの「プレリュード」です。
#include <mmlPSG.h>
#include <Metro.h>
#include <mml.h>
// YMZ294 defines
const byte WRCS_PIN = 8;
const byte A0_PIN = 9;
char *text[2] = {
"o5 l16 b-cdf b->cdf b->cdf b->cdf b-fdc< b-fdc< b-fdc< b-fdc gab-d gab->d gab->d gab->d gd<b-a gd<b-a gd<b-a gdb-a",
"o5 l16 b-a b-cdf b->cdf b->cdf b->cdf b-fdc< b-fdc< b-fdc< b-fdc gab-d gab->d gab->d gab->d gd<b-a gd<b-a gd<b-a gd"
};
void setup() {
DDRD = 0b11111111;
pinMode(WRCS_PIN, OUTPUT);
pinMode(A0_PIN, OUTPUT);
PSG_init(WRCS_PIN, A0_PIN);
PSG_setup(text[0], text[1]);
}
void loop() {
PSG_advance();
}
このスケッチでは2音しか鳴らしていませんが、PSG_setup関数にmmlもう1個渡せば、3音鳴ります。
ボリュームとかテンポとかはいまのところ固定になっています。おいおい追加していくということで。