mod groovebox_audio; pub use self::groovebox_audio::*; mod groovebox_command; pub use self::groovebox_command::*; mod groovebox_tui; pub use self::groovebox_tui::*; mod groovebox_edn; pub use self::groovebox_edn::*; use crate::*; use super::*; use KeyCode::{Char, Delete, Tab, Up, Down, Left, Right}; use ClockCommand::{Play, Pause}; use GrooveboxCommand as Cmd; use MidiEditCommand::*; use PhrasePoolCommand::*; pub struct Groovebox { _jack: Arc>, pub player: MidiPlayer, pub pool: PoolModel, pub editor: MidiEditor, pub sampler: Sampler, pub compact: bool, pub size: Measure, pub status: bool, pub note_buf: Vec, pub midi_buf: Vec>>, pub perf: PerfModel, } has_clock!(|self: Groovebox|self.player.clock()); impl Groovebox { pub fn new ( jack: &Arc>, midi_from: &[impl AsRef], midi_to: &[impl AsRef], audio_from: &[&[impl AsRef];2], audio_to: &[&[impl AsRef];2], ) -> Usually { let sampler = crate::sampler::Sampler::new(jack, &"sampler", midi_from, audio_from, audio_to)?; let mut player = crate::midi::MidiPlayer::new(jack, &"sequencer", &midi_from, &midi_to)?; jack.read().unwrap().client().connect_ports(&player.midi_outs[0], &sampler.midi_in)?; let phrase = Arc::new(RwLock::new(MidiClip::new( "Clip", true, 4 * player.clock.timebase.ppq.get() as usize, None, Some(ItemColor::random().into()) ))); player.play_phrase = Some((Moment::zero(&player.clock.timebase), Some(phrase.clone()))); Ok(Self { player, sampler, _jack: jack.clone(), pool: crate::pool::PoolModel::from(&phrase), editor: crate::midi::MidiEditor::from(&phrase), compact: true, status: true, size: Measure::new(), midi_buf: vec![vec![];65536], note_buf: vec![], perf: PerfModel::default(), }) } }