好的,我希望我不要搞砸了,我已经寻找了一些答案,但找不到任何东西。我正在尝试在 3D 模式下使用 FMOD 声音播放器在 openframeworks 中制作一个简单的采样器。我可以使单个实例正常工作(使用 libsndfilerecorder 录制一个新文件,然后播放它并在环绕中移动它。
但是,我想要 8 层循环音频,我可以在现场表演中一次录制和替换一层。一旦我有超过 1 层,我就会遇到很多问题。
我的问题的第一部分与 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";
}
}
我小心不要中断更新过程,但我看不出哪里出错了。
非常感谢