From 12df6d5af277955cd8ed4e2d62d82c63e2902b6b Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 11 Oct 2024 18:30:45 +0300 Subject: [PATCH] scene and track gradients --- crates/tek_sequencer/src/arranger.rs | 14 +++++----- crates/tek_sequencer/src/arranger_cli.rs | 26 ++++++++++--------- crates/tek_sequencer/src/arranger_tui.rs | 16 ++++++------ crates/tek_sequencer/src/lib.rs | 33 ++++++++++-------------- 4 files changed, 41 insertions(+), 48 deletions(-) diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index c2ef46da..e12bdba6 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -203,10 +203,10 @@ impl Arrangement { pub fn track_prev (&mut self) { self.selected.track_prev() } - pub fn track_add (&mut self, name: Option<&str>) -> Usually<&mut ArrangementTrack> { + pub fn track_add (&mut self, name: Option<&str>, color: Option) -> Usually<&mut ArrangementTrack> { self.tracks.push(name.map_or_else( - || ArrangementTrack::new(&self.track_default_name(), None), - |name| ArrangementTrack::new(name, None), + || ArrangementTrack::new(&self.track_default_name(), color), + |name| ArrangementTrack::new(name, color), )); let index = self.tracks.len() - 1; Ok(&mut self.tracks[index]) @@ -243,12 +243,10 @@ impl Arrangement { pub fn scene_prev (&mut self) { self.selected.scene_prev() } - pub fn scene_add (&mut self, name: Option<&str>) -> Usually<&mut Scene> { + pub fn scene_add (&mut self, name: Option<&str>, color: Option) -> Usually<&mut Scene> { let clips = vec![None;self.tracks.len()]; - self.scenes.push(match name { - Some(name) => Scene::new(name, clips, None), - None => Scene::new(&self.scene_default_name(), clips, None), - }); + let name = name.map(|x|x.to_string()).unwrap_or_else(||self.scene_default_name()); + self.scenes.push(Scene::new(name, clips, color)); let index = self.scenes.len() - 1; Ok(&mut self.scenes[index]) } diff --git a/crates/tek_sequencer/src/arranger_cli.rs b/crates/tek_sequencer/src/arranger_cli.rs index 9daa3184..e9cf03c2 100644 --- a/crates/tek_sequencer/src/arranger_cli.rs +++ b/crates/tek_sequencer/src/arranger_cli.rs @@ -27,19 +27,21 @@ impl ArrangerCli { if let Some(name) = self.name.as_ref() { *arrangement.name.write().unwrap() = name.clone(); } - for _ in 0..self.tracks { - let track = arrangement.track_add(None)?; - //for _ in 0..self.scenes { - //track.phrases.push( - //Arc::new(RwLock::new(Phrase::new("", true, PPQ * 4, None))) - //); - //} + let track_color_1 = random_okhsl(); + let track_color_2 = random_okhsl(); + for i in 0..self.tracks { + let _track = arrangement.track_add( + None, + Some(okhsl_to_rgb(track_color_1.mix(track_color_2, i as f32 / self.tracks as f32))) + )?; } - for _ in 0..self.scenes { - let _scene = arrangement.scene_add(None)?; - //for i in 0..self.tracks { - //scene.clips[i] = Some(i); - //} + let scene_color_1 = random_okhsl(); + let scene_color_2 = random_okhsl(); + for i in 0..self.scenes { + let _scene = arrangement.scene_add( + None, + Some(okhsl_to_rgb(scene_color_1.mix(scene_color_2, i as f32 / self.scenes as f32))) + )?; } transport.write().unwrap().jack = Some( jack.activate( diff --git a/crates/tek_sequencer/src/arranger_tui.rs b/crates/tek_sequencer/src/arranger_tui.rs index 5852cbef..d6f8a521 100644 --- a/crates/tek_sequencer/src/arranger_tui.rs +++ b/crates/tek_sequencer/src/arranger_tui.rs @@ -95,15 +95,15 @@ impl Arranger { impl Handle for Arrangement { fn handle (&mut self, from: &TuiInput) -> Perhaps { match from.event() { - key!(KeyCode::Char('`')) => { self.mode.to_next(); }, - key!(KeyCode::Delete) => { self.delete(); }, - key!(KeyCode::Char('.')) => { self.increment(); }, - key!(KeyCode::Char(',')) => { self.decrement(); }, + key!(KeyCode::Char('`')) => { self.mode.to_next(); }, + key!(KeyCode::Delete) => { self.delete(); }, + key!(KeyCode::Char('.')) => { self.increment(); }, + key!(KeyCode::Char(',')) => { self.decrement(); }, // TODO: next/prev scene - key!(KeyCode::Enter) => { self.activate(); }, - key!(Ctrl-KeyCode::Char('a')) => { self.scene_add(None)?; }, - key!(Ctrl-KeyCode::Char('t')) => { self.track_add(None)?; }, - key!(KeyCode::Char('n')) => { todo!("rename selected"); }, + key!(KeyCode::Enter) => { self.activate(); }, + key!(Ctrl-KeyCode::Char('a')) => { self.scene_add(None, None)?; }, + key!(Ctrl-KeyCode::Char('t')) => { self.track_add(None, None)?; }, + key!(KeyCode::Char('n')) => { todo!("rename selected"); }, key!(KeyCode::Char('l')) => if let Some(phrase) = self.phrase() { phrase.write().unwrap().toggle_loop() }, diff --git a/crates/tek_sequencer/src/lib.rs b/crates/tek_sequencer/src/lib.rs index 9bda7626..d0d33665 100644 --- a/crates/tek_sequencer/src/lib.rs +++ b/crates/tek_sequencer/src/lib.rs @@ -35,21 +35,24 @@ tui_style!(STYLE_LABEL = tui_style!(STYLE_VALUE = Some(Color::White), None, None, Modifier::BOLD, Modifier::DIM); -pub fn random_color () -> Color { +pub fn random_okhsl () -> Okhsl { let mut rng = thread_rng(); - let color: Okhsl = Okhsl::new( + Okhsl::new( rng.gen::() * 360f32 - 180f32, rng.gen::(), rng.gen::() * 0.5, - ); - let color: Srgb = Srgb::from_color_unclamped(color); - Color::Rgb( - (color.red * 255.0) as u8, - (color.green * 255.0) as u8, - (color.blue * 255.0) as u8, ) } +pub fn okhsl_to_rgb (color: Okhsl) -> Color { + let Srgb { red, green, blue, .. }: Srgb = Srgb::from_color_unclamped(color); + Color::Rgb((red * 255.0) as u8, (green * 255.0) as u8, (blue * 255.0) as u8,) +} + +pub fn random_color () -> Color { + okhsl_to_rgb(random_okhsl()) +} + pub fn random_color_near (color: Color, distance: f32) -> Color { let (r, g, b) = if let Color::Rgb(r, g, b) = color { (r, g, b) @@ -64,17 +67,7 @@ pub fn random_color_near (color: Color, distance: f32) -> Color { g as f32 / 255.0, b as f32 / 255.0, ]); - let mut rng = thread_rng(); - let new: Okhsl = Okhsl::new( - rng.gen::() * 360f32 - 180f32, - rng.gen::(), - rng.gen::() * 0.66, - ); + let new: Okhsl = random_okhsl(); let mixed = new.mix(old, 0.5); - let color: Srgb = Srgb::from_color_unclamped(mixed); - Color::Rgb( - (color.red * 255.0) as u8, - (color.green * 255.0) as u8, - (color.blue * 255.0) as u8, - ) + okhsl_to_rgb(mixed) }