3

わかりました、これを台無しにしないことを願っています。いくつかの答えを探しましたが、何も見つかりません。3D モードで FMOD サウンド プレーヤーを使用して、openframeworks で簡単なサンプラーを作成しようとしています。単一のインスタンスを正常に動作させることができます (libsndfilerecorder を使用して新しいファイルを録音し、それを再生してサラウンドで移動します。

ただし、ライブ ショーで一度に 1 つのレイヤーを録音して置き換えることができるループ オーディオの 8 つのレイヤーが必要です。複数のレイヤーがあるとすぐに、多くの問題が発生します。

私の質問の最初の部分は、FMOD 3D モードに関するもので、これはリスナー相対であるため、すべてのサウンドに対してリスナーの位置を定義する必要があります (ヘッド相対モードを使用することをお勧めしますが、これをまったく機能させることはできません。繰り返します。これは、単一のプレーヤーを使用している場合は正常に機能しますが、複数のプレーヤーでは、最後に更新したリスナーのみが実際に機能します。

私が抱えている主な問題は、複数のプレーヤーを使用すると歪みが発生し、新しい録音で現在再生中の他のサウンドが混在することが多いことです (マイクがそれらを聞くことができない場合でも)。libsndfilerecorder と FMOD との非互換性はありますか?

ここで、プレーヤーを初期化します

for (int i=0; i<CHANNEL_COUNT; i++) {  
    lvelocity[i].set(1, 1, 1);  
    lup[i].set(0, 1, 0);  
    lforward[i].set(0, 0, 1);  
    lposition[i].set(0, 0, 0);  
    sposition[i].set(3, 3, 2);  
    svelocity[i].set(1, 1, 1);  
    //player[1].initializeFmod();  
    //player[i].loadSound( "1.wav" );  
    player[i].setVolume(0.75);  
    player[i].setMultiPlay(true);  
    player[i].play();  
    setupHold[i]==false;  
    recording[i]=false;  
    channelHasFile[i]=false;  
    settingOsc[i]=false;  
} 

記録中にファイルをアンロードし、ロードされていないプレーヤーの位置が更新されていないことを確認します。

void fmodApp::recordingStart( int recordingId ){

if (recording[recordingId]==false) {  
    setupHold[recordingId]=true; //this stops the position updating  
    cout<<"Start recording Channel " + ofToString(recordingId+1)+"  setup hold is true \n";  
    pt=getDateName() +".wav";  
    player[recordingId].stop();  
    player[recordingId].unloadSound();  
    audioRecorder.setup(pt);  
    audioRecorder.setFormat(SF_FORMAT_WAV | SF_FORMAT_PCM_16);  
    recording[recordingId]=true; //this starts the libSndFIleRecorder  

}  
else {  
    cout<<"Channel" + ofToString(recordingId+1)+" is already recording \n";  
}  

}

そして、このように録音を停止します。

void fmodApp::recordingEnd( int recordingId ){  
if (recording[recordingId]=true) {  
    recording[recordingId]=false;  
    cout<<"Stop recording" + ofToString(recordingId+1)+" \n";  
    audioRecorder.finalize();  
    audioRecorder.close();  
    player[recordingId].loadSound(pt);  
    setupHold[recordingId]=false;  
    channelHasFile[recordingId]=true;  
    cout<< "File recorded channel " + ofToString(recordingId+1) + " file is called " + pt + "\n";  
}  
else {  
    cout << "Sorry track" + ofToString(recordingId+1) + "is not recording";  
}  

}

更新プロセスを中断しないように注意していますが、どこが間違っているのかわかりません。

どうもありがとう

4

2 に答える 2

1

歪みに対処するには、再生時に各チャンネルの音量を下げる必要があると思います。音量を最大音量の 1/8 に設定してみてください。クリッピングが発生していないため、サウンドの合計が 1.0f を超える場合、クリッピングが発生し、サウンドが悪くなります。

録音時のクロストークに対処するには: 出力で何らかのフィードバックが発生していると思います。つまり、おそらくオペレーティング システムによって、出力音が入力チャンネルにフィードバックされています。音を出す別のアプリを実行すると、録音でもそれが得られますか? もしそうなら、それはおそらくあなたの問題です。

1 つのチャンネルで動作する場合は、8 チャンネルまで直接ジャンプするのではなく、2 つだけで試してください。

一般に、再生/録音ロジックとサウンドプレーヤー/レコーダーを別のクラスに抽象化しようとします。そこにはいくつかのブール値があり、>1 のブール値で間違いを犯すのは本当に簡単です。ブール値を列挙型または整数の状態変数に置き換える方法はありますか?

于 2012-06-16T12:26:30.000 に答える