読者です 読者をやめる 読者になる 読者になる

tech memorandom

Webに関して調査したことや、メディアアート系(Max,Processing)で調査したことなどを書いていきます。

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);

手荒なつくりですが、ヒントにでもなるかと思うので、こちらからダウンロードしてください。

https://github.com/coa00/ofxFFT-1