Commit Graph

698 Commits

Author SHA1 Message Date
admin 59e4951912 fix(fxrt): toggle VST bypass khong reload plugin - cache instance trong bridge, chain giu slot bypassed, bypass state trong chainKey, poll 100ms + fade-in 512 samples che gap latency 2026-08-24 16:56:10 +07:00
admin 3a3f46b7d3 fix(fxrt): mo GUI VST khong gay crackle - GUI spawn BELOW_NORMAL, mien watchdog khi mo native GUI, realtime loop ABOVE_NORMAL 2026-08-24 16:38:52 +07:00
admin 9137e7e276 fix(fxrt): giu session realtime khi loop/seek/reschedule - het bypass+reload moi pass loop
- fxRtKeepForRestart flag: nhánh restart/resume (loop selection/project-end,
  sub-tab loop, reschedule items, seek, solo toggle, piano-roll seek, export
  rewind, unmute, playhead, tab-switch resume, ghost play) set flag truoc
  stopAllPlayback -> giu session FX (fxRtStart early-return) -> khong reload
  VST ~4s moi pass loop.
- User stop thật (fade=true), bridge-down, new project, recovery rebuild,
  export end, offline export: khong set flag -> teardown nhu cu.
- Rebuild app.precompiled.js tu source (babel) + giu lai IIFE overlay telemetry.
- Bump cache-buster 202608242200 -> 202608242300 (5 ban).
2026-08-24 15:54:13 +07:00
admin 348079ceae fix(fxrt): doc stats tu fxRt const global, khong phai window.fxRt 2026-08-24 15:40:49 +07:00
admin 69bb449958 feat(fxrt): hien thi telemetry stats tren UI (vi WebView2 khong mo devtools) 2026-08-24 15:35:16 +07:00
admin 559d52e3c5 fix(fxrt): bo pace setTimeout input, gui ngay theo dong ho audio worklet (het crackle sau 3-4s khi chain rong) 2026-08-24 15:28:41 +07:00
admin 272382f73c fix(fxrt): tang cushion worklet 128->256ms + telemetry underrun (giam crackle do main-thread stall) 2026-08-24 15:20:26 +07:00
admin 09d8a386fb fix(fxrt): resume sau long stall phai fade-in (het click), khong hold khi da im lang 2026-08-24 12:25:13 +07:00
admin 5ca2027966 fix(fxrt): underrun xu ly o worklet (hold+fade), bo fade engine, fix wet bus
- sf-fx-realtime.js: underrun -> hold block cuoi (HOLD) roi fade-out 4 block ~21ms
  gain 1->0 truoc khi im lang (het click cat cung khi main-thread stall chan ca
  2 huong - engine khong the gui fade toi kip); resume giua fade -> fade-in nhanh
- plugins.py: bo fade-out/fade-in engine (den tre vo dung + fade-in sau stall tao
  dip dinh ky = vibrato/wow&flutter), giu to_thread(time.sleep) poll 2ms
- app.jsx/precompiled/index.html: fix master wet bus (no dry lai) + latency const
  FX_RT_ROUNDTRIP_SAMPLES + bump worklet cache-buster v=202608241800
- fxrt_ws_probe.py: consumer stall (mo hinh dung app that), WorkletSim holdfade mode

Probe consumer-stall (app that): light 5/5 hard click 0.245-0.285 -> hard=0;
heavy: recv=sent (het fade thua), hard=0
2026-08-24 11:19:56 +07:00
admin 708e7de32b fix(audio): offline mix limiter -3dBFS, 2-stage normalize (-14 LUFS + hard peak -1 dBTP), OGG export 2026-08-24 09:10:00 +07:00
admin 10997a65b9 fix(fx-rt): het crackle master FX - limiter attack smooth + crossfade khi bat/tat chain
- NativeInstrumentEngine: kAttack 0.9->0.1 (het zipper khi sum nhieu track)
- app.jsx: crossfade masterFxDryGain/masterFxGain thay hard-rewire graph luc
  activation/deactivation master chain FX; worklet bao 'started' -> ramp dung
  luc; PDC tre sau khi dry silent (tranh gap 80ms)
