void GraphicEQ(float inL[], float inR[], float outL[], float outR[], int wavelength)
{
// inL[]、inR[]、outL[]、outR[]はそれぞれ入力信号と出力信号のバッファ(左右)
// wavelenghtはバッファのサイズ、サンプリング周波数は44100Hzとする
// エフェクターのパラメーター
static float gain100Hz = 1.0f; // 周波数 100Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain200Hz = 2.0f; // 周波数 200Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain400Hz = 2.0f; // 周波数 400Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain800Hz = -3.0f; // 周波数 800Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain1600Hz = 0.0f; // 周波数 1,600Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain3200Hz = 2.0f; // 周波数 3,200Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain6400Hz = 2.0f; // 周波数 6,400Hz付近のゲイン(増幅値)。-15~15dB程度
static float gain12800Hz = 0.0f; // 周波数12,800Hz付近のゲイン(増幅値)。-15~15dB程度
// 内部変数
// 各周波数用のフィルタークラス (https://www.utsbox.com/?page_id=728 より)
static CMyFilter f100L, f200L, f400L, f800L, f1600L, f3200L, f6400L, f12800L;
static CMyFilter f100R, f200R, f400R, f800R, f1600R, f3200R, f6400R, f12800R;
// 各周波数を持ち上げる(ピーキング)フィルタを設定 (左分)
f100L.Peaking(100.0f, 1.0f, gain100Hz);
f200L.Peaking(200.0f, 1.0f, gain200Hz);
f400L.Peaking(400.0f, 1.0f, gain400Hz);
f800L.Peaking(800.0f, 1.0f, gain800Hz);
f1600L.Peaking(1600.0f, 1.0f, gain1600Hz);
f3200L.Peaking(3200.0f, 1.0f, gain3200Hz);
f6400L.Peaking(6400.0f, 1.0f, gain6400Hz);
f12800L.Peaking(12800.0f, 1.0f, gain12800Hz);
// 各周波数を持ち上げる(ピーキング)フィルタを設定 (右分)
f100R.Peaking(100.0f, 1.0f, gain100Hz);
f200R.Peaking(200.0f, 1.0f, gain200Hz);
f400R.Peaking(400.0f, 1.0f, gain400Hz);
f800R.Peaking(800.0f, 1.0f, gain800Hz);
f1600R.Peaking(1600.0f, 1.0f, gain1600Hz);
f3200R.Peaking(3200.0f, 1.0f, gain3200Hz);
f6400R.Peaking(6400.0f, 1.0f, gain6400Hz);
f12800R.Peaking(12800.0f, 1.0f, gain12800Hz);
// 入力信号と正弦波を掛け合わせる
for (int i = 0; i < wavelength; i++)
{
// 入力信号にフィルタを直列にかける(左分)
float tmpL = inL[i];
tmpL = f100L.Process(tmpL);
tmpL = f200L.Process(tmpL);
tmpL = f400L.Process(tmpL);
tmpL = f800L.Process(tmpL);
tmpL = f1600L.Process(tmpL);
tmpL = f3200L.Process(tmpL);
tmpL = f6400L.Process(tmpL);
tmpL = f12800L.Process(tmpL);
// 入力信号にフィルタを直列にかける(右分)
float tmpR = inR[i];
tmpR = f100R.Process(tmpR);
tmpR = f200R.Process(tmpR);
tmpR = f400R.Process(tmpR);
tmpR = f800R.Process(tmpR);
tmpR = f1600R.Process(tmpR);
tmpR = f3200R.Process(tmpR);
tmpR = f6400R.Process(tmpR);
tmpR = f12800R.Process(tmpR);
// フィルタをかけた信号を出力する
outL[i] = tmpL;
outR[i] = tmpR;
}
}