#![warn(clippy::single_char_lifetime_names)]
mod events;
pub mod file;
pub mod player;
use midir::SendError;
use midly::{
live::LiveEvent,
num::{u4, u7},
Error as MidlyError, MidiMessage,
};
use thiserror::Error;
pub use midir::{MidiOutput, MidiOutputConnection, MidiOutputPort};
pub use crate::{file::MidiFile, player::MidiPlayer};
const ALL_SOUND_OFF_CC: u7 = u7::new(123);
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum LyricaError {
#[error("couldn't send MIDI message: {0}")]
SendFailed(#[from] SendError),
#[error("failed to parse standard MIDI file: {0}")]
ParsingFailed(#[source] MidlyError),
}
fn all_sound_off(connection: &mut MidiOutputConnection) -> Result<(), LyricaError> {
let mut event_bytes = Vec::new();
for i in 0..16 {
let event = LiveEvent::Midi {
channel: u4::new(i),
message: MidiMessage::Controller {
controller: ALL_SOUND_OFF_CC,
value: u7::new(0),
},
};
event
.write_std(&mut event_bytes)
.expect("failed to write MIDI event to buffer");
connection.send(&event_bytes)?;
event_bytes.clear();
}
Ok(())
}