Arduino+FM音源で遊ぶ(ライブラリの使い方解説)

今回はYM2151ライブラリの使い方についてメモします。ライブラリというよりはMDXシーケンサの実装に伴ない必要な物をまとめただけといった感もありますが、レジスタ裸の状態ですと音を出すまで結構大変なので理解の助けになればと思います。リファレンスはこのページにまとめています。

YM2151Library

まずは基本のお約束、HelloOpmWorld!

Arduinoの各ライブラリの例に漏れず、YM2151.cpp/YM2151.h/Common.hの3点を使いたいスケッチのディレクトリにコピーした後YM2151.hをインクルードするだけです、内容はサンプル3点で同一です。Common.hはマクロを2点定義しているだけなのでお好きなように再定義してください。最低限音を出すのに必要なコードをまとめたのがこちらです。

uint8_t	channel = 0;
YM2151.begin();
YM2151.loadTimbre(channel,(uint16_t)SampleTimbre01);
YM2151.setVolume(channel,0xf,0);
YM2151.setPanpot(channel,0x3);
YM2151.setTone(channel,0x20,0);	// 音階=0x20
YM2151.noteOn(channel);

まずbegin()メソッドを呼び初期化する必要があります、やや時間がかかる処理ですのでsetup()の中で1度だけ呼ぶのがベターだと思います。以降チャンネルごとに設定していきますが、ご存知の通りYM2151は8音同時に出力が可能なので0~7まで同じように設定していきます。

  • loadTimbre(uint8_t,uint16_t)で音色パラメータをセットします、この関数はMDXフォーマット形式で定義されたPROGMEM prog_uchar配列のアドレスを渡します。パラメータについてはさらに分りやすい方法を用意しましたので後述します。
  • setVolume(uint8_t,uint8_t,uint16_t)でボリュームを設定します、範囲は0~15で15が音量最大です。ハードの制約上音色の組み方によりボリュームを下げると破綻する場合があります。
  • setPanpot(uint8_t,uint8_t);でパンポットを設定し、左右どちらに発音するか設定します。ハードの制約上、デジタルな鳴り分けしかできません。
  • setTone(uint8_t,uint8_t,int16_t)で音程を設定します、オクターブ0のD#を0として音階を設定します。3番目のkfは音階の微調整です、6bitで設定しますが、音階と合成しているので連続変化音を作りたい場合はこちらのみで大丈夫です。
  • noteOn(uint8_t)で発音します。

setVolume、setPanpotは一見不要に見えますが、関連レジスタの設定も行っているので音色の再設定を行った後は必ず呼んでください。特にリセット直後はレジスタ初期値0なので呼ばないと全く鳴りません、noteOff(uint8_t)で発音を止めます。

お手軽音色設定関数について

まだFM音源が現役だった頃から難易度が高かったのが音色設定です。倍音を多重合成して音を出しているのでほんの僅かなパラメータの違いにより大きく出力が変わる上、数も多いので当時から沢山の音色設定ツールが作られた程です。そこで、VAL-SOUNDさんが、

FM-Sound Library

にかなり大量の音色を公開していらっしゃるので、そのままロードできるよう関数を追加しました。記述としては、

PROGMEM prog_uchar	AnalogBass[]={
6, 7,  31, 0, 0,12, 1,18, 1, 1, 0,0,
31, 0, 1,12, 1, 4, 1, 2, 0,0,
31, 0, 0, 9, 0, 3, 0, 1, 7,0,
31, 0, 0, 9, 0, 3, 0, 1, 3,0
};
YM2151.loadSeparationTimbre(channel,(uint16_t)AnalogBass);

このような感じです、但しOPN/OPNAもサポートする音色な為、パラメータが若干増えているYM2151は微妙に使いきれない状態となります。

以上全体的に説明をやや端折ってしまいましたので、分かりにくい点がありましたらコメントやメールで遠慮無くお願いします。

いろいろ更新しました

転送ツール他を29日に更新し、若干機能強化を行いました。サポートページにまとめてあります。

YM2151シールドサポートページ

Arduino+FM音源で遊ぶ(MTM05ご来場ありがとうございました)

おかげ様で(ほぼ)完売しました

