This commit is contained in:
🪞👃🪞 2025-01-16 14:42:06 +01:00
parent 26562437bd
commit 525923d057

View file

@ -67,9 +67,9 @@ pub struct TekCli {
/// Multi-track MIDI sequencer. /// Multi-track MIDI sequencer.
Arranger { Arranger {
/// Number of scenes /// Number of scenes
#[arg(short = 'y', long, default_value_t = 1)] scenes: usize, #[arg(short = 'y', long, default_value_t = 1)] scenes: usize,
/// Number of tracks /// Number of tracks
#[arg(short = 'x', long, default_value_t = 1)] tracks: usize, #[arg(short = 'x', long, default_value_t = 1)] tracks: usize,
/// Width of tracks /// Width of tracks
#[arg(short = 'w', long, default_value_t = 9)] track_width: usize, #[arg(short = 'w', long, default_value_t = 9)] track_width: usize,
}, },
@ -145,8 +145,7 @@ has_clips!(|self: Tek|self.pool.as_ref().expect("no clip pool").clips);
has_jack!(|self: Tek|&self.jack); has_jack!(|self: Tek|&self.jack);
has_sampler!(|self: Tek|{ has_sampler!(|self: Tek|{
sampler = self.sampler; sampler = self.sampler;
index = self.editor.as_ref().map(|e|e.note_point()).unwrap_or(0); index = self.editor.as_ref().map(|e|e.note_point()).unwrap_or(0); });
});
has_editor!(|self: Tek|{ has_editor!(|self: Tek|{
editor = self.editor; editor = self.editor;
editor_w = { editor_w = {
@ -157,16 +156,14 @@ has_editor!(|self: Tek|{
(5 + (time_len / time_zoom)).min(size.saturating_sub(20)).max(16) (5 + (time_len / time_zoom)).min(size.saturating_sub(20)).max(16)
}; };
editor_h = 15; editor_h = 15;
is_editing = self.editing.load(Relaxed); is_editing = self.editing.load(Relaxed); });
});
edn_provide!(# usize: |self: Tek| { edn_provide!(# usize: |self: Tek| {
":scene" => self.selected.scene().unwrap_or(0), ":scene" => self.selected.scene().unwrap_or(0),
":scene-next" => self.selected.scene().unwrap_or(0) + 1, ":scene-next" => self.selected.scene().unwrap_or(0) + 1,
":scene-prev" => self.selected.scene().unwrap_or(0).saturating_sub(1), ":scene-prev" => self.selected.scene().unwrap_or(0).saturating_sub(1),
":track" => self.selected.track().unwrap_or(0), ":track" => self.selected.track().unwrap_or(0),
":track-next" => self.selected.track().unwrap_or(0) + 1, ":track-next" => self.selected.track().unwrap_or(0) + 1,
":track-prev" => self.selected.track().unwrap_or(0).saturating_sub(1), ":track-prev" => self.selected.track().unwrap_or(0).saturating_sub(1) });
});
edn_view!(TuiOut: |self: Tek| self.size.of(EdnView::from_source(self, self.edn.as_ref())); { edn_view!(TuiOut: |self: Tek| self.size.of(EdnView::from_source(self, self.edn.as_ref())); {
bool {}; bool {};
isize {}; isize {};
@ -227,14 +224,8 @@ impl Tek {
audio_tos: &[&[PortConnection];2], audio_tos: &[&[PortConnection];2],
) -> Usually<Self> { ) -> Usually<Self> {
let app = Self { let app = Self {
edn: include_str!("./view_groovebox.edn").to_string(), edn: include_str!("./view_groovebox.edn").to_string(),
sampler: Some(Sampler::new( sampler: Some(Sampler::new(jack, &"sampler", midi_froms, audio_froms, audio_tos)?),
jack,
&"sampler",
midi_froms,
audio_froms,
audio_tos
)?),
..Self::new_sequencer(jack, bpm, midi_froms, midi_tos)? ..Self::new_sequencer(jack, bpm, midi_froms, midi_tos)?
}; };
if let Some(sampler) = app.sampler.as_ref().unwrap().midi_in.as_ref() { if let Some(sampler) = app.sampler.as_ref().unwrap().midi_in.as_ref() {
@ -256,13 +247,7 @@ impl Tek {
editor: Some((&clip).into()), editor: Some((&clip).into()),
editing: false.into(), editing: false.into(),
midi_buf: vec![vec![];65536], midi_buf: vec![vec![];65536],
player: Some(MidiPlayer::new( player: Some(MidiPlayer::new(&jack, "sequencer", Some(&clip), &midi_froms, &midi_tos)?),
&jack,
"sequencer",
Some(&clip),
&midi_froms,
&midi_tos
)?),
..Self::new_clock(jack, bpm)? ..Self::new_clock(jack, bpm)?
}) })
} }
@ -499,11 +484,12 @@ impl Tek {
let scenes = move||self.scenes_sizes(editing, 2, 15); let scenes = move||self.scenes_sizes(editing, 2, 15);
let selected_track = self.selected().track(); let selected_track = self.selected().track();
let selected_scene = self.selected().scene(); let selected_scene = self.selected().scene();
let border = |x|Outer(Style::default().fg(TuiTheme::g(0))).enclose(x);
(move||Align::c(Map::new(tracks, move|(_, track, x1, x2), t| { (move||Align::c(Map::new(tracks, move|(_, track, x1, x2), t| {
let w = (x2 - x1) as u16; let w = (x2 - x1) as u16;
let color: ItemPalette = track.color.dark.into(); let color: ItemPalette = track.color.dark.into();
let last_color = Arc::new(RwLock::new(ItemPalette::from(Color::Rgb(0, 0, 0)))); let last_color = Arc::new(RwLock::new(ItemPalette::from(Color::Rgb(0, 0, 0))));
let cells = Map::new(scenes, move|(_, scene, y1, y2), s| { map_east(x1 as u16, w, border(Map::new(scenes, move|(_, scene, y1, y2), s| {
let h = (1 + y2 - y1) as u16; let h = (1 + y2 - y1) as u16;
let color = scene.color; let color = scene.color;
let (name, fg, bg) = if let Some(c) = &scene.clips[t] { let (name, fg, bg) = if let Some(c) = &scene.clips[t] {
@ -530,9 +516,7 @@ impl Tek {
let cell = Either::new(active, editor, cell); let cell = Either::new(active, editor, cell);
*last_color.write().unwrap() = bg.into(); *last_color.write().unwrap() = bg.into();
map_south(y1 as u16, h, Push::y(1, Fixed::y(h, cell))) map_south(y1 as u16, h, Push::y(1, Fixed::y(h, cell)))
}); }))).boxed()
map_east(x1 as u16, w,
Outer(Style::default().fg(TuiTheme::g(0))).enclose(cells)).boxed()
})).boxed()).into() })).boxed()).into()
} }
fn activate (&mut self) -> Usually<()> { fn activate (&mut self) -> Usually<()> {