From 64f43cd5ad26d480148431368b93e0230f3697b4 Mon Sep 17 00:00:00 2001 From: 3dtours Date: Thu, 30 Jul 2026 17:32:57 +0700 Subject: [PATCH] =?UTF-8?q?IMPROVE:=20cho=20ph=C3=A9p=20thay=20=C4=91?= =?UTF-8?q?=E1=BB=95i=20instrument=20realtime=20khi=20=C4=91ang=20playback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/js/services/soundfontPlayer.js | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/static/js/services/soundfontPlayer.js b/app/static/js/services/soundfontPlayer.js index bd5e7b4..c904a54 100644 --- a/app/static/js/services/soundfontPlayer.js +++ b/app/static/js/services/soundfontPlayer.js @@ -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);