extern crate clap; extern crate jack; extern crate crossterm; use clap::{Parser}; use std::error::Error; pub mod cli; pub mod device; pub mod prelude; pub mod draw; pub mod config; pub mod layout; pub mod time; use crate::prelude::*; fn main () -> Result<(), Box> { let _cli = cli::Cli::parse(); let xdg = microxdg::XdgApp::new("tek")?; crate::config::create_dirs(&xdg)?; //run(Sampler::new("Sampler#000")?) let input = ".*nanoKEY.*"; let output = ["Komplete.*:playback_FL", "Komplete.*:playback_FR"]; let (client, _) = Client::new("init", ClientOptions::NO_START_SERVER)?; let timebase = Arc::new(Timebase { rate: AtomicUsize::new(client.sample_rate()), tempo: AtomicUsize::new(113000), ppq: AtomicUsize::new(96), }); let ppq = timebase.ppq() as u32; run(Launcher::new("Launcher#0", &timebase, Some(vec![ Track::new("Kick", &timebase, Some(vec![ //Sampler::new("Sampler")?.boxed(), Plugin::lv2("Kick/ChowKick", "file:///home/user/.lv2/ChowKick.lv2", &[1, 1, 0, 2])?.boxed(), ]), Some(vec![ Phrase::new("HelloKick", ppq * 4, Some(BTreeMap::from([ ( ppq * 0, vec![MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }] ), ( ppq * 1, vec![MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }] ), ( ppq * 2, vec![MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }] ), ( ppq * 3, vec![MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }] ), ]))) ]))?, Track::new("Helm", &timebase, Some(vec![ Plugin::lv2("Helm", "file:///home/user/.lv2/Helm.lv2", &[1, 0, 0, 2])?.boxed(), ]), Some(vec![ Phrase::new("HelloBass", ppq * 4, Some(BTreeMap::from([ ( ppq / 2 + ppq * 0, vec![MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 1 / 2, vec![MidiMessage::NoteOff { key: 36.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 1, vec![MidiMessage::NoteOn { key: 39.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 3 / 2, vec![MidiMessage::NoteOff { key: 39.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 2, vec![MidiMessage::NoteOn { key: 41.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 5 / 2, vec![MidiMessage::NoteOff { key: 41.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 3, vec![MidiMessage::NoteOn { key: 42.into(), vel: 100.into() }] ), ( ppq / 2 + ppq * 7 / 2 - 1, vec![MidiMessage::NoteOff { key: 42.into(), vel: 100.into() }] ), ]))) ]))?, //Plugin::lv2("Kick/ChowKick", "file:///home/user/.lv2/ChowKick.lv2", &[1, 1, 0, 2])?.boxed(), //Plugin::lv2("Bass/Helm", "file:///home/user/.lv2/Helm.lv2", &[1, 0, 0, 2])?.boxed(), //Plugin::lv2("Pads/Odin2", "file:///home/user/.lv2/Odin2.lv2", &[1, 0, 0, 2])?.boxed(), ]), Some(vec![ Scene::new(&"Scene#01", &[Some(0), None, None, None]), Scene::new(&"Scene#02", &[Some(0), Some(0), None, None]), Scene::new(&"Scene#03", &[None, Some(0), None, None]), Scene::new(&"Scene#04", &[None, None, None, None]), Scene::new(&"Scene#05", &[None, None, None, None]), ]) )?.connect(input, &output)?) }