Skip to content

Commit 6314e9b

Browse files
committed
fixes #106, bugfix with loop mode midi message control, also add keyboard shortcuts for loop mode, set A, set B, and Clear A/B
1 parent 273dbe3 commit 6314e9b

File tree

6 files changed

+42
-7
lines changed

6 files changed

+42
-7
lines changed

crates/notation_bevy/src/app/app.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,26 @@ fn handle_keyboard_inputs(
209209
} else if keyboard_input.just_released(KeyCode::Space) {
210210
crate::viewer::control::ControlView::play_or_pause(&mut midi_state, &mut play_control_evts);
211211
} else if keyboard_input.just_released(KeyCode::Return) {
212-
crate::viewer::control::ControlView::play_or_stop(&mut midi_state, &mut play_control_evts);
212+
crate::viewer::control::ControlView::stop(&mut midi_state, &mut play_control_evts);
213213
} else if keyboard_input.just_released(KeyCode::Backslash) {
214214
crate::viewer::control::ControlView::toggle_layout_mode(&mut app_state, &mut settings, &mut theme);
215215
} else if keyboard_input.just_released(KeyCode::M) {
216216
crate::viewer::control::ControlView::toggle_show_melody_syllable(&mut app_state, &mut settings, &mut theme);
217217
} else if keyboard_input.just_released(KeyCode::F) {
218218
crate::viewer::control::ControlView::toggle_always_show_fret(&mut app_state, &mut settings, &mut theme);
219+
} else if keyboard_input.just_released(KeyCode::L) {
220+
settings.should_loop = !settings.should_loop;
221+
crate::viewer::control::ControlView::sync_should_loop(
222+
&settings,
223+
&mut midi_state,
224+
&mut play_control_evts,
225+
);
226+
} else if keyboard_input.just_released(KeyCode::A) {
227+
crate::viewer::control::ControlView::set_begin_bar_ordinal(&mut midi_state, &mut play_control_evts);
228+
} else if keyboard_input.just_released(KeyCode::B) {
229+
crate::viewer::control::ControlView::set_end_bar_ordinal(&mut midi_state, &mut play_control_evts);
230+
} else if keyboard_input.just_released(KeyCode::C) {
231+
crate::viewer::control::ControlView::clear_begin_end(&mut midi_state, &mut play_control_evts);
219232
}
220233
}
221234

crates/notation_bevy/src/viewer/control.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ impl ControlView {
360360
if ui.button(format!("End: {}", midi_state.play_control.end_bar_ordinal)).clicked() {
361361
Self::set_end_bar_ordinal(midi_state, play_control_evts);
362362
}
363+
if ui.button("Clear").clicked() {
364+
Self::clear_begin_end(midi_state, play_control_evts);
365+
}
363366
});
364367
ui.add(Slider::new(&mut settings.speed_factor, 0.1..=2.0).text("Speed"));
365368
if float_ne!(play_speed, settings.speed_factor, abs <= 0.01) {

crates/notation_midi/src/midi_hub.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,13 @@ impl MidiHub {
7979
}
8080
self.check_output(settings);
8181
if let Some(synth) = &self.output_synth {
82+
//println!("send to synth: {:?}", msg);
8283
if let Err(err) = synth.send(speed, msg) {
8384
println!("send to synth failed: {:?} -> {:?}", msg, err);
8485
}
8586
}
8687
if let Some(conn) = &self.output_conn {
87-
//println!("send midi: {:?}", msg);
88+
//println!("send to midi: {:?}", msg);
8889
if let Err(err) = conn.lock().unwrap().send(&msg.to_midi()) {
8990
println!("send to midi failed: {:?} -> {:?}", msg, err);
9091
}

crates/notation_midi/src/midi_state.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ impl MidiChannel {
6666
}
6767
}
6868
pub fn calc_next_index(&mut self, position: &BarPosition) {
69+
let pos_units = Units::from(*position);
6970
for (index, value) in self.messages.iter().enumerate() {
70-
if Units::from(value.bar_position()) >= Units::from(*position) {
71+
if Units::from(value.bar_position()) >= pos_units {
7172
self.next_index = index;
7273
return;
7374
}
@@ -82,13 +83,18 @@ impl MidiChannel {
8283
old_position: &Position,
8384
play_control: &PlayControl,
8485
end_passed: bool,
86+
jumped: bool,
8587
) -> usize {
8688
if self.messages.len() == 0 {
8789
return 0;
8890
}
89-
if end_passed {
91+
if end_passed || jumped {
9092
self.init_channel(settings, hub, speed);
91-
self.calc_next_index(&play_control.begin_bar_position());
93+
if end_passed {
94+
self.calc_next_index(&play_control.begin_bar_position());
95+
} else {
96+
self.calc_next_index(&play_control.position.bar);
97+
}
9298
} else if self.ensure_sorted() {
9399
self.calc_next_index(&old_position.bar);
94100
}
@@ -104,7 +110,11 @@ impl MidiChannel {
104110
count += 1;
105111
hub.send(settings, speed, next);
106112
} else {
107-
break;
113+
if next.bar_position().bar_ordinal < play_control.begin_bar_ordinal {
114+
self.next_index += 1;
115+
} else {
116+
break;
117+
}
108118
}
109119
} else {
110120
break;
@@ -261,6 +271,7 @@ impl MidiState {
261271
&old_position,
262272
&self.play_control,
263273
tick_result.end_passed,
274+
tick_result.jumped,
264275
);
265276
}
266277
}

crates/notation_midi/src/wasm/midi_synth.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use notation_model::prelude::{Entry, PlaySpeed};
77
pub struct MidiSynth {}
88

99
impl MidiSynth {
10+
pub const VOLUME_FACTOR: f32 = 0.8; //The sound in browser is a bit too loud
11+
1012
pub fn try_new() -> Option<MidiSynth> {
1113
Some(MidiSynth {})
1214
}
@@ -33,7 +35,7 @@ impl MidiSynth {
3335
channel.into(),
3436
key_number.into(),
3537
speed.calc_seconds(msg.entry.tied_units()),
36-
u8::from(velocity) as f32 / 128.0,
38+
u8::from(velocity) as f32 / 128.0 * Self::VOLUME_FACTOR,
3739
)),
3840
_ => Err("NOT_IMPLEMENTED".to_owned()),
3941
}

crates/notation_model/src/play/play_control.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ impl PlayControl {
125125
}
126126
pub fn tick(&mut self, jumped: bool, delta_seconds: f32) -> TickResult {
127127
if self.play_state.is_playing() {
128+
let mut jumped = jumped;
129+
if self.position.bar.bar_ordinal < self.begin_bar_ordinal || self.position.bar.bar_ordinal > self.end_bar_ordinal {
130+
self.position.set_in_bar(self.begin_bar_ordinal, Units(0.0));
131+
jumped = true;
132+
}
128133
let delta_units = self.play_speed.calc_units(delta_seconds);
129134
self.position.tick(delta_units);
130135
let end_passed = self.position.bar.bar_ordinal > self.end_bar_ordinal;

0 commit comments

Comments
 (0)