mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56: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:?}")
|
||||
});
|
||||
let midi_in = jack.read().unwrap().client().register_port("in", MidiIn::default())?;
|
||||
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,
|
||||
})
|
||||
Self::new(jack, &name)
|
||||
});
|
||||
|
||||
type MidiSample = (Option<u7>, Arc<RwLock<crate::Sample>>);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,27 @@
|
|||
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.
|
||||
pub trait Ports {
|
||||
fn audio_ins(&self) -> Usually<Vec<&Port<Unowned>>> {
|
||||
|
|
|
|||
|
|
@ -42,10 +42,33 @@ pub struct Sampler {
|
|||
pub unmapped: Vec<Arc<RwLock<Sample>>>,
|
||||
pub voices: Arc<RwLock<Vec<Voice>>>,
|
||||
pub midi_in: Port<MidiIn>,
|
||||
pub audio_ins: Vec<Port<AudioIn>>,
|
||||
pub audio_outs: Vec<Port<AudioOut>>,
|
||||
pub buffer: Vec<Vec<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 state: Sampler,
|
||||
pub cursor: (usize, usize),
|
||||
|
|
@ -75,11 +98,6 @@ impl 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 {
|
||||
cursor: (0, 0),
|
||||
editing: None,
|
||||
|
|
@ -88,17 +106,7 @@ from_jack!(|jack|SamplerTui{
|
|||
note_lo: 36.into(),
|
||||
note_pt: 36.into(),
|
||||
color: ItemPalette::from(Color::Rgb(64, 128, 32)),
|
||||
state: 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,
|
||||
},
|
||||
state: Sampler::new(jack, "sampler")?,
|
||||
}
|
||||
});
|
||||
render!(<Tui>|self: SamplerTui|{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue