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中现在是受支持的