diff --git a/app/static/js/services/soundfontPlayer.js b/app/static/js/services/soundfontPlayer.js index d976037..3dbea9b 100644 --- a/app/static/js/services/soundfontPlayer.js +++ b/app/static/js/services/soundfontPlayer.js @@ -321,9 +321,15 @@ if (channel < 0 || channel > 15) return; if (_initialized && _fluidModule) { var key = channel + ':' + pitch; - var mappedCh = _activeNotes[key]; - console.log("[SonicSF] stopNote ch:", channel, "pitch:", pitch, "key:", key, "mappedCh:", mappedCh, "activeKeys:", Object.keys(_activeNotes)); - if (mappedCh === undefined) mappedCh = channel; + var mappedChs = _activeNotes[key]; + if (mappedChs === undefined) { + if (_activeNotes['_' + key]) mappedChs = _activeNotes['_' + key]; + } + if (mappedChs === undefined) mappedChs = [channel]; + if (!Array.isArray(mappedChs)) mappedChs = [mappedChs]; + for (var i = 0; i < mappedChs.length; i++) { + try { _fluidModule._fluid_synth_noteoff(_synthPtr, mappedChs[i], pitch); } catch (e) {} + } delete _activeNotes[key]; try { var r1 = _fluidModule._fluid_synth_noteoff(_synthPtr, mappedCh, pitch); @@ -397,13 +403,19 @@ try { console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel); _fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel); - _activeNotes[(_origChannel !== undefined ? _origChannel : 0) + ':' + midiPitch] = ch; var noteMapKey = (_origChannel !== undefined ? _origChannel : 0) + ':' + midiPitch; + if (!_activeNotes[noteMapKey]) _activeNotes[noteMapKey] = []; + if (_activeNotes[noteMapKey].indexOf(ch) === -1) _activeNotes[noteMapKey].push(ch); if (durationMs > 0 && durationMs < 60000) { scheduledNote.off = setTimeout(function () { try { _fluidModule._fluid_synth_noteoff(_synthPtr, ch, midiPitch); - delete _activeNotes[(_origChannel !== undefined ? _origChannel : 0) + ':' + midiPitch]; + var arr = _activeNotes[noteMapKey]; + if (arr) { + var idx = arr.indexOf(ch); + if (idx >= 0) arr.splice(idx, 1); + if (arr.length === 0) delete _activeNotes[noteMapKey]; + } } catch (e) {} }, durSec * 1000); }