wip: inc/dec phrase length

This commit is contained in:
🪞👃🪞 2024-10-16 11:32:56 +03:00
parent 26d75340f6
commit ff342963a1
3 changed files with 56 additions and 13 deletions

View file

@ -342,7 +342,7 @@ impl<E: Engine> PhraseLength<E> {
self.pulses / (self.bpb * self.ppq) self.pulses / (self.bpb * self.ppq)
} }
pub fn beats (&self) -> usize { pub fn beats (&self) -> usize {
self.pulses % (self.bpb * self.ppq) (self.pulses % (self.bpb * self.ppq)) / self.ppq
} }
pub fn ticks (&self) -> usize { pub fn ticks (&self) -> usize {
self.pulses % self.ppq self.pulses % self.ppq
@ -359,3 +359,19 @@ impl<E: Engine> PhraseLength<E> {
} }
#[derive(Copy,Clone)] #[derive(Copy,Clone)]
pub enum PhraseLengthFocus { Bar, Beat, Tick } pub enum PhraseLengthFocus { Bar, Beat, Tick }
impl PhraseLengthFocus {
pub fn next (&mut self) {
*self = match self {
Self::Bar => Self::Beat,
Self::Beat => Self::Tick,
Self::Tick => Self::Bar,
}
}
pub fn prev (&mut self) {
*self = match self {
Self::Bar => Self::Tick,
Self::Beat => Self::Bar,
Self::Tick => Self::Beat,
}
}
}

View file

@ -40,19 +40,39 @@ impl Handle<Tui> for PhrasePool<Tui> {
key!(Shift-KeyCode::Char(c)) => { phrase.name.push(*c); }, key!(Shift-KeyCode::Char(c)) => { phrase.name.push(*c); },
key!(KeyCode::Esc) => { phrase.name = old_name.clone(); self.mode = None; }, key!(KeyCode::Esc) => { phrase.name = old_name.clone(); self.mode = None; },
key!(KeyCode::Enter) => { self.mode = None; }, key!(KeyCode::Enter) => { self.mode = None; },
_ => return Ok(None) _ => return Ok(Some(true))
} }
}, },
Some(PhrasePoolMode::Length(phrase, length, focus)) => { Some(PhrasePoolMode::Length(phrase, ref mut length, ref mut focus)) => {
todo!("edit phrase length");
let mut phrase = self.phrases[phrase].write().unwrap(); let mut phrase = self.phrases[phrase].write().unwrap();
match from.event() { match from.event() {
key!(KeyCode::Backspace) => { phrase.name.pop(); }, key!(KeyCode::Left) => { focus.prev() },
key!(KeyCode::Char(c)) => { phrase.name.push(*c); }, key!(KeyCode::Right) => { focus.next() },
key!(Shift-KeyCode::Char(c)) => { phrase.name.push(*c); }, key!(KeyCode::Esc) => { self.mode = None; },
//key!(KeyCode::Esc) => { phrase.name = old_name.clone(); self.mode = None; },
key!(KeyCode::Enter) => { self.mode = None; }, key!(KeyCode::Enter) => { self.mode = None; },
_ => return Ok(None) key!(KeyCode::Up) => match focus {
PhraseLengthFocus::Bar => {
*length += 4 * PPQ
},
PhraseLengthFocus::Beat => {
*length += PPQ
},
PhraseLengthFocus::Tick => {
*length += 1
},
},
key!(KeyCode::Down) => match focus {
PhraseLengthFocus::Bar => {
*length = length.saturating_sub(4 * PPQ)
},
PhraseLengthFocus::Beat => {
*length = length.saturating_sub(PPQ)
},
PhraseLengthFocus::Tick => {
*length = length.saturating_sub(1)
},
},
_ => return Ok(Some(true))
} }
}, },
None => match from.event() { None => match from.event() {

View file

@ -16,17 +16,21 @@ impl Content for PhrasePool<Tui> {
fn content (&self) -> impl Widget<Engine = Tui> { fn content (&self) -> impl Widget<Engine = Tui> {
let content = col!( let content = col!(
(i, phrase) in self.phrases.iter().enumerate() => Layers::new(|add|{ (i, phrase) in self.phrases.iter().enumerate() => Layers::new(|add|{
let Phrase { ref name, color, length, .. } = *phrase.read().unwrap(); let Phrase { ref name, color, length, .. } = *phrase.read().unwrap();
let ticks = length % PPQ;
let beats = length % (4 * PPQ);
let bars = length / (4 * PPQ);
let row1 = lay!(format!(" {i}").align_w().fill_x(), let row1 = lay!(format!(" {i}").align_w().fill_x(),
if let Some(PhrasePoolMode::Length(phrase, length, focus)) = self.mode { if let Some(PhrasePoolMode::Length(phrase, length, focus)) = self.mode {
if self.focused && i == phrase {
PhraseLength::new(length, Some(focus)) PhraseLength::new(length, Some(focus))
} else { } else {
PhraseLength::new(length, None) PhraseLength::new(length, None)
}
} else {
PhraseLength::new(length, None)
}.align_e().fill_x() }.align_e().fill_x()
).fill_x(); ).fill_x();
let row2 = if let Some(PhrasePoolMode::Rename(phrase, _)) = self.mode { let row2 = if let Some(PhrasePoolMode::Rename(phrase, _)) = self.mode {
if self.focused && i == phrase { if self.focused && i == phrase {
format!(" {}", name) format!(" {}", name)
@ -36,12 +40,15 @@ impl Content for PhrasePool<Tui> {
} else { } else {
format!(" {}", name) format!(" {}", name)
}; };
add(&col!(row1, row2).fill_x().bg(if i == self.phrase { add(&col!(row1, row2).fill_x().bg(if i == self.phrase {
color //Color::Rgb(40, 50, 30) color //Color::Rgb(40, 50, 30)
} else { } else {
color //Color::Rgb(28, 35, 25) color //Color::Rgb(28, 35, 25)
}))?; }))?;
if self.focused && i == self.phrase { add(&CORNERS)?; } if self.focused && i == self.phrase { add(&CORNERS)?; }
Ok(()) Ok(())
}) })
) )