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