- sf-fx-realtime.js: fade-in 512 mau luc FILL xong / resume sau underrun
- index.html + addModule: cache-buster v=202608241200
- rebuild app.precompiled.js, copy bundle vao dist/ + src-tauri/resources/
- keo dai fix cac round truoc: FILL 16, FXRT_BURST_MS, REBUFFER, pacing,
  VST GUI click/focus, solo crackle
- them harness + plans/patch scripts
2026-08-24 07:46:09 +07:00
admin 2ad833fbe7 fix(masterfx): merge captured preset vao realtime chain 2026-08-23 16:47:35 +07:00
admin 6edfe1db32 fix(fx-rt): het crackle master FX - engine gui block ASAP + worklet FILL buffer 8
_pump_output bo pace realtime (truoc: moi block send cach nhau block_sec lam
client queue ~1 -> jitter bridge/WS/GC -> queue can -> zero-fill crackle).
Gio gui het burst ASAP; worklet sf-fx-realtime them FILL=8: chi phat khi
outQueue >= 8 block, underrun -> re-buffer (im lang cho du FILL) thay vi
zero-fill lien tuc. Cap 32 giu nguyen. PDC: FX_RT_ROUNDTRIP_SAMPLES 1792->3840
(RTT ~7 block + FILL 8 block = 15 block @48k) de dry-bypass path khong lech
pha voi mastered. Cache-buster v=202608212401 (precompiled + worklet).
Rebuild PyInstaller + copy 3 noi deploy. Verify: probe crackle3 25s Ozone
rebuffer_events=0 (zero_fill 12 block = startup fill), picker UI PASS (59 VST).
2026-08-23 12:50:11 +07:00
admin 9bb9a234b0 feat(rt+auth): batched input publish boi so 4 (het crackle) + auto-login loopback khong can mat khau
- fx_realtime: write_input gom FXRT_IN_SLOTS(4) frame vao _in_pending, flush
  ghi 1 lan + h.in_write += n (publish atomic -> bridge take=4 luon, het deficit)
- plugins pump: flush_input_stale(0.004) dau vong lap -> input le khong ket
- auth: _is_loopback(127.*/::1/localhost) -> get_current_user khong token = admin
  tu DB (must_change_password=False); POST /auth/local auto-login loopback, LAN 403
- ws fx-realtime: loopback khong token cho phep, remote thieu token -> close 4401
- UI: checkAuthStatus khong savedToken -> thu localLogin, thanh cong vao DAW,
  that bai -> modal login nhu cu; cache-buster v=202608212400
