mod midi_clip; pub use midi_clip::*; mod midi_launch; pub use midi_launch::*; mod midi_player; pub use midi_player::*; mod midi_in; pub use midi_in::*; mod midi_out; pub use midi_out::*; mod midi_pitch; pub use midi_pitch::*; mod midi_range; pub use midi_range::*; mod midi_point; pub use midi_point::*; mod midi_view; pub use midi_view::*; mod midi_select; pub use midi_select::*; mod midi_pool; pub use midi_pool::*; mod midi_pool_tui; pub use midi_pool_tui::*; mod midi_pool_cmd; pub use midi_pool_cmd::*; mod midi_editor; pub use midi_editor::*; mod midi_edit_cmd; pub use midi_edit_cmd::*; mod midi_edit_tui; pub use midi_edit_tui::*; mod piano_h; pub use self::piano_h::*; pub(crate) use ::tek_time::*; pub(crate) use ::tek_jack::{*, jack::*}; pub(crate) use ::tek_tui::{ *, tek_input::*, tek_output::*, tek_edn::*, crossterm::event::*, ratatui::style::{Style, Stylize, Color} }; pub(crate) use std::sync::{Arc, RwLock, atomic::{AtomicUsize, AtomicBool, Ordering::Relaxed}}; pub(crate) use std::path::PathBuf; pub(crate) use std::fmt::Debug; pub use ::midly; pub(crate) use ::midly::{*, num::*, live::*}; /// Add "all notes off" to the start of a buffer. pub fn all_notes_off (output: &mut [Vec>]) { let mut buf = vec![]; let msg = MidiMessage::Controller { controller: 123.into(), value: 0.into() }; let evt = LiveEvent::Midi { channel: 0.into(), message: msg }; evt.write(&mut buf).unwrap(); output[0].push(buf); } /// Return boxed iterator of MIDI events pub fn parse_midi_input <'a> (input: MidiIter<'a>) -> Box, &'a [u8])> + 'a> { Box::new(input.map(|RawMidi { time, bytes }|( time as usize, LiveEvent::parse(bytes).unwrap(), bytes ))) } /// Update notes_in array pub fn update_keys (keys: &mut[bool;128], message: &MidiMessage) { match message { MidiMessage::NoteOn { key, .. } => { keys[key.as_int() as usize] = true; } MidiMessage::NoteOff { key, .. } => { keys[key.as_int() as usize] = false; }, _ => {} } }