ArduinoからA tiny MML parserを使ってみた

A tiny MML parser
MMLを読み込ませると、ノートナンバーと発音時間を返してくれる、処理系に依存しない汎用パーサーです。
Source Codes(リンク先の”Source Codes (Version 0.2.0)”ってやつ)をダウンロードしてきて解凍、
mml.c,mml.h,ntlib.c,ntlibc.hの4ファイルをArduinoのlibrariesフォルダに”mml”とかフォルダ作って入れて、
Arduinoからmml.hをincludeしたら普通に使えました。

(この時ついでにkeywords.txtも入れとくと、型と関数が色分けされて便利)
とりあえず普通にtone()関数で音を鳴らします。

あ、ノートナンバーから周波数を出すための配列用にnotes.hも用意します。

const int notes[] = {
  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
};

スケッチはこんな感じ。

#include <mml.h>
#include "notes.h"

const byte SND_OUT = 11;

MML mml;
MML_OPTION mmlopt;
char *text = "o5 l8 def+ae2 >dc+<bf+a2 b>c+d<a4d4. gf+d<a2r b4>c+4d4g4 f+gaf+ef+ge <b>gf+<a>e4c+4 d4<a>ed2";

static void mml_callback(MML_INFO *p, void *extobj)
{
  switch (p->type) {
    case MML_TYPE_NOTE:
      {
      MML_ARGS_NOTE *args = &(p->args.note);
      snd(notes[args->number], args->ticks * 2);
      }
      break;
    case MML_TYPE_REST:
      {
      MML_ARGS_REST *args = &(p->args.rest);
      delay(args->ticks);
      }
      break;
  }
}

void snd(int hz, int ms)
{
  int len = ms / 4 * 3;
  tone(SND_OUT, hz, len);
  delay(ms);
}

void setup()
{
  mml_init(&mml, mml_callback, 0);
  MML_OPTION_INITIALIZER_DEFAULT(&mmlopt);
}

void loop()
{
  mml_setup(&mml, &mmlopt, text);
  while (mml_fetch(&mml) == MML_RESULT_OK);
}

11番ピンとGNDにスピーカーをつなぐとこんな音が鳴ります。

1音のみで映える曲つったらこれだろう、というわけでファミコンのMOTHERより「Eight Melodies」です。
MMLはニコニコ大百科のピコカキコを参考にしました(音長が違ってたので、そこは直しました)。
ピコカキコ(FlMML)とtinymmlでは、オクターブシフトの記号(<>)が逆なので注意。FlMMLで言う「OCTAVE REVERSE」がtynymmlでのデフォルトになります。

ゲームが好きな人もそうでない人も、一度はこのサウンドトラックを聴いておいた方が良いと思います。
こちらの記事もおすすめ。
語り継がれる名作『MOTHER』からの25年 鈴木慶一×田中宏和 – 音楽インタビュー : CINRA.NET
ほぼ日刊イトイ新聞 – MOTHERの音楽は鬼だった。


コメントを残す