V45.12: fix SF preset wrong sau reopen (race C++ restore async ghi de program JS vua gui) - retry FORCE CC0/CC32/PROGRAM sau 1.5s/4s/8s qua cua so restore, bo dedupe v=202608311035
This commit is contained in:
+10
-2
@@ -73,7 +73,7 @@ const resolveTrackInstrumentCtx = (track, tracks) => {
|
||||
// note; reset khi load instrument mới). Dùng chung mọi đường: timeline,
|
||||
// preview, keybed. Trước đây bank hardcode 0 + preview/keybed KHÔNG gửi
|
||||
// program change → SF2 preset ở bank≠0 ra piano sai.
|
||||
window.__ensureBridgeProgram = (trkId, program, synthEngine) => {
|
||||
window.__ensureBridgeProgram = (trkId, program, synthEngine, force) => {
|
||||
try {
|
||||
if (!window.SonicMidiRouter || !window.SonicMidiRouter.isBridgeActive()) return;
|
||||
const _bank = synthEngine && synthEngine.soundfont_bank !== undefined ? synthEngine.soundfont_bank : 0;
|
||||
@@ -83,7 +83,7 @@ window.__ensureBridgeProgram = (trkId, program, synthEngine) => {
|
||||
if (_prog === undefined || _prog === null) return;
|
||||
const _key = trkId + ':' + _bank + ':' + _prog;
|
||||
const _lp = window.__bridgeLastProgram || (window.__bridgeLastProgram = {});
|
||||
if (_lp[_key]) return;
|
||||
if (!force && _lp[_key]) return;
|
||||
_lp[_key] = true;
|
||||
const _isPerc = _bank === 128;
|
||||
window.SonicMidiRouter.pushEvent({ cmd: 'CC', channel: trkId, pitch: 0, velocity: 0, data2: (_bank >> 7) & 0x7F, percussion: _isPerc });
|
||||
@@ -7576,6 +7576,14 @@ const preloadTrackInstruments = async (tracks) => {
|
||||
// __ensureBridgeProgram falls back to synth_engine.soundfont_program.
|
||||
if (typeof inst === 'string' && inst.startsWith('sf_')) {
|
||||
try { if (window.__ensureBridgeProgram) window.__ensureBridgeProgram(t.id || t.trackId, undefined, t.synth_engine); } catch (e) {}
|
||||
// V45.12: C++ restore (bridge_state.json) chạy ASYNC sau preload —
|
||||
// assign() + selectProgram(bank/program CŨ) ghi đè program JS vừa
|
||||
// gửi (race startup). Retry FORCE (bỏ dedupe) sau 1.5s/4s/8s để qua
|
||||
// cửa sổ restore, không spam mỗi note.
|
||||
if (t.synth_engine && t.synth_engine.soundfont_program !== undefined) {
|
||||
const _fire = () => { try { if (window.__ensureBridgeProgram) window.__ensureBridgeProgram(t.id || t.trackId, undefined, t.synth_engine, true); } catch (e) {} };
|
||||
[1500, 4000, 8000].forEach(ms => setTimeout(_fire, ms));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user