mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-08 20:56:43 +01:00
wip: p.44, e=135, removing E generic
This commit is contained in:
parent
a7998860b1
commit
260736f31d
20 changed files with 848 additions and 838 deletions
|
|
@ -1,111 +1,70 @@
|
|||
use crate::*;
|
||||
|
||||
impl TryFrom<&Arc<RwLock<JackClient>>> for ArrangerApp<Tui> {
|
||||
/// Root view for standalone `tek_arranger`
|
||||
pub struct ArrangerTui {
|
||||
pub jack: Arc<RwLock<JackClient>>,
|
||||
pub transport: jack::Transport,
|
||||
pub playing: RwLock<Option<TransportState>>,
|
||||
pub started: RwLock<Option<(usize, usize)>>,
|
||||
pub current: Instant,
|
||||
pub quant: Quantize,
|
||||
pub sync: LaunchSync,
|
||||
pub metronome: bool,
|
||||
pub phrases: Vec<Arc<RwLock<Phrase>>>,
|
||||
pub phrase: usize,
|
||||
pub tracks: Vec<ArrangerTrack>,
|
||||
pub scenes: Vec<ArrangerScene>,
|
||||
pub name: Arc<RwLock<String>>,
|
||||
pub splits: [u16;2],
|
||||
pub selected: ArrangerSelection,
|
||||
pub mode: ArrangerMode,
|
||||
pub color: ItemColor,
|
||||
pub entered: bool,
|
||||
pub size: Measure<Tui>,
|
||||
pub note_buf: Vec<u8>,
|
||||
pub midi_buf: Vec<Vec<Vec<u8>>>,
|
||||
pub cursor: (usize, usize),
|
||||
pub menu_bar: Option<MenuBar<Tui, Self, ArrangerCommand>>,
|
||||
pub status_bar: Option<S>,
|
||||
pub history: Vec<C>,
|
||||
}
|
||||
|
||||
impl TryFrom<&Arc<RwLock<JackClient>>> for ArrangerTui {
|
||||
type Error = Box<dyn std::error::Error>;
|
||||
fn try_from (jack: &Arc<RwLock<JackClient>>) -> Usually<Self> {
|
||||
Ok(Self::new(ArrangerView {
|
||||
name: Arc::new(RwLock::new(String::new())),
|
||||
phrases: vec![],
|
||||
phrase: 0,
|
||||
scenes: vec![],
|
||||
tracks: vec![],
|
||||
metronome: false,
|
||||
playing: None.into(),
|
||||
started: None.into(),
|
||||
transport: jack.read().unwrap().transport(),
|
||||
current: Instant::default(),
|
||||
jack: jack.clone(),
|
||||
selected: ArrangerSelection::Clip(0, 0),
|
||||
mode: ArrangerMode::Vertical(2),
|
||||
color: Color::Rgb(28, 35, 25).into(),
|
||||
size: Measure::new(),
|
||||
entered: false,
|
||||
quant: Default::default(),
|
||||
sync: Default::default(),
|
||||
splits: [20, 20],
|
||||
note_buf: vec![],
|
||||
midi_buf: vec![],
|
||||
}.into(), None, None))
|
||||
Ok(Self {
|
||||
name: Arc::new(RwLock::new(String::new())),
|
||||
phrases: vec![],
|
||||
phrase: 0,
|
||||
scenes: vec![],
|
||||
tracks: vec![],
|
||||
metronome: false,
|
||||
playing: None.into(),
|
||||
started: None.into(),
|
||||
transport: jack.read().unwrap().transport(),
|
||||
current: Instant::default(),
|
||||
jack: jack.clone(),
|
||||
selected: ArrangerSelection::Clip(0, 0),
|
||||
mode: ArrangerMode::Vertical(2),
|
||||
color: Color::Rgb(28, 35, 25).into(),
|
||||
size: Measure::new(),
|
||||
entered: false,
|
||||
quant: Default::default(),
|
||||
sync: Default::default(),
|
||||
splits: [20, 20],
|
||||
note_buf: vec![],
|
||||
midi_buf: vec![],
|
||||
cursor: (0, 0),
|
||||
entered: false,
|
||||
history: vec![],
|
||||
size: Measure::new(),
|
||||
menu_bar: None,
|
||||
status_bar: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub type ArrangerApp<E: Engine> = AppView<
|
||||
E,
|
||||
ArrangerView<E>,
|
||||
ArrangerAppCommand,
|
||||
ArrangerStatusBar
|
||||
>;
|
||||
|
||||
/// Root view for standalone `tek_arranger`
|
||||
pub struct ArrangerView<E: Engine> {
|
||||
pub(crate) jack: Arc<RwLock<JackClient>>,
|
||||
pub(crate) playing: RwLock<Option<TransportState>>,
|
||||
pub(crate) started: RwLock<Option<(usize, usize)>>,
|
||||
pub(crate) current: Instant,
|
||||
pub(crate) quant: Quantize,
|
||||
pub(crate) sync: LaunchSync,
|
||||
pub(crate) transport: jack::Transport,
|
||||
pub(crate) metronome: bool,
|
||||
pub(crate) phrases: Vec<Arc<RwLock<Phrase>>>,
|
||||
pub(crate) phrase: usize,
|
||||
pub(crate) tracks: Vec<ArrangerTrack>,
|
||||
pub(crate) scenes: Vec<ArrangerScene>,
|
||||
pub(crate) name: Arc<RwLock<String>>,
|
||||
pub(crate) splits: [u16;2],
|
||||
pub(crate) selected: ArrangerSelection,
|
||||
pub(crate) mode: ArrangerMode,
|
||||
pub(crate) color: ItemColor,
|
||||
pub(crate) entered: bool,
|
||||
pub(crate) size: Measure<E>,
|
||||
pub(crate) note_buf: Vec<u8>,
|
||||
pub(crate) midi_buf: Vec<Vec<Vec<u8>>>,
|
||||
}
|
||||
|
||||
impl HasJack for ArrangerView<Tui> {
|
||||
fn jack (&self) -> &Arc<RwLock<JackClient>> {
|
||||
&self.transport.jack()
|
||||
}
|
||||
}
|
||||
|
||||
impl Audio for ArrangerApp<Tui> {
|
||||
fn process (&mut self, client: &Client, scope: &ProcessScope) -> Control {
|
||||
TracksAudio(
|
||||
&mut self.app.tracks,
|
||||
&mut self.app.note_buf,
|
||||
&mut self.app.midi_buf,
|
||||
Default::default(),
|
||||
).process(client, scope)
|
||||
}
|
||||
}
|
||||
|
||||
impl ClockApi for ArrangerView<Tui> {
|
||||
fn timebase (&self) -> &Arc<Timebase> {
|
||||
&self.current.timebase
|
||||
}
|
||||
fn quant (&self) -> &Quantize {
|
||||
&self.quant
|
||||
}
|
||||
fn sync (&self) -> &LaunchSync {
|
||||
&self.sync
|
||||
}
|
||||
}
|
||||
|
||||
impl PlayheadApi for ArrangerView<Tui> {
|
||||
fn current (&self) -> &Instant {
|
||||
&self.current
|
||||
}
|
||||
fn transport (&self) -> &jack::Transport {
|
||||
&self.transport
|
||||
}
|
||||
fn playing (&self) -> &RwLock<Option<TransportState>> {
|
||||
&self.playing
|
||||
}
|
||||
fn started (&self) -> &RwLock<Option<(usize, usize)>> {
|
||||
&self.started
|
||||
}
|
||||
}
|
||||
|
||||
impl HasPhrases for ArrangerView<Tui> {
|
||||
impl HasPhrases for ArrangerTui {
|
||||
fn phrases (&self) -> &Vec<Arc<RwLock<Phrase>>> {
|
||||
&self.phrases
|
||||
}
|
||||
|
|
@ -115,7 +74,7 @@ impl HasPhrases for ArrangerView<Tui> {
|
|||
}
|
||||
|
||||
/// General methods for arranger
|
||||
impl ArrangerView<Tui> {
|
||||
impl ArrangerTui {
|
||||
pub fn selected_scene (&self) -> Option<&ArrangerScene> {
|
||||
self.selected.scene().map(|s|self.scenes().get(s)).flatten()
|
||||
}
|
||||
|
|
@ -196,33 +155,14 @@ impl ArrangerView<Tui> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<E: Engine> Audio for ArrangerView<E> {
|
||||
#[inline] fn process (&mut self, client: &Client, scope: &ProcessScope) -> Control {
|
||||
if self.process(client, scope) == Control::Quit {
|
||||
return Control::Quit
|
||||
}
|
||||
// FIXME: one of these per playing track
|
||||
if let ArrangerSelection::Clip(t, s) = self.selected {
|
||||
let phrase = self.scenes().get(s).map(|scene|scene.clips.get(t));
|
||||
if let Some(Some(Some(phrase))) = phrase {
|
||||
if let Some(track) = self.tracks().get(t) {
|
||||
if let Some((ref started_at, Some(ref playing))) = track.player.phrase {
|
||||
let phrase = phrase.read().unwrap();
|
||||
if *playing.read().unwrap() == *phrase {
|
||||
let pulse = self.current().pulse.get();
|
||||
let start = started_at.pulse.get();
|
||||
let now = (pulse - start) % phrase.length as f64;
|
||||
self.editor.now.set(now);
|
||||
return Control::Continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.editor.now.set(0.);
|
||||
return Control::Continue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//pub fn track_next (&mut self, last_track: usize) {
|
||||
//use ArrangerSelection::*;
|
||||
//*self = match self {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue