在 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;
},
我想制作一个小的浏览器应用程序,它可以播放不同的音符。因此,我将声音作为 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;
},