diff --git a/lib_midi/src/midi.rs b/lib_midi/src/midi.rs index 04b7b077..ec1dd2a9 100644 --- a/lib_midi/src/midi.rs +++ b/lib_midi/src/midi.rs @@ -67,6 +67,12 @@ impl Midi { } } + // merged_track.notes = merged_track + // .notes + // .into_iter() + // .filter(|n| n.ch == 9) + // .collect(); + merged_track .notes .sort_by(|a, b| a.start.partial_cmp(&b.start).unwrap()); diff --git a/src/output_manager/midi_backend.rs b/src/output_manager/midi_backend.rs index 6c229ebe..795a67d3 100644 --- a/src/output_manager/midi_backend.rs +++ b/src/output_manager/midi_backend.rs @@ -41,11 +41,15 @@ impl MidiBackend { } impl OutputConnection for MidiOutputConnection { - fn note_on(&mut self, _ch: u8, key: u8, vel: u8) { - self.send(&[0x90, key, vel]).ok(); + fn note_on(&mut self, ch: u8, key: u8, vel: u8) { + if ch <= 15 { + self.send(&[0x90 | ch, key, vel]).ok(); + } } - fn note_off(&mut self, _ch: u8, key: u8) { - self.send(&[0x80, key, 0]).ok(); + fn note_off(&mut self, ch: u8, key: u8) { + if ch <= 15 { + self.send(&[0x80 | ch, key, 0]).ok(); + } } } diff --git a/src/scene/menu_scene/iced_menu.rs b/src/scene/menu_scene/iced_menu.rs index b5ced54a..13595781 100644 --- a/src/scene/menu_scene/iced_menu.rs +++ b/src/scene/menu_scene/iced_menu.rs @@ -24,7 +24,7 @@ impl Controls { } pub struct IcedMenu { - midi_file: Option, + midi_file: bool, pub font_path: Option, pub carousel: Carousel, @@ -37,6 +37,8 @@ pub struct IcedMenu { #[derive(Debug, Clone)] pub enum Message { FileSelectPressed, + FileSelected(PathBuf), + FontSelectPressed, PrevPressed, @@ -44,14 +46,15 @@ pub enum Message { PlayPressed, EscPressed, + MidiFileUpdate(bool), OutputsUpdated(Vec), - MainMenuDone(lib_midi::Midi, OutputDescriptor), + MainMenuDone(OutputDescriptor), } impl IcedMenu { pub fn new( - midi_file: Option, + midi_file: bool, outputs: Vec, out_id: Option, font_path: Option, @@ -92,17 +95,20 @@ impl Program for IcedMenu { { Response::Okay(path) => { log::info!("File path = {:?}", path); - let midi = lib_midi::Midi::new(path.to_str().unwrap()); + // let midi = lib_midi::Midi::new(path.to_str().unwrap()); - if let Err(e) = &midi { - log::error!("{}", e); - } + // if let Err(e) = &midi { + // log::error!("{}", e); + // } - self.midi_file = if let Ok(midi) = midi { - Some(midi) - } else { - None - }; + // self.midi_file = if let Ok(midi) = midi { + // Some(midi) + // } else { + // None + // }; + // + + return Command::from(async { Message::FileSelected(path) }); } _ => { log::error!("User canceled dialog"); @@ -140,26 +146,26 @@ impl Program for IcedMenu { } Message::PlayPressed => { - if self.midi_file.is_some() { + if self.midi_file { async fn play(m: Message) -> Message { m } - if self.midi_file.is_some() { - if let Some(midi) = std::mem::replace(&mut self.midi_file, None) { - if let Some(port) = self.carousel.get_item() { - let port = match port { - #[cfg(feature = "synth")] - OutputDescriptor::Synth(_) => OutputDescriptor::Synth( - std::mem::replace(&mut self.font_path, None), - ), - _ => port.clone(), - }; - let event = Message::MainMenuDone(midi, port); - return Command::from(play(event)); - } - } + // if self.midi_file.is_some() { + // if let Some(midi) = std::mem::replace(&mut self.midi_file, None) { + if let Some(port) = self.carousel.get_item() { + let port = match port { + #[cfg(feature = "synth")] + OutputDescriptor::Synth(_) => OutputDescriptor::Synth( + std::mem::replace(&mut self.font_path, None), + ), + _ => port.clone(), + }; + let event = Message::MainMenuDone(port); + return Command::from(play(event)); } + // } + // } } } @@ -172,11 +178,14 @@ impl Program for IcedMenu { } }, + Message::MidiFileUpdate(is) => self.midi_file = is, + Message::OutputsUpdated(outs) => { self.carousel.update(outs); } - Message::MainMenuDone(_, _) => {} + Message::FileSelected(_) => {} + Message::MainMenuDone(_) => {} } Command::none() @@ -212,7 +221,7 @@ impl Program for IcedMenu { let footer: Element<_, _> = { let content: Element = - if self.midi_file.is_some() && self.carousel.get_item().is_some() { + if self.midi_file && self.carousel.get_item().is_some() { let btn = NeoBtn::new( &mut self.play_button, Text::new("Play") diff --git a/src/scene/menu_scene/mod.rs b/src/scene/menu_scene/mod.rs index 02e3770e..34ea239d 100644 --- a/src/scene/menu_scene/mod.rs +++ b/src/scene/menu_scene/mod.rs @@ -33,7 +33,7 @@ impl MenuScene { let timer = Timer::new(); let menu = IcedMenu::new( - std::mem::replace(&mut state.midi_file, None), + state.midi_file.is_some(), state.output_manager.get_outputs(), state.output_manager.selected_output_id, state.output_manager.selected_font_path.clone(), @@ -170,10 +170,22 @@ impl Scene for MenuScene { let event = crate::block_on(async { f.await }); match event { - iced_menu::Message::MainMenuDone(midi, out) => { - let program = self.iced_state.program(); + iced_menu::Message::FileSelected(path) => { + let midi = lib_midi::Midi::new(path.to_str().unwrap()); + + if let Err(e) = &midi { + log::error!("{}", e); + } + + self.main_state.midi_file = midi.ok(); - self.main_state.midi_file = Some(midi); + self.iced_state + .queue_message(iced_menu::Message::MidiFileUpdate( + self.main_state.midi_file.is_some(), + )); + } + iced_menu::Message::MainMenuDone(out) => { + let program = self.iced_state.program(); self.main_state.output_manager.selected_output_id = Some(program.carousel.id()); diff --git a/src/scene/playing_scene/keyboard.rs b/src/scene/playing_scene/keyboard.rs index 381b221b..5d543661 100644 --- a/src/scene/playing_scene/keyboard.rs +++ b/src/scene/playing_scene/keyboard.rs @@ -149,7 +149,6 @@ impl PianoKeyboard { Color::from_rgba8(125, 69, 134, 1.0), ], ]; - let white_keys = white_keys.into_iter().map(|note| { let color = colors[note.1 % 2]; if note.0 { diff --git a/src/scene/playing_scene/notes.rs b/src/scene/playing_scene/notes.rs index 28b7cc6b..1ec048b8 100644 --- a/src/scene/playing_scene/notes.rs +++ b/src/scene/playing_scene/notes.rs @@ -30,7 +30,7 @@ impl Notes { let mut longer_than_88 = false; for note in midi.merged_track.notes.iter() { - if note.note >= 21 && note.note <= 108 { + if note.note >= 21 && note.note <= 108 && note.ch != 9 { let key = &keys[note.note as usize - 21]; let ar = window_w / window_h;