Commit Graph

77 Commits

Author SHA1 Message Date
3dtours 29206d62a3 fix(ai-copilot): tăng chiều cao prompt input rows=4 + resize-y, sửa ArrowUp/ArrowDown chỉ gọi history khi cursor ở đầu/cuối text 2026-07-27 16:16:26 +07:00
3dtours 57235e68d2 docs: wiki entry program_select fix 2026-07-27 16:16:00 +07:00
3dtours 15ec35d8d9 docs: wiki entry activeNotes array fix 2026-07-27 16:00:42 +07:00
3dtours 7a2ac3a851 docs: wiki entry multi-track ARM + activeNotes 2026-07-27 15:48:43 +07:00
3dtours ef1238b87d feat: migrate SpessaSynth → FluidSynth WASM (SF3 native, loop Gen 54 fix)
Replace SpessaSynth JS/AudioWorklet with FluidSynth C++ WASM
(@enikey87/fluidsynth-emscripten@0.1.1). CDN for dev, self-host
for prod. Fixes stuck Tremolo/Saxophone notes via compliant
Gen 44 loop mode processing. 100% audio parity with server
pyfluidsynth render (same C++ core).

- soundfontPlayer.js: FluidSynth WASM engine, preserve SonicSF API
- fluidsynthLoader.js: auto-select CDN (dev) vs self-host (prod)
- fluidsynth-bridge.js: PCM bridge AudioWorklet processor
- index.html: remove SpessaSynth importmap + module, add loader
- vendor/: libfluidsynth-2.3.0-sf3.js + .wasm (1.8MB self-host)
2026-07-27 12:48:30 +07:00
3dtours 18d2503cb9 fix: bypass SpessaSynth AudioWorklet MIDI pipeline for looped voice release
SpessaSynth 4.3.1 bug: looped voices (Tremolo Strings, Trumpet) ignore
release envelope + CC 120 when processed through MIDI message pipeline
(processMessage). Fix: send stopAll directly to worklet via
handleMessage post() bypass, plus noteOn(vel=0) as alternate note-off.
2026-07-27 12:27:51 +07:00
3dtours 187686aa82 chore: add wiki entry for CC120 fix 2026-07-27 12:12:15 +07:00
3dtours 9357e4fcc8 chore: add wiki log 2026-07-27 11:43:43 +07:00
3dtours 62ac2e2d88 chore: add wiki log 2026-07-27 11:22:01 +07:00
3dtours d5ef016d49 chore: add wiki log 2026-07-27 11:06:43 +07:00
3dtours 138d05698a chore: add wiki log 2026-07-27 10:12:59 +07:00
3dtours d18c0085b6 chore: add wiki log 2026-07-27 09:28:45 +07:00
3dtours 720d80dbf9 chore: add wiki log 2026-07-27 08:53:53 +07:00
3dtours bf0469558a chore: add wiki log 2026-07-27 08:41:48 +07:00
3dtours e739eb54bf chore: add wiki log 2026-07-27 08:25:58 +07:00
3dtours 6a409b954d chore: add wiki log 2026-07-27 08:21:26 +07:00
3dtours 5915049260 chore: add wiki log 2026-07-27 08:03:12 +07:00
3dtours e4dadb3158 chore: add wiki log 2026-07-26 22:03:56 +07:00
3dtours 3b6f1ad05a chore: add wiki log 2026-07-26 21:32:14 +07:00
3dtours 8155b4f2fa chore: add wiki log 2026-07-26 21:16:55 +07:00
3dtours 1daf355dd4 chore: add loop fix log 2026-07-26 21:03:24 +07:00
3dtours 87655f4275 chore: add timeline fix log 2026-07-26 20:47:28 +07:00
3dtours 63496f27f4 chore: add final wiki log 2026-07-26 20:17:04 +07:00
3dtours 0d1ef0f895 chore: add SpessaSynth fix log to wiki 2026-07-26 18:05:54 +07:00
3dtours 3d2930dca5 chore: add SF3+SpessaSynth log to wiki 2026-07-26 17:51:48 +07:00
3dtours bfd7146bfc chore: add fix log to wiki 2026-07-26 17:25:46 +07:00
3dtours 443e09b592 feat(midi): play selected instrument on armed main track via MIDI keyboard
When MIDI note-on received and no PIANO_ROLL sub-tab is armed,
fallback to armed track in main session. Read its synth_engine and
instrumentProgram to route audio through correct instrument.
Route to track gainNode if available.
2026-07-26 17:19:51 +07:00
3dtours 4ff2ce0b9c chore: add drum toggle log to wiki 2026-07-26 17:11:50 +07:00
3dtours 96aa76f194 chore: add fluidsynth fix log to wiki 2026-07-26 17:08:49 +07:00
3dtours 1059f67979 chore: add bugfix log to wiki 2026-07-26 17:00:36 +07:00
3dtours d48262d468 feat(engine): fix SF2 path resolution, add synth_engine struct and fallback chain
- Fix SF2 path: search upload dir, system dir, static dir (backward compat)
- Add synth_engine struct parsing with flat field fallback
- Add 3-level fallback: selected SF -> default SF -> oscillator synth
- Write synth_engine in setTrackInstrument UI setters
- Pass synth_engine context to client SoundFontPlayer and AI gateway
2026-07-26 16:49:40 +07:00
3dtours 2ab989132b fix(ui): wire Synth button to VST3 selection and render engine
- UI: setTrackInstrumentWithProgram stores instrumentId + enables MIDI type
- UI: SoundFont preset selection now passes soundfont_bank to server
- Server: render_engine reads instrument_id field (fallback instrument)
- Serialize/deserialize: soundfont_bank, soundfont_program preserved
- Rebuilt app.precompiled.js from app.jsx
2026-07-26 16:25:26 +07:00
3dtours f25a574126 build(docker): mount daw_assets host dirs into containers
- /home/locpham/daw_assets/vst3 -> /opt/daw_engine/vst3
- /home/locpham/daw_assets/soundfonts -> /opt/daw_engine/soundfonts
- /home/locpham/daw_assets/pianobook -> /opt/daw_engine/samples/pianobook
- Applied to web, worker, and beat services
2026-07-26 16:11:41 +07:00
3dtours 89c7237379 feat: add SoundFont inspection engine + AI instrument schema
- SoundFontInspector (sf2utils) scans .sf2, generates full/condensed catalog
- GET /api/v1/plugins/soundfonts/catalog with lazy init + cache invalidation
- AI tool generate_multitrack_midi now requires soundfont_id/bank/program
- Condensed catalog auto-injected into AI system prompt with bank rules
- Server render: FluidSynth program_select uses bank/program + channel routing (drums→ch9)
- VST3 pedalboard path inserts CC0 bank select + program change before notes
- DecentSamplerManager loads .dspreset with CWD fix for relative sample paths
- Pianobook render branch in render_engine.py
- Client SonicSF: controllerChange, programChange, applyAITrackInstrument
- Post-AI track creation applies instrument via applyAITrackInstrument
- Background cache rescan on .sf2 upload, frontend re-fetches catalog
- libcurl4 + VST3 dirs in Dockerfile
2026-07-26 12:36:48 +07:00
3dtours b1bbf567ab fix(piano-roll): seek-to-start restarts playback
- Add seekPlaybackTo(time) that stops, updates refs, reschedules
  MIDI, and restarts playback for both sub-tab and main timeline