2026-08-23 12:00:05 +07:00
admin 0acc3ee7ee fix(fx-rt): burst 4-block input batch qua bridge — hết lag/giật/crackle master FX
- worklet gom 1024 mẫu (4 block) vào 1 frame interleaved, main thread tách 4 WS frame 512 floats
- bridge take=min(avail,4) xử lí 1 call process cho burst → overhead VST3 amortize 4 lần
- engine _pump_output pace theo deadline thay vì sleep cố định (outRead 131→187.5/s)
- FX_RT_ROUNDTRIP_SAMPLES 512→1792 (RTT batching ~7 block)
2026-08-23 11:44:54 +07:00
admin a105bdb959 Fix: master FX chain khong xu ly sau khi load project — deserialize composite master.bypass thanh vstBypass=true loai het VST3 khoi fxRtChain (chain=[] → fxRtStart early-return → masterBus pass-through, offline export cung tat). Deserializer gio hardcode vstBypass=false (khong co UI nao set flag nay cho master; chi ton tai tu bug deserialize). Build lai app.precompiled.js + copy 3 ban deploy + cache-buster moi. Verify UI: LOADED vstBypass=false, chain VST3 Ozone giu, fxRtChainLen=1; play → fxRt.active=true ws OPEN inQueue=64; DB save moi master.bypass=false. 2026-08-23 10:44:28 +07:00
admin 1d4ff1282b Gap 13: BWF/INFO metadata cho WAV export — wav_bwf.patch_bwf_metadata chen bext + LIST/INFO (INAM/IART/ISRC/ICMT) truoc data chunk, giu nguyen PCM bits; render_project(metadata=) + RenderRequest.metadata + cloud render task; ExportModal Title/Artist/ISRC; test_66 (178 passed) 2026-08-23 09:11:18 +07:00
admin 94a0bc7401 Gap 7: master volume automation lane — render_engine automation.volume_db (dB interp -30..+3 sau fader truoc normalize), schema master.automation, UI AUTOM panel MasterStripConsole + realtime scheduling tren masterBus.output.gain (play/seek/stop), serialize/parse, test_65 (177 passed) 2026-08-23 09:05:39 +07:00
admin 6b2c9a039b Gap 8: PDC realtime — WS latency push + dry-path delay compensation
Backend: /ws/fx-realtime pump drain get_latencies (SHM ring, bridge da bao REPORT_LATENCY) -> push {cmd:'latency',total,latencies} khi tong doi. Frontend: pdcDelay (DelayNode) giua dryOutput->output bu delay master chain (round-trip 2 block + latency VST3), fxRtApplyPdc cap nhat tu WS frame, reset khi chain off. Test test_63 fake session 1024 -> frame total 1024; full 175 passed.
2026-08-23 08:44:54 +07:00
admin db12698ba2 Gap 11: A/B reference track — /reference-analyze LUFS/dBTP/centroid + RefCompareModal A/B listen (5 test, 174 passed) 2026-08-23 08:34:09 +07:00
admin 3ad379f0ba Gap 10: multiband compressor + de-esser (LR4 crossover, UI, test_62) 2026-08-23 08:25:07 +07:00
admin 5d37c0683b D3+D4: export stage PCM16/24 + TPDF dither + noise shaping, resample 44.1/48/96k, normalize -1dBTP/-14LUFS, mono side/mid check; Export modal mastering options + /plugins/render options (test 9 case, 23 passed) 2026-08-23 07:47:27 +07:00
admin 17e22bcf32 D2: LimiterFx brickwall — lookahead 1-5ms + oversample 4x + hard clip, UI toggle SOFT/BRICKWALL + LOOKAHEAD ms 2026-08-23 07:23:52 +07:00
admin 2a5e2af04a master strip: L/R volume + LINK + MUTE that, bo soloBtn 2026-08-22 21:41:54 +07:00
admin c3aba40ffe Phase 4+5: WebAudio I/O shim + verify DAW checklist — live=export, order, fader, PDC, smoke 2026-08-22 21:02:52 +07:00
admin 5ad2c681e7 Remove Carla native VSTi bridge entirely
Drop Carla integration across frontend and backend:
- plugins.py: remove /carla-midi, /carla-status, /carla-stop, /open-in-carla,
  /carla-play-notes endpoints and Carla process management
- runtime.py: remove find_carla / _carla_* helpers, detect and capabilities
- app.jsx: remove Carla bridge UI, SonicCarlaMidi routing, shouldRouteCarla
  guards, VST row Carla button and preset fallback
- system.py: remove /carla-path
- Keep audio path unchanged (tracks -> masterBus -> output -> analyser),
  directOut only for offline render

Build frontend, tests pass (124 passed).
2026-08-22 18:39:49 +07:00
admin 8346bc3041 build(native): rebuild bridge + commit sidecar binary để feature theo push
- fix compile: performEdit dùng setParamNormalized (setParamFromEdit không tồn tại trong SDK này)
- rebuild fx_vst_bridge.exe/daw_vst_bridge.exe/plugin_host.exe (chứa /shm route + SHM audio feeder)
- src-tauri/binaries: hết ignore, commit binary + dll + vst3scan.json — máy khác clone về có ngay feature native
- xóa rác app.precompiled.js.bak + dọn bundle dirs (.bak/.new/_diag/.pytest_cache)
2026-08-22 17:12:18 +07:00
admin 6dfe390bda feat(fx-gui): đưa audio vào process GUI — meter VST nhảy theo âm thật qua SHM peek
- GUI process peek ring SHM đầu vào (không consume, không tranh chấp RealtimeFxLoop)
- gọi fx->processAudio() trên instance GUI để meter/UI plugin chuyển động theo âm thật
- performEdit forward sang controller -> meter điều khiển bởi param cũng cập nhật
- bridge /shm: frontend đẩy tên session live vào mỗi GUI đang mở (start/stop/open)
- tests: 127 passed
2026-08-22 17:06:37 +07:00
admin 6ba38286ad fix(master-fx): loại double-processing khi load VST FX vào master fx chain
- Bỏ push setFxChain xuống native bridge (T2.4) — SHM fxRt loop (fx_vst_bridge
  --realtime-fx) là nơi xử lý live master mix duy nhất; trước đây MIDI/VSTi
  instrument bị xử lý 2 lần (native bridge + SHM loop) → over-process,
  âm bể/crackle. setFxChain vẫn dùng khi Export/Offline render.
