mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
nice (and working) port connect api
This commit is contained in:
parent
f928b026ed
commit
3ed9ebddd4
7 changed files with 209 additions and 190 deletions
140
src/main.rs
140
src/main.rs
|
|
@ -19,67 +19,60 @@ use crate::{core::*, model::*};
|
|||
pub fn main () -> Usually<()> {
|
||||
App::default().run(Some(|app: Arc<Mutex<App>>|{
|
||||
let mut state = app.lock().unwrap();
|
||||
|
||||
let xdg = Arc::new(microxdg::XdgApp::new("tek")?);
|
||||
state.xdg = Some(xdg.clone());
|
||||
|
||||
if crate::config::AppPaths::new(&xdg)?.should_create() {
|
||||
state.modal = Some(Box::new(crate::config::SetupModal(Some(xdg.clone()))));
|
||||
}
|
||||
state.scenes = vec![
|
||||
Scene::new("Intro", vec![None, Some(0), None, None]),
|
||||
Scene::new("Hook", vec![Some(0), Some(0), None, None]),
|
||||
Scene::new("Verse", vec![Some(1), Some(0), None, None]),
|
||||
Scene::new("Chorus", vec![Some(0), Some(0), None, None]),
|
||||
Scene::new("Bridge", vec![Some(2), Some(0), None, None]),
|
||||
Scene::new("Outro", vec![None, Some(0), None, None]),
|
||||
];
|
||||
let jack = jack_run("tek", &app)?;
|
||||
let client = jack.as_client();
|
||||
let timebase = &state.timebase;
|
||||
let ppq = timebase.ppq() as usize;
|
||||
|
||||
let jack = jack_run("tek", &app)?;
|
||||
let client = jack.as_client();
|
||||
state.transport = Some(client.transport());
|
||||
state.playing = Some(TransportState::Stopped);
|
||||
state.midi_in = Some(client.register_port("midi-in", MidiIn)?);
|
||||
|
||||
let timebase = &state.timebase;
|
||||
let ppq = timebase.ppq() as usize;
|
||||
state.track_cursor = 1;
|
||||
state.scene_cursor = 1;
|
||||
state.note_start = 12;
|
||||
state.time_zoom = 12;
|
||||
state.transport = Some(client.transport());
|
||||
state.playing = Some(TransportState::Stopped);
|
||||
state.midi_in = Some(client.register_port("midi-in", MidiIn)?);
|
||||
state.jack = Some(jack);
|
||||
|
||||
state.add_track_with_cb(Some("Drums"), |client: &Client, track: &mut Track|{
|
||||
let outputs: Vec<_> = ["Komplete.+:playback_FL", "Komplete.+:playback_FR"]
|
||||
.iter()
|
||||
.map(|name|client
|
||||
.ports(Some(name), None, PortFlags::empty())
|
||||
.get(0)
|
||||
.map(|name|client.port_by_name(name)))
|
||||
.flatten()
|
||||
.collect();
|
||||
|
||||
state.jack = Some(jack);
|
||||
|
||||
state.add_track_with_cb(Some("Drums"), |_, track|{
|
||||
|
||||
track.add_device_with_cb(Sampler::new("Sampler", Some(BTreeMap::from([
|
||||
sample!(36, "Kick", "/home/user/Lab/Music/pak/kik.wav"),
|
||||
sample!(40, "Snare", "/home/user/Lab/Music/pak/sna.wav"),
|
||||
sample!(44, "Hihat", "/home/user/Lab/Music/pak/chh.wav"),
|
||||
])))?, |track: &Track, device: &mut JackDevice|{
|
||||
client.connect_ports(
|
||||
&track.midi_out, &device.midi_ins()?[0]
|
||||
)?;
|
||||
])))?, |track, device|{
|
||||
device.connect_midi_in(0, &track.midi_out.clone_unowned())?;
|
||||
Ok(())
|
||||
})?;
|
||||
|
||||
track.add_device_with_cb(Plugin::lv2(
|
||||
"Panagement",
|
||||
"file:///home/user/.lv2/Auburn Sounds Panagement 2.lv2"
|
||||
)?, |track: &Track, device: &mut JackDevice|{
|
||||
client.connect_ports(
|
||||
&track.devices[0].audio_outs()?[0], &device.audio_ins()?[0]
|
||||
)?;
|
||||
let output_left = client
|
||||
.ports(Some("Komplete.+:playback_FL"), None, PortFlags::empty())
|
||||
.get(0)
|
||||
.map(|name|client.port_by_name(&name))
|
||||
.flatten();
|
||||
if let Some(output_left) = output_left {
|
||||
client.connect_ports(&device.audio_outs()?[0], &output_left)?;
|
||||
)?, |track, device|{
|
||||
device.connect_audio_in(0, &track.devices[0].audio_outs()?[0])?;
|
||||
device.connect_audio_in(0, &track.devices[0].audio_outs()?[1])?;
|
||||
if let Some(Some(left)) = outputs.get(0) {
|
||||
device.connect_audio_out(0, left)?;
|
||||
}
|
||||
let output_right = client
|
||||
.ports(Some("Komplete.+:playback_FR"), None, PortFlags::empty())
|
||||
.get(0)
|
||||
.map(|name|client.port_by_name(&name))
|
||||
.flatten();
|
||||
if let Some(output_right) = output_right {
|
||||
client.connect_ports(&device.audio_outs()?[0], &output_right)?;
|
||||
if let Some(Some(right)) = outputs.get(0) {
|
||||
device.connect_audio_out(1, right)?;
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
|
|
@ -108,26 +101,20 @@ pub fn main () -> Usually<()> {
|
|||
Ok(())
|
||||
})?;
|
||||
|
||||
state.add_track_with_cb(Some("Bass"), |_client: &Client, track: &mut Track|{
|
||||
track.add_device(Plugin::lv2("Odin2", "file:///home/user/.lv2/Odin2.lv2")?)?;
|
||||
state.add_track_with_cb(Some("Bass"), |_, track|{
|
||||
track.add_device_with_cb(Plugin::lv2(
|
||||
"Odin2",
|
||||
"file:///home/user/.lv2/Odin2.lv2"
|
||||
)?, |_, device|{
|
||||
if let Some(Some(left)) = outputs.get(0) {
|
||||
device.connect_audio_out(0, left)?;
|
||||
}
|
||||
if let Some(Some(right)) = outputs.get(0) {
|
||||
device.connect_audio_out(1, right)?;
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
track.sequence = Some(0); // FIXME
|
||||
//client.connect_ports(&track.midi_out, &track.devices[0].midi_ins()?[0])?;
|
||||
//let output_left = client.ports(Some(".+:playback_FL"), None, PortFlags::empty());
|
||||
//if let Some(
|
||||
//output_left
|
||||
//) = output_left.get(0).map(|name|client.port_by_name(&name)).flatten() {
|
||||
//client.connect_ports(
|
||||
//&track.devices[0].audio_outs()?[0], &output_left
|
||||
//)?;
|
||||
//}
|
||||
//let output_right = client.ports(Some(".+:playback_FR"), None, PortFlags::empty());
|
||||
//if let Some(
|
||||
//output_right
|
||||
//) = output_right.get(0).map(|name|client.port_by_name(&name)).flatten() {
|
||||
//client.connect_ports(
|
||||
//&track.devices[0].audio_outs()?[1], &output_right
|
||||
//)?;
|
||||
//}
|
||||
track.add_phrase("Offbeat", ppq * 4, Some(phrase! {
|
||||
00 * ppq/4 => MidiMessage::NoteOff { key: 40.into(), vel: 100.into() },
|
||||
02 * ppq/4 => MidiMessage::NoteOn { key: 40.into(), vel: 100.into() },
|
||||
|
|
@ -141,6 +128,15 @@ pub fn main () -> Usually<()> {
|
|||
Ok(())
|
||||
})?;
|
||||
|
||||
state.scenes = vec![
|
||||
Scene::new("Intro", vec![None, Some(0), None, None]),
|
||||
Scene::new("Hook", vec![Some(0), Some(0), None, None]),
|
||||
Scene::new("Verse", vec![Some(1), Some(0), None, None]),
|
||||
Scene::new("Chorus", vec![Some(0), Some(0), None, None]),
|
||||
Scene::new("Bridge", vec![Some(2), Some(0), None, None]),
|
||||
Scene::new("Outro", vec![None, Some(0), None, None]),
|
||||
];
|
||||
|
||||
Ok(())
|
||||
}))
|
||||
}
|
||||
|
|
@ -298,32 +294,4 @@ impl App {
|
|||
let (_, scene) = self.scene()?;
|
||||
*scene.clips.get(track_id)?
|
||||
}
|
||||
pub fn connect_tracks (&self) -> Usually<()> {
|
||||
//let (client, _status) = Client::new(
|
||||
//&format!("{}-init", &self.name), ClientOptions::NO_START_SERVER
|
||||
//)?;
|
||||
//let midi_ins = client.ports(Some(midi_in), None, PortFlags::IS_OUTPUT);
|
||||
//let audio_outs: Vec<Vec<String>> = audio_outs.iter()
|
||||
//.map(|pattern|client.ports(Some(pattern), None, PortFlags::IS_INPUT))
|
||||
//.collect();
|
||||
//for (i, sequencer) in self.tracks.iter().enumerate() {
|
||||
//for sequencer_midi_in in sequencer.midi_ins()?.iter() {
|
||||
//for midi_in in midi_ins.iter() {
|
||||
//client.connect_ports_by_name(&midi_in, &sequencer_midi_in)?;
|
||||
//}
|
||||
//}
|
||||
//let chain: &Chain = &self.tracks[i].chain;
|
||||
//for port in sequencer.midi_outs()?.iter() {
|
||||
//for midi_in in chain.midi_ins()?.iter() {
|
||||
//client.connect_ports_by_name(&port, &midi_in)?;
|
||||
//}
|
||||
//}
|
||||
//for (j, port) in chain.audio_outs()?.iter().enumerate() {
|
||||
//for audio_out in audio_outs[j % audio_outs.len()].iter() {
|
||||
//client.connect_ports_by_name(&port, &audio_out)?;
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue