OpenFrameworks FFT解析 マルチチャンネル
複数チャンネルのFFT解析をやりたかったのですがofxFFTではできなかったので、少しコードをいじってできるようにしてみました。
ofxFFT Classをチャンネル分生成
void ofxFFTLiveMutilChannel::setup(ofSoundStream * soundStream,int input) { this->soundStream = soundStream; nInput = input; soundStream->setup( this, // callback obj. 0, // out channels. nInput, // in channels. 44100, // sample rate. buffersize, // buffer size. 4 // number of buffers. ); for (int i=0; i<nInput; i++) { FFTLive *fftLive = new FFTLive(); fftLives.push_back(fftLive); } }
audioInのfftLiveに自身に該当するオーディオデータは格納
inputのなかにはチャンネル分のオーディオ配列がならんでいます。
例えば4chであれば
input[0] 1ch input[1] 2ch input[2] 3ch input[3] 4ch input[5] 1ch input[6] 2ch
以下、buffersizeまで同配列です。 複数のチャンネルのデータが入り混じったinput配列をチャンネル別に別にデータとしていれてあげる必要があります。
void ofxFFTLiveMutilChannel::audioIn(float * input, int bufferSize, int nChannels) { for (int i=0; i<nInput; i++) { int cnt = 0; for (int j=0; j < bufferSize; j=(j+1)*(nChannels-1)) { fftLives[i]->specData[cnt] = input[j]; cnt++; } } }
このへんがofxFFTの実装がなかったので複数のofxFFTを管理するマネージャークラスのようなものを追加で作成してみました。
利用する場合は、setup内で以下のようなコードで生成します。
//FFT設定 ss = new ofSoundStream(); ss->setDeviceID(3); //デバイスを設定 ss->listDevices(); //利用可能なデバイスを出力 不要なら削除 am.setup(ss,2); // amはofxFFTLiveMutilChannel headerで宣言済
updateで更新します。
am.update(); am.fftLives[0]->getFftPeakData(mesh1->fftdata, 256); am.fftLives[1]->getFftPeakData(mesh2->fftdata, 256);
手荒なつくりですが、ヒントにでもなるかと思うので、こちらからダウンロードしてください。