IMPROVE: cho phép thay đổi instrument realtime khi đang playback

This commit is contained in:
2026-07-30 17:32:57 +07:00
parent 2fb70e2e11
commit 64f43cd5ad
+16 -10
View File
@@ -235,7 +235,6 @@
return false;
}
},
selectInstrument: async function (channel, bank, program, sfId) {
if (!_initialized || !_fluidModule) {
var ctx = (typeof getAudioContext === 'function') ? getAudioContext() : new (window.AudioContext || window.webkitAudioContext)();
@@ -269,6 +268,7 @@
_channels[channel].bank = bank;
_channels[channel].program = program;
_channels[channel].isPercussion = (bank === 128);
_channels[channel].sfId = sfId;
},
controllerChange: function (channel, controller, value) {
@@ -407,22 +407,28 @@
var self = this;
var doNote = function () {
try {
var finalBank = usedBank;
var finalProg = usedProg;
var finalSfId = synthEngine ? synthEngine.soundfont_id : undefined;
if (_channels[ch] && _channels[ch].program !== undefined) {
finalBank = _channels[ch].bank;
finalProg = _channels[ch].program;
if (_channels[ch].sfId !== undefined) {
finalSfId = _channels[ch].sfId;
}
}
// Program change at note time, not call time — ensures correct
// instrument for each item regardless of processing order.
if (synthEngine) {
var sfHandle = synthEngine.soundfont_id ? _sfHandleMap.get(synthEngine.soundfont_id) : undefined;
if (synthEngine || program !== undefined) {
var sfHandle = finalSfId ? _sfHandleMap.get(finalSfId) : undefined;
if (sfHandle !== undefined) {
try {
_fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, usedBank, usedProg);
_fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, finalBank, finalProg);
} catch (e) {}
} else {
try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); } catch (e) {}
try { _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg); } catch (e) {}
try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, finalBank); } catch (e) {}
try { _fluidModule._fluid_synth_program_change(_synthPtr, ch, finalProg); } catch (e) {}
}
} else if (program !== undefined) {
try {
_fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg);
} catch (e) {}
}
console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel);
_fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel);