mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
scene and track gradients
This commit is contained in:
parent
6bee5b0bcd
commit
12df6d5af2
4 changed files with 41 additions and 48 deletions
|
|
@ -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])
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue