FM音源YMF825が載ったボードが発売されたので入手して、AVRマイコンを使いUSB-MIDIデバイスとして鳴らしてみました。
Sound Cloud Town.mid
###構成
以前YMF262やYM2151をUSBの複合デバイス(MIDIとHID)としてコントロールしたのですがデバイスドライバやlibusb関係のインストールなど導入が複雑だったので今回はMIDIを2chとし制御に1ch使う事でドライバ関係のインストールを不要にしています。
###ハードウェア
YMF825bordはアンプ内蔵、miniジャックまで付いているので手元にあったAtmega32U4のマイコンボードとYF825boardをSPIとリセット関係の接続をしたのみです。
###ソフトウェア(マイコン側)
USB-MIDIのライブラリはLUFAのDual MIDI Device Demo (Class Driver APIs)を使用しました、これはAtmelStudioへインストールしてメニューから選択すれば簡単にUSBデバイスを作れる優れもので他にもHID,CDC,Mouseなどいろんなデバイスをサポートしています。
MIDIクラスドライバがMIDIメッセージの解読を行ってくれるので、プログラマはMIDIメッセージに対応する処理を作成するだけなので楽にMIDIデバイスが作成できます。
if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_OFF))){
//ノートオフ
ch = ReceivedMIDIEvent.Data1 & 0x0f;
i = ReceivedMIDIEvent.Data2;
note_off_func(ch,i);
}
一部の処理(マイコンからYMF825へのSPIの送信割り込み処理、PitchBendの計算)は速度を稼ぐためアセンブリ言語で書き直しました。
####MIDIサポート
Velocity
Hold
Expression
Modulation
PartLevel
システムエクルシーブメッセージによる音色送信
###PC側ソフトウェア(Javaで作成したToneEditor)
以前作ったToneEditorをYMF825用に改造しました、今更swingアプリケーションです。
演奏と音色コントロールが別々のソフトウェアなので、演奏中にパラメータを触ったりして音色を変化させることが出来音色の編集が大変楽です。
Java Sound APIを使いYMF825boardへMIDIのシステムエクルシーブメッセージを利用してコマンドを送っています。
こちらの記事が大変参考に成りましたJava Sound でMIDI機器を操る
4バイトのコマンドを上下4bitづつに分解してヘッダを省いた10byteのシステムエクルシーブメッセージにして送信しているので他のMIDI機器にこのデータが流れると何が起こるかは分かりません(^^;)
フォーマット
"0xf0, COMMAND_hi, COMMAND_lo, DATA1_hi, DATA1_lo, DATA2_hi, DATA2_lo, DATA3_hi, DATA3_lo, 0xf7"
0. YMF825のリセット
1. レジスタへ書き込み DATA1=addres,DATA2=data
2.Playモード設定
DATA1=0 mono_mode
DATA1=1 Poly_mode
DATA1=3 Poly_mode2: 指定チャンネルの+8チャンネルを同時発音させます
5. EEPROM write DATA1番地へData2を書き込み
6. EEPROM tone read EEPROMのDATA1番音色データを上位と下位4bitづつに分けた62バイトのシステムエクルシーブメッセージで返す
9. write burst 音色バッファのYMF825へ全書き込み
10. write data and burst 音色バッファをDATA1番地へDATA2を書きこみ後書き込み
11. write data only 音色バッファのDATA1番地へData2を書き込み
###感想
YMF825はOPL系と言う事に成っていますがOPL3に比べてパラメータも増えてより変な深い音作りが楽しめます。
###ソース
GitHub
shigosenCCneko/YMF825MIDI_CONTROL