mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
wip: p.58, e=57
This commit is contained in:
parent
0c94c2af8f
commit
e95230a340
5 changed files with 173 additions and 174 deletions
|
|
@ -2,26 +2,10 @@ use crate::*;
|
|||
|
||||
pub struct TransportView<'a, T: TransportViewState>(pub &'a T);
|
||||
|
||||
pub trait TransportViewState: Send + Sync {
|
||||
pub trait TransportViewState: ClockApi + PlayheadApi + Send + Sync {
|
||||
fn transport_selected (&self) -> TransportFocus;
|
||||
fn transport_focused (&self) -> bool;
|
||||
fn transport_state (&self) -> Option<TransportState>;
|
||||
fn bpm_value (&self) -> f64;
|
||||
fn sync_value (&self) -> f64;
|
||||
fn format_beat (&self) -> String;
|
||||
fn format_msu (&self) -> String;
|
||||
}
|
||||
|
||||
impl TransportViewState for TransportTui {
|
||||
fn transport_selected (&self) -> TransportFocus {
|
||||
self.focus
|
||||
}
|
||||
fn transport_focused (&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn transport_state (&self) -> Option<TransportState> {
|
||||
*self.playing().read().unwrap()
|
||||
}
|
||||
fn bpm_value (&self) -> f64 {
|
||||
self.bpm().get()
|
||||
}
|
||||
|
|
@ -36,6 +20,18 @@ impl TransportViewState for TransportTui {
|
|||
}
|
||||
}
|
||||
|
||||
impl TransportViewState for TransportTui {
|
||||
fn transport_selected (&self) -> TransportFocus {
|
||||
self.focus
|
||||
}
|
||||
fn transport_focused (&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn transport_state (&self) -> Option<TransportState> {
|
||||
*self.playing().read().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
impl TransportViewState for SequencerTui {
|
||||
fn transport_selected (&self) -> TransportFocus {
|
||||
self.focus
|
||||
|
|
@ -46,18 +42,6 @@ impl TransportViewState for SequencerTui {
|
|||
fn transport_state (&self) -> Option<TransportState> {
|
||||
*self.playing().read().unwrap()
|
||||
}
|
||||
fn bpm_value (&self) -> f64 {
|
||||
self.bpm().get()
|
||||
}
|
||||
fn sync_value (&self) -> f64 {
|
||||
self.sync().get()
|
||||
}
|
||||
fn format_beat (&self) -> String {
|
||||
self.current().format_beat()
|
||||
}
|
||||
fn format_msu (&self) -> String {
|
||||
self.current().usec.format_msu()
|
||||
}
|
||||
}
|
||||
|
||||
impl TransportViewState for ArrangerTui {
|
||||
|
|
@ -70,18 +54,6 @@ impl TransportViewState for ArrangerTui {
|
|||
fn transport_state (&self) -> Option<TransportState> {
|
||||
*self.playing().read().unwrap()
|
||||
}
|
||||
fn bpm_value (&self) -> f64 {
|
||||
self.bpm().get()
|
||||
}
|
||||
fn sync_value (&self) -> f64 {
|
||||
self.sync().get()
|
||||
}
|
||||
fn format_beat (&self) -> String {
|
||||
self.current().format_beat()
|
||||
}
|
||||
fn format_msu (&self) -> String {
|
||||
self.current().usec.format_msu()
|
||||
}
|
||||
}
|
||||
|
||||
pub trait ArrangerViewState {
|
||||
|
|
@ -161,31 +133,34 @@ impl PhrasesViewState for ArrangerTui {
|
|||
pub struct PhraseView<'a, T: PhraseViewState>(pub &'a T);
|
||||
|
||||
pub trait PhraseViewState: Send + Sync {
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>>;
|
||||
fn phrase_focused (&self) -> bool;
|
||||
fn phrase_editor_size (&self) -> &Measure<Tui>;
|
||||
fn entered (&self) -> bool;
|
||||
fn keys (&self) -> &Buffer;
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>>;
|
||||
fn buffer (&self) -> &BigBuffer;
|
||||
fn note_len (&self) -> usize;
|
||||
fn note_axis (&self) -> &RwLock<FixedAxis<usize>>;
|
||||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>>;
|
||||
fn size (&self) -> &Measure<Tui>;
|
||||
fn now (&self) -> &Arc<Pulse>;
|
||||
}
|
||||
|
||||
impl PhraseViewState for PhraseTui {
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
&self.phrase
|
||||
}
|
||||
fn phrase_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn phrase_editor_size (&self) -> &Measure<Tui> {
|
||||
todo!()
|
||||
}
|
||||
fn entered (&self) -> bool {
|
||||
self.entered
|
||||
}
|
||||
fn keys (&self) -> &Buffer {
|
||||
&self.keys
|
||||
}
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
&self.phrase
|
||||
}
|
||||
fn buffer (&self) -> &BigBuffer {
|
||||
&self.buffer
|
||||
}
|
||||
|
|
@ -198,27 +173,27 @@ impl PhraseViewState for PhraseTui {
|
|||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>> {
|
||||
&self.time_axis
|
||||
}
|
||||
fn size (&self) -> &Measure<Tui> {
|
||||
&self.size
|
||||
}
|
||||
fn now (&self) -> &Arc<Pulse> {
|
||||
&self.now
|
||||
}
|
||||
}
|
||||
|
||||
impl PhraseViewState for SequencerTui {
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
todo!()
|
||||
}
|
||||
fn phrase_focused (&self) -> bool {
|
||||
todo!()
|
||||
}
|
||||
fn phrase_editor_size (&self) -> &Measure<Tui> {
|
||||
todo!()
|
||||
}
|
||||
fn entered (&self) -> bool {
|
||||
todo!()
|
||||
}
|
||||
fn keys (&self) -> &Buffer {
|
||||
todo!()
|
||||
}
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
todo!()
|
||||
}
|
||||
fn buffer (&self) -> &BigBuffer {
|
||||
todo!()
|
||||
}
|
||||
|
|
@ -231,27 +206,27 @@ impl PhraseViewState for SequencerTui {
|
|||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>> {
|
||||
todo!()
|
||||
}
|
||||
fn size (&self) -> &Measure<Tui> {
|
||||
todo!()
|
||||
}
|
||||
fn now (&self) -> &Arc<Pulse> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PhraseViewState for ArrangerTui {
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
todo!()
|
||||
}
|
||||
fn phrase_focused (&self) -> bool {
|
||||
todo!()
|
||||
}
|
||||
fn phrase_editor_size (&self) -> &Measure<Tui> {
|
||||
todo!()
|
||||
}
|
||||
fn entered (&self) -> bool {
|
||||
todo!()
|
||||
}
|
||||
fn keys (&self) -> &Buffer {
|
||||
todo!()
|
||||
}
|
||||
fn phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
todo!()
|
||||
}
|
||||
fn buffer (&self) -> &BigBuffer {
|
||||
todo!()
|
||||
}
|
||||
|
|
@ -264,73 +239,11 @@ impl PhraseViewState for ArrangerTui {
|
|||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>> {
|
||||
todo!()
|
||||
}
|
||||
fn size (&self) -> &Measure<Tui> {
|
||||
todo!()
|
||||
}
|
||||
fn now (&self) -> &Arc<Pulse> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
/// Displays and edits phrase length.
|
||||
pub struct PhraseLength {
|
||||
/// Pulses per beat (quaver)
|
||||
pub ppq: usize,
|
||||
/// Beats per bar
|
||||
pub bpb: usize,
|
||||
/// Length of phrase in pulses
|
||||
pub pulses: usize,
|
||||
/// Selected subdivision
|
||||
pub focus: Option<PhraseLengthFocus>,
|
||||
}
|
||||
|
||||
impl PhraseLength {
|
||||
pub fn new (pulses: usize, focus: Option<PhraseLengthFocus>) -> Self {
|
||||
Self { ppq: PPQ, bpb: 4, pulses, focus }
|
||||
}
|
||||
pub fn bars (&self) -> usize {
|
||||
self.pulses / (self.bpb * self.ppq)
|
||||
}
|
||||
pub fn beats (&self) -> usize {
|
||||
(self.pulses % (self.bpb * self.ppq)) / self.ppq
|
||||
}
|
||||
pub fn ticks (&self) -> usize {
|
||||
self.pulses % self.ppq
|
||||
}
|
||||
pub fn bars_string (&self) -> String {
|
||||
format!("{}", self.bars())
|
||||
}
|
||||
pub fn beats_string (&self) -> String {
|
||||
format!("{}", self.beats())
|
||||
}
|
||||
pub fn ticks_string (&self) -> String {
|
||||
format!("{:>02}", self.ticks())
|
||||
}
|
||||
}
|
||||
|
||||
/// Display mode of arranger
|
||||
#[derive(Clone, PartialEq)]
|
||||
pub enum ArrangerMode {
|
||||
/// Tracks are rows
|
||||
Horizontal,
|
||||
/// Tracks are columns
|
||||
Vertical(usize),
|
||||
}
|
||||
|
||||
/// Arranger display mode can be cycled
|
||||
impl ArrangerMode {
|
||||
/// Cycle arranger display mode
|
||||
pub fn to_next (&mut self) {
|
||||
*self = match self {
|
||||
Self::Horizontal => Self::Vertical(1),
|
||||
Self::Vertical(1) => Self::Vertical(2),
|
||||
Self::Vertical(2) => Self::Vertical(2),
|
||||
Self::Vertical(0) => Self::Horizontal,
|
||||
Self::Vertical(_) => Self::Vertical(0),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn track_widths (tracks: &[ArrangerTrack]) -> Vec<(usize, usize)> {
|
||||
let mut widths = vec![];
|
||||
let mut total = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue