リングバッファについて

リングバッファとは

ここではディレイやコーラスなどのエフェクターで利用されるリングバッファについて簡単に説明いたします。

リングバッファとはデータ確保領域が環状に配置されたエンドレスなバッファです。

リング状のバッファため通常の配列とは違って「先頭から○○番目のデータ」のような指定はできず、「読み込み位置から○○番目のデータ」と指定します。
そのため、リングバッファは内部的に読み取りと書き込みを行うバッファの位置の情報を持ちます。この読み取り位置・書き込み位置を動かす(進める)ことで必要なデータの読み取り・書き込みをします。

【リングバッファのイメージ】

実装に当たっては下記の図のように、1次元のバッファを用意し、読み取り位置や書き込み位置がバッファの大きさを超えるとバッファ先頭へ戻るという処理を行えば実装できます。

【リングバッファの実装イメージ】

リングバッファの実装例

リングバッファは下記のように実装いたします。

【CRingBuffur.h】

リングバッファの読み込み位置・書き込み位置

上記の実装例ではリングバッファの読み込み位置・書き込み位置の距離(interval)はそのまま入力信号の遅れる時間(=ディレイタイム)となります。
たとえば入力信号を0.5秒遅らせたい場合、読み込み位置と書き込み位置の距離(interval)を22050バッファ分とします。(サンプリング周波数44100の場合)

【リングバッファの読み込み位置・書き込み位置】

使用例

使用例は下記のようになります。(簡単なディレイの場合)

【使用例】

最後に

上記のリングバッファを使って実際にディレイやコーラスは下記にまとめております。

  → エフェクターの簡単な実装例

なお、リングバッファのソースコードは上記ですべてですのでご利用の際はコピペしてお使いください。

質問はコメント欄や掲示板Twitterでいただけばとおもいます。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す