MML (Music Macro Language)
MMLは、音楽記法をテキストで簡易的に扱うための記述言語です。
例えば、「ド・レ・ミ」と四分音符で歌う場合には「C4 D4 E4」と書く事で表現できます。
経緯
先日、
大晦日ハッカソン2014なるものを見つけ、
mrubyをBlackfinボード(UCB-BF512-B)で動かすおひとりハッカソンを企画し
実行したわけですが、実は色々な小道具を整備しないとmrubyに辿りつけないとわかり何故か寄り道。
Windows、Mac OS、Linuxで動作可能なChaNさんのFM音源モジュールの簡易シミュレーターの流れもあって、MMLパーサーがあれば自由に自動演奏させられるなぁという考えから実装したい衝動に負けてしまいました。
'A tiny MML parser'
'A tiny MML parser'は、Cで記述されたMMLパーサーです。
特徴をざっと挙げると
- シンプルなAPI
- 可搬性に優れたソースコード (C89準拠)
- 外部ライブラリに非依存 (libcも不要)
- 小さなフットプリント
- シャープ、フラット、ダブル・シャープ、ダブル・フラットなどにも正しく対応可能
- 複数の符点音符にも正しく対応可能
- 三連符に対応
など、マイコンで使う事も考慮した設計と実装になっています。
特に、シャープやフラットが複数付く場合、符点が複数付く場合、三連符に対応可能な点は、実際の曲を簡易的に表現可能という意味で重宝する仕様になっています。三連符を疑似的に入力するのとか辛いじゃないですか・・・。
どういう風に使えるの?
'A tiny MML parser'を使うには、要求されている唯一のコールバック関数を実装するだけです。
このコールバック関数は、「
typedef void (*MML_CALLBACK)(MML_INFO *p, void *extobj);」と宣言されており、mml_fetch関数を呼ぶ度に一つのMMLコマンドが解釈されてコールバックが呼ばれる仕組みです。
ライブラリのインターフェースは以下に示すようにたったの三つです。
まず、初期化関数mml_initでコールバック関数を渡して初期化します。
この時、extobjに外部オブジェクトへのポインタを渡してやると、コールバック関数で受け取れます。
次に設定関数mml_setupで演奏時に必要となるオプションとMMLを渡します。
「オプションなんてわけわからん!」という人は「(MML_OPTION *)0」を渡して下さい。
最後に呼び出し関数mml_fetchでMMLのパースを実行します。
このmml_fetchを呼び出す度に、一つのMMLコマンドが解釈されます。
ちなみに、このライブラリは「何が書いてあるのか?」について解釈する機能を提供します。
「それをどうするのか?」については一切関知しません。
実際のシステムに導入する場合、これを意識して使う事が結構ポイントになってきます。
デモ
Blackfin上でFM音源を構成し、そのFM音源をMMLで操作している様子をデモ映像にしました。
このデモでは、
ChaNさんのFM音源のコードを若干改造したものをミドルウェアとして使用しています。MMLパーサーも軽量ミドルウェアとして導入できたので、上位の実装は非常にシンプルな形で済ます事ができました。
ライセンス
ライセンスはMITです。
趣味でも業務でも、ライセンスの範囲で自由にお使い頂けます。
ダウンロード
'A tiny MML parser'のダウンロードは以下のページからどうぞ。