Javascript 音频和音高上的播放速率
一点点背景:Javascript 音频和音高上的播放速率,javascript,html,html5-audio,pitch-shifting,Javascript,Html,Html5 Audio,Pitch Shifting,一点点背景: 人们喜欢游戏。 人们使用互联网。 互联网需要游戏。 游戏使用声音。 HTML5具有 好的,到目前为止一切都很好 最近我发现——让我惊讶的是——IE9实际上支持播放速率。我迫不及待地试一试。更令人惊讶的是,它确实起了作用。我在Chrome上也尝试了同样的方法,当我将它设置为0.5时,它会发出可怕的刺耳声音。我已经抛弃了Firefox,因为它不支持MP3 接下来,我的问题是:IE和Chrome在更改播放速率时都会应用音高校正。IE做得很好,Chrome做得很糟糕。不管怎样,我不想这样,
人们喜欢游戏。
人们使用互联网。
互联网需要游戏。
游戏使用声音。
HTML5具有
好的,到目前为止一切都很好
最近我发现——让我惊讶的是——IE9实际上支持播放速率。我迫不及待地试一试。更令人惊讶的是,它确实起了作用。我在Chrome上也尝试了同样的方法,当我将它设置为0.5
时,它会发出可怕的刺耳声音。我已经抛弃了Firefox,因为它不支持MP3
接下来,我的问题是:IE和Chrome在更改播放速率时都会应用音高校正。IE做得很好,Chrome做得很糟糕。不管怎样,我不想这样,我想让声音改变音调。有了这种能力,我可以删除650个文件,我必须按程序生成一个备用音高,并将有更多的自由与我的项目。见鬼,如果我真的想做的话,我甚至可以用HTML5制作一个MOD track播放器(不包括特效频道)
那么,HTML5规范中是否有任何内容允许我关闭音高校正功能,让声音播放时就像样本被拉伸或挤压在一起一样?不,HTML5规范中没有任何内容允许您对音频进行如此精细的调整 但是 当你已经决定放弃Firefox限制自己的时候,为什么还要关心“权力”和“项目自由”?顺便说一句,Opera也不支持MP3 当然,除非这是一个个人项目,除了你自己没有人会使用它,因此这是一个没有意义的观点。在这种情况下,如果您想以Chrome为目标,您可以查看可能有您想要的东西的 WebKit通过导出附加(前缀)属性来解决此问题 “保存Spitch”(向WhatWG提议: )
假设您可以将preservesPitch(webkitPreservesPitch for webkit)设置为false,以至少在webkit中关闭此功能。我不熟悉该属性的其他浏览器支持。Chrome当前支持Web Audio API(),该API具有可设置的播放速率audioParam。它不像
标记那样简单,但允许使用各种各样的酷东西。我现在用它来处理音高变换/时间拉伸失真
下面是一个您可以做的示例:
//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
严肃冗长的问题:你检查过HTML5 Aduio API吗?你的音高转换/时间拉伸算法有什么进展吗?我只能拉伸一条音轨,或者我必须合并多条音轨,但这并不理想,因为我失去了改变每条音轨增益的能力;而且,我不能暂停或继续……很遗憾,我的工作让我分心了。我最后一次尝试是使用多个delayNodes尝试并重新创建多个磁带头。这似乎消除了我所经历的一些点击。但不幸的是,目前的算法还远远不够理想。但这看起来很有希望。谢谢你的提示。我终于让它起作用了:不得不调整音效;我正在预渲染我的所有轨迹;使用脱机上下文和context.render函数。我仍然可以播放/暂停/停止/更改每个曲目的增益这在FireFox中现在是受支持的