- closeMasterGui/closeFxGui: POST /close (kill process) thay vì /hide —
  không còn cửa sổ floating always-on-top lơ lửng, tắt được dứt điểm.
- openFxGui already_running kèm embed_url → mở lại embed panel thay vì chỉ toast.
- open_fx_gui (plugins.py): spawn fx-gui với SF_PARENT_PID=<engine pid>.
- RenderFxJob.cpp: watchdog thread trong run_open_fx_gui/run_fx_gui_server —
  engine chết → WM_CLOSE, GUI process tự thoát, không để lại cửa sổ mồ côi.
2026-08-22 16:53:20 +07:00
admin e22757d5be fix(mastering): master dry mac dinh — built-in modules tat khi khoi tao
- App default + 2 fallback (ProfileModal, load project): eqActive/
  imagerActive/maximizerActive = false (truoc day chain rong nhung cac
  flag van true -> Imager+Maximizer van xu ly am mac du MASTERING PANEL
  trong)
- applyMasteringSettings doc flag truc tiep, khong check chain — user
  phai them module trong MASTERING PANEL moi bat built-in processing
- bump cache-bust app.precompiled.js -> 202608212330
2026-08-22 16:27:57 +07:00
admin edc647ded6 fix(rt): restart fxRt khi chain VST doi trong luc realtime dang chay
- masteringSettings effect goi fxRtStart() khong dieu kien: early-return
  khi active + cung chainKey, stop+start lai khi chain doi (insert/remove/
  bypass/reorder VST trong MASTER FX CHAIN) — truoc day nhanh chainKey
  chet vi branch chi chay khi !fxRt.active
- test list_scan_all: path plugin phai ton tai tren dia (loc entry chet
  truoc cache); dung _scan_json helper voi file that trong tmp_path
- bump cache-bust app.precompiled.js -> 202608212300
2026-08-22 16:13:10 +07:00
3dtours eef8603f98 build: rebuild app.precompiled.js (mastering empty-chain fix) 2026-08-22 16:06:19 +07:00
3dtours d74ccdaa8d fix(mastering): empty chain by default, allow removing all modules
MASTERING PANEL auto-seeded 3 modules (Dynamic EQ/Imager/Maximizer) and
removeChainModule re-added them when the chain hit zero. Chain now starts
empty everywhere (init, restore fallback, migration, graph fallback) and
can be removed down to empty; activeModule guards empty chain (null).

Cache-bust precompiled.js ?v= bump.
2026-08-22 15:58:39 +07:00
3dtours 681cab4f25 fix(plugin-manager): xoa/add dir luu dung dir moi (stale closure); loc plugin file da mat khoi disk; scan VST3 giam timeout module con lai 4s va subprocess 300s 2026-08-22 15:10:35 +07:00
3dtours 34d43f5018 fix(fx-list): MASTERING PANEL khong hien thi VST FX da scan trong Plugin Manager (cache _fx_scan_all ket [] vinh vien)
- vst_engine: list_scan_all cache co TTL 300s (FX_SCAN_TTL) + chi cache khi
  find_fx_bridge_exe() co exe (thieu bridge -> tra [] NHUNG khong cache de
  lan sau thu lai) — truoc day ket [] vi mui gio, MASTERING PANEL rong.
