nmeri17 Ответов: 0

Как мне ... как прикрепить звуковые эффекты к аудиобуферу


Я пытаюсь добавить следующие звуковые эффекты к некоторым аудиофайлам, а затем захватить их аудиобуферы и преобразовать в формат. 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());
        }

0 Ответов