Хорошо, надеюсь, я не испортил это, я искал некоторые ответы, но ничего не нашел. Я пытаюсь сделать простой сэмплер в openframeworks, используя звуковой проигрыватель FMOD в 3D-режиме. Я могу заставить один экземпляр работать нормально (записать новый файл с помощью 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 recordId ){
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";
}
}
Я стараюсь не прерывать процесс обновления, но я не вижу, где я ошибаюсь.
Огромное спасибо