feat: CC11 expression automation (spec midi_note_cc11_expression)
- MIDINote schema + expression_curve (position_ratio 0..1, value 0..127) - Piano roll CC lane mode Expression (CC11): draw/move/del anchors - Offline: _expression_events grid 64 samples -> job.events -> RenderJob.cpp sample-accurate CC - Realtime: scheduleNoteExpressionCC11 grid 16ms via bridge pushEvent / SonicSF fallback, epoch-guarded, cleared on stop - tests/test_cc11_expression.py 6/6 (unit interp/grid/clamp + integration energy follows curve) - rebuild daw_vst_bridge (narrowing fix) + sync binaries/dist, babel rebuild + sync 5 copies
This commit is contained in:
@@ -1,3 +1,16 @@
|
||||
### [2026-08-23] Feature: CC11 Expression automation (spec midi_note_cc11_expression)
|
||||
- **Mo ta:** Moi MIDI note co the mang expression_curve (array {position_ratio 0..1, value 0..127}) — duong cong bieu dien CC11. UI: CC lane trong piano roll chon mode Expression (CC11), ve/keo/del anchor, save vao note. Offline render + realtime playback deu phat curve.
|
||||
- **Thiet ke:** Note model dung beats + position_ratio (0..1) thay vi ticks/PPQN. Offline: Python sinh CC events grid 64 samples (~1.3ms @48k) — noi suy tuyen tinh, khong can C++ smoothing. Realtime: JS scheduler qua SonicMidiRouter.pushEvent (CC11) / SonicSF.controllerChange fallback, grid 16ms.
|
||||
- **Cac file anh huong:**
|
||||
(1) app/models/project_schema.json: MIDINote them expression_curve.
|
||||
(2) app/static/js/app.jsx: ccMode option cc11 + badge 'Expr'; draw CC lane (curve + anchor, dashed flat 127 khi rong); handlers handleCC11MouseDown/handleCC11ContextMenu (click them/move anchor, dup ratio replace, right-click xoa <=8px); module helper scheduleNoteExpressionCC11 (grid 16ms, epoch guard _nativePlayEpoch) + clearAllCC11Timers goi trong stopAllPlayback; hook trong schedulePianoRollMidi per-note.
|
||||
(3) app/core/render_engine.py: carry expression_curve vao midi_events + bridge_notes + soundfont notes.
|
||||
(4) app/core/native_render.py: _expression_events(notes, bpm, sample_rate, grid=64) — event {sample, kind:2, a:11, b:value}, inject job[events] vao render_offline + render_soundfont_offline.
|
||||
(5) native_bridge/src/RenderJob.cpp: parse job.events (kind 2=CC, 3=program) truoc stable_sort, sample-accurate.
|
||||
(6) tests/test_cc11_expression.py: 5 unit (_expression_events: grid/interp/clamp/sort) + 1 integration (render_soundfont_offline SF2 that — nang luong theo curve: flat>low >3x, flat>ramp).
|
||||
- **Build:** rebuild daw_vst_bridge (RenderJob.cpp doi) — build/scripts/build_native_bridge.ps1 (fix narrowing cast (uint8_t)kind tai RenderJob.cpp:351); sync exe + DLL vao src-tauri/binaries/ + dist/daw_engine/_internal/. Babel rebuild app.precompiled.js + sync 5 copies (dist/resources/build/target release/debug).
|
||||
- **Ghi chu/Test:** pytest test_cc11_expression 6/6 pass (gom integration energy qua bridge moi). Realtime: engine can restart de dung bridge moi (events key). Bo qua native render path scheduleNativeTrack (bridge down + standalone SF engine) — khong co per-note CC.
|
||||
|
||||
### [2026-08-22] Task: FIX MASTERING PANEL — VST FX đã scan trong Plugin Manager không hiển thị (cache kẹt [] vĩnh viễn)
|
||||
- **Báo cáo user:** MASTERING PANEL (Master FX Chain) khi load VST FX plugin không hiển thị các VST FX đã load trong Plugin Manager (window 192.168.1.24).
|
||||
- **Chẩn đoán (probe thật trên 192.168.1.24):** `GET /api/v1/plugins/fx` → `FX_COUNT=0 time=0s` (cache rỗng); `GET /api/v1/plugins/fx?refresh=true` → 44 VST FX sau 54s (bridge scan chạy TỐT). `/available` → 93 plugin NHƯNG bị xếp nhầm thành instrument (Ozone/Neutron/Insight... là FX) vì `list_scan_all()` trả cache rỗng → block set rỗng → không loại được FX.
|
||||
|
||||
Reference in New Issue
Block a user