tag play javascript html5 audio web-audio

javascript - play - HTML5 Web Audio-La reproducción de audio ralentizada se corta antes



play() javascript (1)

Descubrí que agregar varios segundos de silencio a un sonido funciona en torno a este problema, pero es incómodo debido a la gran cantidad de sonidos que necesitaría procesar y preferiría una solución basada en código.

Puede cargar un archivo de sonido que esté a solo unos segundos de silencio y adjuntarlo al archivo de audio real. Here hay una respuesta SO que muestra cómo hacer esto ...

Estoy trabajando en un secuenciador / rastreador de música basado en la web, y he notado que en mi rutina de reproducción de muestra, los contextos de audio parecen existir solo durante la duración de una muestra, y que la API de audio web no parece para ajustar la duración de la reproducción cuando cambio de tono una muestra. Por ejemplo, si cambio una nota una octava, la rutina solo reproduce la primera mitad del sonido antes de cortar. Los cambios descendentes de tono más intensos hacen que el sonido se reproduzca incluso menos, y aunque no estoy seguro de poder confirmarlo, sospecho que acelerar los resultados de audio en períodos de silencio relativamente largos antes de que el sonido salga del búfer.

Aquí está mi rutina de reproducción de audio en este momento. Hasta ahora, se ha trabajado mucho para asegurarse de que otras funciones envíen los datos correctos a esto que para extender la funcionalidad de esta rutina.

function playSound(buffer, pitch, dspEffect, dspValue, volume) { var source = audioEngine.createBufferSource(); source.buffer = buffer; source.playbackRate.value = pitch; // Volume adjustment is handled before other DSP effects are added. var volumeAdjustment = audioEngine.createGain(); source.connect(volumeAdjustment); // Very basic error trapping in case of bad volume input. if(volume >= 0 && volume <= 1) { volumeAdjustment.gain.value = volume; } else { volumeAdjustment.gain.value = 0.6; } switch(dspEffect){ case ''lowpass'': var createLowPass = audioEngine.createBiquadFilter(); volumeAdjustment.connect(createLowPass); createLowPass.connect(audioEngine.destination); createLowPass.type = ''lowpass''; createLowPass.frequency.value = dspValue; break; // There are a couple of other optional DSP effects, // but so far they all operate in about the same fashion. } source.start(); }

Mi intención es que las muestras se reproduzcan completamente sin importar cuánto cambio de tono se aplique, y limitar la cantidad de cambio de tono permitido si es necesario. Descubrí que agregar varios segundos de silencio a un sonido funciona en torno a este problema, pero es incómodo debido a la gran cantidad de sonidos que necesitaría procesar y preferiría una solución basada en código.

EDITAR: De los navegadores en los que puedo probar esto, esto solo parece ser un problema en Google Chrome. Las muestras se reproducen completamente en Firefox, Internet Explorer aún no es compatible con la API de audio web, y no tengo acceso a Safari u Opera. Esto definitivamente cambia la naturaleza de la ayuda que estoy buscando.