Help us understand the problem. What is going on with this article?

【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設定を開くことです)
スクリーンショット_2019-04-24_17_35_29.png

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

そう思って、コードを書き換えるものの、明らかに挙動が狂ってます…何かがおかしいのです…。
スクリーンショット_2019-04-24_17_42_11.png

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

原因は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++;
}

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

 最後に

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした