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; let app = Launcher::new("Launcher#0", &timebase, Some(vec![ Track::new("Kick", &timebase, Some(vec![ //Plugin::lv2("Kick/ChowKick", "file:///home/user/.lv2/ChowKick.lv2", &[1, 1, 0, 2])?.boxed(), Sampler::new("Sampler", Some(BTreeMap::from([ (u7::from_int_lossy(35), Sample { name: "Kick 1".into(), start: 0, end: 100000, channels: vec![], }.into()), (u7::from_int_lossy(36).into(), Sample { name: "Kick 2".into(), start: 0, end: 100000, channels: vec![], }.into()), (u7::from_int_lossy(38).into(), Sample { name: "Snare 1".into(), start: 0, end: 100000, channels: vec![], }.into()), (u7::from_int_lossy(40).into(), Sample { name: "Snare 2".into(), start: 50000, end: 100000, channels: vec![], }.into()), (u7::from_int_lossy(42).into(), Sample { name: "HH Closed".into(), start: 0, end: 50000, channels: vec![], }.into()), (u7::from_int_lossy(46).into(), Sample { name: "HH Open".into(), start: 0, end: 25000, channels: vec![] }.into()), ])))?.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)?; run(app) }