Tabula Sonora 0.1.0
A native C++20 implementation of the Roland Sound Canvas VA synth voice
Loading...
Searching...
No Matches
effect_presets.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <cstdint>
5#include <string>
6#include <string_view>
7#include <vector>
8
9namespace ts {
10
13 int write_tap = 0;
14 int read_tap = 0;
15 double coef_a = 0.0;
16 double coef_b = 0.0;
17};
18
26struct TankTaps {
27 int tap10 = 0;
28 int tap14 = 0;
29 int tap18 = 0;
30 int tap1c = 0;
31 int tap20 = 0;
32 int tap24 = 0;
33 int tap28 = 0;
34 int tap2c = 0;
35};
36
38struct ReverbTank {
40 double coef_a = 0.0;
41 double coef_b = 0.0;
42};
43
51
54 std::array<AllpassStage, 4> diffusers;
59 double damp_feedback = 0.0;
60 double damp_input = 0.0;
61 double gain_input = 0.0;
62 double gain_injection = 0.0;
63 double gain_feedback = 0.0;
64 double gain_output = 0.0;
65};
66
70 double lpf_a = 0.0;
71 double lpf_b = 0.0;
72 int tap1_depth = 0;
73 int tap1_base = 0;
74 int tap2_depth = 0;
75 int tap2_base = 0;
76 double feedback = 0.0;
77 double gain_write = 0.0;
78 double gain_tap = 0.0;
79};
80
84 static constexpr double send_at_full_scale = 1.02;
85
86 std::vector<std::string> type_names;
88 std::vector<ReverbPreset> types;
89};
90
94 static constexpr double send_at_full_scale = 0.3428;
95
96 std::vector<std::string> type_names;
98 std::vector<ChorusPreset> types;
99};
100
104 static constexpr double send_at_full_scale = 0.356;
105
109 static constexpr int pre_delay_samples = 1920;
110
112 static constexpr std::array<double, 8> pre_low_pass_coefficients{
113 0.0, 0.10, 0.18, 0.28, 0.40, 0.55, 0.70, 0.84};
114
115 std::vector<std::string> type_names;
116 std::vector<double> time_milliseconds;
117 std::vector<double> ratio_percent;
118 std::vector<std::array<int, 10>> raw_presets;
119};
120
127struct EqBand {
128 double b0 = 1.0;
129 double b1 = 0.0;
130 double a1 = 0.0;
131};
132
138struct EqPresets {
140 static constexpr int gain_count = 25;
141
143 static constexpr int gain_base = 0x34;
144
147 static constexpr std::array<int, 2> low_frequencies{200, 400};
148 static constexpr std::array<int, 2> high_frequencies{3000, 6000};
149
151 std::array<std::array<EqBand, gain_count>, 2> low{};
152 std::array<std::array<EqBand, gain_count>, 2> high{};
153
155 [[nodiscard]] const EqBand& low_band(int frequency, int gain) const noexcept;
156 [[nodiscard]] const EqBand& high_band(int frequency, int gain) const noexcept;
157};
158
159class RomImage;
160
168public:
170 static constexpr std::string_view path_variable = "TABULASONORA_PRESETS";
171
176 [[nodiscard]] static const EffectPresets& defaults();
177
184 static void ensure_from(const RomImage& rom);
185
187 static void use(EffectPresets presets);
188
190 [[nodiscard]] static bool available();
191
193 [[nodiscard]] static EffectPresets
195
199 [[nodiscard]] static EffectPresets parse(std::string_view json);
200
201 [[nodiscard]] const ReverbPresets& reverb() const noexcept { return reverb_; }
202
203 [[nodiscard]] const ChorusPresets& chorus() const noexcept { return chorus_; }
204
205 [[nodiscard]] const DelayPresets& delay() const noexcept { return delay_; }
206
213 [[nodiscard]] const EqPresets& eq() const noexcept { return eq_; }
214
216 [[nodiscard]] bool has_eq() const noexcept { return has_eq_; }
217
218private:
219 ReverbPresets reverb_;
220 ChorusPresets chorus_;
221 DelayPresets delay_;
222 EqPresets eq_;
223 bool has_eq_ = false;
224};
225
226} // namespace ts
The coefficient sets for the three GS send effects.
Definition effect_presets.hpp:167
const ChorusPresets & chorus() const noexcept
Definition effect_presets.hpp:203
static constexpr std::string_view path_variable
Environment variable that overrides where presets are read from.
Definition effect_presets.hpp:170
bool has_eq() const noexcept
Whether EQ coefficients are available.
Definition effect_presets.hpp:216
static void ensure_from(const RomImage &rom)
Computes the presets from the DLL, unless a set is already in force.
const ReverbPresets & reverb() const noexcept
Definition effect_presets.hpp:201
const DelayPresets & delay() const noexcept
Definition effect_presets.hpp:205
static EffectPresets from_parts(ReverbPresets reverb, ChorusPresets chorus, DelayPresets delay, EqPresets eq={})
Assembles a preset set from computed parts.
static EffectPresets parse(std::string_view json)
Parses presets from a JSON document.
static const EffectPresets & defaults()
The presets in use.
static void use(EffectPresets presets)
Supplies presets explicitly, for a host that manages its own data files.
static bool available()
Whether presets are available, without throwing.
const EqPresets & eq() const noexcept
The EQ coefficient tables.
Definition effect_presets.hpp:213
Read-only access to SCCore.dll as a data file.
Definition rom_image.hpp:39
Definition control_decode.hpp:7
One allpass stage: a read tap, a write tap and the two coefficients around them.
Definition effect_presets.hpp:12
double coef_a
Definition effect_presets.hpp:15
int write_tap
Definition effect_presets.hpp:13
double coef_b
Definition effect_presets.hpp:16
int read_tap
Definition effect_presets.hpp:14
Coefficients for one GS chorus type.
Definition effect_presets.hpp:68
int tap1_depth
Definition effect_presets.hpp:72
int tap2_depth
Definition effect_presets.hpp:74
double feedback
Definition effect_presets.hpp:76
double gain_tap
Definition effect_presets.hpp:78
int tap2_base
Definition effect_presets.hpp:75
double lpf_a
Definition effect_presets.hpp:70
int tap1_base
Definition effect_presets.hpp:73
double lpf_b
Definition effect_presets.hpp:71
double gain_write
Definition effect_presets.hpp:77
int lfo_increment
Definition effect_presets.hpp:69
The eight GS chorus types plus the power-on default.
Definition effect_presets.hpp:92
std::vector< ChorusPreset > types
Definition effect_presets.hpp:98
static constexpr double send_at_full_scale
Send-bus gain at controller 127.
Definition effect_presets.hpp:94
ChorusPreset defaults
Definition effect_presets.hpp:97
std::vector< std::string > type_names
Definition effect_presets.hpp:96
The ten GS delay types and the two published conversion tables.
Definition effect_presets.hpp:102
static constexpr std::array< double, 8 > pre_low_pass_coefficients
Pre-lowpass coefficient ladder; index 0 bypasses, which every preset uses.
Definition effect_presets.hpp:112
std::vector< double > time_milliseconds
Definition effect_presets.hpp:116
static constexpr double send_at_full_scale
Send-bus gain at full scale.
Definition effect_presets.hpp:104
std::vector< std::string > type_names
Definition effect_presets.hpp:115
static constexpr int pre_delay_samples
Fixed input pre-delay ahead of the feedback line, in samples — 60 ms at 32 kHz.
Definition effect_presets.hpp:109
std::vector< std::array< int, 10 > > raw_presets
Definition effect_presets.hpp:118
std::vector< double > ratio_percent
Definition effect_presets.hpp:117
One shelving band: H(z) = (b0 + b1·z⁻¹) / (1 − a1·z⁻¹).
Definition effect_presets.hpp:127
double a1
Definition effect_presets.hpp:130
double b1
Definition effect_presets.hpp:129
double b0
Definition effect_presets.hpp:128
The four-band EQ block's coefficient tables — two bands, two corner frequencies each.
Definition effect_presets.hpp:138
std::array< std::array< EqBand, gain_count >, 2 > low
[frequency][gain byte − 0x34].
Definition effect_presets.hpp:151
const EqBand & high_band(int frequency, int gain) const noexcept
std::array< std::array< EqBand, gain_count >, 2 > high
Definition effect_presets.hpp:152
static constexpr std::array< int, 2 > low_frequencies
Corner frequencies each band can be switched between, in Hz, for reporting only — the coefficients ca...
Definition effect_presets.hpp:147
const EqBand & low_band(int frequency, int gain) const noexcept
The band for a SysEx frequency and gain pair, clamped the way the engine clamps them.
static constexpr std::array< int, 2 > high_frequencies
Definition effect_presets.hpp:148
static constexpr int gain_base
The lowest gain byte, subtracted to index the tables.
Definition effect_presets.hpp:143
static constexpr int gain_count
Gain settings per band: 40 02 01 and 40 02 03 accept 0x34–0x4C, which is −12…+12 dB.
Definition effect_presets.hpp:140
Coefficients for one GS reverb type.
Definition effect_presets.hpp:53
ReverbTank tank_a
Definition effect_presets.hpp:55
double gain_feedback
Definition effect_presets.hpp:63
double gain_injection
Definition effect_presets.hpp:62
double damp_input
Definition effect_presets.hpp:60
ReverbTank tank_b
Definition effect_presets.hpp:56
double gain_input
Definition effect_presets.hpp:61
std::array< AllpassStage, 4 > diffusers
Definition effect_presets.hpp:54
TankAllpasses tank_allpasses
Definition effect_presets.hpp:57
double damp_feedback
Definition effect_presets.hpp:59
double gain_output
Definition effect_presets.hpp:64
int injection_tap
Definition effect_presets.hpp:58
The eight GS reverb types plus the power-on default.
Definition effect_presets.hpp:82
ReverbPreset defaults
Definition effect_presets.hpp:87
static constexpr double send_at_full_scale
Send-bus gain at controller 127.
Definition effect_presets.hpp:84
std::vector< std::string > type_names
Definition effect_presets.hpp:86
std::vector< ReverbPreset > types
Definition effect_presets.hpp:88
One reverb tank.
Definition effect_presets.hpp:38
double coef_b
Definition effect_presets.hpp:41
TankTaps taps
Definition effect_presets.hpp:39
double coef_a
Definition effect_presets.hpp:40
The two nested allpasses inside each tank.
Definition effect_presets.hpp:45
AllpassStage b0
Definition effect_presets.hpp:48
AllpassStage b1
Definition effect_presets.hpp:49
AllpassStage a1
Definition effect_presets.hpp:47
AllpassStage a0
Definition effect_presets.hpp:46
One reverb tank's eight ring offsets, resolved from their names once.
Definition effect_presets.hpp:26
int tap1c
Definition effect_presets.hpp:30
int tap14
Definition effect_presets.hpp:28
int tap18
Definition effect_presets.hpp:29
int tap20
Definition effect_presets.hpp:31
int tap10
Definition effect_presets.hpp:27
int tap2c
Definition effect_presets.hpp:34
int tap24
Definition effect_presets.hpp:32
int tap28
Definition effect_presets.hpp:33