Как мне ... как прикрепить звуковые эффекты к аудиобуферу
Я пытаюсь добавить следующие звуковые эффекты к некоторым аудиофайлам, а затем захватить их аудиобуферы и преобразовать в формат. mp3
- Исчезать-первый трек с альбома
- Затухание в следующих треках
- Фоновая дорожка (и сделайте ее фоновой, придав ей небольшой узел усиления)
- Еще один трек, который будет служить более слышимым из обоих Объединенных треков
- Затухание предыдущего трека и снова затухание первого трека
Я заметил, что эффекты, возвращаемые классом AudioParam, а также эффекты из интерфейса GainNode, прикрепляются к месту назначения контекста, а не к самому буферу. Есть ли способ закрепить значения экземпляра AudioParam (или свойство усиления) для буферов, чтобы, когда я объединяю их в один конечный буфер, они все еще могут сохранять эти эффекты? Или эти эффекты имеют значение только для пункта назначения (что означает, что я должен «подключиться» к исходному узлу) и выводить их через OfflineContexts / startRendering? Я пробовал этот метод ранее, и в моем последнем потоке мне сказали, что мне нужен только один BaseAudioContext, и это не обязательно должен быть OfflineContext. Я думаю, чтобы иметь различные эффекты для разных файлов, мне нужно несколько контекстов, поэтому я застрял в дилемме с различными AudioParams и GainNodes, но прямой неявный вызов их с помощью вызова start непреднамеренно потеряет свою силу.
Что я уже пробовал:
Следующие фрагменты демонстрируют эффекты, о которых я говорю, в то время как полный код можно найти по адресу https://jsfiddle.net/ka830Lqq/3/
var beginNodeGain = overallContext.createGain(); // Create a gain node beginNodeGain.gain.setValueAtTime(1.0, buffer.duration - 3); // make the volume high 3 secs before the end beginNodeGain.gain.exponentialRampToValueAtTime(0.01, buffer.duration); // reduce the volume to the minimum for the duration of expRampTime - setValTime i.e 3 // connect the AudioBufferSourceNode to the gainNode and the gainNode to the destination begin.connect(beginNodeGain);
Еще один фрагмент звучит так
function handleBg (bgBuff) { var bgContext = new OfflineAudioContext(bgBuff.numberOfChannels, finalBuff[0].length, bgBuff.sampleRate), // using a new context here so we can utilize its individual gains bgAudBuff = bgContext.createBuffer(bgBuff.numberOfChannels, finalBuff[0].length, bgBuff.sampleRate), bgGainNode = bgContext.createGain(), smoothTrans = new Float32Array(3); smoothTrans[0] = overallContext.currentTime; // should be 0, to usher it in but is actually between 5 and 6 smoothTrans[1] = 1.0; smoothTrans[2] = 0.4; // make it flow in the background bgGainNode.gain.setValueAtTime(0, 0); //currentTime here is 6.something-something bgGainNode.gain.setValueCurveAtTime(smoothTrans, 0, finalBuff.pop().duration); // start at `param 2` and last for `param 3` seconds. bgBuff.duration for (var channel = 0; channel < bgBuff.numberOfChannels; channel++) { for (var j = 0; j < finalBuff[0].length; j++) { var data = bgBuff.getChannelData(channel), loopBuff = bgAudBuff.getChannelData(channel), oldBuff = data[j] != void(0) ? data[j] : data[j - data.length]; loopBuff[j] = oldBuff; } } // instead of piping them to the output speakers, merge them mixArr.push(bgAudBuff); gottenBgBuff.then(handleBody()); }