2015-06-17 5 views
19

Sto lavorando a un sequencer/tracker musicale basato sul Web e ho notato che nella mia routine di riproduzione di esempio, i contesti audio sembrano esistere solo per la durata di di un campione e che l'API Web Audio non sembra regolare la durata della riproduzione quando passo il pitch di un campione. Ad esempio, se sposto una nota in giù di un'ottava, la routine suona solo la prima metà del suono prima di tagliare. I downshift con pitch più intensi producono anche meno suono, e mentre non sono sicuro di poterlo confermare, sospetto che l'accelerazione dei risultati audio in periodi relativamente lunghi di silenzio prima che il suono esca dal buffer.HTML5 Web Audio - La riproduzione audio rallentata si interrompe presto

Ecco la mia routine di riproduzione audio al momento. Finora, è stato fatto molto più lavoro per assicurarsi che altre funzioni inviino i dati giusti a questo piuttosto che all'estensione della funzionalità di questa routine.

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(); 
} 

Il mio intento è quello per i campioni di riprodurre completamente non importa quanto spostamento passo viene applicato, e di limitare la quantità di Pitch Shifting consentito, se necessario. Ho scoperto che l'aggiunta di diversi secondi di silenzio a un suono funziona attorno a questo problema, ma è ingombrante a causa della grande quantità di suoni che avrei bisogno di elaborare, e preferirei una soluzione basata su codice.

MODIFICA: tra i browser posso verificarlo, questo sembra essere un problema in Google Chrome. I campioni vengono riprodotti completamente in Firefox, Internet Explorer non supporta ancora l'API Web Audio e non ho un accesso rapido a Safari o Opera. Questo sicuramente cambia la natura dell'aiuto che sto cercando.

+0

Avete un esempio ospitato di questo evento? È certamente vero che la modifica della velocità di riproduzione non dovrebbe modificare il suono fino al completamento, ma senza vederlo in azione non riesco a eseguire il debug. – cwilso

+0

Questa routine fa parte di un programma chiamato Tracker2D, disponibile su http://gabekagan.github.io/Tracker2D/. Recentemente ho scoperto che il bug non sembra accadere in Firefox. A quanto pare, mi sono perso perché per la maggior parte sono stato sviluppato in Chrome e modificherò la domanda originale per indicarlo. –

+0

Ti suggerisco di ricontrollare se questo appare nell'ultima versione di Chromium ogni sera e di segnalare un bug nel tracker dei problemi di Chromium https://code.google.com/p/chromium/issues/list –

risposta

1

Ho riscontrato che l'aggiunta di alcuni secondi di silenzio a un suono risolve questo problema, ma è ingombrante a causa della grande quantità di suoni che avrei bisogno di elaborare, e preferirei una soluzione basata su codice .

È possibile caricare un file audio che è solo alcuni secondi di silenzio e aggiungerlo al file audio effettivo. Here è una risposta SO che mostra come eseguire questa operazione ...