mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
wip: redraw sequencer
This commit is contained in:
parent
ec9352e0f8
commit
b52aa3fc80
2 changed files with 24 additions and 29 deletions
|
|
@ -115,31 +115,11 @@ impl Handle<Tui> for PhraseEditor<Tui> {
|
||||||
false => {},
|
false => {},
|
||||||
},
|
},
|
||||||
key!(KeyCode::Char('a')) => if self.entered {
|
key!(KeyCode::Char('a')) => if self.entered {
|
||||||
if let (Some(phrase), Some(time), Some(note)) = (
|
self.put();
|
||||||
&self.phrase,
|
self.time_axis.point = self.time_axis.point.map(|time|time + self.note_len);
|
||||||
self.time_axis.point,
|
|
||||||
self.note_axis.point,
|
|
||||||
) {
|
|
||||||
let mut phrase = phrase.write().unwrap();
|
|
||||||
let key: u7 = u7::from((127 - note) as u8);
|
|
||||||
let vel: u7 = 100.into();
|
|
||||||
phrase.notes[time].push(MidiMessage::NoteOn { key, vel });
|
|
||||||
phrase.notes[time + self.note_len].push(MidiMessage::NoteOff { key, vel });
|
|
||||||
self.time_axis.point = Some(time + self.note_len);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
key!(KeyCode::Char('s')) => if self.entered {
|
key!(KeyCode::Char('s')) => if self.entered {
|
||||||
if let (Some(phrase), Some(time), Some(note)) = (
|
self.put();
|
||||||
&self.phrase,
|
|
||||||
self.time_axis.point,
|
|
||||||
self.note_axis.point,
|
|
||||||
) {
|
|
||||||
let mut phrase = phrase.write().unwrap();
|
|
||||||
let key: u7 = u7::from((127 - note) as u8);
|
|
||||||
let vel: u7 = 100.into();
|
|
||||||
phrase.notes[time].push(MidiMessage::NoteOn { key, vel });
|
|
||||||
phrase.notes[time + self.note_len].push(MidiMessage::NoteOff { key, vel });
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_ => { return Ok(None) }
|
_ => { return Ok(None) }
|
||||||
|
|
|
||||||
|
|
@ -155,21 +155,36 @@ impl Content for PhraseEditor<Tui> {
|
||||||
}
|
}
|
||||||
impl PhraseEditor<Tui> {
|
impl PhraseEditor<Tui> {
|
||||||
const H_KEYS_OFFSET: usize = 5;
|
const H_KEYS_OFFSET: usize = 5;
|
||||||
|
pub fn put (&mut self) {
|
||||||
|
if let (Some(phrase), Some(time), Some(note)) = (
|
||||||
|
&self.phrase,
|
||||||
|
self.time_axis.point,
|
||||||
|
self.note_axis.point,
|
||||||
|
) {
|
||||||
|
let mut phrase = phrase.write().unwrap();
|
||||||
|
let key: u7 = u7::from((127 - note) as u8);
|
||||||
|
let vel: u7 = 100.into();
|
||||||
|
phrase.notes[time].push(MidiMessage::NoteOn { key, vel });
|
||||||
|
phrase.notes[time + self.note_len].push(MidiMessage::NoteOff { key, vel });
|
||||||
|
self.buffer = Self::redraw(&phrase);
|
||||||
|
}
|
||||||
|
}
|
||||||
/// Select which pattern to display. This pre-renders it to the buffer at full resolution.
|
/// Select which pattern to display. This pre-renders it to the buffer at full resolution.
|
||||||
pub fn show (&mut self, phrase: Option<&Arc<RwLock<Phrase>>>) {
|
pub fn show (&mut self, phrase: Option<&Arc<RwLock<Phrase>>>) {
|
||||||
if let Some(phrase) = phrase {
|
if let Some(phrase) = phrase {
|
||||||
self.phrase = Some(phrase.clone());
|
self.phrase = Some(phrase.clone());
|
||||||
let width = usize::MAX.min(phrase.read().unwrap().length);
|
self.buffer = Self::redraw(&*phrase.read().unwrap());
|
||||||
let mut buffer = BigBuffer::new(width, 64);
|
|
||||||
let phrase = phrase.read().unwrap();
|
|
||||||
Self::fill_seq_bg(&mut buffer, phrase.length, phrase.ppq);
|
|
||||||
Self::fill_seq_fg(&mut buffer, &phrase);
|
|
||||||
self.buffer = buffer;
|
|
||||||
} else {
|
} else {
|
||||||
self.phrase = None;
|
self.phrase = None;
|
||||||
self.buffer = Default::default();
|
self.buffer = Default::default();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fn redraw (phrase: &Phrase) -> BigBuffer {
|
||||||
|
let mut buf = BigBuffer::new(usize::MAX.min(phrase.length), 64);
|
||||||
|
Self::fill_seq_bg(&mut buf, phrase.length, phrase.ppq);
|
||||||
|
Self::fill_seq_fg(&mut buf, &phrase);
|
||||||
|
buf
|
||||||
|
}
|
||||||
fn fill_seq_bg (buf: &mut BigBuffer, length: usize, ppq: usize) {
|
fn fill_seq_bg (buf: &mut BigBuffer, length: usize, ppq: usize) {
|
||||||
for x in 0..buf.width {
|
for x in 0..buf.width {
|
||||||
if x as usize >= length {
|
if x as usize >= length {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue