mirror of
https://codeberg.org/unspeaker/tek.git
synced 2026-01-31 16:36:40 +01:00
61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
use crate::*;
|
|
|
|
pub use ::midly::{
|
|
Smf,
|
|
TrackEventKind,
|
|
MidiMessage,
|
|
num::*,
|
|
live::*,
|
|
};
|
|
|
|
/// 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; },
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
/// Return boxed iterator of MIDI events
|
|
pub fn parse_midi_input <'a> (input: ::jack::MidiIter<'a>) -> Box<dyn Iterator<Item=(usize, LiveEvent<'a>, &'a [u8])> + 'a> {
|
|
Box::new(input.map(|::jack::RawMidi { time, bytes }|(
|
|
time as usize,
|
|
LiveEvent::parse(bytes).unwrap(),
|
|
bytes
|
|
)))
|
|
}
|
|
|
|
/// Add "all notes off" to the start of a buffer.
|
|
pub fn all_notes_off (output: &mut [Vec<Vec<u8>>]) {
|
|
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);
|
|
}
|
|
|
|
/// Trait for thing that may receive MIDI.
|
|
pub trait HasMidiIns {
|
|
fn midi_ins (&self) -> &Vec<JackMidiIn>;
|
|
|
|
fn midi_ins_mut (&mut self) -> &mut Vec<JackMidiIn>;
|
|
|
|
fn has_midi_ins (&self) -> bool {
|
|
!self.midi_ins().is_empty()
|
|
}
|
|
}
|
|
|
|
/// Trait for thing that may output MIDI.
|
|
pub trait HasMidiOuts {
|
|
fn midi_outs (&self) -> &Vec<JackMidiOut>;
|
|
|
|
fn midi_outs_mut (&mut self) -> &mut Vec<JackMidiOut>;
|
|
|
|
fn has_midi_outs (&self) -> bool {
|
|
!self.midi_outs().is_empty()
|
|
}
|
|
|
|
/// Buffer for serializing a MIDI event. FIXME rename
|
|
fn midi_note (&mut self) -> &mut Vec<u8>;
|
|
}
|