- vst_engine: them invalidate_fx_scan() clear cache scan VST.
- plugins.py: POST /scan (Plugin Manager Scan) goi _invalidate_fx_scan_cache()
  -> MASTERING PANEL lan mo ke tiep quet lai voi dirs moi; response them
  fx_cache_invalidated.
- app.jsx: MasteringModal/FXRackModal load listFx() lai moi lan mo modal
  (deps [isOpen]/[track.id]) + loading state; VstPluginPicker nhan prop
  loading -> hien 'Dang quet VST FX...' thay vi 'Khong co VST FX'.
- precompiled rebuild (LF) + index.html ?v=202608220330; dist sync.
- tests: +4 test cache TTL/invalidate/no-bridge (TestFxScanCache).
2026-08-22 03:34:33 +00:00
3dtours 1a8b210063 feat(fx-rt): VST master chain realtime khi insert/bypass/reorder + VU meter đo sau VST node
- fxRtStart: so chainKey signature — insert/remove/bypass/reorder VST trong
  MASTER FX CHAIN giờ restart session SHM với chuỗi FX mới (trước đây
  early-return khi active → VST mới không bao giờ được áp dụng realtime)
- masterBus.splitter (leftAnalyser/rightAnalyser) chuyển sang sau fxRt.node
  khi realtime active → VU meter master strip + peak graph hiển thị audio
  data ĐÃ QUA VST; khôi phục output khi stop
- MasteringModal outPeak/outRms/LUFS đọc masterBus.analyser (post-VST) thay
  vì outputAnalyser (pre-VST)
2026-08-21 15:39:23 +00:00
admin bb6658e03d fix(fx): realtime VST ngắt quãng khi mở MASTERING PANEL + PWR master không ảnh hưởng âm; pacing WS input/output, gate fxRt theo masterConnected, worklet cap 32 2026-08-21 21:48:56 +07:00
admin 4e3f2fd08a Fix 3 bug standalone: save project lỗi schema, export MIDI/WAV không hỏi nơi lưu
- Bug 1: serializeTracksList bỏ section item không có sectionId (do insertSectionAtPlayhead tạo) — tránh source_data {} làm schema oneOf fail
- Bug 2: export MIDI qua save-dialog + write file, toast kèm đường dẫn
- Bug 3: export mix WAV/MP3/OGG qua save-dialog + write file, toast kèm đường dẫn
- Marker tauri_bridge_ready: xóa khi window destroy + guard SF_PARENT_PID — tránh standalone treo 120s
2026-08-21 17:13:28 +07:00
admin 9b14c99a7a Fix 3 bug standalone: VKB chiếm phím V, TCP FX button mở FX chain, VST GUI embed qua bridge
- VKB: stopImmediatePropagation thay stopPropagation (keydown+keyup) — chặn
  transport hotkey 'v' mở prompt Gain khi VKB đang mở (VKB đăng ký trước).
- TCP FX button: onClick -> window.__openFxRack(track.id, track.name), title
  'Mở Track FX Chain', giữ caret ▾ (title 'FX nhanh (cũ)') cho dropdown legacy.
- VST FX GUI embed: copy fx_vst_bridge.exe vào bundle (engine.spec binaries),
  find_bridge_exe tìm được trong _internal/ — hết lỗi 409 'Không tìm thấy bridge'.

