firewire_dice_protocols/tcelectronic/
reverb.rs

1// SPDX-License-Identifier: LGPL-3.0-or-later
2// Copyright (c) 2020 Takashi Sakamoto
3
4//! Data of reverb effect in protocol defined by TC Electronic for Konnekt series.
5//!
6//! The module includes structure, trait and its implementation for data of reverb effect in
7//! protocol defined by TC Electronic for Konnekt series. It's called as `Fabrik R`.
8
9use super::*;
10
11/// Algorithm of reverb effect.
12#[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/// State of reverb effect.
64#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
65pub struct ReverbState {
66    /// The level of input. -24..0 (-24.0..0.0 dB).
67    pub input_level: i32,
68    pub bypass: bool,
69    pub kill_wet: bool,
70    pub kill_dry: bool,
71    /// The level of output. -24..12 (-24.0..12.0 dB).
72    pub output_level: i32,
73    /// The decay of time. 1..290.
74    pub time_decay: i32,
75    /// The pre decay of time. 1..100.
76    pub time_pre_decay: i32,
77    // blank
78    /// The color at low frequency. -50..50.
79    pub color_low: i32,
80    /// The color at high frequency. -50..50.
81    pub color_high: i32,
82    /// The factor of color at high frequency. -25..25.
83    pub color_high_factor: i32,
84    /// The rate of modulation. -25..25.
85    pub mod_rate: i32,
86    /// The depth of modulation. -25..25.
87    pub mod_depth: i32,
88    /// The level of early reflection. -48..0.
89    pub level_early: i32,
90    /// The level of reverb. -48..0.
91    pub level_reverb: i32,
92    /// The level of dry. -48..0.
93    pub level_dry: i32,
94    /// The algorithm of reverb.
95    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    // blank
113    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    // blank
136    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/// Meter of reverb effect.
149#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
150pub struct ReverbMeter {
151    /// The meter of left and right outputs. -1000..500 (-24.0..12.0 dB)
152    pub outputs: [i32; 2],
153    /// The meter of left and right inputs. -1000..0 (-24.0..0.0 dB)
154    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}