diff --git a/Cargo.lock b/Cargo.lock index 82ffbf1a..802b42b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1721,6 +1721,7 @@ dependencies = [ "fast-srgb8", "palette_derive", "phf", + "rand", ] [[package]] diff --git a/crates/tek_sequencer/Cargo.toml b/crates/tek_sequencer/Cargo.toml index c43fe12c..c33a160f 100644 --- a/crates/tek_sequencer/Cargo.toml +++ b/crates/tek_sequencer/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.0" [dependencies] tek_core = { path = "../tek_core" } uuid = { version = "1.10.0", features = [ "v4" ] } -palette = "0.7.6" +palette = { version = "0.7.6", features = [ "random" ] } rand = "0.8.5" [lib] diff --git a/crates/tek_sequencer/src/lib.rs b/crates/tek_sequencer/src/lib.rs index d0d33665..30b8dbc3 100644 --- a/crates/tek_sequencer/src/lib.rs +++ b/crates/tek_sequencer/src/lib.rs @@ -7,6 +7,7 @@ pub(crate) use tek_core::jack::*; pub(crate) use std::sync::{Arc, RwLock}; pub(crate) use rand::{thread_rng, prelude::*}; pub(crate) use palette::{*, convert::*, okhsl::*}; +use rand::distributions::uniform::UniformSampler; submod! { arranger arranger_tui @@ -37,11 +38,10 @@ tui_style!(STYLE_VALUE = pub fn random_okhsl () -> Okhsl { let mut rng = thread_rng(); - Okhsl::new( - rng.gen::() * 360f32 - 180f32, - rng.gen::(), - rng.gen::() * 0.5, - ) + UniformOkhsl::new( + Okhsl::new(-180.0, 0.05, 0.1), + Okhsl::new( 180.0, 0.9, 0.5), + ).sample(&mut rng) } pub fn okhsl_to_rgb (color: Okhsl) -> Color { @@ -62,12 +62,9 @@ pub fn random_color_near (color: Color, distance: f32) -> Color { if distance > 1.0 { panic!("random_color_near requires distance between 0.0 and 1.0"); } - let old: Okhsl = Okhsl::from([ + okhsl_to_rgb(Okhsl::from_color(Srgb::new( r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0, - ]); - let new: Okhsl = random_okhsl(); - let mixed = new.mix(old, 0.5); - okhsl_to_rgb(mixed) + )).mix(random_okhsl(), distance)) } diff --git a/crates/tek_sequencer/src/sequencer_tui.rs b/crates/tek_sequencer/src/sequencer_tui.rs index 339db77e..bb83ca4a 100644 --- a/crates/tek_sequencer/src/sequencer_tui.rs +++ b/crates/tek_sequencer/src/sequencer_tui.rs @@ -121,7 +121,7 @@ impl Handle for PhrasePool { }, key!(KeyCode::Char('d')) => { // insert duplicate let mut phrase = (*self.phrases[self.phrase].read().unwrap()).clone(); - phrase.color = random_color_near(phrase.color, 0.1); + phrase.color = random_color_near(phrase.color, 0.2); self.phrases.insert(self.phrase + 1, Arc::new(RwLock::new(phrase))); self.phrase += 1; },