mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
add background to status bar + misc
This commit is contained in:
parent
d94aa8c8ac
commit
792dab9714
3 changed files with 20 additions and 21 deletions
|
|
@ -100,7 +100,7 @@ impl Content for ArrangerStatusBar {
|
||||||
_ => command(&[])
|
_ => command(&[])
|
||||||
};
|
};
|
||||||
//let commands = commands.iter().reduce(String::new(), |s, (a, b, c)| format!("{s} {a}{b}{c}"));
|
//let commands = commands.iter().reduce(String::new(), |s, (a, b, c)| format!("{s} {a}{b}{c}"));
|
||||||
row!(mode, commands)
|
row!(mode, commands).fill_x().bg(Color::Rgb(28, 35, 25))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn command (commands: &[[impl Widget<Engine = Tui>;3]]) -> impl Widget<Engine = Tui> + '_ {
|
fn command (commands: &[[impl Widget<Engine = Tui>;3]]) -> impl Widget<Engine = Tui> + '_ {
|
||||||
|
|
|
||||||
|
|
@ -56,25 +56,23 @@ impl PhrasePlayer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn play (&mut self, scope: &ProcessScope) -> bool {
|
fn play (&mut self, scope: &ProcessScope) -> bool {
|
||||||
let sample0 = scope.last_frame_time() as usize;
|
|
||||||
let samples = scope.n_frames() as usize;
|
|
||||||
let mut next = false;
|
let mut next = false;
|
||||||
// Write MIDI events from currently playing phrase (if any) to MIDI output buffer
|
// Write MIDI events from currently playing phrase (if any) to MIDI output buffer
|
||||||
if self.is_rolling() {
|
if self.is_rolling() {
|
||||||
|
let sample0 = scope.last_frame_time() as usize;
|
||||||
|
let samples = scope.n_frames() as usize;
|
||||||
// If no phrase is playing, prepare for switchover immediately
|
// If no phrase is playing, prepare for switchover immediately
|
||||||
next = self.phrase.is_none();
|
next = self.phrase.is_none();
|
||||||
if let Some((started, phrase)) = &self.phrase {
|
if let Some((started, phrase)) = &self.phrase {
|
||||||
// First sample to populate. Greater than 0 means that the first
|
// First sample to populate. Greater than 0 means that the first
|
||||||
// pulse of the phrase falls somewhere in the middle of the chunk.
|
// pulse of the phrase falls somewhere in the middle of the chunk.
|
||||||
let sample = sample0.saturating_sub(
|
let sample = started.sample.get() as usize;
|
||||||
started.sample.get() as usize + self.clock.started.read().unwrap().unwrap().0
|
let sample = sample + self.clock.started.read().unwrap().unwrap().0;
|
||||||
);
|
let sample = sample0.saturating_sub(sample);
|
||||||
// Iterator that emits sample (index into output buffer at which to write MIDI event)
|
// Iterator that emits sample (index into output buffer at which to write MIDI event)
|
||||||
// paired with pulse (index into phrase from which to take the MIDI event) for each
|
// paired with pulse (index into phrase from which to take the MIDI event) for each
|
||||||
// sample of the output buffer that corresponds to a MIDI pulse.
|
// sample of the output buffer that corresponds to a MIDI pulse.
|
||||||
let pulses = self.clock.timebase().pulses_between_samples(sample, sample + samples);
|
let pulses = self.clock.timebase().pulses_between_samples(sample, sample + samples);
|
||||||
// MIDI output buffer that will be copied to the JACK MIDI output ports.
|
|
||||||
let output = &mut self.midi_chunk;
|
|
||||||
// Notes active during current chunk.
|
// Notes active during current chunk.
|
||||||
let notes = &mut self.notes_out.write().unwrap();
|
let notes = &mut self.notes_out.write().unwrap();
|
||||||
for (sample, pulse) in pulses {
|
for (sample, pulse) in pulses {
|
||||||
|
|
@ -101,9 +99,11 @@ impl PhrasePlayer {
|
||||||
// TODO: support MIDI channels other than CH1.
|
// TODO: support MIDI channels other than CH1.
|
||||||
let channel = 0.into();
|
let channel = 0.into();
|
||||||
// Serialize MIDI event into message buffer.
|
// Serialize MIDI event into message buffer.
|
||||||
LiveEvent::Midi { channel, message: *message }.write(&mut self.midi_note).unwrap();
|
LiveEvent::Midi { channel, message: *message }
|
||||||
|
.write(&mut self.midi_note)
|
||||||
|
.unwrap();
|
||||||
// Append serialized message to output buffer.
|
// Append serialized message to output buffer.
|
||||||
output[sample].push(self.midi_note.clone());
|
self.midi_chunk[sample].push(self.midi_note.clone());
|
||||||
// Update the list of currently held notes.
|
// Update the list of currently held notes.
|
||||||
update_keys(notes, &message);
|
update_keys(notes, &message);
|
||||||
}
|
}
|
||||||
|
|
@ -114,15 +114,14 @@ impl PhrasePlayer {
|
||||||
next
|
next
|
||||||
}
|
}
|
||||||
fn switchover (&mut self, scope: &ProcessScope) {
|
fn switchover (&mut self, scope: &ProcessScope) {
|
||||||
let sample0 = scope.last_frame_time() as usize;
|
|
||||||
let samples = scope.n_frames() as usize;
|
|
||||||
if self.is_rolling() {
|
if self.is_rolling() {
|
||||||
|
let sample0 = scope.last_frame_time() as usize;
|
||||||
|
//let samples = scope.n_frames() as usize;
|
||||||
if let Some((start_at, phrase)) = &self.next_phrase {
|
if let Some((start_at, phrase)) = &self.next_phrase {
|
||||||
let start = start_at.sample.get() as usize;
|
let start = start_at.sample.get() as usize;
|
||||||
|
let sample = self.clock.started.read().unwrap().unwrap().0;
|
||||||
// If it's time to switch to the next phrase:
|
// If it's time to switch to the next phrase:
|
||||||
if start <= sample0.saturating_sub(
|
if start <= sample0.saturating_sub(sample) {
|
||||||
self.clock.started.read().unwrap().unwrap().0
|
|
||||||
) {
|
|
||||||
// Samples elapsed since phrase was supposed to start
|
// Samples elapsed since phrase was supposed to start
|
||||||
let skipped = sample0 - start;
|
let skipped = sample0 - start;
|
||||||
// Switch over to enqueued phrase
|
// Switch over to enqueued phrase
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue