firewire_dice_protocols/tcelectronic/
reverb.rs1use super::*;
10
11#[derive(Debug, Copy, Clone, PartialEq, Eq)]
13pub enum ReverbAlgorithm {
14 Live1,
15 Hall,
16 Plate,
17 Club,
18 ConcertHall,
19 Cathedral,
20 Church,
21 Room,
22 SmallRoom,
23 Box,
24 Ambient,
25 Live2,
26 Live3,
27 Spring,
28}
29
30impl Default for ReverbAlgorithm {
31 fn default() -> Self {
32 Self::Live1
33 }
34}
35
36const REVERB_ALGORITHMS: &[ReverbAlgorithm] = &[
37 ReverbAlgorithm::Live1,
38 ReverbAlgorithm::Hall,
39 ReverbAlgorithm::Plate,
40 ReverbAlgorithm::Club,
41 ReverbAlgorithm::ConcertHall,
42 ReverbAlgorithm::Cathedral,
43 ReverbAlgorithm::Church,
44 ReverbAlgorithm::Room,
45 ReverbAlgorithm::SmallRoom,
46 ReverbAlgorithm::Box,
47 ReverbAlgorithm::Ambient,
48 ReverbAlgorithm::Live2,
49 ReverbAlgorithm::Live3,
50 ReverbAlgorithm::Spring,
51];
52
53const REVERB_ALGORITHM_LABEL: &str = "reverb algorithm";
54
55fn serialize_algorithm(algo: &ReverbAlgorithm, raw: &mut [u8]) -> Result<(), String> {
56 serialize_position(REVERB_ALGORITHMS, algo, raw, REVERB_ALGORITHM_LABEL)
57}
58
59fn deserialize_algorithm(algo: &mut ReverbAlgorithm, raw: &[u8]) -> Result<(), String> {
60 deserialize_position(REVERB_ALGORITHMS, algo, raw, REVERB_ALGORITHM_LABEL)
61}
62
63#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
65pub struct ReverbState {
66 pub input_level: i32,
68 pub bypass: bool,
69 pub kill_wet: bool,
70 pub kill_dry: bool,
71 pub output_level: i32,
73 pub time_decay: i32,
75 pub time_pre_decay: i32,
77 pub color_low: i32,
80 pub color_high: i32,
82 pub color_high_factor: i32,
84 pub mod_rate: i32,
86 pub mod_depth: i32,
88 pub level_early: i32,
90 pub level_reverb: i32,
92 pub level_dry: i32,
94 pub algorithm: ReverbAlgorithm,
96}
97
98impl ReverbState {
99 pub(crate) const SIZE: usize = 68;
100}
101
102pub(crate) fn serialize_reverb_state(state: &ReverbState, raw: &mut [u8]) -> Result<(), String> {
103 assert!(raw.len() >= ReverbState::SIZE);
104
105 serialize_i32(&state.input_level, &mut raw[..4]);
106 serialize_bool(&state.bypass, &mut raw[4..8]);
107 serialize_bool(&state.kill_wet, &mut raw[8..12]);
108 serialize_bool(&state.kill_dry, &mut raw[12..16]);
109 serialize_i32(&state.output_level, &mut raw[16..20]);
110 serialize_i32(&state.time_decay, &mut raw[20..24]);
111 serialize_i32(&state.time_pre_decay, &mut raw[24..28]);
112 serialize_i32(&state.color_low, &mut raw[32..36]);
114 serialize_i32(&state.color_high, &mut raw[36..40]);
115 serialize_i32(&state.color_high_factor, &mut raw[40..44]);
116 serialize_i32(&state.mod_rate, &mut raw[44..48]);
117 serialize_i32(&state.mod_depth, &mut raw[48..52]);
118 serialize_i32(&state.level_early, &mut raw[52..56]);
119 serialize_i32(&state.level_dry, &mut raw[60..64]);
120 serialize_algorithm(&state.algorithm, &mut raw[64..])?;
121
122 Ok(())
123}
124
125pub(crate) fn deserialize_reverb_state(state: &mut ReverbState, raw: &[u8]) -> Result<(), String> {
126 assert!(raw.len() >= ReverbState::SIZE);
127
128 deserialize_i32(&mut state.input_level, &raw[..4]);
129 deserialize_bool(&mut state.bypass, &raw[4..8]);
130 deserialize_bool(&mut state.kill_wet, &raw[8..12]);
131 deserialize_bool(&mut state.kill_dry, &raw[12..16]);
132 deserialize_i32(&mut state.output_level, &raw[16..20]);
133 deserialize_i32(&mut state.time_decay, &raw[20..24]);
134 deserialize_i32(&mut state.time_pre_decay, &raw[24..28]);
135 deserialize_i32(&mut state.color_low, &raw[32..36]);
137 deserialize_i32(&mut state.color_high, &raw[36..40]);
138 deserialize_i32(&mut state.color_high_factor, &raw[40..44]);
139 deserialize_i32(&mut state.mod_rate, &raw[44..48]);
140 deserialize_i32(&mut state.mod_depth, &raw[48..52]);
141 deserialize_i32(&mut state.level_early, &raw[52..56]);
142 deserialize_i32(&mut state.level_dry, &raw[60..64]);
143 deserialize_algorithm(&mut state.algorithm, &raw[64..])?;
144
145 Ok(())
146}
147
148#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
150pub struct ReverbMeter {
151 pub outputs: [i32; 2],
153 pub inputs: [i32; 2],
155}
156
157impl ReverbMeter {
158 pub(crate) const SIZE: usize = 24;
159}
160
161pub(crate) fn serialize_reverb_meter(meter: &ReverbMeter, raw: &mut [u8]) -> Result<(), String> {
162 assert!(raw.len() >= ReverbMeter::SIZE);
163
164 serialize_i32(&meter.outputs[0], &mut raw[..4]);
165 serialize_i32(&meter.outputs[1], &mut raw[4..8]);
166 serialize_i32(&meter.inputs[0], &mut raw[8..12]);
167 serialize_i32(&meter.inputs[1], &mut raw[12..16]);
168
169 Ok(())
170}
171
172pub(crate) fn deserialize_reverb_meter(meter: &mut ReverbMeter, raw: &[u8]) -> Result<(), String> {
173 assert!(raw.len() >= ReverbMeter::SIZE);
174
175 deserialize_i32(&mut meter.outputs[0], &raw[..4]);
176 deserialize_i32(&mut meter.outputs[1], &raw[4..8]);
177 deserialize_i32(&mut meter.inputs[0], &raw[8..12]);
178 deserialize_i32(&mut meter.inputs[1], &raw[12..16]);
179
180 Ok(())
181}