use crate::*; pub type MidiSample = (Option, Arc>); impl Sampler { /// Create [Voice]s from [Sample]s in response to MIDI input. pub fn process_midi_in (&mut self, scope: &ProcessScope) { let Sampler { midi_in, mapped, voices, .. } = self; for RawMidi { time, bytes } in midi_in.port().iter(scope) { if let LiveEvent::Midi { message, .. } = LiveEvent::parse(bytes).unwrap() { match message { MidiMessage::NoteOn { ref key, ref vel } => { if let Some(ref sample) = mapped[key.as_int() as usize] { voices.write().unwrap().push(Sample::play(sample, time as usize, vel)); } }, MidiMessage::Controller { controller: _, value: _ } => { // TODO } _ => {} } } } } } impl Sample { pub fn handle_cc (&mut self, controller: u7, value: u7) { let percentage = value.as_int() as f64 / 127.; match controller.as_int() { 20 => { self.start = (percentage * self.end as f64) as usize; }, 21 => { let length = self.channels[0].len(); self.end = length.min( self.start + (percentage * (length as f64 - self.start as f64)) as usize ); }, 22 => { /*attack*/ }, 23 => { /*decay*/ }, 24 => { self.gain = percentage as f32 * 2.0; }, 26 => { /* pan */ } 25 => { /* pitch */ } _ => {} } } } // TODO: //for port in midi_in.iter() { //for event in port.iter() { //match event { //(time, Ok(LiveEvent::Midi {message, ..})) => match message { //MidiMessage::NoteOn {ref key, ..} if let Some(editor) = self.editor.as_ref() => { //editor.set_note_pos(key.as_int() as usize); //}, //MidiMessage::Controller {controller, value} if let (Some(editor), Some(sampler)) = ( //self.editor.as_ref(), //self.sampler.as_ref(), //) => { //// TODO: give sampler its own cursor //if let Some(sample) = &sampler.mapped[editor.note_pos()] { //sample.write().unwrap().handle_cc(*controller, *value) //} //} //_ =>{} //}, //_ =>{} //} //} //}