3dtours
fdaabe3a08
feat: Media Explorer panel (F6) với mutual exclusion Mixer (F7)
2026-07-31 11:59:20 +07:00
3dtours
2c2ee59d7d
fix: bump soundfontPlayer cache version
2026-07-31 10:52:35 +07:00
3dtours
c60803ee2a
fix: bump precompiled cache version for piano roll split fix
2026-07-31 08:10:06 +07:00
3dtours
ca34a496eb
fix: force piano roll grid redraw on snap change via renderTick
...
snapVal already in useLayoutEffect deps. Added renderTick
counter bumped in onChange to guarantee canvas redraw.
2026-07-30 21:32:45 +07:00
3dtours
e76a6df86b
chore: bump precompiled cache version
2026-07-30 21:29:22 +07:00
3dtours
bbd06f23d5
FEAT: thay đổi UI của mixer panel
2026-07-30 14:52:57 +07:00
3dtours
b67c0264fb
feat(mixer): Master + Track Strip Console per specs 47/48
2026-07-30 12:55:35 +07:00
3dtours
74597cfe8b
feat(mixer): install Master Strip Console per spec 47
2026-07-30 12:47:10 +07:00
3dtours
4cead1010e
FEAT: thêm tính năng hiển thị ở master track
2026-07-29 22:13:54 +07:00
3dtours
7b5d4bf27a
FEAT: thêm tính năng MasteringModules Modal
2026-07-29 22:03:20 +07:00
3dtours
47af85c072
FIX: sửa UNDO/REDO bị lỗi màn hình đen
2026-07-29 18:19:02 +07:00
3dtours
2eb327056d
fix: MIDI Rearrange — selected item triggers dedicated tool flow
...
- midiExtractor.js: extractSelectedMIDIContext with note name conversion
- aiGateway.js: REARRANGE_TOOL_SPEC + buildRearrangeMessage
- dawCommandDispatcher.js: register REARRANGE_MIDI_MELODY command
- app.jsx: handleAISend detects selected MIDI item → rearrange flow
- rearrangeMidiMelody handler places A/B track below source track
2026-07-28 10:54:35 +07:00
3dtours
421535ca0e
feat: AI MIDI Prompt Template & Preset Engine
...
- promptTemplateManager.js: standalone service with keyword scoring, CRUD, fav toggle
- ai_presets.py: backend CRUD router (JSON file, auth isolation)
- AIPresetModal: PromptTemplateManager, star/fav column, backend API sync
- Piano Roll AI: preset matching support
- 7 tests: matching, CRUD, anonymous auth, user isolation
2026-07-28 10:42:30 +07:00
3dtours
b42190e6bc
feat: implement md/41_INSTRUMENT.md spec
...
- PianoRollTabService: getParentTrackByItemId, buildActiveScope,
getTrackMidiChannel helpers
- parent_track_id on all MIDI items for reverse track lookup
- handleSwitchMidiItem uses active_scope pattern
- Toolbar shows parent track context labels
- Channel assignment simplified to trackIndex % 16
- All playNote calls use unified getTrackMidiChannel
2026-07-27 20:48:14 +07:00
3dtours
035d75e504
feat(piano-roll): ghost notes + dropdown item switcher + session sync
...
- MIDI ghost notes: all non-selected items rendered at 25% opacity
- Dropdown at tab title: switch active edit target across all tracks
- Session Sync mode (default): viewport aligned to session bars
- Isolated mode toggle: bar 0, no ghost notes
- Ghost toggle: show/hide ghost layer (only in session mode)
- Auto-scroll to session position in session sync mode
- Bar labels show absolute session bar numbers
2026-07-27 17:08:59 +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
981a184176
chore: bump cache version to force browser refresh
2026-07-27 10:18:34 +07:00
3dtours
4064b90874
chore: bump JS cache version to force browser refresh
2026-07-26 19:47:50 +07:00
3dtours
6a2522d039
fix: correct importmap path for spessasynth_core main entry
2026-07-26 18:56:26 +07:00
3dtours
263c4be409
fix: use importmap to resolve spessasynth_core bare import
...
- Add importmap in index.html to map spessasynth_core to CDN URL
- Load spessasynth_lib from CDN directly (with importmap resolving deps)
- WorkerSynthesizer fallback also uses CDN import
- Ensures library and processor use same spessasynth_core version
2026-07-26 18:55:08 +07:00
3dtours
4d42b8407c
fix: serve SpessaSynth processor locally to avoid CDN version mismatch
...
- Download spessasynth_processor.min.js from CDN, serve as static file
- Change __SpessaSynthCDN to /static/js/services/
- Fix version mismatch between esm.sh library and CDN processor
2026-07-26 18:47:32 +07:00
3dtours
09def59cac
fix: use esm.sh CDN to resolve spessasynth_core bare import
...
- jdelivr raw index.js has bare import 'spessasynth_core' which browser can't resolve
- esm.sh automatically rewrites bare imports to full URLs
- Keep jdelivr for worklet processor (self-contained, no imports)
- WorkerSynthesizer fallback also uses esm.sh
2026-07-26 18:09:12 +07:00
3dtours
0271be4484
fix: SpessaSynth CDN URL + AudioWorklet init flow
...
- Fix CDN URL: spessasynth_lib@4.3.1/dist/index.js (was @latest with wrong path)
- Use WorkletSynthesizer instead of Synthesizer (correct class name)
- Add audioWorklet.addModule() for processor CDN URL
- Await synth.isReady before use
- Use soundBankManager.addSoundBank() (correct API)
- Fallback to WorkerSynthesizer if AudioWorklet fails
2026-07-26 18:05:44 +07:00
3dtours
e51b7fd355
feat: SF3 conversion + SpessaSynth client player
...
Server:
- soundfont_converter.py: Python SF2->SF3 via ffmpeg Ogg compression
- batch_convert_all runs on startup (daemon thread)
- GET /soundfonts/download/{sf_id} serves SF3 with SF2 fallback
- Dockerfile: add fluidsynth, vorbis-tools
Client:
- soundfontStorage.js: IndexedDB cache for SF3 buffers
- soundfontPlayer.js: dual-mode (SpessaSynth + oscillator fallback)
- app.jsx: init SpessaSynth, loadSF on instrument select
- index.html: SpessaSynth CDN import + storage script tag
Compression: DSK 11M->1.1M (90%), SGM 529M->18M (97%)
2026-07-26 17:51:37 +07:00
3dtours
17a284ad17
feat: bổ sung phần section-item và section tab
2026-07-24 17:00:22 +07:00
3dtours
6a17e7036c
fix: nhãn của soundfont hiển thị sai và không load được instrument
2026-07-23 22:32:19 +07:00
3dtours
1a28ebabee
fix: piano roll và main session play
2026-07-23 21:05:26 +07:00
3dtours
f0210dd019
fix: main session có thể play midi item
2026-07-23 20:52:50 +07:00
3dtours
dac661e6c6
fix: piano roll tab có thể play với soundfont
2026-07-23 20:34:52 +07:00
3dtours
a21266736c
fix: synth để gắn soundfont cho midi
2026-07-23 19:26:26 +07:00
3dtours
055f351a17
fix: sửa lỗi cho AI thực hiện tạo MIDI
2026-07-23 18:19:12 +07:00
3dtours
225f23516f
feat: thêm soundfont và VSTi cho MIDI
2026-07-23 17:47:46 +07:00
3dtours
b460d40824
fix: lỗi ghi note midi vào track
2026-07-23 16:07:40 +07:00
3dtours
92877d02b7
feat: bổ sung phần record MIDI
2026-07-23 11:01:22 +07:00
3dtours
022fbb3351
fix: đã sửa lỗi AI gửi prompt và thêm các tool để AI thực hiện
2026-07-22 09:23:05 +07:00
3dtours
04403b0af7
fix tạm lỗi cài đặt AI prompt
2026-07-21 21:38:37 +07:00
3dtours
ffdb4806f8
fix: zoom in lỗi nền trắng
2026-07-20 22:49:43 +07:00
3dtours
83dc97e788
fix: some bugs
2026-07-20 20:22:48 +07:00
3dtours
98af980a41
fix: double click to edit crash
2026-07-20 20:06:06 +07:00
3dtours
f123199855
fix: double click to edit crash
2026-07-20 20:00:58 +07:00
3dtours
f616e1fd70
fix: time selection click and shiftclick
2026-07-20 19:45:48 +07:00
3dtours
85a8dc6d17
fix: time selection click and shiftclick
2026-07-20 19:44:23 +07:00
3dtours
271f0583f4
fix: time selection show handles
2026-07-20 16:25:46 +07:00
3dtours
9e936144e1
feat: xử lí track/clip với AI
2026-07-20 15:36:28 +07:00
3dtours
2a44b81cf5
fix: cannot login with default password
2026-07-20 11:50:07 +07:00
3dtours
f3f1292aa4
fix: cannot login with default password
2026-07-20 11:30:25 +07:00
3dtours
c8ebdb50b0
fix: refactor
2026-07-20 10:39:07 +07:00
3dtours
3c77e98956
fix: hiển thị thời gian trên timeline theo 0.00s
2026-07-19 22:34:46 +07:00
3dtours
7d9267d175
fix: TCP của subtab
2026-07-19 21:58:16 +07:00