use crate::*; /// The sampler plugin plays sounds. #[derive(Debug)] pub struct Sampler { pub jack: Arc>, pub name: String, pub mapped: BTreeMap>>, pub unmapped: Vec>>, pub voices: Arc>>, pub midi_in: Port, pub audio_outs: Vec>, pub buffer: Vec>, pub output_gain: f32 } impl Sampler { pub fn from_edn <'e> (jack: &Arc>, args: &[Edn<'e>]) -> Usually { let mut name = String::new(); let mut dir = String::new(); let mut samples = BTreeMap::new(); edn!(edn in args { Edn::Map(map) => { if let Some(Edn::Str(n)) = map.get(&Edn::Key(":name")) { name = String::from(*n); } if let Some(Edn::Str(n)) = map.get(&Edn::Key(":dir")) { dir = String::from(*n); } }, Edn::List(args) => match args.get(0) { Some(Edn::Symbol("sample")) => { let (midi, sample) = Sample::from_edn(jack, &dir, &args[1..])?; if let Some(midi) = midi { samples.insert(midi, sample); } else { panic!("sample without midi binding: {}", sample.read().unwrap().name); } }, _ => panic!("unexpected in sampler {name}: {args:?}") }, _ => panic!("unexpected in sampler {name}: {edn:?}") }); Ok(Sampler { jack: jack.clone(), name: name.into(), mapped: samples, unmapped: Default::default(), voices: Default::default(), buffer: Default::default(), midi_in: jack.read().unwrap().register_port("in", MidiIn::default())?, audio_outs: vec![], output_gain: 0. }) } }