mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
105 lines
3.2 KiB
Rust
105 lines
3.2 KiB
Rust
use crate::*;
|
|
|
|
impl TryFrom<&Arc<RwLock<JackClient>>> for SequencerTui {
|
|
type Error = Box<dyn std::error::Error>;
|
|
fn try_from (jack: &Arc<RwLock<JackClient>>) -> Usually<Self> {
|
|
Ok(Self::new(SequencerTui {
|
|
phrases: vec![],
|
|
metronome: false,
|
|
transport: jack.read().unwrap().transport(),
|
|
jack: jack.clone(),
|
|
focused: false,
|
|
focus: TransportFocus::PlayPause,
|
|
size: Measure::new(),
|
|
phrases: vec![],
|
|
}.into(), None, None))
|
|
}
|
|
}
|
|
|
|
/// Root view for standalone `tek_sequencer`.
|
|
pub struct SequencerTui {
|
|
jack: Arc<RwLock<JackClient>>,
|
|
playing: RwLock<Option<TransportState>>,
|
|
started: RwLock<Option<(usize, usize)>>,
|
|
current: Instant,
|
|
quant: Quantize,
|
|
sync: LaunchSync,
|
|
transport: jack::Transport,
|
|
metronome: bool,
|
|
phrases: Vec<Arc<RwLock<Phrase>>>,
|
|
view_phrase: usize,
|
|
split: u16,
|
|
/// 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_inputs: Vec<Port<MidiIn>>,
|
|
/// Play from current sequence to MIDI ports
|
|
midi_outputs: Vec<Port<MidiOut>>,
|
|
/// MIDI output buffer
|
|
midi_note: Vec<u8>,
|
|
/// MIDI output buffer
|
|
midi_chunk: Vec<Vec<Vec<u8>>>,
|
|
/// Notes currently held at input
|
|
notes_in: Arc<RwLock<[bool; 128]>>,
|
|
/// Notes currently held at output
|
|
notes_out: Arc<RwLock<[bool; 128]>>,
|
|
}
|
|
|
|
/// Sections in the sequencer app that may be focused
|
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
|
pub enum SequencerFocus {
|
|
/// The menu bar is focused
|
|
Menu,
|
|
/// The transport (toolbar) is focused
|
|
Transport,
|
|
/// The phrase list (pool) is focused
|
|
PhrasePool,
|
|
/// The phrase editor (sequencer) is focused
|
|
PhraseEditor,
|
|
}
|
|
|
|
impl Audio for SequencerTui {
|
|
fn process (&mut self, client: &Client, scope: &ProcessScope) -> Control {
|
|
self.model.process(client, scope)
|
|
}
|
|
}
|
|
|
|
impl HasPhrases for SequencerTui {
|
|
fn phrases (&self) -> &Vec<Arc<RwLock<Phrase>>> {
|
|
&self.phrases
|
|
}
|
|
fn phrases_mut (&mut self) -> &mut Vec<Arc<RwLock<Phrase>>> {
|
|
&mut self.phrases
|
|
}
|
|
}
|
|
|
|
impl HasPhrase for SequencerTui {
|
|
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!()
|
|
}
|
|
}
|