use crate::types::{midi2freq, DelayType, FilterSlope, LfoShape}; #[derive(Clone, Default, Debug)] pub struct Event { pub cmd: Option, // Timing pub time: Option, pub repeat: Option, pub duration: Option, pub gate: Option, // Voice control pub voice: Option, pub reset: Option, pub orbit: Option, // Pitch pub freq: Option, pub detune: Option, pub speed: Option, pub glide: Option, // Source pub sound: Option, pub pw: Option, pub spread: Option, pub size: Option, pub mult: Option, pub warp: Option, pub mirror: Option, pub harmonics: Option, pub timbre: Option, pub morph: Option, pub n: Option, pub cut: Option, pub begin: Option, pub end: Option, // Web sample (WASM only - set by JavaScript) pub file_pcm: Option, pub file_frames: Option, pub file_channels: Option, pub file_freq: Option, // Gain pub gain: Option, pub postgain: Option, pub velocity: Option, pub pan: Option, // Gain envelope pub attack: Option, pub decay: Option, pub sustain: Option, pub release: Option, // Lowpass filter pub lpf: Option, pub lpq: Option, pub lpe: Option, pub lpa: Option, pub lpd: Option, pub lps: Option, pub lpr: Option, // Highpass filter pub hpf: Option, pub hpq: Option, pub hpe: Option, pub hpa: Option, pub hpd: Option, pub hps: Option, pub hpr: Option, // Bandpass filter pub bpf: Option, pub bpq: Option, pub bpe: Option, pub bpa: Option, pub bpd: Option, pub bps: Option, pub bpr: Option, // Filter type pub ftype: Option, // Pitch envelope pub penv: Option, pub patt: Option, pub pdec: Option, pub psus: Option, pub prel: Option, // Vibrato pub vib: Option, pub vibmod: Option, pub vibshape: Option, // FM synthesis pub fm: Option, pub fmh: Option, pub fmshape: Option, pub fme: Option, pub fma: Option, pub fmd: Option, pub fms: Option, pub fmr: Option, // AM pub am: Option, pub amdepth: Option, pub amshape: Option, // Ring mod pub rm: Option, pub rmdepth: Option, pub rmshape: Option, // Phaser pub phaser: Option, pub phaserdepth: Option, pub phasersweep: Option, pub phasercenter: Option, // Flanger pub flanger: Option, pub flangerdepth: Option, pub flangerfeedback: Option, // Chorus pub chorus: Option, pub chorusdepth: Option, pub chorusdelay: Option, // Comb filter pub comb: Option, pub combfreq: Option, pub combfeedback: Option, pub combdamp: Option, // Distortion pub coarse: Option, pub crush: Option, pub fold: Option, pub wrap: Option, pub distort: Option, pub distortvol: Option, // Delay pub delay: Option, pub delaytime: Option, pub delayfeedback: Option, pub delaytype: Option, // Reverb pub verb: Option, pub verbdecay: Option, pub verbdamp: Option, pub verbpredelay: Option, pub verbdiff: Option, } impl Event { pub fn parse(input: &str) -> Self { let mut event = Self::default(); let tokens: Vec<&str> = input.trim().split('/').filter(|s| !s.is_empty()).collect(); let mut i = 0; while i + 1 < tokens.len() { let key = tokens[i]; let val = tokens[i + 1]; match key { "doux" | "dirt" => event.cmd = Some(val.to_string()), "time" | "t" => event.time = val.parse().ok(), "repeat" | "rep" => event.repeat = val.parse().ok(), "duration" | "dur" | "d" => event.duration = val.parse().ok(), "gate" => event.gate = val.parse().ok(), "voice" => event.voice = val.parse::().ok().map(|f| f as usize), "reset" => event.reset = Some(val == "1" || val == "true"), "orbit" => event.orbit = val.parse::().ok().map(|f| f as usize), "freq" => event.freq = val.parse().ok(), "note" => event.freq = val.parse().ok().map(midi2freq), "detune" => event.detune = val.parse().ok(), "speed" => event.speed = val.parse().ok(), "glide" => event.glide = val.parse().ok(), "sound" | "s" => event.sound = Some(val.to_string()), "pw" => event.pw = val.parse().ok(), "spread" => event.spread = val.parse().ok(), "size" => event.size = val.parse().ok(), "mult" => event.mult = val.parse().ok(), "warp" => event.warp = val.parse().ok(), "mirror" => event.mirror = val.parse().ok(), "harmonics" | "harm" => event.harmonics = val.parse().ok(), "timbre" => event.timbre = val.parse().ok(), "morph" => event.morph = val.parse().ok(), "n" => event.n = val.parse::().ok().map(|f| f as usize), "cut" => event.cut = val.parse::().ok().map(|f| f as usize), "begin" => event.begin = val.parse().ok(), "end" => event.end = val.parse().ok(), "file_pcm" => event.file_pcm = val.parse().ok(), "file_frames" => event.file_frames = val.parse().ok(), "file_channels" => event.file_channels = val.parse::().ok().map(|f| f as u8), "file_freq" => event.file_freq = val.parse().ok(), "gain" => event.gain = val.parse().ok(), "postgain" => event.postgain = val.parse().ok(), "velocity" => event.velocity = val.parse().ok(), "pan" => event.pan = val.parse().ok(), "attack" => event.attack = val.parse().ok(), "decay" => event.decay = val.parse().ok(), "sustain" => event.sustain = val.parse().ok(), "release" => event.release = val.parse().ok(), "lpf" | "cutoff" => event.lpf = val.parse().ok(), "lpq" | "resonance" => event.lpq = val.parse().ok(), "lpe" | "lpenv" => event.lpe = val.parse().ok(), "lpa" | "lpattack" => event.lpa = val.parse().ok(), "lpd" | "lpdecay" => event.lpd = val.parse().ok(), "lps" | "lpsustain" => event.lps = val.parse().ok(), "lpr" | "lprelease" => event.lpr = val.parse().ok(), "hpf" | "hcutoff" => event.hpf = val.parse().ok(), "hpq" | "hresonance" => event.hpq = val.parse().ok(), "hpe" | "hpenv" => event.hpe = val.parse().ok(), "hpa" => event.hpa = val.parse().ok(), "hpd" => event.hpd = val.parse().ok(), "hps" => event.hps = val.parse().ok(), "hpr" => event.hpr = val.parse().ok(), "bpf" | "bandf" => event.bpf = val.parse().ok(), "bpq" | "bandq" => event.bpq = val.parse().ok(), "bpe" | "bpenv" => event.bpe = val.parse().ok(), "bpa" | "bpattack" => event.bpa = val.parse().ok(), "bpd" | "bpdecay" => event.bpd = val.parse().ok(), "bps" | "bpsustain" => event.bps = val.parse().ok(), "bpr" | "bprelease" => event.bpr = val.parse().ok(), "ftype" => event.ftype = val.parse().ok(), "penv" => event.penv = val.parse().ok(), "patt" => event.patt = val.parse().ok(), "pdec" => event.pdec = val.parse().ok(), "psus" => event.psus = val.parse().ok(), "prel" => event.prel = val.parse().ok(), "vib" => event.vib = val.parse().ok(), "vibmod" => event.vibmod = val.parse().ok(), "vibshape" => event.vibshape = val.parse().ok(), "fm" | "fmi" => event.fm = val.parse().ok(), "fmh" => event.fmh = val.parse().ok(), "fmshape" => event.fmshape = val.parse().ok(), "fme" => event.fme = val.parse().ok(), "fma" => event.fma = val.parse().ok(), "fmd" => event.fmd = val.parse().ok(), "fms" => event.fms = val.parse().ok(), "fmr" => event.fmr = val.parse().ok(), "am" => event.am = val.parse().ok(), "amdepth" => event.amdepth = val.parse().ok(), "amshape" => event.amshape = val.parse().ok(), "rm" => event.rm = val.parse().ok(), "rmdepth" => event.rmdepth = val.parse().ok(), "rmshape" => event.rmshape = val.parse().ok(), "phaser" | "phaserrate" => event.phaser = val.parse().ok(), "phaserdepth" => event.phaserdepth = val.parse().ok(), "phasersweep" => event.phasersweep = val.parse().ok(), "phasercenter" => event.phasercenter = val.parse().ok(), "flanger" | "flangerrate" => event.flanger = val.parse().ok(), "flangerdepth" => event.flangerdepth = val.parse().ok(), "flangerfeedback" => event.flangerfeedback = val.parse().ok(), "chorus" | "chorusrate" => event.chorus = val.parse().ok(), "chorusdepth" => event.chorusdepth = val.parse().ok(), "chorusdelay" => event.chorusdelay = val.parse().ok(), "comb" => event.comb = val.parse().ok(), "combfreq" => event.combfreq = val.parse().ok(), "combfeedback" => event.combfeedback = val.parse().ok(), "combdamp" => event.combdamp = val.parse().ok(), "coarse" => event.coarse = val.parse().ok(), "crush" => event.crush = val.parse().ok(), "fold" => event.fold = val.parse().ok(), "wrap" => event.wrap = val.parse().ok(), "distort" => event.distort = val.parse().ok(), "distortvol" => event.distortvol = val.parse().ok(), "delay" => event.delay = val.parse().ok(), "delaytime" => event.delaytime = val.parse().ok(), "delayfeedback" => event.delayfeedback = val.parse().ok(), "delaytype" | "dtype" => event.delaytype = val.parse().ok(), "verb" | "reverb" => event.verb = val.parse().ok(), "verbdecay" => event.verbdecay = val.parse().ok(), "verbdamp" => event.verbdamp = val.parse().ok(), "verbpredelay" => event.verbpredelay = val.parse().ok(), "verbdiff" => event.verbdiff = val.parse().ok(), _ => {} } i += 2; } event } }