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; return false;
} }
}, },
selectInstrument: async function (channel, bank, program, sfId) { selectInstrument: async function (channel, bank, program, sfId) {
if (!_initialized || !_fluidModule) { if (!_initialized || !_fluidModule) {
var ctx = (typeof getAudioContext === 'function') ? getAudioContext() : new (window.AudioContext || window.webkitAudioContext)(); var ctx = (typeof getAudioContext === 'function') ? getAudioContext() : new (window.AudioContext || window.webkitAudioContext)();
@@ -269,6 +268,7 @@
_channels[channel].bank = bank; _channels[channel].bank = bank;
_channels[channel].program = program; _channels[channel].program = program;
_channels[channel].isPercussion = (bank === 128); _channels[channel].isPercussion = (bank === 128);
_channels[channel].sfId = sfId;
}, },
controllerChange: function (channel, controller, value) { controllerChange: function (channel, controller, value) {
@@ -407,22 +407,28 @@
var self = this; var self = this;
var doNote = function () { var doNote = function () {
try { 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 // Program change at note time, not call time — ensures correct
// instrument for each item regardless of processing order. // instrument for each item regardless of processing order.
if (synthEngine) { if (synthEngine || program !== undefined) {
var sfHandle = synthEngine.soundfont_id ? _sfHandleMap.get(synthEngine.soundfont_id) : undefined; var sfHandle = finalSfId ? _sfHandleMap.get(finalSfId) : undefined;
if (sfHandle !== undefined) { if (sfHandle !== undefined) {
try { try {
_fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, usedBank, usedProg); _fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, finalBank, finalProg);
} catch (e) {} } catch (e) {}
} else { } else {
try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); } catch (e) {} try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, finalBank); } catch (e) {}
try { _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg); } 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); console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel);
_fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel); _fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel);