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 хотя бы. Я не знаком с другими браузерами, поддерживающими это свойство.