音を扱う基礎的な方法をみてゆきます。

プロジェクト名は audio とします。

audioout.png

以下、ofApp.hofApp.cpp の違いに注意してください。


単純な波形の出力

ofSoundStream オブジェクトを使うと、波形を音として出力することができます。


サイン波のオーディオ出力

はじめに、ofApp.h ヘッダファイルに ofSoundStream オブジェクトを追加します。

class ofApp : public ofBaseApp {
    public:
    ...略...
    
    void audioOut(ofSoundBuffer & buffer);
    
    ofSoundStream soundStream;
    
    int sampleRate;
    float phase;
    float phaseAdder;
};

つぎに、サンプリングレートなどのオーディオ出力に必要な設定を行います。

void ofApp::setup() {
    int bufferSize = 512;
    
    sampleRate = 44100;    // サンプリングレートは44100[Hz]
    phase = 0;
    phaseAdder = 0.0f;
    
    ofSoundStreamSettings settings;
    settings.setOutListener(this);
    settings.sampleRate = sampleRate;
    settings.numOutputChannels = 2;    // 出力は2チャンネル: 左右
    settings.numInputChannels = 0;
    settings.bufferSize = bufferSize;
    soundStream.setup(settings);
}

そして、波形をオーディオとして出力します。

void ofApp::audioOut(ofSoundBuffer & buffer) {
    while(phase > TWO_PI) {
        phase -= TWO_PI;
    }
    
    int nCh = buffer.getNumChannels();
    
    phaseAdder = 440.0f / (float)sampleRate * TWO_PI;    // 周波数:440[Hz]
    
    for(int i=0; i<buffer.getNumFrames(); i++) {
        phase += phaseAdder;
        float sample = sin(phase);
        
        buffer[i * nCh] = sample;
        buffer[i * nCh + 1] = sample;
    }
}

440[Hz] のサイン波が出力されます。周波数の数値を変更して実行してみてください。


音量の変更

音量を変更できるようにします。