# TASK 53: ALTERNATIVE SOLUTIONS FOR DIRECT VSTi USAGE IN STANDALONE DAW APPLICATIONS > Spec: "ALTERNATIVE SOLUTIONS FOR DIRECT VSTi USAGE IN STANDALONE DAW APPLICATIONS" > Thực hiện trên `C:/Users/locpham/SonicForgeStudio` (branch `standalone`). > Tài liệu đi kèm: `md/53_VSTI_AUTOSAMPLE_RENDER_WALKTHROUGH.md`. --- ## 1. Mục tiêu (từ spec) | Option | Yêu cầu spec | Hiện thực | |---|---|---| | **Option 1** | Client-side WASM live preview với **0% IPC** — cần "a custom Python script" tự động sample các preset VSTi thành `.sf3` (~3-8MB) | `tools/autosample_vsti.py` — render từng nốt qua pedalboard → SF2 (16-bit mono), tùy chọn convert sang SF3 | | **Option 2** | Offline render/export qua Python backend (pedalboard VST3 + FluidSynth) — WAV chất lượng **24-bit / 32-bit** | Thêm `bit_depth` (16/24/32) vào toàn bộ đường render/export backend + frontend | --- ## 2. Thay đổi ### 2.1 Auto-sampling tool (mới) **File:** `tools/autosample_vsti.py` (mới, untracked) - CLI: `--instrument --out out.sf2 [--preset] [--low --high --step] [--sf3] [--duration --release --velocity --sample-rate]` - Reuse `PluginManager().load_vst`, `apply_preset_to_plugin`, `HAS_PEDALBOARD` từ `app/core/vst_engine.py` - Render từng nốt bằng pedalboard, MIDI dạng **raw tuple** `(bytes([0x90,note,vel]), 0.0)` / `(bytes([0x80,note,0]), dur)` — pedalboard 0.9.19 build này **không có** `NoteOn` classes; khớp `PluginManager.midi_events_to_messages` (trả `(bytes, seconds)` tuples) - Trim leading silence + normalize peak 0.9 trước khi cast int16 - `write_sf2()`: SF2 tối giản hợp lệ — 16-bit mono PCM, 1 zone/nốt (`keyRange lo=hi`), `sampleID`, `overridingRootKey`, `end=exclusive`; preset 0/bank 0 - `--sf3`: convert qua `SoundFontConverter` (`app/core/soundfont_converter.py`); fallback giữ SF2 nếu thiếu ffmpeg libvorbis - Toàn bộ text ASCII-only (an toàn cp1252 console Windows) **SF2 writer — chi tiết đúng chuẩn** (đã verify bằng sf2utils): - INFO text chunk (INAM) **phải chẵn** — pad `\x00` bên trong data (strict parsers không skip RIFF pad byte của odd chunk) - Records: `phdr` 38B (name20 + ` Lưu ý: không chạy `pytest` bare từ root repo (collect torch resources dưới `src-tauri/target/release/resources/` → 52 collection errors). Luôn nhắm `tests/`. --- ## 4. Cách dùng ```bash # Option 1 — auto-sample VSTi preset sang SF2 (client WASM preview, 0% IPC) python tools/autosample_vsti.py --instrument Nexus.vst3 --out app/storage/soundfonts/nexus.sf2 --preset --low 36 --high 96 --step 2 # ... hoặc sang SF3 (cần ffmpeg + libvorbis) python tools/autosample_vsti.py --instrument Nexus.vst3 --out app/storage/soundfonts/nexus.sf3 --sf3 # Option 2 — render/export 24-bit/32-bit (API) POST /api/v1/plugins/render { "project_json": {...}, "bit_depth": 24 } POST /api/v1/plugins/midi-render { ..., "bit_depth": 32 } POST /api/v1/plugins/soundfont-render { ..., "bit_depth": 24 } ``` SF2/SF3 đặt vào `app/storage/soundfonts/` để client tải qua `/soundfonts/download`.