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();
}
------