Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
module_descriptor.hpp
Go to the documentation of this file.
1#pragma once
2
19
20#include <cmath>
21#include <cstdint>
22#include <string>
23#include <vector>
24
26
30inline constexpr double kHpMm = 5.08;
31inline constexpr double kPanelHeightMm = 380.0 / 75.0 * 25.4; // 128.69333…
32inline constexpr double kRackDpi = 75.0;
33
34inline constexpr double hp_to_mm(int hp) { return hp * kHpMm; }
35inline constexpr double mm_to_px(double mm) { return mm / 25.4 * kRackDpi; }
36
38namespace volts {
39inline constexpr float kAudioPeak = 5.0f;
40inline constexpr float kCvUnipolar = 10.0f;
41inline constexpr float kCvBipolar = 5.0f;
42inline constexpr float kGateHigh = 10.0f;
43inline constexpr float kSchmittLow = 0.1f;
44inline constexpr float kSchmittHigh = 1.0f;
47inline constexpr float kPitchRefHz = 261.6256f;
48inline constexpr float kLfoRefHz = 2.0f;
49inline float voct_to_hz(float volts, float ref_hz = kPitchRefHz) {
50 return ref_hz * std::pow(2.0f, volts);
51}
52} // namespace volts
53
64
76
80inline constexpr double control_radius_mm(ControlKind k) {
81 switch (k) {
82 case ControlKind::KnobLarge: return 9.15; // 54 px / 2
83 case ControlKind::Knob: return 6.10; // 36 px / 2
84 case ControlKind::KnobSmall: return 4.32; // 25.5 px / 2
85 case ControlKind::Trimpot: return 2.88; // 17 px / 2
86 case ControlKind::Toggle: return 3.49; // 20.6 px / 2 (tall axis)
87 case ControlKind::Button: return 3.05;
88 }
89 return 6.10;
90}
91
93inline constexpr double kJackRadiusMm = 4.11;
95inline constexpr double kLightRadiusMm = 1.39;
96
100inline const char* widget_class(ControlKind k) {
101 switch (k) {
102 case ControlKind::KnobLarge: return "RoundBigBlackKnob";
103 case ControlKind::Knob: return "RoundBlackKnob";
104 case ControlKind::KnobSmall: return "RoundSmallBlackKnob";
105 case ControlKind::Trimpot: return "Trimpot";
106 case ControlKind::Toggle: return "CKSS";
107 case ControlKind::Button: return "VCVButton";
108 }
109 return "RoundBlackKnob";
110}
111
112struct ParamSpec {
113 int id = 0;
114 std::string ident;
115 std::string name;
116 std::string label;
117 std::string unit;
118 float min_value = 0.0f;
119 float max_value = 1.0f;
120 float default_value = 0.0f;
122 double x_mm = 0.0;
123 double y_mm = 0.0;
125 float display_base = 0.0f;
126 float display_multiplier = 1.0f;
127 bool snap = false;
128};
129
130struct PortSpec {
131 int id = 0;
132 std::string ident;
133 std::string name;
134 std::string label;
136 double x_mm = 0.0;
137 double y_mm = 0.0;
138};
139
140struct LightSpec {
141 int id = 0;
142 std::string ident;
143 std::string name;
144 std::string label;
145 double x_mm = 0.0;
146 double y_mm = 0.0;
147};
148
152 std::string slug;
153 std::string name;
154 std::string description;
155 std::vector<std::string> tags;
156 int hp = 8;
157 std::vector<ParamSpec> params;
158 std::vector<PortSpec> inputs;
159 std::vector<PortSpec> outputs;
160 std::vector<LightSpec> lights;
161
162 double width_mm() const { return hp_to_mm(hp); }
163};
164
167 std::string slug;
168 std::string name;
169 std::string brand;
170 std::string version = "2.0.0";
171 std::string license = "MIT";
172 std::string author;
173 std::string author_email;
174 std::string author_url;
175 std::string plugin_url;
176 std::string manual_url;
177 std::string source_url;
178 std::vector<ModuleDescriptor> modules;
179};
180
181} // namespace pulp::format::rack
Published modular voltage standards. Centralized so no module can drift.
Definition module_descriptor.hpp:38
float voct_to_hz(float volts, float ref_hz=kPitchRefHz)
Definition module_descriptor.hpp:49
constexpr float kAudioPeak
audio is ±5 V
Definition module_descriptor.hpp:39
constexpr float kSchmittHigh
Definition module_descriptor.hpp:44
constexpr float kCvUnipolar
unipolar CV is 0..10 V
Definition module_descriptor.hpp:40
constexpr float kPitchRefHz
1 V/oct: f = f0 · 2^V.
Definition module_descriptor.hpp:47
constexpr float kLfoRefHz
Definition module_descriptor.hpp:48
constexpr float kSchmittLow
trigger detection thresholds
Definition module_descriptor.hpp:43
constexpr float kGateHigh
gates and triggers are 10 V
Definition module_descriptor.hpp:42
constexpr float kCvBipolar
bipolar CV is ±5 V
Definition module_descriptor.hpp:41
Definition module_descriptor.hpp:25
const char * widget_class(ControlKind k)
The Rack widget class this control maps to.
Definition module_descriptor.hpp:100
constexpr double kHpMm
Eurorack geometry.
Definition module_descriptor.hpp:30
PortRole
What a jack carries.
Definition module_descriptor.hpp:68
@ Pitch
1 V/oct
Definition module_descriptor.hpp:71
@ Clock
trigger used as a time base
Definition module_descriptor.hpp:74
@ Audio
±5 V
Definition module_descriptor.hpp:69
@ Gate
10 V while active
Definition module_descriptor.hpp:72
@ Cv
0..10 V or ±5 V
Definition module_descriptor.hpp:70
@ Trigger
10 V, ~1 ms
Definition module_descriptor.hpp:73
ControlKind
Which physical control renders a parameter.
Definition module_descriptor.hpp:56
@ KnobSmall
25.5 px / 8.64 mm
Definition module_descriptor.hpp:59
@ Knob
36 px / 12.19 mm — standard
Definition module_descriptor.hpp:58
@ Button
momentary
Definition module_descriptor.hpp:62
@ Trimpot
17 px / 5.76 mm — attenuverters and secondary amounts
Definition module_descriptor.hpp:60
@ Toggle
10 × 20.6 px switch
Definition module_descriptor.hpp:61
@ KnobLarge
54 px / 18.29 mm — the hero control
Definition module_descriptor.hpp:57
constexpr double hp_to_mm(int hp)
Definition module_descriptor.hpp:34
constexpr double kJackRadiusMm
Jack footprint (PJ301M is 24.3 px square).
Definition module_descriptor.hpp:93
constexpr double control_radius_mm(ControlKind k)
Drawn footprint radius in mm for each control kind — the radius of what Rack actually paints,...
Definition module_descriptor.hpp:80
constexpr double kPanelHeightMm
Definition module_descriptor.hpp:31
constexpr double mm_to_px(double mm)
Definition module_descriptor.hpp:35
constexpr double kRackDpi
Definition module_descriptor.hpp:32
constexpr double kLightRadiusMm
Medium LED (3 mm).
Definition module_descriptor.hpp:95
Definition module_descriptor.hpp:140
std::string name
Definition module_descriptor.hpp:143
double y_mm
Definition module_descriptor.hpp:146
double x_mm
Definition module_descriptor.hpp:145
std::string ident
Definition module_descriptor.hpp:142
std::string label
Definition module_descriptor.hpp:144
One module: everything needed to emit its panel, its manifest entry, and its widget placement.
Definition module_descriptor.hpp:151
std::vector< ParamSpec > params
Definition module_descriptor.hpp:157
std::string name
human-readable, shown in the browser
Definition module_descriptor.hpp:153
int hp
Definition module_descriptor.hpp:156
std::vector< LightSpec > lights
Definition module_descriptor.hpp:160
std::vector< PortSpec > inputs
Definition module_descriptor.hpp:158
std::vector< std::string > tags
must come from Rack's fixed vocabulary
Definition module_descriptor.hpp:155
std::string slug
PERMANENT once published — see the identity policy.
Definition module_descriptor.hpp:152
double width_mm() const
Definition module_descriptor.hpp:162
std::vector< PortSpec > outputs
Definition module_descriptor.hpp:159
std::string description
Definition module_descriptor.hpp:154
Definition module_descriptor.hpp:112
double y_mm
Definition module_descriptor.hpp:123
float display_multiplier
Definition module_descriptor.hpp:126
std::string name
tooltip name, e.g. "Frequency"
Definition module_descriptor.hpp:115
bool snap
integer-quantized (step counts, divisions)
Definition module_descriptor.hpp:127
float min_value
Definition module_descriptor.hpp:118
float max_value
Definition module_descriptor.hpp:119
std::string ident
enum identifier, e.g. "FREQ_PARAM"
Definition module_descriptor.hpp:114
std::string label
panel lettering, e.g. "FREQ" (may be empty)
Definition module_descriptor.hpp:116
float display_base
Exponential display base for frequency-style params (0 = linear).
Definition module_descriptor.hpp:125
double x_mm
Definition module_descriptor.hpp:122
float default_value
Definition module_descriptor.hpp:120
std::string unit
tooltip unit, e.g. " Hz"
Definition module_descriptor.hpp:117
ControlKind kind
Definition module_descriptor.hpp:121
A whole plugin: brand plus its modules.
Definition module_descriptor.hpp:166
std::string author_email
Definition module_descriptor.hpp:173
std::string name
Definition module_descriptor.hpp:168
std::string manual_url
Definition module_descriptor.hpp:176
std::vector< ModuleDescriptor > modules
Definition module_descriptor.hpp:178
std::string brand
prefix shown in the Module Browser
Definition module_descriptor.hpp:169
std::string slug
PERMANENT once published.
Definition module_descriptor.hpp:167
std::string plugin_url
Definition module_descriptor.hpp:175
std::string license
Definition module_descriptor.hpp:171
std::string author_url
Definition module_descriptor.hpp:174
std::string source_url
Definition module_descriptor.hpp:177
std::string author
Definition module_descriptor.hpp:172
std::string version
major must match Rack's major
Definition module_descriptor.hpp:170
Definition module_descriptor.hpp:130
double y_mm
Definition module_descriptor.hpp:137
PortRole role
Definition module_descriptor.hpp:135
double x_mm
Definition module_descriptor.hpp:136
std::string ident
e.g. "VOCT_INPUT"
Definition module_descriptor.hpp:132
std::string name
tooltip, e.g. "1V/oct pitch"
Definition module_descriptor.hpp:133
std::string label
panel lettering, e.g. "V/OCT"
Definition module_descriptor.hpp:134