PlayRate на AUDIO и высоту звука - PullRequest
10 голосов
/ 25 января 2012

Немного предыстории:
Люди любят игры.
Люди пользуются Интернетом.
Интернету нужны игры.
Игры используют звук.
HTML5 имеет <audio>.

Хорошо, пока все хорошо.

Недавно я обнаружил - к моему удивлению - что IE9 на самом деле поддерживает воспроизведениеRate.Я охотно дал ему попробовать.Еще более удивительно, что это действительно сработало.Я попробовал то же самое в Chrome, и, хотя он работал, он ужасно раздражал, когда я установил 0.5.Я уже отказался от Firefox, потому что он не поддерживает MP3.

Двигаясь дальше, вот мой вопрос: и IE, и Chrome применяют коррекцию высоты тона при изменении воспроизведения.IE делает отличную работу, Chrome делает ужасную.В любом случае, я не хочу этого, я хочу звуки, чтобы изменить высоту тона.С такой мощью я могу удалить 650 файлов, которые мне пришлось генерировать процедурно, чтобы иметь альтернативную высоту звука, и у меня будет гораздо больше свободы в моих проектах.Черт, я мог бы даже сделать проигрыватель MOD-треков в HTML5 (за исключением канала Effects), если бы я действительно хотел.

Итак, есть ли в спецификации HTML5 что-нибудь, что позволяет мне отключать коррекцию высоты тона, и простоЗвук воспроизводился так, как если бы сэмплы были буквально растянуты или сжаты вместе?

Ответы [ 3 ]

6 голосов
/ 27 сентября 2012

Chrome в настоящее время поддерживает API-интерфейс Web Audio (http://www.w3.org/TR/webaudio/), в котором есть значение audioParam PlayRate, которое вы можете установить.Это не так просто, как тег <audio>, но допускает все виды интересных вещей.В настоящее время я использую его для воспроизведения искажений со сдвигом высоты тона / растяжением по времени.

Вот пример того, что вы можете сделать:

    //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
5 голосов
/ 21 июля 2012

Из проблемы с трекером ошибок Mozilla при реализации воспроизведенияRate

WebKit решает эту проблему, экспортируя дополнительный (с префиксом) атрибут «preservedPitch» (предложенный здесь для WhatWG: http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-July/021100.html)

Предположительно, вы можете установить для preservedPitch (webkitPreservedPitch для webkit) значение false, чтобы отключить эту функцию в Webkit по крайней мере. Я не знаком с другими браузерами, поддерживающими это свойство.

0 голосов
/ 25 января 2012

Нет, в спецификации HTML5 нет ничего, что позволяло бы вам так точно настраивать звук.

Но.

Почему вы заботитесь о "мощи" и "свободе с проектами", когдавы уже ограничиваете себя, решив отказаться от Firefox?Кстати, Opera также не поддерживает MP3.

Если, конечно, это не личный проект, где никто, кроме вас, не будет его использовать, и, следовательно, это спорный вопрос.В этом случае, если вы хотите настроить таргетинг на Chrome, например, вы можете проверить Web Audio API , который может иметь то, что вы хотите.

...