diff --git a/app/static/js/services/soundfontPlayer.js b/app/static/js/services/soundfontPlayer.js index 20ec72e..639a5e0 100644 --- a/app/static/js/services/soundfontPlayer.js +++ b/app/static/js/services/soundfontPlayer.js @@ -13,6 +13,7 @@ let _channels = Array.from({ length: 16 }, () => ({ bank: 0, program: 0, isPercussion: false })); let _nextMelodicChannel = 0; let _sustainStates = new Array(16).fill(false); + let _engineChMap = {}; let _leftBufPtr = null; let _rightBufPtr = null; let _renderTimer = null; @@ -229,6 +230,14 @@ var ok = await this.loadSoundFont(sfId); if (!ok) return; } + var engKey = (sfId || '') + ':' + bank + ':' + program; + if (!_engineChMap[engKey]) { + var allocCh = this.allocateChannel(bank); + _engineChMap[engKey] = allocCh; + channel = allocCh; + } else { + channel = _engineChMap[engKey]; + } try { _fluidModule._fluid_synth_bank_select(_synthPtr, channel, bank); } catch (e) {} @@ -278,9 +287,14 @@ bank = bank !== undefined ? bank : (synthEngine.soundfont_bank || 0); program = program !== undefined ? program : (synthEngine.soundfont_program || 0); } - var channel = this.allocateChannel(bank); - this.selectInstrument(channel, bank, program, synthEngine && synthEngine.soundfont_id); - return channel; + var sfId = synthEngine && synthEngine.soundfont_id; + var engKey = (sfId || '') + ':' + bank + ':' + program; + if (!_engineChMap[engKey]) { + var channel = this.allocateChannel(bank); + _engineChMap[engKey] = channel; + } + this.selectInstrument(_engineChMap[engKey], bank, program, sfId); + return _engineChMap[engKey]; }, getChannelState: function (channel) { @@ -342,11 +356,16 @@ var ch = channel; var usedBank = 0, usedProg = 0; if (synthEngine) { - if (ch === undefined) { - ch = synthEngine.soundfont_bank === 128 ? 9 : 0; - } usedBank = synthEngine.soundfont_bank || 0; usedProg = synthEngine.soundfont_program || 0; + var engKey = (synthEngine.soundfont_id || '') + ':' + usedBank + ':' + usedProg; + var mappedCh = _engineChMap[engKey]; + if (mappedCh !== undefined) { + ch = mappedCh; + } else if (ch === undefined) { + ch = usedBank === 128 ? 9 : 0; + } + if (ch === undefined) ch = (usedBank === 128 ? 9 : 0); try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); } catch (e) {} @@ -356,8 +375,9 @@ if (channel === undefined) channel = ch; } else if (program !== undefined) { usedProg = program; + if (ch === undefined) ch = 0; try { - _fluidModule._fluid_synth_program_change(_synthPtr, ch || 0, usedProg); + _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg); } catch (e) {} } if (ch === undefined) ch = (usedBank === 128 ? 9 : 0);