playRate на AUDIO и высоту звука

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

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

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

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

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

3 ответа

Решение

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

Но.

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

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

В настоящее время 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

Из вопроса отслеживания ошибок Mozilla о реализации PlayRate

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

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

Другие вопросы по тегам