diff --git a/sampler/src/has_sampler.rs b/sampler/src/has_sampler.rs new file mode 100644 index 00000000..1f2cc58c --- /dev/null +++ b/sampler/src/has_sampler.rs @@ -0,0 +1,30 @@ +use crate::*; +pub trait HasSampler { + fn sampler (&self) -> &Option<Sampler>; + fn sampler_mut (&mut self) -> &mut Option<Sampler>; + fn sample_index (&self) -> usize; + fn view_sample <'a> (&'a self, compact: bool) -> impl Content<TuiOut> + 'a { + self.sampler().as_ref().map(|sampler|Max::y( + if compact { 0u16 } else { 5 }.into(), + Fill::x(sampler.viewer(self.sample_index())) + )) + } + fn view_sampler <'a> (&'a self, compact: bool, editor: &Option<MidiEditor>) -> impl Content<TuiOut> + 'a { + self.sampler().as_ref().map(|sampler|Fixed::x( + if compact { 4u16 } else { 40 }.into(), + Push::y( + if compact { 1u16 } else { 0 }.into(), + editor.as_ref().map(|e|Fill::y(sampler.list(compact, e))) + ) + )) + } +} +#[macro_export] macro_rules! has_sampler { + (|$self:ident:$Struct:ty| { sampler = $e0:expr; index = $e1:expr; }) => { + impl HasSampler for $Struct { + fn sampler (&$self) -> &Option<Sampler> { &$e0 } + fn sampler_mut (&mut $self) -> &mut Option<Sampler> { &mut $e0 } + fn sample_index (&$self) -> usize { $e1 } + } + } +} diff --git a/sampler/src/lib.rs b/sampler/src/lib.rs index 797a2d08..8f7fba28 100644 --- a/sampler/src/lib.rs +++ b/sampler/src/lib.rs @@ -25,3 +25,5 @@ pub(crate) use ratatui::{prelude::Rect, widgets::{Widget, canvas::{Canvas, Line} // TODO! let sample = Sample::new("test", 0, 0, vec![]); } + +mod has_sampler; pub use self::has_sampler::*; diff --git a/sampler/src/sampler.rs b/sampler/src/sampler.rs index b90de3f5..b3280a6a 100644 --- a/sampler/src/sampler.rs +++ b/sampler/src/sampler.rs @@ -1,33 +1,4 @@ use crate::*; -pub trait HasSampler { - fn sampler (&self) -> &Option<Sampler>; - fn sampler_mut (&mut self) -> &mut Option<Sampler>; - fn sample_index (&self) -> usize; - fn view_sample <'a> (&'a self, compact: bool) -> impl Content<TuiOut> + 'a { - self.sampler().as_ref().map(|sampler|Max::y( - if compact { 0u16 } else { 5 }.into(), - Fill::x(sampler.viewer(self.sample_index())) - )) - } - fn view_sampler <'a> (&'a self, compact: bool, editor: &Option<MidiEditor>) -> impl Content<TuiOut> + 'a { - self.sampler().as_ref().map(|sampler|Fixed::x( - if compact { 4u16 } else { 40 }.into(), - Push::y( - if compact { 1u16 } else { 0 }.into(), - editor.as_ref().map(|e|Fill::y(sampler.list(compact, e))) - ) - )) - } -} -#[macro_export] macro_rules! has_sampler { - (|$self:ident:$Struct:ty| { sampler = $e0:expr; index = $e1:expr; }) => { - impl HasSampler for $Struct { - fn sampler (&$self) -> &Option<Sampler> { &$e0 } - fn sampler_mut (&mut $self) -> &mut Option<Sampler> { &mut $e0 } - fn sample_index (&$self) -> usize { $e1 } - } - } -} /// The sampler device plays sounds in response to MIDI notes. #[derive(Debug)] pub struct Sampler { pub jack: Jack, @@ -837,7 +808,8 @@ impl Sampler { let offset = |a|Push::y(i as u16, Align::n(Fixed::y(1, Fill::x(a)))); let mut bg = if note == note_pt { Tui::g(64) } else { Color::Reset }; let mut fg = Tui::g(160); - if self.mapped[note].is_some() { + let mapped: &Option<Arc<RwLock<Sample>>> = &self.mapped[note]; + if mapped.is_some() { fg = Tui::g(224); bg = Color::Rgb(0, if note == note_pt { 96 } else { 64 }, 0); }