pass around TransportTime

This commit is contained in:
🪞👃🪞 2024-10-26 17:31:44 +03:00
parent 85e243f782
commit 67a5ea3a2b
6 changed files with 41 additions and 25 deletions

View file

@ -6,6 +6,8 @@ pub struct Arranger<E: Engine> {
pub focus_cursor: (usize, usize), pub focus_cursor: (usize, usize),
/// Controls the JACK transport. /// Controls the JACK transport.
pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>, pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>,
/// Global timebase
pub clock: Arc<TransportTime>,
/// Contains all the sequencers. /// Contains all the sequencers.
pub arrangement: Arrangement<E>, pub arrangement: Arrangement<E>,
/// Pool of all phrases in the arrangement /// Pool of all phrases in the arrangement
@ -117,14 +119,19 @@ impl<E: Engine> Arranger<E> {
phrases: Arc<RwLock<PhrasePool<E>>>, phrases: Arc<RwLock<PhrasePool<E>>>,
) -> Self { ) -> Self {
let mut app = Self { let mut app = Self {
focus_cursor: (0, 1), focus_cursor: (0, 1),
editor: PhraseEditor::new(), phrases_split: 20,
status: ArrangerStatusBar::ArrangementClip, arrangement_split: 20,
editor: PhraseEditor::new(),
status: ArrangerStatusBar::ArrangementClip,
clock: if let Some(ref transport) = transport {
transport.read().unwrap().clock.clone()
} else {
Arc::new(TransportTime::default())
},
transport, transport,
arrangement, arrangement,
phrases, phrases,
phrases_split: 20,
arrangement_split: 20,
}; };
app.update_focus(); app.update_focus();
app app

View file

@ -21,7 +21,7 @@ impl ArrangerCli {
fn run (&self) -> Usually<()> { fn run (&self) -> Usually<()> {
let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0; let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0;
let jack = JackClient::Inactive(jack); let jack = JackClient::Inactive(jack);
let transport = Arc::new(RwLock::new(TransportToolbar::new(Some(jack.transport())))); let transport = Arc::new(RwLock::new(TransportToolbar::new(None, Some(jack.transport()))));
let phrases = Arc::new(RwLock::new(PhrasePool::new())); let phrases = Arc::new(RwLock::new(PhrasePool::new()));
let mut arrangement = Arrangement::new("", &phrases); let mut arrangement = Arrangement::new("", &phrases);
if let Some(name) = self.name.as_ref() { if let Some(name) = self.name.as_ref() {

View file

@ -11,6 +11,8 @@ pub struct Sequencer<E: Engine> {
pub focus_cursor: (usize, usize), pub focus_cursor: (usize, usize),
/// Controls the JACK transport. /// Controls the JACK transport.
pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>, pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>,
/// Global timebase
pub clock: Arc<TransportTime>,
/// Pool of all phrases available to the sequencer /// Pool of all phrases available to the sequencer
pub phrases: Arc<RwLock<PhrasePool<E>>>, pub phrases: Arc<RwLock<PhrasePool<E>>>,
/// Phrase editor view /// Phrase editor view

View file

@ -20,7 +20,7 @@ impl SequencerCli {
fn run (&self) -> Usually<()> { fn run (&self) -> Usually<()> {
let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0; let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0;
let jack = JackClient::Inactive(jack); let jack = JackClient::Inactive(jack);
let transport = Arc::new(RwLock::new(TransportToolbar::new(Some(jack.transport())))); let transport = Arc::new(RwLock::new(TransportToolbar::new(None, Some(jack.transport()))));
transport.write().unwrap().jack = Some( transport.write().unwrap().jack = Some(
jack.activate( jack.activate(
&transport.clone(), &transport.clone(),
@ -29,12 +29,12 @@ impl SequencerCli {
} }
)? )?
); );
let seq = Sequencer { let focus_cursor = (1, 1);
focus_cursor: (1, 1), let clock = transport.read().unwrap().clock.clone();
transport: self.transport.then_some(transport), let transport = self.transport.then_some(transport);
editor: PhraseEditor::new(), let editor = PhraseEditor::new();
phrases: Arc::new(RwLock::new(PhrasePool::new())), let phrases = Arc::new(RwLock::new(PhrasePool::new()));
}; let seq = Sequencer { focus_cursor, clock, transport, editor, phrases };
if let Some(_) = self.name.as_ref() { if let Some(_) = self.name.as_ref() {
// TODO: seq.name = Arc::new(RwLock::new(name.clone())); // TODO: seq.name = Arc::new(RwLock::new(name.clone()));
} }

View file

@ -1,5 +1,5 @@
use crate::*; use crate::*;
#[derive(Debug)] #[derive(Debug, Default)]
pub struct TransportTime { pub struct TransportTime {
/// Current sample sr, tempo, and PPQ. /// Current sample sr, tempo, and PPQ.
pub timebase: Timebase, pub timebase: Timebase,
@ -72,7 +72,10 @@ impl LaunchSync<usize> for TransportTime {
#[inline] fn set_sync (&self, sync: usize) { self.sync.store(sync, Ordering::Relaxed); } #[inline] fn set_sync (&self, sync: usize) { self.sync.store(sync, Ordering::Relaxed); }
} }
impl<E: Engine> TransportToolbar<E> { impl<E: Engine> TransportToolbar<E> {
pub fn new (transport: Option<Transport>) -> Self { pub fn new (
clock: Option<&Arc<TransportTime>>,
transport: Option<Transport>,
) -> Self {
let timebase = Timebase::default(); let timebase = Timebase::default();
Self { Self {
_engine: Default::default(), _engine: Default::default(),
@ -82,15 +85,19 @@ impl<E: Engine> TransportToolbar<E> {
started: None, started: None,
jack: None, jack: None,
transport, transport,
clock: Arc::new(TransportTime { clock: if let Some(clock) = clock {
playing: Some(TransportState::Stopped).into(), clock.clone()
quant: 24.into(), } else {
sync: (timebase.ppq() as usize * 4).into(), Arc::new(TransportTime {
frame: 0.into(), playing: Some(TransportState::Stopped).into(),
pulse: 0.into(), quant: 24.into(),
usecs: 0.into(), sync: (timebase.ppq() as usize * 4).into(),
timebase, frame: 0.into(),
}) pulse: 0.into(),
usecs: 0.into(),
timebase,
})
}
} }
} }
pub fn bpm (&self) -> usize { self.clock.bpm() as usize } pub fn bpm (&self) -> usize { self.clock.bpm() as usize }

View file

@ -4,7 +4,7 @@ pub fn main () -> Usually<()> {
let jack = JackClient::Inactive( let jack = JackClient::Inactive(
Client::new("tek_transport", ClientOptions::NO_START_SERVER)?.0 Client::new("tek_transport", ClientOptions::NO_START_SERVER)?.0
); );
let mut transport = TransportToolbar::new(Some(jack.transport())); let mut transport = TransportToolbar::new(None, Some(jack.transport()));
transport.focused = true; transport.focused = true;
let transport = Arc::new(RwLock::new(transport)); let transport = Arc::new(RwLock::new(transport));
transport.write().unwrap().jack = Some( transport.write().unwrap().jack = Some(