特にYM2151/YM3012の仕入れにかなりの額を投入したので「売れ残ったらどうしよう・・」と嫌な汗をかいていたのですが、YM2151/YM3012無しが1セット残り、YM2151/YM3012付きは完売となりました。ただ初日は若干トラブルが有りMIDIとWiiヌンチャクのデモが動作しておらずご迷惑おかけしました。原因はWiiヌンチャクのピンヘッダの接続を間違えていて、Wireライブラリが通信に失敗した所でHALT状態になっていたというオチでした。その場で原因を調べようにもUSBポートの数が足りなく、色々ともう少し余裕を持たないとダメだという教訓ですね。そう、ここでWireライブラリの仕様を責めたらプログラマ失格なのです!

MTM05バージョンについて

MTM05バージョンで出したキット内容についてざっくり解説します、まずハード周りの変更点です。

MTM04版のRev1.1でMIDI入力にフォトカプラのTLP521を使用していましたが、実際に信号を流すと取りこぼしが多く、オシロで見ると案の定波形がメタメタだったのでデジタル出力のPC900Vに変更しています。結果としてarduino.ccで公開されいるMIDI Library2.5がそのまま利用できることを確認しています。また、Rev1.1でカットしたYM2151の割込み出力をAnalog04に入力可能なようにジャンパパターンを追加しました。基板の方は電子回路初心者の方でも安定して組み上げられるよう、少々値は張りましたが製造をP板.COMさんに委託しました。キットの外観はこんな感じで。

組み上げるとこのように、緑基板で地味地味ですが、緑以外だと+2万円という見積もりだったので断念。

ソフト面では前回MDX再生スケッチの再現度が完璧でなく、ソフトLFOの一部のモードが動作していなかったのを修正したのでおおよそ100%の実装度に到達したと思います。あとArduinoのCPUパワーに余力があるのが分かったので、やや効率は落ちていますがYM2151のレジスタを叩いている部分を極力分離し、Arduino標準のお作法に習う形でYM2151.cpp/.hにライブラリとしてまとめています。音色設定配列はブラックボックス気味ですが発音制御と音程、ボリューム、パンポット制御辺りまではお手軽にできるようになっています。

ライブラリの詳しいドキュメントは後日公開します。

各コードについてはbrogからのリンクですと色々不便ですので「YM2151シールドサポートページ」として以下のGoogleSitesにまとめています。

YM2151シールドサポートページ

キットに同梱した組立説明書も近々PDF変換してこのページに上げておきますので、組んだ後は捨ててしまって問題無いと思います。私自身が余分な紙資料キライ!でScanSnapで何でも電子化な人ですので。Wordで書いている都合上やや解像度は下がってしまいますが。

今後の展開について

まずほぼやります!なToDoについては、ライブラリの使い方解説、エラー処理がユルいMDX転送ツールの手直し、MTM05版紹介動画の作成、辺りです。

後はどうでしょうかね、YM2151の詳細解説とかですかね?現状ネット上に存在しないので、英語の勉強も兼ねて日/英版でテキスト化とか、また恥ずかしい物を晒すことになりそうですが。

キットの追加ロットについてはやはり肝心要のYM2151/YM3012の入手が不安定なのと、石自体がかなり高価な部類で個人で回すには在庫リスクが高いので、反響が予想外に大きかったらやりますといった感じでお願いします、申し訳ない。

Arduino+FM音源で遊ぶ(MTM05に出展しキット販売を行います!)

準備完了

細かい部品の手配も完了し、基板の新リビジョン版も完成したので、後は説明書を書いて部品を小分けするだけといった状態です。

小型オシレータも大量にあると迫力です、ちなみにYM2151/YM3012は古い石ということもあるので、このようにゼロプレッシャーをムリヤリ取り付けて全数チェックを行います。

最終的な原価計算がまだなので価格未定です。

というわけで実はかなり前に受理されていますがMTM05に出展しキットを販売を行います。

Make: Tokyo Meeting 05

あと直前で申し訳ないですが5月9日の「はんだづけカフェ」さんのオープニングイベントにおじゃまして最新リビジョンのお披露目をするかもしれません。

はんだづけカフェ

キット販売とか何気に小売初体験なので色々ドキドキです。ではMTM05でお待ちしております。