rytm_rs/object/kit/
delay.rs1use 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#[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 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 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 #[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 pub fn set_time_on_grid(&mut self, time: FxDelayTimeOnTheGrid) {
89 self.time = time.into();
90 }
91
92 pub fn set_ping_pong(&mut self, enable: bool) {
94 self.ping_pong = enable;
95 }
96
97 #[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 #[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 #[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 #[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 #[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 #[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 pub const fn time(&self) -> usize {
155 self.time as usize
156 }
157
158 pub const fn ping_pong(&self) -> bool {
160 self.ping_pong
161 }
162
163 pub const fn stereo_width(&self) -> isize {
167 self.stereo_width as isize
168 }
169
170 pub const fn feedback(&self) -> usize {
174 self.feedback as usize
175 }
176
177 pub const fn hpf(&self) -> usize {
181 self.hpf as usize
182 }
183
184 pub const fn lpf(&self) -> usize {
188 self.lpf as usize
189 }
190
191 pub const fn reverb_send(&self) -> usize {
195 self.reverb_send as usize
196 }
197
198 pub const fn volume(&self) -> usize {
202 self.volume as usize
203 }
204}