scene and track gradients

This commit is contained in:
🪞👃🪞 2024-10-11 18:30:45 +03:00
parent 6bee5b0bcd
commit 12df6d5af2
4 changed files with 41 additions and 48 deletions

View file

@ -203,10 +203,10 @@ impl<E: Engine> Arrangement<E> {
pub fn track_prev (&mut self) {
self.selected.track_prev()
}
pub fn track_add (&mut self, name: Option<&str>) -> Usually<&mut ArrangementTrack<E>> {
pub fn track_add (&mut self, name: Option<&str>, color: Option<Color>) -> Usually<&mut ArrangementTrack<E>> {
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<E: Engine> Arrangement<E> {
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<Color>) -> 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])
}

View file

@ -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(

View file

@ -95,15 +95,15 @@ impl Arranger<Tui> {
impl Handle<Tui> for Arrangement<Tui> {
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {
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()
},

View file

@ -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<f32> {
let mut rng = thread_rng();
let color: Okhsl<f32> = Okhsl::new(
Okhsl::new(
rng.gen::<f32>() * 360f32 - 180f32,
rng.gen::<f32>(),
rng.gen::<f32>() * 0.5,
);
let color: Srgb<f32> = 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<f32>) -> Color {
let Srgb { red, green, blue, .. }: Srgb<f32> = 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<f32> = Okhsl::new(
rng.gen::<f32>() * 360f32 - 180f32,
rng.gen::<f32>(),
rng.gen::<f32>() * 0.66,
);
let new: Okhsl<f32> = random_okhsl();
let mixed = new.mix(old, 0.5);
let color: Srgb<f32> = 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)
}