Verified bằng Playwright: VKB không mở Gain prompt, FX chain rack mở + GUI VST
embed hiển thị (cả track FX rack lẫn Master FX Chain).
2026-08-21 16:17:33 +07:00
admin bcd8e37e86 feat(build): Phase 7 — verify 10 mục + fix export MIDI thiếu delta-time + fix WAV float32 2026-08-21 15:29:47 +07:00
admin a667d0354f feat(chords): thêm Chords Panel — chordTheory service + presets/custom/AI tab, insert progression vào timeline, Shift+K/menu/toolbar 2026-08-21 12:35:20 +07:00
admin ec85e7d1a9 Phase 5: Virtual MIDI Keyboard (F2/menu Tools) — QWERTY mapping spec §3, note routing theo attachMidiHandler (bridge/native SF-VST/SonicSF/Carla), live record forward, drag+persist localStorage, verify Playwright + 3 regression PASS 2026-08-21 12:16:03 +07:00
admin 5fc45a59f8 Phase 3: gộp builtin DSP + VST FX thành 1 FX CHAIN (track + master), đổi tên panel/nút/menu, fix lookup track cho nút FX TCP 2026-08-21 11:36:48 +07:00
admin 2c93c701ce feat(export): Export Mix loop không fade (checkbox + cắt buffer client) + server download thay blob (WebView2 chặn) 2026-08-21 11:25:49 +07:00
admin 96da8b5ac0 fix(export): MIDI export qua server endpoint thay blob download (WebView2 chặn) + velocity 1..127, bỏ rest-track 2026-08-21 11:10:32 +07:00
admin 7c22ae1f02 refactor(bridge): split fx bridge, stabilize VST3 host chain, drop old install engines
- remove diagnostic canaries from audio hot path (crackle fix) and
  stuck C5 note raw-MIDI test (Vst2Instrument::init noteOff)
- split native bridge into daw_vst_bridge (VSTi) + fx_vst_bridge (VST FX)
- VST3: processData prepare before setActive, zero input buses, accept
  both .vstpreset and bridge-state blob in RenderJob presets
- native_render/vst_engine: bridge-exe discovery + render_fx_chain + /fx-gui
- delete old install/ engine binaries (install via sidecar+resources now)
- add BUILD_LAYOUT.md, build_selfcheck, tools/ diagnostics
2026-08-20 09:42:42 +07:00
admin 5df96aef1e fix(bridge): deploy ABI-fixed VST2 binary to install + open GUI for VST2 tracks
Qin_RV_x64.dll (Kong Audio) crashed with SEH 0xc0000005 in Bridger64.dll
using the stale install binary (pre-ABI-fix). Copy native_bridge build
Release binary into install/ so the packaged app runs the fixed host.

Also open the native GUI after loading a VST2 instrument (previously
VST3-only), so Qin_RV's editor (Qin_VST_Window via auxhost.exe) shows
automatically on track load.
2026-08-19 22:36:28 +07:00
admin 819257a1b3 Fix bypass JSON bool + load SF2 tracks into bridge on restore
- RenderFxJob: parse bypass as JSON bool (memberBool) — bypass:true
  previously ignored (memberInt parses numbers only), plugin kept
  processing. Verified: bypass RMS == plain, VST3 loaded once.
- preloadTrackInstruments / bridge reconnect: load SF2 instruments
  into bridge too (loadAnyTrackToBridge) — opened projects with SF2
  tracks sent MIDI to empty bridge channels (C++ silent), never
  reaching the native mastering chain.
- rebuild app.precompiled.js from app.jsx (was stale: missing A14).
2026-08-19 21:55:48 +07:00
admin 6a3b430da0 A14: MIDI-out từ plugin (VST2/VST3) → SHM → Rust emit → DAW track
- Vst2Instrument: audioMaster callback thu VstEvents, push SHM midiOutQueue
- Vst3Instrument: IEventList output bus (kAudioMasterWantMidi) — check
- SharedMemoryIPC.h: midiOutQueue[64] + midiOutCount (offset 27556/28324, sizeof 28328)
- shm.rs: MidiEventIPC Serialize, drain_midi_out() emit 'bridge-midi-out'
- lib.rs: pump emit midi-out events
- nativeBridgeService.js: onMidiOut API
- app.jsx: route MIDI-out về selected track qua SonicMidiRouter (feedback guard)
- TASKS.md: A14 ✅
2026-08-19 21:12:07 +07:00
admin 927597a822 fix(tcp): prevent panel scroll when wheeling volume ruler
React onWheel is passive so e.preventDefault() was a no-op, letting the
TCP panel scroll and the ruler slip away from the cursor (no snap).
Add native non-passive capture listener that preventDefault()s wheel
events starting on [data-sf-wheel] ruler containers.
2026-08-19 15:05:37 +07:00