From db2a2efa63725e929d531b9cdf89f71c7f865892 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 11 Oct 2024 10:12:02 +0300 Subject: [PATCH] insert duplicate phrase --- crates/tek_sequencer/src/arranger_tui.rs | 12 +++---- crates/tek_sequencer/src/lib.rs | 2 ++ crates/tek_sequencer/src/sequencer.rs | 39 ++++++++++++----------- crates/tek_sequencer/src/sequencer_tui.rs | 23 ++++++++++--- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/crates/tek_sequencer/src/arranger_tui.rs b/crates/tek_sequencer/src/arranger_tui.rs index a04dae7e..760fc8e4 100644 --- a/crates/tek_sequencer/src/arranger_tui.rs +++ b/crates/tek_sequencer/src/arranger_tui.rs @@ -178,12 +178,12 @@ impl<'a> Content for VerticalArranger<'a, Tui> { let name = &(phrase as &Arc>).read().unwrap().name; let name = format!("{}", name.read().unwrap()); add(&name.as_str().push_x(1).fixed_x(w))?; - color = COLOR_BG1; - if let Some(playing_phrase) = &track.player.phrase { - if *playing_phrase.read().unwrap() == *phrase.read().unwrap() { - color = COLOR_PLAYING - } - } + color = (phrase as &Arc>).read().unwrap().color; + //if let Some(playing_phrase) = &track.player.phrase { + //if *playing_phrase.read().unwrap() == *phrase.read().unwrap() { + //color = COLOR_PLAYING + //} + //} }, _ => {} }; diff --git a/crates/tek_sequencer/src/lib.rs b/crates/tek_sequencer/src/lib.rs index 52186c3b..5ead3524 100644 --- a/crates/tek_sequencer/src/lib.rs +++ b/crates/tek_sequencer/src/lib.rs @@ -5,6 +5,8 @@ pub(crate) use tek_core::crossterm::event::KeyCode; pub(crate) use tek_core::midly::{num::u7, live::LiveEvent, MidiMessage}; 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::*}; submod! { arranger arranger_tui diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index 9a1e1c86..c9f29346 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -32,7 +32,7 @@ pub struct PhrasePool { pub focused: bool, } /// A MIDI sequence. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Phrase { pub uuid: uuid::Uuid, /// Name of phrase @@ -153,30 +153,28 @@ impl PhraseEditor { } } } -impl Default for Phrase { - fn default () -> Self { Self::new("", false, 0, None) } +pub fn random_color () -> Color { + let mut rng = thread_rng(); + let color: Okhsl = Okhsl::new( + rng.gen::() * 360f32 - 180f32, + rng.gen::() * 0.5 + 0.25, + rng.gen::() * 0.5 + 0.25, + ); + 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, + ) } impl Phrase { pub fn new ( name: &str, loop_on: bool, length: usize, - notes: Option + notes: Option, + color: Option, ) -> Self { - use rand::{thread_rng, prelude::*}; - use palette::{*, convert::*, okhsl::*}; - let mut rng = thread_rng(); - let color: Okhsl = Okhsl::new( - rng.gen::() * 360f32 - 180f32, - rng.gen::() * 0.5 + 0.25, - rng.gen::() * 0.5 + 0.25, - ); - let color: Srgb = Srgb::from_color_unclamped(color); - let color = Color::Rgb( - (color.red * 255.0) as u8, - (color.green * 255.0) as u8, - (color.blue * 255.0) as u8, - ); Self { uuid: uuid::Uuid::new_v4(), name: Arc::new(RwLock::new(name.into())), @@ -187,7 +185,7 @@ impl Phrase { loop_start: 0, loop_length: length, percussive: true, - color + color: color.unwrap_or_else(random_color) } } pub fn toggle_loop (&mut self) { @@ -244,6 +242,9 @@ impl Phrase { } } } +impl Default for Phrase { + fn default () -> Self { Self::new("", false, 0, None, Some(Color::Rgb(0, 0, 0))) } +} impl std::cmp::PartialEq for Phrase { fn eq (&self, other: &Self) -> bool { self.uuid == other.uuid diff --git a/crates/tek_sequencer/src/sequencer_tui.rs b/crates/tek_sequencer/src/sequencer_tui.rs index 3e870dbc..dd59ba6e 100644 --- a/crates/tek_sequencer/src/sequencer_tui.rs +++ b/crates/tek_sequencer/src/sequencer_tui.rs @@ -83,13 +83,26 @@ impl Handle for PhrasePool { key!(KeyCode::Down) => { self.phrase = (self.phrase + 1) % self.phrases.len() }, - key!(KeyCode::Char('i')) => { - self.phrases.insert(self.phrase, Arc::new(RwLock::new(Phrase::default()))); + key!(KeyCode::Char('a')) => { // append new + let mut phrase = Phrase::default(); + phrase.color = random_color(); + self.phrases.push(Arc::new(RwLock::new(phrase))); + self.phrase = self.phrases.len() - 1; + }, + key!(KeyCode::Char('i')) => { // insert new + let mut phrase = Phrase::default(); + phrase.color = random_color(); + self.phrases.insert(self.phrase, Arc::new(RwLock::new(phrase))); self.phrase += 1; }, - key!(KeyCode::Char('a')) => { - self.phrases.push(Arc::new(RwLock::new(Phrase::default()))); - self.phrase = self.phrases.len() - 1; + key!(KeyCode::Char('d')) => { // insert duplicate + let phrase = (*self.phrases[self.phrase].read().unwrap()).clone(); + self.phrases.insert(self.phrase, Arc::new(RwLock::new(phrase))); + self.phrase += 1; + }, + key!(KeyCode::Char('c')) => { // change color + let mut phrase = self.phrases[self.phrase].write().unwrap(); + phrase.color = random_color(); }, _ => return Ok(None), }