Files
SonicForgeStudio/md/35.1_VST_FIX.md

6.1 KiB
Raw Permalink Blame History

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.