From 63b5eb374030307cd220bc1d3d3bb6c32801a70b Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 5 Jul 2024 20:14:49 +0300 Subject: [PATCH] per-track reset --- src/control.rs | 2 ++ src/model.rs | 6 +++--- src/model/track.rs | 12 ++++++++++-- src/view.rs | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/control.rs b/src/control.rs index 8ebba520..f5f0a0fe 100644 --- a/src/control.rs +++ b/src/control.rs @@ -302,10 +302,12 @@ fn activate (app: &mut App) -> Usually { if app.track_cursor == 0 { for (i, track) in app.tracks.iter_mut().enumerate() { track.sequence = scene.clips[i]; + track.reset = true; } } else { let track = &mut app.tracks[app.track_cursor - 1]; track.sequence = scene.clips[app.track_cursor - 1]; + track.reset = true; }; true } diff --git a/src/model.rs b/src/model.rs index f5cdce9d..4920aa82 100644 --- a/src/model.rs +++ b/src/model.rs @@ -82,7 +82,7 @@ process!(App |self, _client, scope| { } = scope.cycle_times().unwrap(); let transport = self.transport.as_ref().unwrap().query().unwrap(); self.playhead = transport.pos.frame() as usize; - let mut send_all_off = false; + let mut reset = false; if self.playing != Some(transport.state) { match transport.state { TransportState::Rolling => { @@ -90,7 +90,7 @@ process!(App |self, _client, scope| { }, TransportState::Stopped => { self.play_started = None; - send_all_off = true; + reset = true; }, _ => {} } @@ -103,7 +103,7 @@ process!(App |self, _client, scope| { self.playing, self.play_started, self.quant, - send_all_off, + reset, &scope, (current_frames as usize, self.chunk_size), (current_usecs as usize, next_usecs.saturating_sub(current_usecs) as usize), diff --git a/src/model/track.rs b/src/model/track.rs index 9f03beda..3a845c55 100644 --- a/src/model/track.rs +++ b/src/model/track.rs @@ -22,6 +22,9 @@ pub struct Track { pub devices: Vec, /// Device selector pub device: usize, + /// Send all notes off + /// FIXME: Some(nframes)? + pub reset: bool } ports!(Track { audio: { @@ -51,6 +54,7 @@ impl Track { phrases: phrases.unwrap_or_else(||Vec::with_capacity(16)), devices: devices.unwrap_or_else(||Vec::with_capacity(16)), device: 0, + reset: true, }) } pub fn device (&self) -> Option>> { @@ -117,7 +121,7 @@ impl Track { playing: Option, started: Option, quant: usize, - panic: bool, + reset: bool, scope: &ProcessScope, (frame0, frames): (usize, usize), (usec0, usecs): (usize, usize), @@ -131,7 +135,11 @@ impl Track { frame.clear(); } // Emit "all notes off" at start of buffer if requested - if panic { + if self.reset { + all_notes_off(&mut self.midi_out_buf); + self.reset = false; + } + else if reset { all_notes_off(&mut self.midi_out_buf); } // Play from phrase into output buffer diff --git a/src/view.rs b/src/view.rs index 577a2a96..4f215a50 100644 --- a/src/view.rs +++ b/src/view.rs @@ -45,12 +45,13 @@ render!(App |self, buf, area| { .get(self.track_cursor - 1) .unwrap(); + let chain_area = Rect { x, y: y + height - height / 3 - 1, width, height: height / 3 }; ChainView { focused: self.section == 1, track: Some(track), vertical: false, } - .render(buf, Rect { x, y: y + height - height / 3 - 1, width, height: height / 3 })?.height; + .render(buf, chain_area)?; let phrase = self.phrase();