diff --git a/crates/tek_sequencer/src/sequencer_cmd.rs b/crates/tek_sequencer/src/sequencer_cmd.rs index 306672ef..380d1557 100644 --- a/crates/tek_sequencer/src/sequencer_cmd.rs +++ b/crates/tek_sequencer/src/sequencer_cmd.rs @@ -115,31 +115,11 @@ impl Handle for PhraseEditor { false => {}, }, key!(KeyCode::Char('a')) => if self.entered { - 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.time_axis.point = Some(time + self.note_len); - } + self.put(); + self.time_axis.point = self.time_axis.point.map(|time|time + self.note_len); }, key!(KeyCode::Char('s')) => if self.entered { - 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.put(); }, _ => { return Ok(None) } diff --git a/crates/tek_sequencer/src/sequencer_tui.rs b/crates/tek_sequencer/src/sequencer_tui.rs index ad326bb0..d76c7952 100644 --- a/crates/tek_sequencer/src/sequencer_tui.rs +++ b/crates/tek_sequencer/src/sequencer_tui.rs @@ -155,21 +155,36 @@ impl Content for PhraseEditor { } impl PhraseEditor { 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. pub fn show (&mut self, phrase: Option<&Arc>>) { if let Some(phrase) = phrase { self.phrase = Some(phrase.clone()); - let width = usize::MAX.min(phrase.read().unwrap().length); - 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; + self.buffer = Self::redraw(&*phrase.read().unwrap()); } else { self.phrase = None; 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) { for x in 0..buf.width { if x as usize >= length {