Spaces:
Sleeping
Sleeping
Commit History
-
feat(player): forward MIDI control-change events to FluidSynth
score-player now dispatches 'controller' events to the audio backend, and LilyFluidAudio.controlChange forwards them to FluidSynth's sequencer so sustain pedal (CC64), volume (CC7), pan, expression, etc. play back instead of being dropped. stopAllNotes also lifts the hold pedals (CC64/66/67) on every channel before silencing, so a pedal-down whose pedal-off was dropped from the look-ahead window (removeAllEvents on stop/seek) can't leave notes hanging forever.e805c10
-
added assets loading retry UI.
b48cc75
-
fixed sound library loading issue.
2a7be55 -
added URL hash for loaded score file.
3225df7 -
player: FluidSynth (GM soundfont) audio backend with piano fallback
Replace the single-piano MIDI.js soundfont with FluidSynth (js-synthesizer WASM) playing a 128-instrument General MIDI gm.sf3, so each MIDI program sounds with its own timbre instead of everything-as-piano. The legacy grand-piano soundfont stays as an immediate fallback while the ~40MB GM font downloads, then FluidSynth takes over transparently. - web/fluid-audio.js: vanilla-JS port of live-editor's fluidAudio.ts, window.LilyFluidAudio (init/loadPlugin/resume/noteOn/noteOff/ programChange/stopAllNotes), routing to FluidSynth's Sequencer with the legacy MidiAudio piano as fallback. - web/fluid/, web/vendor/js-synthesizer.min.js, web/soundfont/gm.sf3: vendored FluidSynth runtime + GM soundfont (LFS). - score-player.js: initAudio drives LilyFluidAudio; reports ready as soon as any backend is audible; play() resume()s the AudioContext. Adds a sound-library status badge (pulsing while loading, steady green when ready). - app.py: build_head injects js-synthesizer + fluid-audio…78f88e1