rytm_rs/object/kit/
delay.rs

1use super::types::FxDelayTimeOnTheGrid;
2use crate::{
3    error::{ConversionError, ParameterError, RytmError},
4    util::{i8_to_u8_midpoint_of_u8_input_range, u8_to_i8_midpoint_of_u8_input_range},
5};
6use rytm_rs_macro::parameter_range;
7use rytm_sys::ar_kit_t;
8use serde::{Deserialize, Serialize};
9
10/// Delay parameters for the kit.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
12pub struct FxDelay {
13    time: u8,
14    ping_pong: bool,
15    stereo_width: i8,
16    feedback: u8,
17    hpf: u8,
18    lpf: u8,
19    reverb_send: u8,
20    volume: u8,
21}
22
23impl Default for FxDelay {
24    fn default() -> Self {
25        Self {
26            time: 23,
27            ping_pong: false,
28            stereo_width: 0,
29            feedback: 49,
30            hpf: 32,
31            lpf: 96,
32            reverb_send: 0,
33            volume: 110,
34        }
35    }
36}
37
38impl TryFrom<&ar_kit_t> for FxDelay {
39    type Error = ConversionError;
40    fn try_from(raw_kit: &ar_kit_t) -> Result<Self, Self::Error> {
41        // map 0..=127 to 0..=198
42        let feedback = (raw_kit.fx_delay_feedback as f32 / 127.0 * 198.0) as u8;
43
44        Ok(Self {
45            time: raw_kit.fx_delay_time,
46            ping_pong: raw_kit.fx_delay_pingpong != 0,
47            stereo_width: u8_to_i8_midpoint_of_u8_input_range(
48                raw_kit.fx_delay_stereo_width,
49                0,
50                127,
51            ),
52            feedback,
53            hpf: raw_kit.fx_delay_hpf,
54            lpf: raw_kit.fx_delay_lpf,
55            reverb_send: raw_kit.fx_delay_reverb_send,
56            volume: raw_kit.fx_delay_volume,
57        })
58    }
59}
60
61impl FxDelay {
62    pub(crate) fn apply_to_raw_kit(self, raw_kit: &mut ar_kit_t) {
63        // map 0..=198 to 0..=127
64        let feedback = (self.feedback as f32 / 198.0 * 127.0) as u8;
65
66        raw_kit.fx_delay_time = self.time;
67        raw_kit.fx_delay_pingpong = self.ping_pong as u8;
68        raw_kit.fx_delay_stereo_width =
69            i8_to_u8_midpoint_of_u8_input_range(self.stereo_width, 0, 127);
70        raw_kit.fx_delay_feedback = feedback;
71        raw_kit.fx_delay_hpf = self.hpf;
72        raw_kit.fx_delay_lpf = self.lpf;
73        raw_kit.fx_delay_reverb_send = self.reverb_send;
74        raw_kit.fx_delay_volume = self.volume;
75    }
76
77    /// Sets the time of the delay.
78    ///
79    /// Range: `0..=127`
80
81    #[parameter_range(range = "time:0..=127")]
82    pub fn set_time(&mut self, time: usize) -> Result<(), RytmError> {
83        self.time = time as u8;
84        Ok(())
85    }
86
87    /// Sets the time of the delay on the grid.
88    pub fn set_time_on_grid(&mut self, time: FxDelayTimeOnTheGrid) {
89        self.time = time.into();
90    }
91
92    /// Sets the ping pong of the delay.
93    pub fn set_ping_pong(&mut self, enable: bool) {
94        self.ping_pong = enable;
95    }
96
97    /// Sets the stereo width of the delay.
98    ///
99    /// Range: `-64..=63`
100    #[parameter_range(range = "stereo_width:-64..=63")]
101    pub fn set_stereo_width(&mut self, stereo_width: isize) -> Result<(), RytmError> {
102        self.stereo_width = stereo_width as i8;
103        Ok(())
104    }
105
106    /// Sets the feedback of the delay.
107    ///
108    /// Range: `0..=`198`
109    #[parameter_range(range = "feedback:0..=198")]
110    pub fn set_feedback(&mut self, feedback: usize) -> Result<(), RytmError> {
111        self.feedback = feedback as u8;
112        Ok(())
113    }
114
115    /// Sets the high pass filter of the delay.
116    ///
117    /// Range: `0..=127`
118    #[parameter_range(range = "hpf:0..=127")]
119    pub fn set_hpf(&mut self, hpf: usize) -> Result<(), RytmError> {
120        self.hpf = hpf as u8;
121        Ok(())
122    }
123
124    /// Sets the low pass filter of the delay.
125    ///
126    /// Range: `0..=127`
127    #[parameter_range(range = "lpf:0..=127")]
128    pub fn set_lpf(&mut self, lpf: usize) -> Result<(), RytmError> {
129        self.lpf = lpf as u8;
130        Ok(())
131    }
132
133    /// Sets the reverb send of the delay.
134    ///
135    /// Range: `0..=127`
136    #[parameter_range(range = "reverb_send:0..=127")]
137    pub fn set_reverb_send(&mut self, reverb_send: usize) -> Result<(), RytmError> {
138        self.reverb_send = reverb_send as u8;
139        Ok(())
140    }
141
142    /// Sets the volume of the delay.
143    ///
144    /// Range: `0..=127`
145    #[parameter_range(range = "volume:0..=127")]
146    pub fn set_volume(&mut self, volume: usize) -> Result<(), RytmError> {
147        self.volume = volume as u8;
148        Ok(())
149    }
150
151    /// Returns the time of the delay.
152    ///
153    /// Range: `0..=127`
154    pub const fn time(&self) -> usize {
155        self.time as usize
156    }
157
158    /// Returns the ping pong state of the delay.
159    pub const fn ping_pong(&self) -> bool {
160        self.ping_pong
161    }
162
163    /// Returns the stereo width of the delay.
164    ///
165    /// Range: `-64..=63`
166    pub const fn stereo_width(&self) -> isize {
167        self.stereo_width as isize
168    }
169
170    /// Returns the feedback of the delay.
171    ///
172    /// Range: `0..=198`
173    pub const fn feedback(&self) -> usize {
174        self.feedback as usize
175    }
176
177    /// Returns the high pass filter of the delay.
178    ///
179    /// Range: `0..=127`
180    pub const fn hpf(&self) -> usize {
181        self.hpf as usize
182    }
183
184    /// Returns the low pass filter of the delay.
185    ///
186    /// Range: `0..=127`
187    pub const fn lpf(&self) -> usize {
188        self.lpf as usize
189    }
190
191    /// Returns the reverb send of the delay.
192    ///
193    /// Range: `0..=127`
194    pub const fn reverb_send(&self) -> usize {
195        self.reverb_send as usize
196    }
197
198    /// Returns the volume of the delay.
199    ///
200    /// Range: `0..=127`
201    pub const fn volume(&self) -> usize {
202        self.volume as usize
203    }
204}