2012-01-25 24 views
9

Poco de fondo:
La gente le gusta los juegos.
La gente usa internet.
Internet necesita juegos.
Los juegos usan sonido.
HTML5 tiene <audio>.playbackRate en AUDIO y tono

De acuerdo, todo bien hasta ahora.

Recientemente descubrí, para mi sorpresa, que IE9 realmente admite playbackRate. Yo ansiosamente lo intenté. Aún más sorprendente, realmente funcionó. Intenté lo mismo en Chrome, y aunque funcionó fue horriblemente irritante cuando lo configuré en 0.5. Ya he abandonado Firefox porque no es compatible con MP3.

Pasando, esta es mi pregunta: tanto IE como Chrome aplican la corrección de tono al cambiar la velocidad de reproducción. IE hace un gran trabajo, Chrome hace uno horrible. De cualquier manera, no quiero esto, I quiero los sonidos para cambiar el tono. Con ese tipo de poder puedo eliminar 650 archivos que tuve que generar proceduralmente para tener un tono alternativo, y tendré mucha más libertad con mis proyectos. Diablos, incluso podría hacer un reproductor de pistas MOD en HTML5 (menos el canal de Efectos) si realmente quisiera.

Entonces, ¿hay algo en la especificación de HTML5 que me permita desactivar la corrección de tono, y simplemente hacer que el sonido se reproduzca como si las muestras se hubiesen estirado o comprimido literalmente?

+4

pregunta seriamente detallado: D – Lloyd

+0

Ha comprobado la API HTML5 Aduio? – LeeGee

Respuesta

0

No, actualmente no hay nada en la especificación HTML5 que le permita un ajuste tan preciso con el audio.

Pero.

¿Por qué te preocupas por el "poder" y la "libertad con los proyectos" cuando ya te estás limitando al decidir abandonar el Firefox? Por cierto, Opera tampoco es compatible con MP3.

A menos que sea un proyecto personal donde nadie más que usted lo utilizará y, por lo tanto, es un punto discutible. En ese caso, si desea orientarlo a Chrome, por ejemplo, puede consultar Web Audio API que podría tener algo que desee.

+0

Muy bien, gracias por la información. –

5

Desde el WebKit Mozilla bug tracker issue on implementing playbackRate

soluciona este problema al exportar un (prefijo) atributo adicional "preservesPitch" (propuesto al WhatWG aquí: http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-July/021100.html)

Es de suponer que se puede establecer preservesPitch (webkitPreservesPitch for webkit) a falso para desactivar esta función en Webkit al menos. No estoy familiarizado con otro soporte de navegador para esta propiedad.

+0

Esto es ahora compatible con FireFox por https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement – mysteryegg

6

Chrome actualmente es compatible con Web Audio API (http://www.w3.org/TR/webaudio/) que tiene un playbackRate audioParam que puede establecer. No es tan simple como la etiqueta <audio>, pero permite todo tipo de cosas interesantes. Actualmente lo estoy usando para jugar con la distorsión de desplazamiento de tono/estiramiento de tiempo.

He aquí un ejemplo de lo que podría hacer:

//build a request and fire it off 
    speedChanger.loader = (function(){ 

     var _request  = new XMLHttpRequest(), 

      _handleRequest = function(url){ 
      _request.open('GET',url,true); 
      _request.responseType = 'arraybuffer'; 
      _request.onload = function(){ 
       SpeedChanger.audioGraph.context.decodeAudioData(_request.response, function(buffer){ 
       _loadedBuffer = buffer; 
       SpeedChanger.audioGraph.setBuffer(buffer); 
       SpeedChanger.audioGraph.setBufferCache(buffer); 

       },function(){//error stuff}); 
      }; 
      _request.send(); 
      }; 

     _handleRequest("audio/file.mp3"); 

    }());//loader 

    grainTable.audioGraph = (function(){ 
    var _context = new webkitAudioContext(),   //this is the container for your entire audio graph 
     _source = _context.createBufferSource(),  //your buffer will sit here 
     _bufferCache,        //buffer needs to be re-initialized before every play, so we'll cache what we've loaded here 

     //for chaching/retrieving the buffer 
     _getBufferCache = function(){ 
      return _bufferCache; 
     }, 
     _setBufferCache = function(_sound){ 
      _bufferCache = _sound; 
     }, 

     //for setting the current instance of the buffer 
     _setBuffer = function(_sound){ 
      _source.buffer = _sound; 
     }, 

     _setPlaybackRate = function(rate){ 
      _source.playbackRate.value = rate; 
     }, 

     _setRate = function(myRate){ 
      _rate = myRate; 
     } 

     //play it 
     _playSound = function(){ 

      _source.noteOff(0);      //call noteOff to stop any instance already playing before we play ours 

      _source = _context.createBufferSource(); //init the source 
      _setBuffer(_bufferCache);     //re-set the buffer 

      _setPlaybackRate(_rate);     //here's your playBackRate check 

      _source.connect(_context.destination); //connect to the speakers 
      _source.noteOn(0);      //pass in 0 to play immediately 
     }, 

} 

    return{ 

     context  :_context, 
     setBuffer  :_setBuffer, 
     setBufferCache :_setBufferCache, 
     playSound  :_playSound, 
     setRate  :_setRate 

    } 

    }());//audioGraph 
+0

ningún progreso en su pitch-shifting/algo de estiramiento de tiempo? Solo puedo estirar el tiempo de una pista o tengo que fusionar varias pistas, pero eso no es ideal porque pierdo la capacidad de cambiar la ganancia en cada pista; También no puedo hacer una pausa o reanudar ... – Thomas

+0

He conseguido por el trabajo rastreado lado, por desgracia. Mi último intento fue utilizar varios delayNodes para tratar de volver a crear varios cabezales de cinta. Esto parecía estar eliminando algunos de los clics que estaba experimentando. Pero desafortunadamente el algoritmo está lejos de ser ideal en este punto. – joeLepper

+0

¿Ha intentado utilizar https://github.com/also/soundtouch-js – Thomas

Cuestiones relacionadas