From 939ffe36301066e44068cccb1e345257716f2c7d Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 1 Jul 2024 22:12:25 +0300 Subject: [PATCH] refactor: reuse horizontal::draw --- src/core/time.rs | 34 ++++++++- src/device/launcher/mod.rs | 34 ++++----- src/device/sequencer/horizontal.rs | 116 +++++++++++++++-------------- src/device/sequencer/mod.rs | 49 +++--------- src/device/transport.rs | 12 ++- src/main.rs | 2 +- 6 files changed, 130 insertions(+), 117 deletions(-) diff --git a/src/core/time.rs b/src/core/time.rs index 9db24137..1c0beea8 100644 --- a/src/core/time.rs +++ b/src/core/time.rs @@ -27,7 +27,7 @@ impl Timebase { self.bpm.load(Ordering::Relaxed) } #[inline] fn beat_usec (&self) -> f64 { - 60_000_000_000_000f64 / self.bpm() as f64 + 60_000_000f64 / self.bpm() as f64 } #[inline] pub fn ppq (&self) -> f64 { @@ -36,7 +36,7 @@ impl Timebase { #[inline] fn pulse_usec (&self) -> f64 { self.beat_usec() / self.ppq() as f64 } - #[inline] fn pulse_frame (&self) -> f64 { + #[inline] pub fn pulse_frame (&self) -> f64 { self.pulse_usec() / self.frame_usec() as f64 } #[inline] pub fn pulses_frames (&self, pulses: f64) -> f64 { @@ -130,3 +130,33 @@ impl Timebase { } } +#[cfg(test)] mod test { + use super::*; + + #[test] + fn test_timebase () -> Usually<()> { + let timebase = Timebase::new(48000.0, 240.0, 24.0); + println!("F/S = {:.03}", s.rate()); + println!("B/S = {:.03}", s.beats_per_secon()); + println!("F/B = {:.03}", s.frames_per_beat()); + println!("T/B = {:.03}", s.ticks_per_beat()); + println!("F/T = {:.03}", s.frames_per_tick()); + println!("F/L = {:.03}", s.frames_per_loop()); + println!("T/L = {:.03}", s.ticks_per_loop()); + let fpt = s.fpt(); + let frames_per_chunk = 240; + let chunk = |chunk: usize| s.frames_to_ticks( + chunk * frames_per_chunk, + (chunk + 1) * frames_per_chunk + ); + //for i in 0..2000 { + //println!("{i} {:?}", chunk(i)); + //} + assert_eq!(chunk(0), vec![(0, 0), (125, 1)]); + assert_eq!(chunk(1), vec![(10, 2), (135, 3)]); + assert_eq!(chunk(12), vec![(120, 24)]); + assert_eq!(chunk(412), vec![(120, 24)]); + assert_eq!(chunk(413), vec![(5, 25), (130, 26)]); + Ok(()) + } +} diff --git a/src/device/launcher/mod.rs b/src/device/launcher/mod.rs index 549f6024..688a7d5d 100644 --- a/src/device/launcher/mod.rs +++ b/src/device/launcher/mod.rs @@ -221,26 +221,24 @@ fn draw_section_sequencer (state: &Launcher, buf: &mut Buffer, area: Rect) -> Us } let track = track.unwrap().1; let sequencer = track.sequencer.state(); - { - use crate::device::sequencer::horizontal::*; - timer(buf, x+5, y, sequencer.time_start, sequencer.time_start + area.width as usize, 0); - keys(buf, Rect { x, y: y + 1, width, height }, sequencer.note_start)?; - if let Some(Some(phrase)) = state.phrase_id().map(|id|sequencer.phrases.get(id)) { - let ppq = sequencer.timebase.ppq() as usize; - let zoom = sequencer.time_zoom; - let t0 = sequencer.time_start; - let t1 = t0 + area.width as usize; - let n0 = sequencer.note_start; - let n1 = n0 + area.height as usize; - lanes(buf, x, y + 1, &phrase, ppq, zoom, t0, t1, n0, n1); - } - let cursor_style = match view { + crate::device::sequencer::horizontal::draw( + buf, + area, + match state.phrase_id().map(|id|sequencer.phrases.get(id)) { + Some(Some(phrase)) => Some(phrase), + _ => None + }, + state.timebase.ppq() as usize, + sequencer.time_cursor, + sequencer.time_start, + sequencer.time_zoom, + sequencer.note_cursor, + sequencer.note_start, + Some(match view { LauncherView::Sequencer => Style::default().green().not_dim(), _ => Style::default().green().dim(), - }; - cursor(buf, x, y + 1, cursor_style, sequencer.time_cursor, sequencer.note_cursor); - } - Ok(area) + }) + ) } fn draw_section_chains (state: &Launcher, buf: &mut Buffer, area: Rect) -> Usually { let style = Some(Style::default().green().dim()); diff --git a/src/device/sequencer/horizontal.rs b/src/device/sequencer/horizontal.rs index 90fd5b4b..cb714b3d 100644 --- a/src/device/sequencer/horizontal.rs +++ b/src/device/sequencer/horizontal.rs @@ -2,47 +2,39 @@ use crate::core::*; use super::*; pub fn draw ( - s: &Sequencer, - buf: &mut Buffer, - mut area: Rect, + buf: &mut Buffer, + area: Rect, + phrase: Option<&Phrase>, + ppq: usize, + time: usize, + time0: usize, + timeZ: usize, + note: usize, + note0: usize, + style: Option