use super::{
Adsr, DriveShape, KitStyle, Mode, NoiseColor, SeqNote, SeqWave, SuperWave, Track, Value,
default_gain,
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
fn default_duty() -> Value {
Value::Const(0.5)
}
fn default_q() -> f32 {
0.707
}
fn default_steps_per_beat() -> u32 {
4
}
fn default_mod_depth() -> f32 {
0.5
}
fn default_mod_mix() -> f32 {
0.5
}
fn default_chorus_rate() -> f32 {
1.5
}
fn default_flanger_rate() -> f32 {
0.25
}
fn default_flanger_feedback() -> f32 {
0.5
}
fn default_phaser_rate() -> f32 {
0.4
}
fn default_phaser_feedback() -> f32 {
0.3
}
fn default_comp_attack() -> f32 {
0.005
}
fn default_comp_release() -> f32 {
0.08
}
fn default_voices() -> u32 {
7
}
fn default_detune() -> f32 {
15.0
}
fn default_seq_fm_ratio() -> f32 {
1.0
}
fn default_seq_fm_index() -> f32 {
5.0
}
fn default_seq_fm_strike() -> f32 {
0.2
}
fn default_pluck_decay() -> f32 {
0.996
}
fn default_pluck_body() -> f32 {
0.0
}
fn default_pluck_pick() -> f32 {
0.0
}
fn default_pluck_tone() -> f32 {
0.0
}
fn default_piano_hammer() -> f32 {
1.0
}
fn default_piano_strike() -> f32 {
0.125
}
fn default_piano_inharm() -> f32 {
1.0
}
fn default_piano_detune() -> f32 {
1.0
}
fn default_piano_decay() -> f32 {
1.0
}
fn default_bass_cutoff() -> f32 {
250.0
}
fn default_bass_env() -> f32 {
700.0
}
fn default_bass_env_vel() -> f32 {
1100.0
}
fn default_bass_decay() -> f32 {
0.15
}
fn default_bass_click() -> f32 {
0.0
}
fn default_bass_body() -> f32 {
0.7
}
fn default_bass_sub() -> f32 {
0.45
}
fn default_bass_sub_ratio() -> f32 {
1.0
}
fn default_bass_drive() -> f32 {
0.0
}
fn default_bass_body_decay() -> f32 {
2.0
}
fn default_duck_amount() -> f32 {
0.8
}
fn default_duck_attack() -> f32 {
0.005
}
fn default_duck_release() -> f32 {
0.25
}
fn default_modal_mix() -> f32 {
1.0
}
fn default_impact_hardness() -> f32 {
0.5
}
fn default_dust_decay() -> f32 {
0.02
}
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum Node {
Square {
freq: Value,
#[serde(default = "default_duty")]
duty: Value,
},
Triangle {
freq: Value,
},
Sawtooth {
freq: Value,
},
Sine {
freq: Value,
},
Noise {
#[serde(default)]
color: NoiseColor,
},
Fm {
freq: Value,
ratio: f32,
index: Value,
},
Super {
#[serde(default)]
wave: SuperWave,
freq: Value,
#[serde(default = "default_voices")]
voices: u32,
#[serde(default = "default_detune")]
detune_cents: f32,
},
Seq {
bpm: f32,
#[serde(default = "default_steps_per_beat")]
steps_per_beat: u32,
wave: SeqWave,
#[serde(default = "default_duty")]
duty: Value,
#[serde(default = "default_seq_fm_ratio")]
fm_ratio: f32,
#[serde(default = "default_seq_fm_index")]
fm_index: f32,
#[serde(default = "default_seq_fm_strike")]
fm_strike: f32,
#[serde(default = "default_pluck_decay")]
pluck_decay: f32,
#[serde(default = "default_pluck_body")]
pluck_body: f32,
#[serde(default = "default_pluck_pick")]
pluck_pick: f32,
#[serde(default = "default_pluck_tone")]
pluck_tone: f32,
#[serde(default = "default_piano_hammer")]
piano_hammer: f32,
#[serde(default = "default_piano_strike")]
piano_strike: f32,
#[serde(default = "default_piano_inharm")]
piano_inharm: f32,
#[serde(default = "default_piano_detune")]
piano_detune: f32,
#[serde(default = "default_piano_decay")]
piano_decay: f32,
#[serde(default)]
kit: KitStyle,
#[serde(default = "default_bass_cutoff")]
bass_cutoff: f32,
#[serde(default = "default_bass_env")]
bass_env: f32,
#[serde(default = "default_bass_env_vel")]
bass_env_vel: f32,
#[serde(default = "default_bass_decay")]
bass_decay: f32,
#[serde(default = "default_bass_click")]
bass_click: f32,
#[serde(default = "default_bass_body")]
bass_body: f32,
#[serde(default = "default_bass_sub")]
bass_sub: f32,
#[serde(default = "default_bass_sub_ratio")]
bass_sub_ratio: f32,
#[serde(default = "default_bass_drive")]
bass_drive: f32,
#[serde(default = "default_bass_body_decay")]
bass_body_decay: f32,
#[serde(default)]
sf2: String,
#[serde(default)]
sf2_preset: u32,
#[serde(default)]
sf2_bank: u32,
#[serde(default)]
swing: f32,
#[serde(default)]
humanize: f32,
env: Adsr,
notes: Vec<SeqNote>,
},
Impact {
#[serde(default = "default_impact_hardness")]
hardness: f32,
#[serde(default = "default_gain")]
velocity: f32,
},
Dust {
density: f32,
#[serde(default = "default_dust_decay")]
decay: f32,
},
Env {
#[serde(flatten)]
adsr: Adsr,
},
Tracks {
tracks: Vec<Track>,
#[serde(default)]
master: Vec<Node>,
},
Mix {
inputs: Vec<Node>,
},
Mul {
inputs: Vec<Node>,
},
Chain {
stages: Vec<Node>,
},
Lowpass {
cutoff: Value,
#[serde(default = "default_q")]
q: f32,
},
Highpass {
cutoff: Value,
#[serde(default = "default_q")]
q: f32,
},
Bandpass {
cutoff: Value,
#[serde(default = "default_q")]
q: f32,
},
Notch {
cutoff: Value,
#[serde(default = "default_q")]
q: f32,
},
Peak {
cutoff: Value,
#[serde(default = "default_q")]
q: f32,
#[serde(default)]
gain_db: f32,
},
Lowshelf {
cutoff: Value,
#[serde(default)]
gain_db: f32,
},
Highshelf {
cutoff: Value,
#[serde(default)]
gain_db: f32,
},
Gain {
amount: Value,
},
Bitcrush {
bits: u8,
},
Downsample {
factor: u32,
},
Delay {
secs: f32,
#[serde(default)]
feedback: f32,
},
Reverb {
#[serde(default)]
room: f32,
#[serde(default)]
mix: f32,
},
Modal {
modes: Vec<Mode>,
#[serde(default = "default_modal_mix")]
mix: f32,
},
Drive {
amount: Value,
#[serde(default)]
shape: DriveShape,
#[serde(default, skip_serializing_if = "Option::is_none")]
aa: Option<bool>,
},
RingMod {
freq: Value,
},
Flanger {
#[serde(default = "default_flanger_rate")]
rate: f32,
#[serde(default = "default_mod_depth")]
depth: f32,
#[serde(default = "default_flanger_feedback")]
feedback: f32,
#[serde(default = "default_mod_mix")]
mix: f32,
},
Phaser {
#[serde(default = "default_phaser_rate")]
rate: f32,
#[serde(default = "default_mod_depth")]
depth: f32,
#[serde(default = "default_phaser_feedback")]
feedback: f32,
#[serde(default = "default_mod_mix")]
mix: f32,
},
Chorus {
#[serde(default = "default_chorus_rate")]
rate: f32,
#[serde(default = "default_mod_depth")]
depth: f32,
#[serde(default = "default_mod_mix")]
mix: f32,
},
Duck {
trigger: Box<Node>,
#[serde(default = "default_duck_amount")]
amount: f32,
#[serde(default = "default_duck_attack")]
attack: f32,
#[serde(default = "default_duck_release")]
release: f32,
},
Compress {
threshold: f32,
ratio: f32,
#[serde(default = "default_comp_attack")]
attack: f32,
#[serde(default = "default_comp_release")]
release: f32,
#[serde(default)]
makeup: f32,
},
}
impl Node {
pub fn is_processor(&self) -> bool {
matches!(
self,
Node::Lowpass { .. }
| Node::Highpass { .. }
| Node::Bandpass { .. }
| Node::Notch { .. }
| Node::Peak { .. }
| Node::Lowshelf { .. }
| Node::Highshelf { .. }
| Node::Gain { .. }
| Node::Bitcrush { .. }
| Node::Downsample { .. }
| Node::Delay { .. }
| Node::Reverb { .. }
| Node::Modal { .. }
| Node::Drive { .. }
| Node::RingMod { .. }
| Node::Chorus { .. }
| Node::Flanger { .. }
| Node::Phaser { .. }
| Node::Compress { .. }
| Node::Duck { .. }
)
}
}