Files
SonicForgeStudio/md/35.1_VST_FIX.md
T

115 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# INTEGRATION & OPERATIONAL GUIDE: SOUNDFONT & VST3 ENGINE SYSTEM
This document outlines the workflow for connecting and operating the designed technical methods and modules across the entire DAW system, clearly categorized by system integration steps.
---
## 1. System Environment & Storage Setup
### A. Server & Docker Directory Structure
* **System SoundFont Directory (`/opt/daw_engine/soundfonts/`):** Stores system default `.sf2` files (e.g., `GeneralUser_GS.sf2`, `SGM-V2.01.sf2`).
* **User Upload Directory (`app/storage/uploads/soundfonts/`):** Stores `.sf2` files uploaded by users via the web interface.
* **VST3 & Pianobook Directories (`/opt/daw_engine/vst3/`, `/opt/daw_engine/samples/pianobook/`):** Contains the `DecentSampler.vst3` binary along with the directory structure holding `.dspreset` sample files and `samples/*.wav` subdirectories.
### B. System Dependencies
Ensure the `Dockerfile`/`Virtualenv` has installed the `libcurl4` system library (mandatory for DecentSampler) and the Python package `sf2utils>=0.9.0`.
---
## 2. SoundFont Catalog Operational Lifecycle
### A. First Startup (Lazy Initialization)
* When the Server boots, the Catalog is not generated immediately to prevent slowing down the app boot time.
* When the Frontend dispatches its first request to the API Endpoint `GET /api/v1/plugins/soundfonts/catalog`, the Backend triggers `SoundFontInspector` to simultaneously scan both system and upload directories.
* The extracted data is categorized into 2 versions:
* **Full Catalog:** Designed for the UI to display the complete list of instruments.
* **Condensed Catalog:** A summary (maximum 4050 representative instruments categorized under General MIDI groups such as Piano, Brass, Drums, etc.) specifically tailored for the AI Agent.
* The parsed data is cached in memory (Memory Cache) for subsequent queries.
### B. Cache Invalidation on User Upload
* Once the upload handling endpoint successfully saves an uploaded `.sf2` file to the upload directory:
* Automatically invokes the `invalidate_catalog_cache()` method to purge the memory cache.
* Triggers a Background Task calling the catalog initialization function to incrementally scan the new file without blocking the user's HTTP response.
---
## 3. AI Copilot Integration Workflow (AI Gateway & System Prompt)
### A. Initial Instrument Catalog Load (Frontend Startup)
* As soon as the Web application launches (`app.jsx`), the Frontend proactively calls the API to fetch the Catalog.
* Extracts the `condensed_catalog` section and persists it into the application's global state (Global State).
### B. Automated Prompt Context Injection
* When a user submits an interaction command to the AI:
* The System Instruction generator reads the `condensed_catalog` and converts it into a concise text description of available instruments (including name, bank code, and program code).
* Enforces the rule that the AI must assign `soundfont_bank: 0` for melodic instruments and `soundfont_bank: 128` for Drum Kits.
### C. Function Calling Schema Definition
* When dispatching requests to the LLM, the Tools list configuring `generate_multitrack_midi` includes 3 mandatory fields for every Track: `soundfont_id`, `soundfont_bank`, and `soundfont_program`.
---
## 4. Real-time Client-Side Instrument Switching (Browser Playback)
### A. Listening for AI Responses
* When the AI successfully completes a Function Call and returns a JSON payload containing musical notes alongside `soundfont_bank` & `soundfont_program` parameters for each Track:
* The Client allocates each Track to a corresponding MIDI Channel (Channels 0 through 8 for standard instruments, fixed Channel 9 for Drum Kits).
### B. Applying Real-Time Program Changes
* Calls the `applyAITrackInstrument` method on the Client's SoundFont Player module.
* The module dispatches a Control Change (CC 0) signal to select the Bank, followed by a Program Change event to the designated MIDI channel to immediately play the newly selected instrument sound inside the browser.
---
## 5. Server-Side Offline Render Workflow (Audio Export)
When a user clicks "Export WAV" or "Bounce Track", the processing pipeline on the Server executes as follows:
### A. Reading Track Metadata
Extracts `soundfont_bank` and `soundfont_program` parameters from the Track metadata received in the project's JSON payload.
### B. MIDI Channel Routing & FluidSynth Rendering
* **Channel Rules:** If `soundfont_bank == 128` or the track is marked as percussion (`is_percussion`), rigidly assigns `midi_channel = 9` (Channel 10 under the General MIDI standard). Otherwise, assigns free channels from 0 to 8.
* Executes `program_select` settings on the FluidSynth Instance targeting the correct channel, bank, and program before feeding the note sequence into the audio rendering buffer.
### C. Rendering Pianobook (`.dspreset`)
* If a Track selects a Pianobook instrument source:
* Calls `DecentSamplerManager` passing the absolute file path to the `.dspreset` file.
* The manager automatically changes the Current Working Directory (CWD) temporarily to the parent folder of the `.dspreset` file, loads the preset into VST3, and subsequently restores the original working directory to prevent "Sample Not Found" errors on relative `.wav` sample files.
### D. Rendering VST3 via Pedalboard
Prior to passing the MIDI note array into the VST3 Plugin, inserts 2 initialization MIDI messages at timestamp $0.0\text{s}$:
* A `control_change` message (Control 0, Value = bank).
* A `program_change` message (Program = program).
---
## 6. Verification & Testing Workflow
* **Catalog API Verification:** Use Postman or a browser to call `GET /api/v1/plugins/soundfonts/catalog`, confirming that the returned payload contains both `full_catalog` and `condensed_catalog`.
* **AI Response Verification:** Input the command *"Compose 8 bars of Brass horns and a drum kit"* $\rightarrow$ Inspect the returned JSON from the AI to verify that the Brass track has `program: 56`, `bank: 0` and the Drums track has `program: 0`, `bank: 128`.
* **Audio Output Verification:** Export the WAV file and listen to confirm that the Brass horn and Drum sounds are rendered using the correct instrument patches.