pub(crate) const MASTER_BPM_MIN: f32 = 60.0;
pub(crate) const MASTER_BPM_MAX: f32 = 200.0;
pub(crate) const BASS_CUTOFF_MIN_HZ: f32 = 80.0;
pub(crate) const BASS_CUTOFF_MAX_HZ: f32 = 8000.0;
pub(crate) const LEVEL_RAMP_MS: f32 = 30.0;
#[derive(Clone)]
pub(crate) struct MasterControls {
pub bpm: f32,
pub level: f32,
pub drive: f32,
pub comp_threshold: f32, pub comp_ratio: f32, pub comp_release_ms: f32, pub tone: f32, pub tune: f32, }
impl Default for MasterControls {
fn default() -> Self {
Self {
bpm: 82.0,
level: 0.8,
drive: 0.1,
comp_threshold: -8.0,
comp_ratio: 2.0,
comp_release_ms: 100.0,
tone: 0.0,
tune: 0.0,
}
}
}
#[derive(Clone)]
pub(crate) struct PercControls {
pub level: f32,
pub decay_ms: f32,
pub filter: f32,
pub interval_beats: f32,
pub offset_beats: f32,
pub swing: f32, }
impl Default for PercControls {
fn default() -> Self {
Self {
level: 0.0,
decay_ms: 200.0,
filter: 0.7,
interval_beats: 0.25,
offset_beats: 0.0,
swing: 0.0,
}
}
}
#[derive(Clone, Default)]
pub(crate) struct ChordSlotControls {
pub degree: f32,
pub accidental: f32,
pub extension: f32,
pub inversion: f32,
}
pub(crate) const DEFAULT_CHORD_SLOT_DEGREES: [f32; 8] = [0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 2.0, 4.0];
pub(crate) const CHORD_SLOT_COUNT: usize = 8;
#[derive(Clone)]
pub(crate) struct PadControls {
pub level: f32,
pub voice_type: f32, pub chord_bars: f32, pub chord_count: f32,
pub progression: f32,
pub chord_slots: [ChordSlotControls; CHORD_SLOT_COUNT],
pub reverb_mix: f32,
pub stereo_width: f32,
pub detune: f32,
pub octave_mix: f32,
pub attack_time: f32,
pub release_time: f32,
}
impl Default for PadControls {
fn default() -> Self {
Self {
level: 0.7,
voice_type: 0.0,
chord_bars: 4.0,
chord_count: 8.0,
progression: 0.0,
chord_slots: std::array::from_fn(|slot| ChordSlotControls {
degree: DEFAULT_CHORD_SLOT_DEGREES[slot],
..ChordSlotControls::default()
}),
reverb_mix: 0.8,
stereo_width: 0.8,
detune: 0.5,
octave_mix: 0.5,
attack_time: 6.0,
release_time: 8.0,
}
}
}
#[derive(Clone)]
pub(crate) struct KickControls {
pub level: f32,
pub voice_type: f32, pub start_freq: f32,
pub pitch_decay_ms: f32,
pub amp_decay_ms: f32,
pub click: f32, pub drive: f32,
pub filter: f32,
pub interval_beats: f32,
pub offset_beats: f32,
}
impl Default for KickControls {
fn default() -> Self {
Self {
level: 0.0,
voice_type: 0.0,
start_freq: 160.0,
pitch_decay_ms: 55.0,
amp_decay_ms: 250.0,
click: 0.0,
drive: 0.2,
filter: 0.7,
interval_beats: 1.0,
offset_beats: 0.0,
}
}
}
#[derive(Clone)]
pub(crate) struct TonalControls {
pub level: f32,
pub synth_type: f32,
pub octave: f32,
pub phrase: f32,
pub randomness: f32,
pub evolve_rate: f32,
pub rate_beats: f32,
pub step_interval_beats: f32,
pub offset_beats: f32,
pub attack: f32,
pub decay: f32,
pub reverb_mix: f32,
pub swing: f32, }
impl Default for TonalControls {
fn default() -> Self {
Self {
level: 0.0,
synth_type: 0.0,
octave: 0.0,
phrase: 0.0,
randomness: 0.5,
evolve_rate: 0.0,
rate_beats: 0.5,
step_interval_beats: 16.0,
offset_beats: 0.0,
attack: 0.03,
decay: 1.2,
reverb_mix: 0.6,
swing: 0.0,
}
}
}
#[derive(Clone)]
pub(crate) struct ClapControls {
pub level: f32,
pub interval_beats: f32,
pub offset_beats: f32,
pub slap_count: f32, pub slap_spread_ms: f32, pub decay_ms: f32, pub filter: f32, pub room: f32, pub body: f32, }
impl Default for ClapControls {
fn default() -> Self {
Self {
level: 0.0,
interval_beats: 2.0,
offset_beats: 1.0,
slap_count: 3.0,
slap_spread_ms: 8.0,
decay_ms: 40.0,
filter: 0.75,
room: 0.0,
body: 0.2,
}
}
}
#[derive(Clone)]
pub(crate) struct BassControls {
pub level: f32,
pub voice_type: f32, pub interval_beats: f32, pub offset_beats: f32,
pub rhythm: f32, pub octave: f32, pub attack_time: f32,
pub decay_time: f32, pub drive: f32,
pub cutoff: f32, }
impl Default for BassControls {
fn default() -> Self {
Self {
level: 0.0,
voice_type: 0.0,
interval_beats: 4.0,
offset_beats: 0.0,
rhythm: 0.0,
octave: -1.0,
decay_time: 0.3,
attack_time: 0.01,
drive: 0.15,
cutoff: BASS_CUTOFF_MAX_HZ,
}
}
}
#[derive(Clone)]
pub(crate) struct ArpControls {
pub gain: f32,
pub voice_type: f32, pub rate_beats: f32,
pub offset_beats: f32,
pub pattern: f32, pub octaves: f32, pub attack: f32,
pub decay: f32,
pub reverb_mix: f32,
pub swing: f32, }
impl Default for ArpControls {
fn default() -> Self {
Self {
gain: 0.0,
voice_type: 6.0,
rate_beats: 0.5,
offset_beats: 0.0,
pattern: 0.0,
octaves: 1.0,
attack: 0.005,
decay: 0.4,
reverb_mix: 0.5,
swing: 0.0,
}
}
}
pub(crate) const MACRO_COUNT: usize = 4;
#[derive(Clone, Default)]
pub(crate) struct MacroControls {
pub values: [f32; MACRO_COUNT],
}
#[derive(Clone, Default)]
pub(crate) struct FluidControls {
pub master: MasterControls,
pub perc: PercControls,
pub pad: PadControls,
pub kick: KickControls,
pub tonal: TonalControls,
pub clap: ClapControls,
pub bass: BassControls,
pub arp: ArpControls,
pub macros: MacroControls,
}