我想做一个小浏览器应用程序,它能够播放不同的音符。因此我将声音作为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()?
答案 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;
},