博多キャナルシティでやるイベントでマイクを入力にしたのですが、何度やっても、すぐopenFrameworksでマイク入力を取るとき忘れるので、覚書きです。
まず、testApp.h
にofSoundStream
の変数とaudioIn
関数、ボリュームを格納する変数curVol
を宣言します。
[code lang=cpp]
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed (int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
void audioIn(float * input, int bufferSize, int nChannels);
ofSoundStream soundStream;
float curVol;
};
[/code]
次にtestApp.cpp
のsetup
内に
[code lang=text]
void testApp::setup(){
ofBackground(0);
ofSetFrameRate(60);
//setup(this, outChannels, inChannels, SamplingRate, BufferSize, nBuffer);
soundStream.setup(this, 0, 1, 44100, 256, 4);
}
[/code]
今回は音は入力だけに使うので、アウトは0, インを1にしています。サンプリングレート等はだいたい標準的な設定です。
さらにaudioIn()
関数に、
[code lang=cpp]
void testApp::audioIn(float * input, int bufferSize, int nChannels){
curVol = 0.0;
for (int i = 0; i < bufferSize; i++){
curVol += input[i]*input[i]; // 聴覚上は出力の2乗に比例するので、2乗しています。
}
curVol /= bufferSize; // 平均を取ります。
}
[/code]
あとは、update
やdraw
の中でcurVol
を使うだけです。
ただ、注意しなくてはいけないのは、audioIn
関数はupdate
やdraw
とは独立に呼ばれるようで、配列をaudioIn
関数の中で使うと、配列処理のタイミングが合わず、EXC_BAD_ACCESSとかで落ちたりします。なので、変数に値を格納して、updateやdrawで配列処理を行うようにしましょう。
コメントを残す