在 decodeAudioData 回调方法中存储缓冲区

Storing Buffers in decodeAudioData callback method

我想制作一个小的浏览器应用程序,它可以播放不同的音符。因此,我将声音作为 Base64 编码的 js 变量。 现在我必须先解码 Base64,然后再解码 mp3 格式,以使应用程序可以使用声音。 此外,我有一个名为 '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 内部的调用确实工作正常,因为 note 总是相同的。我想要像 storeNote(buffer, note) 这样的东西。但是,我可以只在 decodeAudioData 中使用回调函数,除了 'buffer' 之外没有其他参数。 现在的问题是:如何将当前笔记作为变量传递给 storeNote() ?

您可以将 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); });    
                }
            } 
        }
            context.decodeAudioData(byteArray, function(buffer).bind(cNote){
                scale[this].buffer = buffer;
            },