diff --git a/src/core/jack.rs b/src/core/jack.rs index fccb0743..c4d33193 100644 --- a/src/core/jack.rs +++ b/src/core/jack.rs @@ -16,7 +16,8 @@ pub fn jack_run (name: &str, app: &Arc>) -> Usually Usually<()> { state.scenes = vec![ Scene::new("Intro", vec![None, None, None, None]), ]; - state.phrases = vec![ - Phrase::new("4 kicks", state.timebase.ppq() as usize * 4, None), - ]; state.tracks = vec![ Track::new("Drums", &state.timebase, Some(vec![ Sampler::new("Sampler", Some(BTreeMap::from([ @@ -38,7 +35,9 @@ pub fn main () -> Usually<()> { sample!(40, "Snare", "/home/user/Lab/Music/pak/sna.wav"), sample!(44, "Hihat", "/home/user/Lab/Music/pak/chh.wav"), ])))?.boxed(), - ]), None)?, + ]), Some(vec![ + Phrase::new("4 kicks", state.timebase.ppq() as usize * 4, None), + ]))?, ]; state.jack = Some(jack_run("tek", &app)?); Ok(()) @@ -84,14 +83,14 @@ render!(App |self, buf, area| { y = y + ChainView { focused: true, - chain: None + chain: Some(&self.tracks[0].chain), }.render(buf, Rect { x, y, width, height: height / 3 })?.height; y = y + SequencerView { focused: true, ppq: self.timebase.ppq() as usize, - track: None, - phrase: None, + track: Some(&self.tracks[0]), + phrase: Some(&self.tracks[0].sequencer.phrases[0]), }.render(buf, Rect { x, y, width, height })?.height; if let Some(ref modal) = self.modal { @@ -114,7 +113,8 @@ handle!(App |self, e| { } handle_keymap(self, e, keymap!(App { [F(1), NONE, "toggle_help", "toggle help", toggle_help], - + [Tab, NONE, "focus_next", "focus next area", focus_next], + [Tab, SHIFT, "focus_prev", "focus previous area", focus_prev], [Up, NONE, "cursor_up", "move cursor up", cursor_up], [Down, NONE, "cursor_down", "move cursor down", cursor_down], [Left, NONE, "cursor_left", "move cursor left", cursor_left], @@ -124,9 +124,6 @@ handle!(App |self, e| { [Delete, CONTROL, "delete", "delete track", delete], [Char('d'), CONTROL, "duplicate", "duplicate scene or track", duplicate], [Enter, NONE, "activate", "activate item at cursor", activate], - - [Tab, NONE, "focus_next", "focus next area", focus_next], - [Tab, SHIFT, "focus_prev", "focus previous area", focus_prev], [Char(' '), NONE, "play_toggle", "play or pause", play_toggle], [Char('r'), NONE, "record_toggle", "toggle recording", record_toggle], [Char('d'), NONE, "overdub_toggle", "toggle overdub", overdub_toggle], @@ -143,8 +140,14 @@ fn delete (_: &mut App) -> Usually { Ok(true) } fn duplicate (_: &mut App) -> Usually { Ok(true) } fn activate (_: &mut App) -> Usually { Ok(true) } fn rename (_: &mut App) -> Usually { Ok(true) } -fn add_track (_: &mut App) -> Usually { Ok(true) } -fn delete_track (_: &mut App) -> Usually { Ok(true) } +fn add_track (app: &mut App) -> Usually { + let name = format!("Track {}", app.tracks.len() + 1); + app.tracks.push(Track::new(&name, &app.timebase, None, None)?); + Ok(true) +} +fn delete_track (_: &mut App) -> Usually { + Ok(true) +} fn cursor_up (_: &mut App) -> Usually { Ok(true) } fn cursor_down (_: &mut App) -> Usually { Ok(true) } fn cursor_left (_: &mut App) -> Usually { Ok(true) } diff --git a/src/model/track.rs b/src/model/track.rs index 862df5ea..8618ee65 100644 --- a/src/model/track.rs +++ b/src/model/track.rs @@ -16,23 +16,23 @@ impl Track { ) -> Usually { let sequencer = Sequencer::new(&name, tempo, phrases)?; let chain = Chain::new(&name, devices)?; - let (client, _status) = Client::new("init", ClientOptions::NO_START_SERVER)?; - { - if let (Some(output), Some(input)) = ( - sequencer.midi_outs()?.get(0).clone(), - if let Some(item) = chain.items.get(0) { - if let Some(port) = item.midi_ins()?.get(0) { - Some(port.clone()) - } else { - None - } - } else { - None - } - ) { - client.connect_ports_by_name(&output, &input)?; - } - } + //let (client, _status) = Client::new("init", ClientOptions::NO_START_SERVER)?; + //{ + //if let (Some(output), Some(input)) = ( + //sequencer.midi_outs()?.get(0).clone(), + //if let Some(item) = chain.items.get(0) { + //if let Some(port) = item.midi_ins()?.get(0) { + //Some(port.clone()) + //} else { + //None + //} + //} else { + //None + //} + //) { + //client.connect_ports_by_name(&output, &input)?; + //} + //} Ok(Self { name: name.to_string(), sequencer, chain }) } } diff --git a/src/view/chain.rs b/src/view/chain.rs index 3ef6968f..1977831b 100644 --- a/src/view/chain.rs +++ b/src/view/chain.rs @@ -16,21 +16,67 @@ pub struct ChainView<'a> { impl<'a> Render for ChainView<'a> { fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { - let style = Some(Style::default().green().dim()); - if self.focused { - let Rect { x, y, width, height} = area; - lozenge_left(buf, x, y, height, style); - lozenge_right(buf, x + width - 1, y, height, style); - }; + let style = Some(if self.focused { + Style::default().green() + } else { + Style::default().green().dim() + }); let (area, _plugins) = if let Some(ref chain) = self.chain { draw_as_row(&*chain, buf, area, style)? } else { (area, vec![]) }; + let Rect { x, y, width, height} = area; + lozenge_left(buf, x, y, height, style); + lozenge_right(buf, x + width - 1, y, height, style); Ok(area) } } +pub fn draw_as_row ( + state: &Chain, buf: &mut Buffer, area: Rect, style: Option