diff --git a/Justfile b/Justfile index 5ecece41..f86ae529 100644 --- a/Justfile +++ b/Justfile @@ -6,7 +6,7 @@ midi-in := "-i 'Midi-Bridge:.*nanoKEY.*:.*capture.*'" midi-out := "-o 'Midi-Bridge:.*playback.*'" audio-in := "-l 'Komplete Audio 6 Pro:capture_AUX1' -r 'Komplete Audio 6 Pro:capture_AUX1'" audio-out := "-L 'Komplete Audio 6 Pro:playback_AUX1' -R 'Komplete Audio 6 Pro:playback_AUX1'" -firefox-in := "-l 'Firefox:output_FL*' -r 'Firefox:output_FR*'" +firefox-in := "-l 'Firefox:output_FL' -r 'Firefox:output_FR'" covfig := "CARGO_INCREMENTAL=0 RUSTFLAGS='-Cinstrument-coverage' RUSTDOCFLAGS='-Cinstrument-coverage' LLVM_PROFILE_FILE='cov/cargo-test-%p-%m.profraw'" grcov-binary := "--binary-path ./target/coverage/deps/" grcov-ignore := "--ignore-not-existing --ignore '../*' --ignore \"/*\" --ignore 'target/*'" @@ -71,8 +71,6 @@ groovebox: groovebox-ext: reset {{debug}} {{name}} {{bpm}} {{midi-in}} {{midi-out}} {{audio-in}} {{audio-out}} groovebox -groovebox-browser: - {{debug}} {{name}} {{bpm}} {{audio-in}} groovebox groovebox-release: {{release}} {{name}} {{bpm}} groovebox groovebox-release-ext: diff --git a/config/keys_editor.edn b/config/keys_editor.edn index a99ec7e5..64523ac7 100644 --- a/config/keys_editor.edn +++ b/config/keys_editor.edn @@ -1,7 +1,5 @@ (@left editor set-time-pos :time-pos-prev) -(@shift-left editor set-time-pos :time-pos-prev-fine) (@right editor set-time-pos :time-pos-next) -(@shift-right editor set-time-pos :time-pos-next-fine) (@equal editor set-time-zoom :time-zoom-prev) (@minus editor set-time-zoom :time-zoom-next) diff --git a/config/keys_sampler.edn b/config/keys_sampler.edn index 0e8aa127..036342a0 100644 --- a/config/keys_sampler.edn +++ b/config/keys_sampler.edn @@ -4,5 +4,3 @@ (@right sampler select :sample-to-right) (@r sampler record-toggle :sample-selected) (@shift-R sampler record-cancel) -(@p sampler play-sample :sample-selected) -(@P sampler stop-sample :sample-selected) diff --git a/crates/app/src/model/track.rs b/crates/app/src/model/track.rs index a94e5b0f..959238d8 100644 --- a/crates/app/src/model/track.rs +++ b/crates/app/src/model/track.rs @@ -2,15 +2,19 @@ use crate::*; #[derive(Debug, Default)] pub struct Track { /// Name of track - pub name: Arc, - /// Identifying color of track - pub color: ItemTheme, + pub name: Arc, /// Preferred width of track column - pub width: usize, + pub width: usize, + /// Identifying color of track + pub color: ItemTheme, /// MIDI sequencer state - pub sequencer: Sequencer, + pub sequencer: Sequencer, /// Device chain - pub devices: Vec, + pub devices: Vec, + /// Inputs of 1st device + pub audio_ins: Vec, + /// Outputs of last device + pub audio_outs: Vec, } has_clock!(|self: Track|self.sequencer.clock); @@ -54,7 +58,9 @@ impl Track { audio_from: &[&[PortConnect];2], audio_to: &[&[PortConnect];2], ) -> Usually { - let mut track = Self::new(name, color, jack, clock, clip, midi_from, midi_to)?; + let mut track = Self::new( + name, color, jack, clock, clip, midi_from, midi_to + )?; track.devices.push(Device::Sampler(Sampler::new( jack, &format!("{}/sampler", name.as_ref()), diff --git a/crates/app/src/view.rs b/crates/app/src/view.rs index c6b55c84..21743eb7 100644 --- a/crates/app/src/view.rs +++ b/crates/app/src/view.rs @@ -571,13 +571,9 @@ impl<'a> ArrangerView<'a> { } -/// Iterator over scenes with their sizes and colors. -pub(crate) trait ScenesColors<'a> = - Iterator>; +trait ScenesColors<'a> = Iterator>; -/// A scene with size and color. -pub(crate) type SceneWithColor<'a> = - (usize, &'a Scene, usize, usize, Option); +type SceneWithColor<'a> = (usize, &'a Scene, usize, usize, Option); /// Define a type alias for iterators of sized items (columns). macro_rules! def_sizes_iter { diff --git a/crates/cli/tek.rs b/crates/cli/tek.rs index 3f7fdfcb..1e303f23 100644 --- a/crates/cli/tek.rs +++ b/crates/cli/tek.rs @@ -128,13 +128,11 @@ impl Cli { midi_ins, midi_outs, midi_buf: match mode { - LaunchMode::Clock | - LaunchMode::Sampler => - vec![], - LaunchMode::Sequencer | - LaunchMode::Groovebox | - LaunchMode::Arranger {..} => - vec![vec![];65536], + LaunchMode::Clock + | LaunchMode::Sampler => vec![], + LaunchMode::Sequencer + | LaunchMode::Groovebox + | LaunchMode::Arranger {..} => vec![vec![];65536], _ => todo!("{mode:?}"), }, tracks: match mode { @@ -157,7 +155,7 @@ impl Cli { Some(&clock), clip.as_ref(), midi_froms.as_slice(), - midi_tos.as_slice(), + midi_froms.as_slice(), audio_froms, audio_tos, )? diff --git a/crates/device/src/editor/editor_api.rs b/crates/device/src/editor/editor_api.rs index 3ef47b0b..85748cae 100644 --- a/crates/device/src/editor/editor_api.rs +++ b/crates/device/src/editor/editor_api.rs @@ -5,10 +5,6 @@ use crate::*; todo!() } - fn clip_length (&self) -> usize { - self.clip().as_ref().map(|p|p.read().unwrap().length).unwrap_or(1) - } - fn note_length (&self) -> usize { self.get_note_len() } @@ -53,19 +49,10 @@ use crate::*; self.get_time_pos() } fn time_pos_next (&self) -> usize { - (self.get_time_pos() + self.get_note_len()) % self.clip_length() - } - fn time_pos_next_fine (&self) -> usize { - (self.get_time_pos() + 1) % self.clip_length() + self.get_time_pos() + self.get_note_len() } fn time_pos_prev (&self) -> usize { - let step = self.get_note_len(); - self.get_time_pos().overflowing_sub(step) - .0.min(self.clip_length().saturating_sub(step)) - } - fn time_pos_prev_fine (&self) -> usize { - self.get_time_pos().overflowing_sub(1) - .0.min(self.clip_length().saturating_sub(1)) + self.get_time_pos().saturating_sub(self.get_note_len()) } fn time_zoom (&self) -> usize { diff --git a/crates/device/src/editor/editor_model.rs b/crates/device/src/editor/editor_model.rs index 648e70c5..90d6d2ee 100644 --- a/crates/device/src/editor/editor_model.rs +++ b/crates/device/src/editor/editor_model.rs @@ -61,7 +61,7 @@ impl MidiEditor { clip.notes[note_end].push(note_off); } if advance { - self.set_time_pos((note_end + 1) % clip.length); + self.set_time_pos(note_end + 1); } redraw = true; } @@ -69,6 +69,33 @@ impl MidiEditor { self.mode.redraw(); } } + + pub fn clip_status (&self) -> impl Content + '_ { + let (color, name, length, looped) = if let Some(clip) = self.clip().as_ref().map(|p|p.read().unwrap()) { + (clip.color, clip.name.clone(), clip.length, clip.looped) + } else { (ItemTheme::G[64], String::new().into(), 0, false) }; + Bsp::e( + FieldH(color, "Edit", format!("{name} ({length})")), + FieldH(color, "Loop", looped.to_string()) + ) + } + + pub fn edit_status (&self) -> impl Content + '_ { + let (color, length) = if let Some(clip) = self.clip().as_ref().map(|p|p.read().unwrap()) { + (clip.color, clip.length) + } else { (ItemTheme::G[64], 0) }; + let time_pos = self.get_time_pos(); + let time_zoom = self.get_time_zoom(); + let time_lock = if self.get_time_lock() { "[lock]" } else { " " }; + let note_pos = self.get_note_pos(); + let note_name = format!("{:4}", Note::pitch_to_name(note_pos)); + let note_pos = format!("{:>3}", note_pos); + let note_len = format!("{:>4}", self.get_note_len()); + Bsp::e( + FieldH(color, "Time", format!("{length}/{time_zoom}+{time_pos} {time_lock}")), + FieldH(color, "Note", format!("{note_name} {note_pos} {note_len}")), + ) + } } impl TimeRange for MidiEditor { diff --git a/crates/device/src/editor/editor_view.rs b/crates/device/src/editor/editor_view.rs index 7828d416..9a7e4f48 100644 --- a/crates/device/src/editor/editor_view.rs +++ b/crates/device/src/editor/editor_view.rs @@ -7,34 +7,3 @@ content!(TuiOut: |self: MidiEditor| { //self.autozoom(); self.size.of(&self.mode) }); - -impl MidiEditor { - - pub fn clip_status (&self) -> impl Content + '_ { - let (color, name, length, looped) = if let Some(clip) = self.clip().as_ref().map(|p|p.read().unwrap()) { - (clip.color, clip.name.clone(), clip.length, clip.looped) - } else { (ItemTheme::G[64], String::new().into(), 0, false) }; - Bsp::e( - FieldH(color, "Edit", format!("{name} ({length})")), - FieldH(color, "Loop", looped.to_string()) - ) - } - - pub fn edit_status (&self) -> impl Content + '_ { - let (color, length) = if let Some(clip) = self.clip().as_ref().map(|p|p.read().unwrap()) { - (clip.color, clip.length) - } else { (ItemTheme::G[64], 0) }; - let time_pos = self.get_time_pos(); - let time_zoom = self.get_time_zoom(); - let time_lock = if self.get_time_lock() { "[lock]" } else { " " }; - let note_pos = self.get_note_pos(); - let note_name = format!("{:4}", Note::pitch_to_name(note_pos)); - let note_pos = format!("{:>3}", note_pos); - let note_len = format!("{:>4}", self.get_note_len()); - Bsp::e( - FieldH(color, "Time", format!("{length}/{time_zoom}+{time_pos} {time_lock}")), - FieldH(color, "Note", format!("{note_name} {note_pos} {note_len}")), - ) - } - -} diff --git a/crates/device/src/sampler/sampler_api.rs b/crates/device/src/sampler/sampler_api.rs index 514ccf5f..f490350e 100644 --- a/crates/device/src/sampler/sampler_api.rs +++ b/crates/device/src/sampler/sampler_api.rs @@ -81,16 +81,6 @@ impl SamplerCommand { sampler.recording = None; Ok(None) } - fn play_sample (sampler: &mut Sampler, pitch: usize) -> Perhaps { - if let Some(ref sample) = sampler.mapped[pitch] { - sampler.voices.write().unwrap().push(Sample::play(sample, 0, &u7::from(128))); - } - Ok(None) - } - fn stop_sample (sampler: &mut Sampler, pitch: usize) -> Perhaps { - todo!(); - Ok(None) - } //fn select (&self, state: &mut Sampler, i: usize) -> Option { //Self::Select(state.set_note_pos(i)) //}