Lightningbeam/lightningbeam-ui/lightningbeam-editor/src/default_instrument.rs

58 lines
2.3 KiB
Rust

/// Default MIDI instrument loader
///
/// This module provides a default instrument (bass synthesizer) for MIDI tracks
/// until the user implements the node editor to load custom instruments.
/// Embedded default MIDI instrument preset (bass synthesizer)
const DEFAULT_MIDI_INSTRUMENT: &str = include_str!("../../../src/assets/instruments/synthesizers/bass.json");
/// Load the default MIDI instrument into a daw-backend MIDI track
///
/// This function:
/// 1. Parses the embedded bass.json preset
/// 2. Writes it to a temporary file (required by daw-backend API)
/// 3. Loads the preset into the track's instrument graph
/// 4. Asynchronously cleans up the temp file after a delay
///
/// # Arguments
/// * `audio_controller` - Mutable reference to the daw-backend EngineController
/// * `track_id` - The MIDI track ID to load the instrument into
///
/// # Returns
/// * `Ok(())` if successful
/// * `Err(String)` with error message if parsing or file I/O fails
pub fn load_default_instrument(
audio_controller: &mut daw_backend::EngineController,
track_id: daw_backend::TrackId,
) -> Result<(), String> {
// Verify the embedded JSON is valid by attempting to parse it
let _preset: serde_json::Value = serde_json::from_str(DEFAULT_MIDI_INSTRUMENT)
.map_err(|e| format!("Failed to parse embedded default instrument: {}", e))?;
// Create temp directory path
let temp_dir = std::env::temp_dir();
let temp_filename = format!("lightningbeam_default_instrument_{}.json", track_id);
let temp_path = temp_dir.join(&temp_filename);
// Write preset to temporary file
std::fs::write(&temp_path, DEFAULT_MIDI_INSTRUMENT)
.map_err(|e| format!("Failed to write temp preset file: {}", e))?;
// Load preset into track's instrument graph via daw-backend API
let temp_path_str = temp_path.to_string_lossy().to_string();
audio_controller.graph_load_preset(track_id, temp_path_str);
// Schedule async cleanup of temp file (give backend time to load it first)
std::thread::spawn(move || {
std::thread::sleep(std::time::Duration::from_millis(500));
let _ = std::fs::remove_file(temp_path);
});
Ok(())
}
/// Get the name of the default instrument for display purposes
pub fn default_instrument_name() -> &'static str {
"Deep Bass (Default)"
}