【openFrameworks】チャンネル1でマイク入力するときの注意点


openFrameworksでのマイク入力でハマったことを、忘れないようにメモします。

マイク入力で詰まったこと

oFのexampleにあるaudioInputExampleを開いてビルド&ランしても、全く反応しません。無反応です…。

原因はsetup関数内の初期設定にあります。こちらのコードをご覧ください。

ofApp.h
settings.setInListener(this);
settings.sampleRate = 44100;
settings.numOutputChannels = 0;
settings.numInputChannels = 2;
settings.bufferSize = bufferSize;
soundStream.setup(settings);

settings.numInputChannels2になっています。一方で自分のPCで入力を確認すると、入力1になっていたんです。
(確認方法はmacの場合、Audio Midi設定を開くことです)

`settings.numInputChannels=1'にすればできる…!!!

そう思って、コードを書き換えるものの、明らかに挙動が狂ってます…何かがおかしいのです…。

原因は音声入力の処理だった!

原因はsettings.numInputChannels = 2に合わせた処理が原因でした。

ofApp.h

void ofApp::audioIn(ofSoundBuffer & input){

    float curVol = 0.0;
    int numCounted = 0; 

    for (size_t i = 0; i < input.getNumFrames(); i++){

        left[i]        = input[i*2]*0.5;
        right[i]    = input[i*2+1]*0.5;

        curVol += left[i] * left[i];
        curVol += right[i] * right[i];
        numCounted+=2;
    }

    curVol /= (float)numCounted;
    curVol = sqrt( curVol );

    smoothedVol *= 0.93;
    smoothedVol += 0.07 * curVol;

    bufferCounter++;

}

ここでのleft, rightの配列は入力チャンネルが2つだからこそ、実装できる処理になります。今回は入力1なので、ここの処理を以下のように変更する必要があります。

ofApp.h

void ofApp::audioIn(ofSoundBuffer & input){

    float curVol = 0.0;
    int numCounted = 0; 

    for (size_t i = 0; i < input.getNumFrames(); i++){

        /////////
        //変更箇所
        /////////
        left[i]        = input[i]*0.5;
        curVol += left[i] * left[i];
        numCounted++;
        //////
    }

    curVol /= (float)numCounted;
    curVol = sqrt( curVol );

    smoothedVol *= 0.93;
    smoothedVol += 0.07 * curVol;

    bufferCounter++;
}

すると、処理が思ったような動きになってるはずです!

 最後に

PCによっては、マイク入力が初期から2になっており、サンプルのように動かせば問題ありません。

ただ私のように一部のPCは、マイク入力が1のまま固定され、入力2に変更できない可能性があります。

そういう場合は、上記のやり方をお試し頂ければ幸いです!