FIX: 6 lỗi âm thanh/Carla/temp-save/Ctrl-S/FX Chain Carla bridge

- Soundfont preview: hủy note đang chờ load soundfont (stopNote/stopAll/panic) — hết âm loop không dừng với MIDI Keyboard; preview dùng channel riêng (applyAITrackInstrument) — hết sai instrument
- Carla bridge: endpoint /carla-stop (all-notes-off OSC + terminate process) + stopBridge() khi track chuyển VSTi -> soundfont — hết âm play qua Carla cũ
- MIDI items play qua Carla khi VSTi loaded: scheduleCarlaNote route vào startTrackPlayback + startLocalTrackPlayback + ghost notes
- Tự động lưu temp khi tắt app: beforeunload/pagehide sendBeacon + autosave 30s + ghi storage/temp/autosave.json + khôi phục khi load lại
- Ctrl-S: desktop -> save-to-disk (Documents/SonicForgeDAW/Projects); docker -> Cloud/local
- FX Chain (Mastering + FX Rack): module Carla Bridge (VST FX) — load/openInCarla + stop/unload, pass-through trong graph
This commit is contained in:
2026-08-10 05:34:32 +00:00
parent d20932a68b
commit c08233a163
10 changed files with 622 additions and 45 deletions
+11
View File
@@ -1,3 +1,14 @@
### [2026-08-10] Task: Fix 6 lỗi âm thanh/Carla/temp-save/Ctrl-S/FX Chain
- **Tóm tắt thay đổi:**
(1) **Soundfont preview âm loop không dừng**: `soundfontPlayer.js` — note đang CHỜ load soundfont giờ được đăng ký trong `_pendingNoteOns` + `_noteGeneration` trước khi load → `stopNote` (thả phím MIDI Keyboard) / `stopAll` / `panic` hủy được note deferred (trước đây note bắn TRỄ sau khi thả phím/Stop → âm loop không dừng).
(2) **Unload Carla bridge khi chọn lại instrument soundfont**: backend `plugins.py` thêm registry `_CARLA_PROCESSES` (open_in_carla lưu Popen) + endpoint `POST /api/v1/plugins/carla-stop` (OSC note_off toàn pitch mọi channel → terminate/kill tiến trình Carla). Frontend `setTrackInstrumentWithProgram` gọi `SonicCarlaMidi.stopBridge()` khi track chuyển từ VSTi → non-VST; `runtime.js` thêm `allNotesOff()` + `stopBridge()`; `api.js` thêm `stopCarla()`.
(3) **MIDI item play qua Carla bridge khi VSTi loaded**: `app.jsx` thêm helper `scheduleCarlaNote()` và route vào CẢ 3 đường playback: `startTrackPlayback` (main timeline), `startLocalTrackPlayback` (local loop), ghost notes trong `schedulePianoRollMidi` (trước đây chỉ piano roll chính route).
(4) **Tự động lưu temp khi tắt app**: `projects.py` POST /temp giờ ghi file `storage/temp/autosave.json` (thư mục temp của ứng dụng) + DB; GET /temp fallback đọc file. `app.jsx` thêm beforeunload/pagehide → sendBeacon POST /projects/temp + autosave 30s + khôi phục dự án temp khi mount (chỉ khi project trống).
(5) **Ctrl-S (Save)**: `app.jsx` thêm global Ctrl/Cmd+S handler — desktop → `POST /api/v1/projects/save-to-disk` (ghi vào Documents/SonicForgeDAW/Projects — Windows; ~/SonicForgeDAW/Projects — Linux); docker/headless → Cloud (đã login) hoặc local .sfs.
(6) **FX Chain (Mastering + FX Rack) load Carla bridge**: thêm module type `carla` vào `TRACK_FX_META`/`TRACK_FX_DEFAULTS` + `MODULE_META` (mastering) — UI dropdown VST đã scan → Load Carla Bridge (openInCarla) / Stop-Unload (carla-stop); `createTrackFxModule` + `rebuildMasteringGraph` xử lý carla là pass-through (không thêm DSP WebAudio).
- **Các file ảnh hưởng:** `app/api/v1/plugins.py`, `app/api/v1/projects.py`, `app/static/js/app.jsx`, `app/static/js/app.precompiled.js` (rebuild babel), `app/static/js/services/soundfontPlayer.js`, `app/static/js/services/runtime.js`, `app/static/js/services/api.js`, `app/templates/index.html` (?v= bump 202608101200), `dist/daw_engine/_internal/app/static/**` + `templates/index.html`
- **Ghi chú/Test (nếu có):** pytest 86 passed, 7 skipped. Smoke test jsdom: bundle eval OK, các symbol mới (scheduleCarlaNote, TRACK_FX_META.carla, stopBridge, stopCarla, saveProjectToDisk) đều tồn tại. Test curl: `/carla-stop` 200, `/save-to-disk` ghi file OS, `/temp` ghi storage/temp/autosave.json + GET trả has_temp. ⚠️ Backend .py nằm trong PyInstaller PYZ → CẦN rebuild exe trên Windows để nhận fix backend (static/templates đã sync dist).
### [2026-08-08] FIX: verify_bundle.py vẫn false-positive trên Windows — TOC là Python literal nên backslash bị DOUBLE-escape ('app\\\\static')
- **Tóm tắt thay đổi:** Fix LAN 2 normalize `replace('\\','/')` 1 lần KHÔNG đủ: TOC file là Python literal (repr) → path Windows ghi thành `app\\\\static` (2 backslash trên disk) → replace 1 lần ra `app//static` → regex `app/static(?=[/'"])` không match → vẫn báo "Bundle thieu" DÙ bundle đủ. Fix: normalize 2 bước — `replace("\\\\","/")` (bắt double-escape) rồi `replace("\\","/")` (backslash đơn). Verify bằng TOC giả lập Windows repr: cả 2 entry match True.
- **Các file ảnh hưởng:** `tools/verify_bundle.py` (dòng normalize)