2015年2月26日木曜日

Arduinoでも扱いやすくするために'A tiny MML parser'をアップデートしました (ついでにスーパーマリオも演奏してみました)

Arduinoでも扱いやすくするために'A tiny MML parser'をアップデートしました。このアップデートにより、以下の動画で示すような長い曲でも難なく再生させる事ができるようになりました。お約束感が満載ですが、Super Marioのテーマ曲を演奏しています。



'A tiny MML parser'の公開直後、「A Day in The BAKA's Lifeさん」の「ARDUINOからA TINY MML PARSERを使ってみた」の記事によって、Arduinoを使った活用の御紹介を頂きました。

最初にライブラリを公開した段階では、Blackfin以外に具体的なターゲット・プラットフォームのイメージを持っていなかったのですが、この記事のおかげでお手軽なArduinoで動作するのは面白いなぁと興味を持ちました。

で、実際に自分でもやってみた結果、FLASH上にもMMLを配置できた方がアプリケーションの幅が広がるだろうとの結論に達しました。

というのも、avr-gccではconstとPROGMEMというディレクティブを使って、コンパイラにテキストの配置を指示する形を取ります。AVRの場合、ハーバード・アーキテクチャですから、一口にポインタと言ってもSRAMを指すポインタなのかFLASHを指すポインタなのか区別して扱う必要があるわけです。


最初のバージョンでは、FLASH上に配置する事を考慮していなかったので、必然的にSRAMにMMLを配置せざるを得ず、長大な曲を再生させる事は困難でした。

今回公開した新しいバージョンでは、mml.hにMML_USE_AVR_PROGMEMという定義を追加しました。この値を(1)に設定する事でFLASH上に配置した文字列を処理対象にする事が可能です。もちろん、従来通りSRAM上に配置する事も可能。アプリケーションの設計に応じて切り替えて御利用頂けます。

サンプルのスケッチは https://www.cubeatsystems.com/tinymml/download.html からダウンロードできます。