好的,我希望我不会把它弄乱,我已经寻找了一些答案,但是找不到任何东西。我正在尝试使用3D模式下的FMOD声音播放器在openframeworks中制作一个简单的采样器。我可以使单个实例正常工作(使用libsndfilerecorder记录新文件,然后播放它并在环绕中移动它。

但是,我希望有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;
}

录制时,我卸载文件并确保未加载的播放器的位置没有更新。

无效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";
}

}

我小心不要中断更新过程,但看不到我要去哪里。

非常感谢

最佳答案

为了处理失真,我想您需要在播放时降低每个通道的音量,尝试将音量设置为最大音量的1/8。没有任何剪辑,因此如果声音总和> 1.0f,您将进行剪辑并且听起来很糟糕。

在录制时处理串扰:我想您会对输出进行某种反馈,即输出声音可能会由操作系统反馈到输入通道。如果您运行另一个可以发出声音的应用程序,那么您也可以在录音中得到声音吗?如果是这样,那可能是您的问题。

如果它仅可用于一个 channel ,请尝试仅2个,而不是直接跳至8个 channel 。

通常,我会尝试将播放/录音逻辑和soundPlayer /录音机抽象到一个单独的类中。您那里有几个 bool(boolean) 值,并且> 1 bool(boolean) 值很容易出错。有什么办法可以用枚举或整数状态变量替换 bool(boolean) 值?

关于audio - FMOD环绕声openframeworks,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10984145/

10-13 07:05