- 'Quay lại đầu' and 'Đầu vùng chọn' buttons use seekPlaybackTo
2026-07-26 12:22:51 +07:00
3dtours b0d7f35a1e fix(piano-roll): loop only on btn + instant stop
- Sub-tab selection loop only active when st.isLooping is true
- End-of-playback loop uses st.isLooping, not global isLoopingSelection
- SonicSF.stopAll() sets gain 0 and stops oscillators immediately
2026-07-26 12:16:01 +07:00
3dtours 4e880850f5 fix(piano-roll): playhead seek + sound cracking
- Piano roll ruler click during playback now seeks and continues playing
- ADSR envelope uses linearRampToValueAtTime for crack-free release
- stopAll ramps gain to 0 in 20ms before stopping oscillators
2026-07-26 12:03:29 +07:00
3dtours 49c9f019db wiki: ruler range drag + SonicSF smooth stopAll 2026-07-26 11:42:17 +07:00
3dtours d3c28d2fa7 wiki: fix ruler click playhead 2026-07-26 11:37:00 +07:00
3dtours f7b499cda9 wiki: fix range auto-loop + gain fade-out 2026-07-26 11:34:08 +07:00
3dtours 724b42d506 wiki: fix realtime velocity + ruler restart 2026-07-26 11:28:54 +07:00
3dtours 7ede9bbf72 wiki: realtime velocity, ruler play, export MIDI 2026-07-26 11:20:25 +07:00
3dtours 6926c79357 wiki: instrument change loop fix 2026-07-26 11:10:41 +07:00
3dtours e57f6d96d9 fix: MIDI tab real-time instrument change - restart playback 2026-07-26 11:07:37 +07:00
3dtours 5b500ebdf3 fix: remove MIDI tab loop button + Ctrl+click clear range 2026-07-26 11:03:51 +07:00
3dtours 9438f44052 fix: CC note detection with Y-aware stem matching 2026-07-26 10:59:33 +07:00
3dtours 27d9556a9d fix: brush draw pitch revisit by comparing lastDrawnPitch 2026-07-26 10:55:21 +07:00
3dtours 034455598d fix: brush draw per-note duration with noteStartBeats tracking 2026-07-26 10:50:45 +07:00
3dtours 8450bd6de4 fix: brush draw only pitch change + CC velocity skip unchanged 2026-07-26 10:48:16 +07:00
3dtours d2993eee69 fix: brush drawing smooth - track pitch + beat delta 2026-07-26 10:44:37 +07:00