Key components: - no_std core so it can be used bare metal on embedded systems - default implementation for RPi 2350, with midi input and I2s output using PIO - Visualiser for the web to play with on a dev system
53 lines
1.8 KiB
Rust
53 lines
1.8 KiB
Rust
//! Synthesiser parameter model — mirrors synth-core state.
|
||
//! Serialised as JSON for postMessage() across the AudioWorklet MessagePort.
|
||
|
||
use wasm_bindgen::prelude::*;
|
||
use serde::{Serialize, Deserialize};
|
||
|
||
#[wasm_bindgen]
|
||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||
pub struct SynthParams {
|
||
pub osc_freq: f32, // Hz
|
||
pub osc_wave: u8, // 0=Sine 1=Saw 2=Square 3=Triangle
|
||
pub filter_cutoff: f32, // Hz
|
||
pub filter_res: f32, // 0.0–1.0
|
||
pub env_attack: f32, // seconds
|
||
pub env_decay: f32,
|
||
pub env_sustain: f32, // 0.0–1.0
|
||
pub env_release: f32,
|
||
pub lfo_rate: f32, // Hz
|
||
pub lfo_depth: f32, // 0.0–1.0
|
||
pub master_gain: f32, // 0.0–1.0
|
||
}
|
||
|
||
#[wasm_bindgen]
|
||
impl SynthParams {
|
||
#[wasm_bindgen(constructor)]
|
||
pub fn new() -> Self {
|
||
Self {
|
||
osc_freq: 440.0,
|
||
osc_wave: 1,
|
||
filter_cutoff: 2000.0,
|
||
filter_res: 0.3,
|
||
env_attack: 0.01,
|
||
env_decay: 0.1,
|
||
env_sustain: 0.7,
|
||
env_release: 0.3,
|
||
lfo_rate: 2.0,
|
||
lfo_depth: 0.0,
|
||
master_gain: 0.8,
|
||
}
|
||
}
|
||
|
||
pub fn to_json(&self) -> String {
|
||
// serde_json would pull in std; for WASM we use the js glue instead.
|
||
// This is a simple manual serialisation for the scaffold.
|
||
format!(
|
||
r#"{{"osc_freq":{:.2},"osc_wave":{},"filter_cutoff":{:.2},"filter_res":{:.3},"env_attack":{:.4},"env_decay":{:.4},"env_sustain":{:.3},"env_release":{:.4},"lfo_rate":{:.3},"lfo_depth":{:.3},"master_gain":{:.3}}}"#,
|
||
self.osc_freq, self.osc_wave, self.filter_cutoff, self.filter_res,
|
||
self.env_attack, self.env_decay, self.env_sustain, self.env_release,
|
||
self.lfo_rate, self.lfo_depth, self.master_gain
|
||
)
|
||
}
|
||
}
|