Effector Tips
リングバッファに必要な機能
ディレイを実現するに当たり以下の機能を持ったリングバッファを実装する必要がある。
- 読み出し位置からデータを読み出す機能
- 読み出し位置を進める機能
- 書き込み位置にデータを書き込む機能
- 書き込み位置を進める機能
- 読み出し位置、書き込み位置の距離を変更する機能
リングバッファの実装例
上記の機能を持ったリングバッファを作成する。
なお、説明については要点のみ説明する。サンプルコード全体は
ここ
からダウンロードしてほしい。
ディレイ用リングバッファクラスクラスの定義
#define RINGBUFFER_SIZE_DEFAULT 88200
class CRingBuffer
{
protected:
float *buffer;
int buffersize;
int read_pos; //読み込み位置
int write_pos; //書き込み位置
public:
CRingBuffer(void);
~CRingBuffer(void);
float GetValue(); //読み込み位置のデータを返す関数
void SetValue(float value); //書き込み位置にデータを設定する関数
void ForwardReadPosition(); //書き込み位置を進める関数
void ForwardWritePosition(); //読み込み位置を進める関数
void SetInterval(int interval); //書き込み位置、読み込み位置の距離を設定する関数
};
コンストラクタ、デストラクタ
コンストラクタではバッファの確保と初期化、読み込み位置・書き込み位置の初期化を行っている。
デストラクタでは確保したバッファを解放している。
CRingBuffer::CRingBuffer(void)
{
//バッファサイズを設定後、バッファの割り当てと初期化を行う
buffersize = RINGBUFFER_SIZE_DEFAULT;
buffer = new float[buffersize];
memset(buffer, 0, sizeof(float) * buffersize);
//読み込み位置と書き込み位置を初期化する。
read_pos = 0;
write_pos = buffersize / 2;
}
CRingBuffer::~CRingBuffer(void)
{
delete[] buffer;
}
GetValue()関数、SetValue()関数
GetValue()関数では読み込み位置のデータを返している。
SetValue()関数では書き込み位置にデータを保存している。
float CRingBuffer::GetValue()
{
return buffer[read_pos];
}
void CRingBuffer::SetValue(float value)
{
buffer[write_pos] = value;
}
ForwardReadPosition()関数とForwardWritePosition()関数
それぞれの関数で読み込み位置と書き込み位置を1つ進めている。
バッファサイズを超えないよう、進めた後バッファサイズで割った余りをread_pos・write_posに代入している。
void CRingBuffer::ForwardReadPosition()
{
read_pos = (read_pos + 1) % buffersize;
}
void CRingBuffer::ForwardWritePosition()
{
write_pos = (write_pos + 1) % buffersize;
}
SetInterval()関数
読み取り位置と書き込み位置の距離を設定する。
設定後はバッファのデータを初期化しておく。
void CRingBuffer::SetInterval(int interval)
{
//intervalに不正な値(大きすぎる、小さすぎる)がある場合は1にしておく。
interval = interval % buffersize;
if (interval <= 0)
{
interval = 1;
}
//書き込み位置を変更し、バッファを初期化する。
write_pos = (read_pos + interval) % buffersize;
memset(buffer, 0, sizeof(float) * buffersize);
}
同一カテゴリのTips
最終更新:2010年06月04日 01:00