Tamesuke-Goto Maker的Blog -13ページ目

Tamesuke-Goto Maker的Blog

地域ISP管理者だけれど、ここ3年ほどMakerなJobが増えたのでまとめてみたいと思います 旧ハンドル Ringoro

ArduinoのYMF825 MIDI音源モジュールで音色データをグローバル変数領域に記述すると、データがRAM上展開されてメモリ不足になりそうです。

固定の音色データはフラッシュ上に持っておきたいです。

フラッシュ上にデータを持つ為に PPRGMEM を使います。コンパイルするとグローバル変数領域が減少しました

 

RAM展開時

 

 

PROGMEM使用時

 

 

PROGMEM領域のデータにアクセスするには普通のポインタなどは使えず専用のマクロ(関数?)を使ってアクセスしなければなりません。

今回音色データは「配列の配列」で定義したのですが、この場合のマクロの使い方がイマイチ不明だったのですが、以下の様な記述でアクセスが出来ましたのでメモしておきます。

 

 

---定義---

 

const  unsigned char PROGMEM  program[4][30]={
{
/*
Piano-1
*/  
0x01,0x85,
0x00,0x72,0xF9,0xD6,0x00,0x20,0x40,
0x00,0xA3,0xFC,0x02,0x03,0x10,0x40,
0x00,0x92,0xF3,0xA2,0x00,0x20,0x41,
0x00,0xA3,0xFC,0x1A,0x01,0x10,0x40
},
{
/*
Piano-2
*/  
0x01,0x85,
0x30,0x75,0xF2,0x7F,0x00,0x40,0x40,
0x30,0x73,0xF0,0x12,0x03,0x10,0x40,
0x60,0x76,0xF3,0x5B,0x00,0x20,0x41,
0x50,0xA7,0xF0,0x12,0x01,0x10,0x40
},

 

--- アクセス ---


/*
 *   Prog change
 */
extern unsigned char tone_data[35];
void progchang(unsigned char p)
{
  int i;
  p = p & 0x3;
 
  for(i=0;i<30;i++){
    tone_data[i+1]=pgm_read_byte_near(&(program[p][0])+i);
  }
  set_tone();
 
}

 

 

------

 

 

 

 

YMF825board ボイスエディタを改訂しました

音色データ最大16音色保存、音色データのimport/export機能を付けました。

音色データは30バイトの10進表記 カラム数30のcsv形式にしましょうという事で、他のFM音源プログラマー の方とフォーマットを揃えました。

 

https://github.com/ringoro/YMF825voiceeditor

 

 

例:ピアノの音色


1,133,0,123,249,67,0,32,64,0,163,166,14,3,16,0,0,44,249,155,0,32,65,0,163,166,14,1,16,64,


 

 

 
音データ制作用にもう一枚シールドをハンダ付け
今回は秋月の丸ピンソケットを使うことにします。ただ、これ、ラインだったら良いけど、1,2ピンづつ半田付けするのは結構面倒でしたね。。。
 
{7279A472-CAFD-4704-8A34-11FAEFF6373D}

 

 

YMF825boardはブレッドボードを使うときれいに半田付けできる。。。

 

{98F100EF-45F7-4524-B0F3-2DE31D59D48E}

 

スピーカー端子は普通のピンヘッダにしました。

ベースにしたArudinoはCH340互換機です。確かヤフーショップで575円とかでしたね。送料がかかるので5個ばかりまとめて買ってあります。micoroUSBなので使いやすいです。

 

 

 

{0039B5A5-3A53-41F6-A25B-C0A5D6437024}

 

YMF825boardとArduino、MIDIシールドの組み合わせでレガシーMIDI音源モジュールを作ってみました。オムニモード、全MIDIチャンネルで発音します。
 
16音ポリ(のはず) ベロシティ対応 プログラムチェンジ 音色は4音色実装しました。
 
今後追加したい機能としては ピッチベンド、LFOやダンパーなど一般的なコントロールチェンジ類 追々やっていこうと思います。
 


 
MIDIシールド前提ですが、setup()でボーレートを 38400 等にしてCOMポートを通して直接パソコンからコントロールはできると思います。
 
音色データをどうするか、、、悩みます。今回の実装ではプログラムチェンジで音色データをYMF825のToneNumber 1 へ音色パラーメータごと毎回送る形にしました。16音色分YMF825に先に送っておいても良いのですが、気の利いた16音色がなかなか作れないのと、転送に480バイトのRAM領域が要るのがArduinoには負担がありそうなので、こんな感じになりました。この辺の仕様は追々考えていかないと。