mirror of
https://codeberg.org/unspeaker/tek.git
synced 2026-01-12 11:06:41 +01:00
191 lines
5.1 KiB
Rust
191 lines
5.1 KiB
Rust
use crate::*;
|
|
|
|
impl HasTracks<ArrangerTrack> for ArrangerTui {
|
|
fn tracks (&self) -> &Vec<ArrangerTrack> {
|
|
&self.tracks
|
|
}
|
|
fn tracks_mut (&mut self) -> &mut Vec<ArrangerTrack> {
|
|
&mut self.tracks
|
|
}
|
|
}
|
|
|
|
impl ArrangerTracksApi<ArrangerTrack> for ArrangerTui {
|
|
fn track_add (&mut self, name: Option<&str>, color: Option<ItemColor>)
|
|
-> Usually<&mut ArrangerTrack>
|
|
{
|
|
let name = name.map_or_else(||self.track_default_name(), |x|x.to_string());
|
|
let track = ArrangerTrack {
|
|
width: name.len() + 2,
|
|
name: Arc::new(name.into()),
|
|
color: color.unwrap_or_else(||ItemColor::random()),
|
|
midi_ins: vec![],
|
|
midi_outs: vec![],
|
|
reset: true,
|
|
recording: false,
|
|
monitoring: false,
|
|
overdub: false,
|
|
play_phrase: None,
|
|
next_phrase: None,
|
|
notes_in: RwLock::new([false;128]).into(),
|
|
notes_out: RwLock::new([false;128]).into(),
|
|
};
|
|
self.tracks_mut().push(track);
|
|
let index = self.tracks().len() - 1;
|
|
Ok(&mut self.tracks_mut()[index])
|
|
}
|
|
fn track_del (&mut self, index: usize) {
|
|
self.tracks_mut().remove(index);
|
|
for scene in self.scenes_mut().iter_mut() {
|
|
scene.clips.remove(index);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct ArrangerTrack {
|
|
/// Name of track
|
|
name: Arc<RwLock<String>>,
|
|
/// Preferred width of track column
|
|
width: usize,
|
|
/// Identifying color of track
|
|
color: ItemColor,
|
|
/// Start time and phrase being played
|
|
play_phrase: Option<(Instant, Option<Arc<RwLock<Phrase>>>)>,
|
|
/// Start time and next phrase
|
|
next_phrase: Option<(Instant, Option<Arc<RwLock<Phrase>>>)>,
|
|
/// Play input through output.
|
|
monitoring: bool,
|
|
/// Write input to sequence.
|
|
recording: bool,
|
|
/// Overdub input to sequence.
|
|
overdub: bool,
|
|
/// Send all notes off
|
|
reset: bool, // TODO?: after Some(nframes)
|
|
/// Record from MIDI ports to current sequence.
|
|
midi_ins: Vec<Port<MidiIn>>,
|
|
/// Play from current sequence to MIDI ports
|
|
midi_outs: Vec<Port<MidiOut>>,
|
|
/// Notes currently held at input
|
|
notes_in: Arc<RwLock<[bool; 128]>>,
|
|
/// Notes currently held at output
|
|
notes_out: Arc<RwLock<[bool; 128]>>,
|
|
///// MIDI output buffer
|
|
//midi_note: Vec<u8>,
|
|
///// MIDI output buffer
|
|
//midi_chunk: Vec<Vec<Vec<u8>>>,
|
|
}
|
|
|
|
impl ArrangerTrackApi for ArrangerTrack {
|
|
/// Name of track
|
|
fn name (&self) -> &Arc<RwLock<String>> {
|
|
&self.name
|
|
}
|
|
/// Preferred width of track column
|
|
fn width (&self) -> usize {
|
|
self.width
|
|
}
|
|
/// Preferred width of track column
|
|
fn width_mut (&mut self) -> &mut usize {
|
|
&mut self.width
|
|
}
|
|
/// Identifying color of track
|
|
fn color (&self) -> ItemColor {
|
|
self.color
|
|
}
|
|
}
|
|
|
|
impl HasPhrase for ArrangerTrack {
|
|
fn reset (&self) -> bool {
|
|
self.reset
|
|
}
|
|
fn reset_mut (&mut self) -> &mut bool {
|
|
&mut self.reset
|
|
}
|
|
fn phrase (&self) -> &Option<(Instant, Option<Arc<RwLock<Phrase>>>)> {
|
|
todo!()
|
|
}
|
|
fn phrase_mut (&self) -> &mut Option<(Instant, Option<Arc<RwLock<Phrase>>>)> {
|
|
todo!()
|
|
}
|
|
fn next_phrase (&self) -> &Option<(Instant, Option<Arc<RwLock<Phrase>>>)> {
|
|
todo!()
|
|
}
|
|
fn next_phrase_mut (&mut self) -> &mut Option<(Instant, Option<Arc<RwLock<Phrase>>>)> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl MidiInputApi for ArrangerTrack {
|
|
fn midi_ins (&self) -> &Vec<Port<jack::MidiIn>> {
|
|
todo!()
|
|
}
|
|
fn midi_ins_mut (&self) -> &mut Vec<Port<jack::MidiIn>> {
|
|
todo!()
|
|
}
|
|
fn recording (&self) -> bool {
|
|
todo!()
|
|
}
|
|
fn recording_mut (&mut self) -> &mut bool {
|
|
todo!()
|
|
}
|
|
fn monitoring (&self) -> bool {
|
|
todo!()
|
|
}
|
|
fn monitoring_mut (&mut self) -> &mut bool {
|
|
todo!()
|
|
}
|
|
fn overdub (&self) -> bool {
|
|
todo!()
|
|
}
|
|
fn overdub_mut (&mut self) -> &mut bool {
|
|
todo!()
|
|
}
|
|
fn notes_in (&self) -> &Arc<RwLock<[bool; 128]>> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl MidiOutputApi for ArrangerTrack {
|
|
fn midi_outs (&self) -> &Vec<Port<jack::MidiOut>> {
|
|
todo!()
|
|
}
|
|
fn midi_outs_mut (&mut self) -> &mut Vec<Port<jack::MidiOut>> {
|
|
todo!()
|
|
}
|
|
fn midi_note (&mut self) -> &mut Vec<u8> {
|
|
todo!()
|
|
}
|
|
fn notes_out (&self) -> &Arc<RwLock<[bool; 128]>> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl ClockApi for ArrangerTrack {
|
|
fn timebase (&self) -> &Arc<Timebase> {
|
|
todo!()
|
|
}
|
|
fn quant (&self) -> &Quantize {
|
|
todo!()
|
|
}
|
|
fn sync (&self) -> &LaunchSync {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl PlayheadApi for ArrangerTrack {
|
|
fn current (&self) -> &Instant {
|
|
todo!()
|
|
}
|
|
fn transport (&self) -> &Transport {
|
|
todo!()
|
|
}
|
|
fn playing (&self) -> &RwLock<Option<TransportState>> {
|
|
todo!()
|
|
}
|
|
fn started (&self) -> &RwLock<Option<(usize, usize)>> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl PlayerApi for ArrangerTrack {}
|
|
|