« RAMの節約 | トップページ | レトロプリンタ »

2016年1月10日 (日)

音色キャッシュ

下調べも終わったので、今夜は音色キャッシュを実装しよう。
試しに先頭から10音色をキャッシュするとこんな感じ。

//	----------------------------------------
//	音色キャッシュに先読み
//	----------------------------------------
void timbreCacheRead260( uint16_t mdxAdd ) {
	timbreOffset = timbreOffsetGet( mdxAdd );	// 音色offset
	timbreAddress = mdxAdd + timbreOffset;		// 音色のROMアドレス
	for(int8_t i=0; i<__TIM_CACHE; i++) {
		eeprom.Read( (long)(timbreAddress + 27*i), (char*)(timbreCache + 27*i), 27 );
	}
}

プリフェッチキューと音色キャッシュ、二つのキャッシュメモリが存在することになるから、 それに応じた読み出し処理が必要になる。

//	----------------------------------------
//	external EEPROM read
//	----------------------------------------
uint8_t eepromRead8( uint16_t add ) {
	uint8_t dat8;
	uint16_t offset;

	if( timbreOffset ) {				// 音色キャッシュがあれば...
		offset = add - timbreAddress;
		if( offset<=(27*__TIM_CACHE)-1 ) {
			dat8 = timbreCache[offset];
			return dat8;
		}
		Count++;
		Count &= 0x000f;
	}

	offset = add - pfqCacheAddress;
	if( offset<=(__CACHE_SIZE-2) ) {	// プリフェッチキュー内なら...
		dat8 = pfqBuffer[offset];
	}
	else {
		eeprom.Read( (long)add, (char*)&dat8, 1 );
	}

	pfqNextAddress = add + 1;			// 次のアドレスを記憶
	return dat8;
}

確かに音質は改善したが、まだ少し物足りない。
だが、メモリも残っていないし、今回はここであきらめるとしよう。
演奏できるのは15曲、スイッチで曲を選択して演奏できる。
曲に合わせてLEDアレイが光るようにした。

ちなみに、今回のコードをコンパイルすると、ArduinoIDEはこんな警告を出す。

> グローバル変数が 1,791バイト (87%) の 動的メモリを使用しており、
> ローカル変数に 257 バイトが残っています。最高は 2,048バイトです。
> Low memory available, stability problems may occur.

続きはまた今度。仕事がもっと暇になってからだな。

« RAMの節約 | トップページ | レトロプリンタ »

お仕事」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/24707/63394595

この記事へのトラックバック一覧です: 音色キャッシュ:

« RAMの節約 | トップページ | レトロプリンタ »

最近のトラックバック