好的,我希望我不会把它弄乱,我已经寻找了一些答案,但是找不到任何东西。我正在尝试使用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/