mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
autoregister sampler ports
This commit is contained in:
parent
9f739fe040
commit
120a67ba21
3 changed files with 47 additions and 28 deletions
|
|
@ -60,18 +60,7 @@ from_edn!("sampler" => |jack: &Arc<RwLock<JackClient>>, args| -> crate::Sampler
|
||||||
},
|
},
|
||||||
_ => panic!("unexpected in sampler {name}: {edn:?}")
|
_ => panic!("unexpected in sampler {name}: {edn:?}")
|
||||||
});
|
});
|
||||||
let midi_in = jack.read().unwrap().client().register_port("in", MidiIn::default())?;
|
Self::new(jack, &name)
|
||||||
Ok(Self {
|
|
||||||
jack: jack.clone(),
|
|
||||||
mapped: samples,
|
|
||||||
unmapped: Default::default(),
|
|
||||||
voices: Default::default(),
|
|
||||||
buffer: Default::default(),
|
|
||||||
audio_outs: vec![],
|
|
||||||
output_gain: 0.,
|
|
||||||
midi_in,
|
|
||||||
name,
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
|
|
||||||
type MidiSample = (Option<u7>, Arc<RwLock<crate::Sample>>);
|
type MidiSample = (Option<u7>, Arc<RwLock<crate::Sample>>);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,27 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
|
pub trait RegisterPort {
|
||||||
|
fn midi_in (&self, name: &str) -> Usually<Port<MidiIn>>;
|
||||||
|
fn midi_out (&self, name: &str) -> Usually<Port<MidiOut>>;
|
||||||
|
fn audio_in (&self, name: &str) -> Usually<Port<AudioIn>>;
|
||||||
|
fn audio_out (&self, name: &str) -> Usually<Port<AudioOut>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RegisterPort for &Arc<RwLock<JackClient>> {
|
||||||
|
fn midi_in (&self, name: &str) -> Usually<Port<MidiIn>> {
|
||||||
|
Ok(self.read().unwrap().client().register_port(name, MidiIn::default())?)
|
||||||
|
}
|
||||||
|
fn midi_out (&self, name: &str) -> Usually<Port<MidiOut>> {
|
||||||
|
Ok(self.read().unwrap().client().register_port(name, MidiOut::default())?)
|
||||||
|
}
|
||||||
|
fn audio_out (&self, name: &str) -> Usually<Port<AudioOut>> {
|
||||||
|
Ok(self.read().unwrap().client().register_port(name, AudioOut::default())?)
|
||||||
|
}
|
||||||
|
fn audio_in (&self, name: &str) -> Usually<Port<AudioIn>> {
|
||||||
|
Ok(self.read().unwrap().client().register_port(name, AudioIn::default())?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Trait for things that may expose JACK ports.
|
/// Trait for things that may expose JACK ports.
|
||||||
pub trait Ports {
|
pub trait Ports {
|
||||||
fn audio_ins(&self) -> Usually<Vec<&Port<Unowned>>> {
|
fn audio_ins(&self) -> Usually<Vec<&Port<Unowned>>> {
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,33 @@ pub struct Sampler {
|
||||||
pub unmapped: Vec<Arc<RwLock<Sample>>>,
|
pub unmapped: Vec<Arc<RwLock<Sample>>>,
|
||||||
pub voices: Arc<RwLock<Vec<Voice>>>,
|
pub voices: Arc<RwLock<Vec<Voice>>>,
|
||||||
pub midi_in: Port<MidiIn>,
|
pub midi_in: Port<MidiIn>,
|
||||||
|
pub audio_ins: Vec<Port<AudioIn>>,
|
||||||
pub audio_outs: Vec<Port<AudioOut>>,
|
pub audio_outs: Vec<Port<AudioOut>>,
|
||||||
pub buffer: Vec<Vec<f32>>,
|
pub buffer: Vec<Vec<f32>>,
|
||||||
pub output_gain: f32
|
pub output_gain: f32
|
||||||
}
|
}
|
||||||
|
impl Sampler {
|
||||||
|
pub fn new (jack: &Arc<RwLock<JackClient>>, name: &str) -> Usually<Self> {
|
||||||
|
Ok(Self {
|
||||||
|
midi_in: jack.midi_in(&format!("M->{name}"))?,
|
||||||
|
audio_ins: vec![
|
||||||
|
jack.audio_in(&format!("L/{name}"))?,
|
||||||
|
jack.audio_in(&format!("R/{name}"))?
|
||||||
|
],
|
||||||
|
audio_outs: vec![
|
||||||
|
jack.audio_out(&format!("{name}/L"))?,
|
||||||
|
jack.audio_out(&format!("{name}/R"))?,
|
||||||
|
],
|
||||||
|
jack: jack.clone(),
|
||||||
|
name: name.into(),
|
||||||
|
mapped: BTreeMap::new(),
|
||||||
|
unmapped: vec![],
|
||||||
|
voices: Arc::new(RwLock::new(vec![])),
|
||||||
|
buffer: vec![vec![0.0;16384];2],
|
||||||
|
output_gain: 0.5,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
pub struct SamplerTui {
|
pub struct SamplerTui {
|
||||||
pub state: Sampler,
|
pub state: Sampler,
|
||||||
pub cursor: (usize, usize),
|
pub cursor: (usize, usize),
|
||||||
|
|
@ -75,11 +98,6 @@ impl SamplerTui {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
from_jack!(|jack|SamplerTui{
|
from_jack!(|jack|SamplerTui{
|
||||||
let midi_in = jack.read().unwrap().client().register_port("in", MidiIn::default())?;
|
|
||||||
let audio_outs = vec![
|
|
||||||
jack.read().unwrap().client().register_port("outL", AudioOut::default())?,
|
|
||||||
jack.read().unwrap().client().register_port("outR", AudioOut::default())?,
|
|
||||||
];
|
|
||||||
Self {
|
Self {
|
||||||
cursor: (0, 0),
|
cursor: (0, 0),
|
||||||
editing: None,
|
editing: None,
|
||||||
|
|
@ -88,17 +106,7 @@ from_jack!(|jack|SamplerTui{
|
||||||
note_lo: 36.into(),
|
note_lo: 36.into(),
|
||||||
note_pt: 36.into(),
|
note_pt: 36.into(),
|
||||||
color: ItemPalette::from(Color::Rgb(64, 128, 32)),
|
color: ItemPalette::from(Color::Rgb(64, 128, 32)),
|
||||||
state: Sampler {
|
state: Sampler::new(jack, "sampler")?,
|
||||||
jack: jack.clone(),
|
|
||||||
name: "Sampler".into(),
|
|
||||||
mapped: BTreeMap::new(),
|
|
||||||
unmapped: vec![],
|
|
||||||
voices: Arc::new(RwLock::new(vec![])),
|
|
||||||
buffer: vec![vec![0.0;16384];2],
|
|
||||||
output_gain: 0.5,
|
|
||||||
midi_in,
|
|
||||||
audio_outs,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
render!(<Tui>|self: SamplerTui|{
|
render!(<Tui>|self: SamplerTui|{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue