mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
new minimal transport bar
This commit is contained in:
parent
d4c96f4b41
commit
7f57465b3a
5 changed files with 141 additions and 376 deletions
116
src/groovebox.rs
116
src/groovebox.rs
|
|
@ -28,34 +28,20 @@ impl Groovebox {
|
|||
audio_from: &[&[impl AsRef<str>];2],
|
||||
audio_to: &[&[impl AsRef<str>];2],
|
||||
) -> Usually<Self> {
|
||||
let sampler = crate::sampler::Sampler::new(
|
||||
jack, &"sampler", midi_from, audio_from, audio_to
|
||||
)?;
|
||||
let mut player = crate::midi::MidiPlayer::new(
|
||||
jack, &"sequencer", &midi_from, &midi_to
|
||||
)?;
|
||||
let sampler = crate::sampler::Sampler::new(jack, &"sampler", midi_from, audio_from, audio_to)?;
|
||||
let mut player = crate::midi::MidiPlayer::new(jack, &"sequencer", &midi_from, &midi_to)?;
|
||||
jack.read().unwrap().client().connect_ports(&player.midi_outs[0], &sampler.midi_in)?;
|
||||
//jack.connect_midi_from(&player.midi_ins[0], &midi_from)?;
|
||||
//jack.connect_midi_from(&sampler.midi_in, &midi_from)?;
|
||||
//jack.connect_midi_to(&player.midi_outs[0], &midi_to)?;
|
||||
//jack.connect_audio_from(&sampler.audio_ins[0], &audio_from[0])?;
|
||||
//jack.connect_audio_from(&sampler.audio_ins[1], &audio_from[1])?;
|
||||
//jack.connect_audio_to(&sampler.audio_outs[0], &audio_to[0])?;
|
||||
//jack.connect_audio_to(&sampler.audio_outs[1], &audio_to[1])?;
|
||||
|
||||
let phrase = Arc::new(RwLock::new(MidiClip::new(
|
||||
"New", true, 4 * player.clock.timebase.ppq.get() as usize,
|
||||
None, Some(ItemColor::random().into())
|
||||
)));
|
||||
player.play_phrase = Some((Moment::zero(&player.clock.timebase), Some(phrase.clone())));
|
||||
let pool = crate::pool::PoolModel::from(&phrase);
|
||||
let editor = crate::midi::MidiEditor::from(&phrase);
|
||||
Ok(Self {
|
||||
_jack: jack.clone(),
|
||||
player,
|
||||
pool,
|
||||
editor,
|
||||
sampler,
|
||||
_jack: jack.clone(),
|
||||
pool: crate::pool::PoolModel::from(&phrase),
|
||||
editor: crate::midi::MidiEditor::from(&phrase),
|
||||
size: Measure::new(),
|
||||
midi_buf: vec![vec![];65536],
|
||||
note_buf: vec![],
|
||||
|
|
@ -78,6 +64,7 @@ audio!(|self: Groovebox, client, scope|{
|
|||
if Control::Quit == SamplerAudio(&mut self.sampler).process(client, scope) {
|
||||
return Control::Quit
|
||||
}
|
||||
// TODO move this to sampler:
|
||||
for RawMidi { time, bytes } in self.player.midi_ins[0].iter(scope) {
|
||||
if let LiveEvent::Midi { message, .. } = LiveEvent::parse(bytes).unwrap() {
|
||||
match message {
|
||||
|
|
@ -120,52 +107,51 @@ render!(Tui: (self: Groovebox) => {
|
|||
let color = self.player.play_phrase().as_ref()
|
||||
.and_then(|(_,p)|p.as_ref().map(|p|p.read().unwrap().color))
|
||||
.clone();
|
||||
let transport = Fixed::y(3, Bsp::e(
|
||||
PlayPause(self.clock().is_rolling()),
|
||||
TransportView::new(self, color, true),
|
||||
));
|
||||
let selector = Fixed::y(1, Bsp::e(
|
||||
PhraseSelector::play_phrase(&self.player),
|
||||
PhraseSelector::next_phrase(&self.player),
|
||||
));
|
||||
let sampler = Tui::bg(TuiTheme::g(32), Align::w(Fixed::x(sampler_w, Fill::xy(col!(
|
||||
Meters(self.sampler.input_meter.as_ref()),
|
||||
GrooveboxSamples(self)
|
||||
)))));
|
||||
let status = EditStatus(&self.sampler, &self.editor, note_pt, ());
|
||||
let pool = PoolView(&self.pool);
|
||||
let with_pool = move|x|Bsp::w(Align::e(Fill::y(Fixed::x(pool_w, pool))), x);
|
||||
Fill::xy(Bsp::a(&self.size,
|
||||
Bsp::s(transport,
|
||||
Bsp::n(status,
|
||||
Bsp::n(selector,
|
||||
with_pool(Fill::xy(sampler)))))))});
|
||||
|
||||
struct EditStatus<'a, T: Content<Tui>>(&'a Sampler, &'a MidiEditor, usize, T);
|
||||
impl<'a, T: Content<Tui>> Content<Tui> for EditStatus<'a, T> {
|
||||
fn content (&self) -> impl Content<Tui> {
|
||||
Bsp::n(Fixed::y(9, col!(
|
||||
row!(
|
||||
self.0.mapped[self.2].as_ref().map(|sample|format!(
|
||||
"Sample {}-{}",
|
||||
sample.read().unwrap().start,
|
||||
sample.read().unwrap().end,
|
||||
)),
|
||||
MidiEditStatus(&self.1),
|
||||
),
|
||||
lay!(
|
||||
Outer(Style::default().fg(TuiTheme::g(128))),
|
||||
Fill::x(Fixed::y(8, if let Some((_, sample)) = &self.0.recording {
|
||||
SampleViewer(Some(sample.clone()))
|
||||
} else if let Some(sample) = &self.0.mapped[self.2] {
|
||||
SampleViewer(Some(sample.clone()))
|
||||
} else {
|
||||
SampleViewer(None)
|
||||
})),
|
||||
),
|
||||
)), &self.3)
|
||||
}
|
||||
}
|
||||
Fill::xy(Bsp::b(
|
||||
&self.size,
|
||||
Bsp::s(
|
||||
Fill::x(Fixed::y(3, Align::x(TransportView(&self.player.clock)))),
|
||||
Bsp::s(
|
||||
Fill::x(Fixed::y(1, Align::x(Bsp::e(
|
||||
PhraseSelector::play_phrase(&self.player),
|
||||
PhraseSelector::next_phrase(&self.player),
|
||||
)))),
|
||||
Bsp::n(
|
||||
Fixed::y(9, col!(
|
||||
Bsp::e(
|
||||
self.sampler.mapped[note_pt].as_ref().map(|sample|format!(
|
||||
"Sample {}-{}",
|
||||
sample.read().unwrap().start,
|
||||
sample.read().unwrap().end,
|
||||
)),
|
||||
MidiEditStatus(&self.editor),
|
||||
),
|
||||
Bsp::a(
|
||||
Outer(Style::default().fg(TuiTheme::g(128))),
|
||||
Fill::x(Fixed::y(8, if let Some((_, sample)) = &self.sampler.recording {
|
||||
SampleViewer(Some(sample.clone()))
|
||||
} else if let Some(sample) = &self.sampler.mapped[note_pt] {
|
||||
SampleViewer(Some(sample.clone()))
|
||||
} else {
|
||||
SampleViewer(None)
|
||||
})),
|
||||
),
|
||||
)),
|
||||
Bsp::w(
|
||||
Align::e(Fill::y(Fixed::x(pool_w, PoolView(&self.pool)))),
|
||||
Fill::xy(Bsp::e(
|
||||
Align::w(Fixed::x(sampler_w, Tui::bg(TuiTheme::g(32), Fill::xy(col!(
|
||||
Meters(self.sampler.input_meter.as_ref()),
|
||||
GrooveboxSamples(self)
|
||||
))))),
|
||||
Fill::xy(Align::c("kyp"))
|
||||
))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)});
|
||||
|
||||
struct GrooveboxSamples<'a>(&'a Groovebox);
|
||||
render!(Tui: (self: GrooveboxSamples<'a>) => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue