rytm_rs/object/kit/
reverb.rs

1use crate::error::{ConversionError, ParameterError, RytmError};
2use rytm_rs_macro::parameter_range;
3use rytm_sys::ar_kit_t;
4use serde::{Deserialize, Serialize};
5
6/// Reverb parameters for the kit.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
8pub struct FxReverb {
9    pre_delay: u8,
10    decay: u8,
11    freq: u8,
12    gain: u8,
13    hpf: u8,
14    lpf: u8,
15    volume: u8,
16}
17
18impl Default for FxReverb {
19    fn default() -> Self {
20        Self {
21            pre_delay: 8,
22            decay: 40,
23            freq: 64,
24            gain: 32,
25            hpf: 32,
26            lpf: 96,
27            volume: 110,
28        }
29    }
30}
31
32impl TryFrom<&ar_kit_t> for FxReverb {
33    type Error = ConversionError;
34    fn try_from(raw_kit: &ar_kit_t) -> Result<Self, Self::Error> {
35        Ok(Self {
36            pre_delay: raw_kit.fx_reverb_pre,
37            decay: raw_kit.fx_reverb_decay,
38            freq: raw_kit.fx_reverb_freq,
39            gain: raw_kit.fx_reverb_gain,
40            hpf: raw_kit.fx_reverb_hpf,
41            lpf: raw_kit.fx_reverb_lpf,
42            volume: raw_kit.fx_reverb_volume,
43        })
44    }
45}
46
47impl FxReverb {
48    pub(crate) fn apply_to_raw_kit(self, raw_kit: &mut ar_kit_t) {
49        raw_kit.fx_reverb_pre = self.pre_delay;
50        raw_kit.fx_reverb_decay = self.decay;
51        raw_kit.fx_reverb_freq = self.freq;
52        raw_kit.fx_reverb_gain = self.gain;
53        raw_kit.fx_reverb_hpf = self.hpf;
54        raw_kit.fx_reverb_lpf = self.lpf;
55        raw_kit.fx_reverb_volume = self.volume;
56    }
57
58    /// Sets the pre delay of the reverb.
59    ///
60    /// Range: `0..=127`
61    #[parameter_range(range = "pre_delay:0..=127")]
62    pub fn set_pre_delay(&mut self, pre_delay: usize) -> Result<(), RytmError> {
63        self.pre_delay = pre_delay as u8;
64        Ok(())
65    }
66
67    /// Sets the decay of the reverb.
68    ///
69    /// Range: `0..=127`
70    ///
71    /// `127` is infinite decay.
72    #[parameter_range(range = "decay:0..=127")]
73    pub fn set_decay(&mut self, decay: usize) -> Result<(), RytmError> {
74        self.decay = decay as u8;
75        Ok(())
76    }
77
78    /// Sets the frequency of the reverb.
79    ///
80    /// Range: `0..=127`
81    #[parameter_range(range = "freq:0..=127")]
82    pub fn set_freq(&mut self, freq: usize) -> Result<(), RytmError> {
83        self.freq = freq as u8;
84        Ok(())
85    }
86
87    /// Sets the gain of the reverb.
88    ///
89    /// Range: `0..=127`
90    #[parameter_range(range = "gain:0..=127")]
91    pub fn set_gain(&mut self, gain: usize) -> Result<(), RytmError> {
92        self.gain = gain as u8;
93        Ok(())
94    }
95
96    /// Sets the high-pass filter of the reverb.
97    ///
98    /// Range: `0..=127`
99    #[parameter_range(range = "hpf:0..=127")]
100    pub fn set_hpf(&mut self, hpf: usize) -> Result<(), RytmError> {
101        self.hpf = hpf as u8;
102        Ok(())
103    }
104
105    /// Sets the low-pass filter of the reverb.
106    ///
107    /// Range: `0..=127`
108    #[parameter_range(range = "lpf:0..=127")]
109    pub fn set_lpf(&mut self, lpf: usize) -> Result<(), RytmError> {
110        self.lpf = lpf as u8;
111        Ok(())
112    }
113    /// Sets the volume of the reverb.
114    ///
115    /// Range: `0..=127`
116    #[parameter_range(range = "volume:0..=127")]
117    pub fn set_volume(&mut self, volume: usize) -> Result<(), RytmError> {
118        self.volume = volume as u8;
119        Ok(())
120    }
121
122    /// Returns the pre delay of the reverb.
123    ///
124    /// Range: `0..=127`
125    pub const fn pre_delay(&self) -> usize {
126        self.pre_delay as usize
127    }
128
129    /// Returns the decay of the reverb.
130    ///
131    /// Range: `0..=127`
132    pub const fn decay(&self) -> usize {
133        self.decay as usize
134    }
135
136    /// Returns the frequency of the reverb.
137    ///
138    /// Range: `0..=127`
139    pub const fn freq(&self) -> usize {
140        self.freq as usize
141    }
142
143    /// Returns the gain of the reverb.
144    ///
145    /// Range: `0..=127`
146    pub const fn gain(&self) -> usize {
147        self.gain as usize
148    }
149
150    /// Returns the high-pass filter of the reverb.
151    ///
152    /// Range: `0..=127`
153    pub const fn hpf(&self) -> usize {
154        self.hpf as usize
155    }
156
157    /// Returns the low-pass filter of the reverb.
158    ///
159    /// Range: `0..=127`
160    pub const fn lpf(&self) -> usize {
161        self.lpf as usize
162    }
163
164    /// Returns the volume of the reverb.
165    ///
166    /// Range: `0..=127`
167    pub const fn volume(&self) -> usize {
168        self.volume as usize
169    }
170}