在decodeAudioData回调方法

时间:2015-07-31 21:01:52

标签: javascript callback web-audio

我想做一个小浏览器应用程序,它能够播放不同的音符。因此我将声音作为Base64编码的js-Variables。 现在我必须首先解码Base64然后解码mp3格式以使声音可用于App。 此外,我有一个名为'scale'的数据结构,它存储一个简单的c-Major标度:

scale = {
 'c': {
  color: 'red',
  name: 'C1'
 },
 'd': {
  color: 'darkorange',
  name: 'D1'
 },...

在goolge和一些教程的帮助下,我这样做了编码:

    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    var context = new AudioContext();

    for (var note in scale){
        var cNote  = MIDI["Soundfont"]["acoustic_grand_piano"][scale[note].name];
        if(cNote){
            var byteArray = Base64Binary.decodeArrayBuffer(cNote);
            context.decodeAudioData(byteArray, storeNote, function(err) { console.log("err(decodeAudioData): "+err); });    
        }
    }

    function storeNote(buffer){
        scale[note].buffer = buffer;
    }

显然,storeNote doenst中的调用正常工作,因为注释总是相同的。我想要像storeNote(缓冲区,注释)之类的东西。但是我可以在decodeAudioData中使用callback-Function而没有附加参数但是'buffer'。 现在的问题是:我如何将当前音符作为变量传递给storeNote()?

2 个答案:

答案 0 :(得分:1)

您可以将decodeAudioData移动到storeNote函数中并将注释作为参数传递。像这样:

    window.AudioContext = window.AudioContext || window.webkitAudioContext;
        var context = new AudioContext();

        for (var note in scale){
            storeNote(note)    
        }

        function storeNote(note){
            var cNote  = MIDI["Soundfont"]["acoustic_grand_piano"][scale[note].name];
            if(cNote){
                var byteArray = Base64Binary.decodeArrayBuffer(cNote);
                context.decodeAudioData(byteArray, function(buffer){
                    scale[note].buffer = buffer;
                }, 
                function(err) {         
                    console.log("err(decodeAudioData): "+err); });    
                }
            } 
        }

答案 1 :(得分:1)

            context.decodeAudioData(byteArray, function(buffer).bind(cNote){
                scale[this].buffer = buffer;
            },