2 * Example audio modules - parameters and LADSPA wrapper instantiation
4 * Copyright (C) 2001-2008 Krzysztof Foltman
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 * Boston, MA 02111-1307, USA.
25 #include <jack/jack.h>
27 #include <calf/giface.h>
28 #include <calf/metadata.h>
31 using namespace calf_plugins
;
33 const char *calf_plugins::calf_copyright_info
= "(C) 2001-2008 Krzysztof Foltman, license: LGPL";
35 ////////////////////////////////////////////////////////////////////////////
37 CALF_PORT_NAMES(flanger
) = {"In L", "In R", "Out L", "Out R"};
39 CALF_PORT_PROPS(flanger
) = {
40 { 0.1, 0.1, 10, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
| PF_PROP_GRAPH
, NULL
, "min_delay", "Minimum delay" },
41 { 0.5, 0.1, 10, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "mod_depth", "Modulation depth" },
42 { 0.25, 0.01, 20, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "mod_rate", "Modulation rate" },
43 { 0.90, -0.99, 0.99, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
| PF_UNIT_COEF
, NULL
, "feedback", "Feedback" },
44 { 0, 0, 360, 9, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "stereo", "Stereo phase" },
45 { 0, 0, 1, 2, PF_BOOL
| PF_CTL_BUTTON
, NULL
, "reset", "Reset" },
46 { 1, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "amount", "Amount" },
47 { 1.0, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "dry", "Dry Amount" },
50 CALF_PLUGIN_INFO(flanger
) = { 0x847d, "Flanger", "Calf Flanger", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "FlangerPlugin" };
52 ////////////////////////////////////////////////////////////////////////////
54 CALF_PORT_NAMES(phaser
) = {"In L", "In R", "Out L", "Out R"};
56 CALF_PORT_PROPS(phaser
) = {
57 { 1000, 20, 20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
| PF_PROP_GRAPH
, NULL
, "base_freq", "Center Freq" },
58 { 4000, 0, 10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "mod_depth", "Modulation depth" },
59 { 0.25, 0.01, 20, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "mod_rate", "Modulation rate" },
60 { 0.25, -0.99, 0.99, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
| PF_UNIT_COEF
, NULL
, "feedback", "Feedback" },
61 { 6, 1, 12, 12, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "stages", "# Stages" },
62 { 180, 0, 360, 9, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "stereo", "Stereo phase" },
63 { 0, 0, 1, 2, PF_BOOL
| PF_CTL_BUTTON
, NULL
, "reset", "Reset" },
64 { 1, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "amount", "Amount" },
65 { 1.0, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "dry", "Dry Amount" },
68 CALF_PLUGIN_INFO(phaser
) = { 0x8484, "Phaser", "Calf Phaser", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "PhaserPlugin" };
70 ////////////////////////////////////////////////////////////////////////////
72 CALF_PORT_NAMES(reverb
) = {"In L", "In R", "Out L", "Out R"};
74 const char *reverb_room_sizes
[] = { "Small", "Medium", "Large", "Tunnel-like", "Large/smooth", "Experimental" };
76 CALF_PORT_PROPS(reverb
) = {
77 { 1.5, 0.4, 15.0, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_SEC
, NULL
, "decay_time", "Decay time" },
78 { 5000, 2000,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "hf_damp", "High Frq Damp" },
79 { 2, 0, 5, 0, PF_ENUM
| PF_CTL_COMBO
, reverb_room_sizes
, "room_size", "Room size", },
80 { 0.5, 0, 1, 0, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_PERC
, NULL
, "diffusion", "Diffusion" },
81 { 0.25, 0, 2, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "amount", "Wet Amount" },
82 { 1.0, 0, 2, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "dry", "Dry Amount" },
83 { 0, 0, 50, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "predelay", "Pre Delay" },
84 { 300, 20, 20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "bass_cut", "Bass Cut" },
85 { 5000, 20, 20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "treble_cut", "Treble Cut" },
88 CALF_PLUGIN_INFO(reverb
) = { 0x847e, "Reverb", "Calf Reverb", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "ReverbPlugin" };
90 ////////////////////////////////////////////////////////////////////////////
92 CALF_PORT_NAMES(filter
) = {"In L", "In R", "Out L", "Out R"};
94 const char *filter_choices
[] = {
103 CALF_PORT_PROPS(filter
) = {
104 { 2000, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
| PF_PROP_GRAPH
, NULL
, "freq", "Frequency" },
105 { 0.707, 0.707, 32, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
, NULL
, "res", "Resonance" },
106 { 0, 0, 5, 1, PF_ENUM
| PF_CTL_COMBO
, filter_choices
, "mode", "Mode" },
107 { 20, 5, 100, 20, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "inertia", "Inertia"},
110 CALF_PLUGIN_INFO(filter
) = { 0x847f, "Filter", "Calf Filter", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "FilterPlugin" };
112 ////////////////////////////////////////////////////////////////////////////
114 CALF_PORT_NAMES(vintage_delay
) = {"In L", "In R", "Out L", "Out R"};
116 const char *vintage_delay_mixmodes
[] = {
121 const char *vintage_delay_fbmodes
[] = {
127 CALF_PORT_PROPS(vintage_delay
) = {
128 { 120, 30, 300,2701, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_BPM
, NULL
, "bpm", "Tempo" },
129 { 4, 1, 16, 1, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "subdiv", "Subdivide"},
130 { 3, 1, 16, 1, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "time_l", "Time L"},
131 { 5, 1, 16, 1, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "time_r", "Time R"},
132 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "feedback", "Feedback" },
133 { 0.25, 0, 4, 100, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
, NULL
, "amount", "Amount" },
134 { 1, 0, 1, 0, PF_ENUM
| PF_CTL_COMBO
, vintage_delay_mixmodes
, "mix_mode", "Mix mode" },
135 { 1, 0, 2, 0, PF_ENUM
| PF_CTL_COMBO
, vintage_delay_fbmodes
, "medium", "Medium" },
136 { 1.0, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "dry", "Dry Amount" },
139 CALF_PLUGIN_INFO(vintage_delay
) = { 0x8482, "VintageDelay", "Calf Vintage Delay", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "DelayPlugin" };
141 ////////////////////////////////////////////////////////////////////////////
143 CALF_PORT_NAMES(rotary_speaker
) = {"In L", "In R", "Out L", "Out R"};
145 const char *rotary_speaker_speed_names
[] = { "Off", "Chorale", "Tremolo", "HoldPedal", "ModWheel", "Manual" };
147 CALF_PORT_PROPS(rotary_speaker
) = {
148 { 2, 0, 5, 1.01, PF_ENUM
| PF_CTL_COMBO
, rotary_speaker_speed_names
, "vib_speed", "Speed Mode" },
149 { 0.5, 0, 1, 0, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_PERC
, NULL
, "spacing", "Tap Spacing" },
150 { 0.5, 0, 1, 0, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_PERC
, NULL
, "shift", "Tap Offset" },
151 { 0.10, 0, 1, 0, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_PERC
, NULL
, "mod_depth", "Mod Depth" },
152 { 390, 10, 600, 0, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_LOG
| PF_UNIT_RPM
, NULL
, "treble_speed", "Treble Motor" },
153 { 410, 10, 600, 0, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_LOG
| PF_UNIT_RPM
, NULL
, "bass_speed", "Bass Motor" },
154 { 0.7, 0, 1, 101, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_PERC
, NULL
, "mic_distance", "Mic Distance" },
155 { 0.3, 0, 1, 101, PF_FLOAT
| PF_CTL_KNOB
| PF_SCALE_PERC
, NULL
, "reflection", "Reflection" },
158 CALF_PLUGIN_INFO(rotary_speaker
) = { 0x8483, "RotarySpeaker", "Calf Rotary Speaker", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "SimulationPlugin" };
160 ////////////////////////////////////////////////////////////////////////////
162 CALF_PORT_NAMES(multichorus
) = {"In L", "In R", "Out L", "Out R"};
164 CALF_PORT_PROPS(multichorus
) = {
165 { 5, 0.1, 10, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
| PF_PROP_GRAPH
, NULL
, "min_delay", "Minimum delay" },
166 { 6, 0.1, 10, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
| PF_PROP_GRAPH
, NULL
, "mod_depth", "Modulation depth" },
167 { 0.5, 0.01, 20, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
| PF_PROP_GRAPH
, NULL
, "mod_rate", "Modulation rate" },
168 { 180, 0, 360, 91, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "stereo", "Stereo phase" },
169 { 4, 1, 8, 8, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "voices", "Voices"},
170 { 64, 0, 360, 91, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "vphase", "Inter-voice phase" },
171 { 2, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "amount", "Amount" },
172 { 1.0, 0, 4, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_COEF
| PF_PROP_NOBOUNDS
, NULL
, "dry", "Dry Amount" },
173 { 100, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
| PF_PROP_GRAPH
, NULL
, "freq", "Center Frq 1" },
174 { 5000, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
| PF_PROP_GRAPH
, NULL
, "freq2", "Center Frq 2" },
175 { 0.125, 0.125, 8, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_COEF
, NULL
, "q", "Q" },
178 CALF_PLUGIN_INFO(multichorus
) = { 0x8501, "MultiChorus", "Calf MultiChorus", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "ChorusPlugin" };
180 ////////////////////////////////////////////////////////////////////////////
182 CALF_PORT_NAMES(compressor
) = {"In L", "In R", "Out L", "Out R"};
184 const char *compressor_detection_names
[] = { "RMS", "Peak" };
185 const char *compressor_stereo_link_names
[] = { "Average", "Maximum" };
187 CALF_PORT_PROPS(compressor
) = {
188 { 0.125, 0.000976563, 1, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_DB
, NULL
, "threshold", "Threshold" },
189 { 2, 1, 20, 21, PF_FLOAT
| PF_SCALE_LOG_INF
| PF_CTL_KNOB
| PF_UNIT_COEF
, NULL
, "ratio", "Ratio" },
190 { 20, 0.01, 2000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "attack", "Attack" },
191 { 250, 0.01, 2000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "release", "Release" },
192 { 2, 1, 64, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_DB
, NULL
, "makeup", "Makeup Gain" },
193 { 2.828427125, 1, 8, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_UNIT_DB
, NULL
, "knee", "Knee" },
194 { 0, 0, 1, 0, PF_ENUM
| PF_CTL_COMBO
, compressor_detection_names
, "detection", "Detection" },
195 { 0, 0, 1, 0, PF_ENUM
| PF_CTL_COMBO
, compressor_stereo_link_names
, "stereo_link", "Stereo Link" },
196 { 0, 0, 1, 0, PF_BOOL
| PF_CTL_TOGGLE
, NULL
, "aweighting", "A-weighting" },
197 { 0, 0.03125, 1, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_METER
| PF_CTLO_LABEL
| PF_CTLO_REVERSE
| PF_UNIT_DB
| PF_PROP_OUTPUT
| PF_PROP_OPTIONAL
| PF_PROP_GRAPH
, NULL
, "compression", "Compression" },
198 { 0, 0, 1, 0, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_METER
| PF_CTLO_LABEL
| PF_UNIT_DB
| PF_PROP_OUTPUT
| PF_PROP_OPTIONAL
, NULL
, "peak", "Peak Output" },
199 { 0, 0, 1, 0, PF_BOOL
| PF_CTL_LED
| PF_PROP_OUTPUT
| PF_PROP_OPTIONAL
, NULL
, "clip", "0dB" },
200 { 0, 0, 1, 0, PF_BOOL
| PF_CTL_TOGGLE
, NULL
, "bypass", "Bypass" }
203 CALF_PLUGIN_INFO(compressor
) = { 0x8502, "Compressor", "Calf Compressor", "Thor Harald Johansen", calf_plugins::calf_copyright_info
, "CompressorPlugin" };
205 ////////////////////////////////////////////////////////////////////////////
207 CALF_PORT_NAMES(monosynth
) = {
211 const char *monosynth_waveform_names
[] = { "Sawtooth", "Square", "Pulse", "Sine", "Triangle", "Varistep", "Skewed Saw", "Skewed Square",
212 "Smooth Brass", "Bass", "Dark FM", "Multiwave", "Bell FM", "Dark Pad", "DCO Saw", "DCO Maze" };
213 const char *monosynth_mode_names
[] = { "0 : 0", "0 : 180", "0 : 90", "90 : 90", "90 : 270", "Random" };
214 const char *monosynth_legato_names
[] = { "Retrig", "Legato", "Fng Retrig", "Fng Legato" };
216 const char *monosynth_filter_choices
[] = {
219 "2x12dB/oct Lowpass",
224 "2x6dB/oct Bandpass",
227 CALF_PLUGIN_INFO(monosynth
) = { 0x8480, "Monosynth", "Calf Monosynth", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "SynthesizerPlugin" };
229 CALF_PORT_PROPS(monosynth
) = {
230 { monosynth_metadata::wave_saw
, 0, monosynth_metadata::wave_count
- 1, 1, PF_ENUM
| PF_CTL_COMBO
, monosynth_waveform_names
, "o1_wave", "Osc1 Wave" },
231 { monosynth_metadata::wave_sqr
, 0, monosynth_metadata::wave_count
- 1, 1, PF_ENUM
| PF_CTL_COMBO
, monosynth_waveform_names
, "o2_wave", "Osc2 Wave" },
232 { 10, 0, 100, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "o12_detune", "O1<>2 Detune" },
233 { 12, -24, 24, 0, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_SEMITONES
, NULL
, "o2_xpose", "Osc 2 transpose" },
234 { 0, 0, 5, 0, PF_ENUM
| PF_CTL_COMBO
, monosynth_mode_names
, "phase_mode", "Phase mode" },
235 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "o12_mix", "O1<>2 Mix" },
236 { 1, 0, 7, 0, PF_ENUM
| PF_CTL_COMBO
, monosynth_filter_choices
, "filter", "Filter" },
237 { 33, 10,16000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "cutoff", "Cutoff" },
238 { 2, 0.7, 8, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
, NULL
, "res", "Resonance" },
239 { 0, -2400, 2400, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "filter_sep", "Separation" },
240 { 8000, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "env2cutoff", "Env->Cutoff" },
241 { 1, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "env2res", "Env->Res" },
242 { 1, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "env2amp", "Env->Amp" },
244 { 1, 1,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr_a", "Attack" },
245 { 350, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr_d", "Decay" },
246 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr_s", "Sustain" },
247 { 50, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr_r", "Release" },
249 { 0, 0, 2, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "key_follow", "Key Follow" },
250 { 0, 0, 3, 0, PF_ENUM
| PF_CTL_COMBO
, monosynth_legato_names
, "legato", "Legato Mode" },
251 { 1, 1, 2000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "portamento", "Portamento" },
253 { 0.5, 0, 1, 0.1, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "vel2filter", "Vel->Filter" },
254 { 0, 0, 1, 0.1, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "vel2amp", "Vel->Amp" },
256 { 0.5, 0, 1, 100, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_PROP_OUTPUT_GAIN
, NULL
, "master", "Volume" },
259 ////////////////////////////////////////////////////////////////////////////
261 CALF_PLUGIN_INFO(organ
) = { 0x8481, "Organ", "Calf Organ", "Krzysztof Foltman", calf_plugins::calf_copyright_info
, "SynthesizerPlugin" };
263 const char **organ_metadata::get_default_configure_vars()
265 static const char *data
[] = { "map_curve", "2\n0 1\n1 1\n", NULL
};
269 plugin_command_info
*organ_metadata::get_commands()
271 static plugin_command_info cmds
[] = {
272 { "cmd_panic", "Panic!", "Stop all sounds and reset all controllers" },
278 CALF_PORT_NAMES(organ
) = {"Out L", "Out R"};
280 const char *organ_percussion_trigger_names
[] = { "First note", "Each note", "Each, no retrig", "Polyphonic" };
282 const char *organ_wave_names
[] = {
285 "SSaw", "SSqr", "SPls",
287 "S(", "Sq(", "S+", "Clvg",
289 "W1", "W2", "W3", "W4", "W5", "W6", "W7", "W8", "W9",
290 "DSaw", "DSqr", "DPls",
291 "P:SynStr","P:WideStr","P:Sine","P:Bell","P:Space","P:Voice","P:Hiss","P:Chant",
294 const char *organ_routing_names
[] = { "Out", "Flt 1", "Flt 2" };
296 const char *organ_ampctl_names
[] = { "None", "Direct", "Flt 1", "Flt 2", "All" };
298 const char *organ_vibrato_mode_names
[] = { "None", "Direct", "Flt 1", "Flt 2", "Voice", "Global" };
300 const char *organ_init_map_curve
= "2\n0 1\n1 1\n";
302 CALF_PORT_PROPS(organ
) = {
303 { 8, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l1", "16'" },
304 { 8, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l2", "5 1/3'" },
305 { 8, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l3", "8'" },
306 { 0, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l4", "4'" },
307 { 0, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l5", "2 2/3'" },
308 { 0, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l6", "2'" },
309 { 0, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l7", "1 3/5'" },
310 { 0, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l8", "1 1/3'" },
311 { 8, 0, 8, 80, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_FADER
, NULL
, "l9", "1'" },
313 { 1, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f1", "Freq 1" },
314 { 3, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f2", "Freq 2" },
315 { 2, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f3", "Freq 3" },
316 { 4, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f4", "Freq 4" },
317 { 6, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f5", "Freq 5" },
318 { 8, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f6", "Freq 6" },
319 { 10, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f7", "Freq 7" },
320 { 12, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f8", "Freq 8" },
321 { 16, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "f9", "Freq 9" },
323 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w1", "Wave 1" },
324 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w2", "Wave 2" },
325 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w3", "Wave 3" },
326 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w4", "Wave 4" },
327 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w5", "Wave 5" },
328 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w6", "Wave 6" },
329 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w7", "Wave 7" },
330 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w8", "Wave 8" },
331 { 0, 0, organ_enums::wave_count
- 1, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_wave_names
, "w9", "Wave 9" },
333 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune1", "Detune 1" },
334 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune2", "Detune 2" },
335 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune3", "Detune 3" },
336 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune4", "Detune 4" },
337 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune5", "Detune 5" },
338 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune6", "Detune 6" },
339 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune7", "Detune 7" },
340 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune8", "Detune 8" },
341 { 0, -100,100, 401, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune9", "Detune 9" },
343 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase1", "Phase 1" },
344 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase2", "Phase 2" },
345 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase3", "Phase 3" },
346 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase4", "Phase 4" },
347 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase5", "Phase 5" },
348 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase6", "Phase 6" },
349 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase7", "Phase 7" },
350 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase8", "Phase 8" },
351 { 0, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "phase9", "Phase 9" },
353 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan1", "Pan 1" },
354 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan2", "Pan 2" },
355 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan3", "Pan 3" },
356 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan4", "Pan 4" },
357 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan5", "Pan 5" },
358 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan6", "Pan 6" },
359 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan7", "Pan 7" },
360 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan8", "Pan 8" },
361 { 0, -1, 1, 201, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "pan9", "Pan 9" },
363 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing1", "Routing 1" },
364 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing2", "Routing 2" },
365 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing3", "Routing 3" },
366 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing4", "Routing 4" },
367 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing5", "Routing 5" },
368 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing6", "Routing 6" },
369 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing7", "Routing 7" },
370 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing8", "Routing 8" },
371 { 0, 0, 2, 0, PF_ENUM
| PF_SCALE_LINEAR
| PF_CTL_COMBO
, organ_routing_names
, "routing9", "Routing 9" },
373 { 96, 0, 127, 128, PF_INT
| PF_CTL_KNOB
| PF_UNIT_NOTE
, NULL
, "foldnote", "Foldover" },
375 { 200, 10, 3000, 100, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "perc_decay", "P: Carrier Decay" },
376 { 0.25, 0, 1, 100, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
, NULL
, "perc_level", "P: Level" },
377 { 0, 0, organ_enums::wave_count_small
- 1, 1, PF_ENUM
| PF_CTL_COMBO
, organ_wave_names
, "perc_waveform", "P: Carrier Wave" },
378 { 6, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "perc_harmonic", "P: Carrier Frq" },
379 { 0, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "perc_vel2amp", "P: Vel->Amp" },
381 { 200, 10, 3000, 100, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "perc_fm_decay", "P: Modulator Decay" },
382 { 0, 0, 4, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "perc_fm_depth", "P: FM Depth" },
383 { 0, 0, organ_enums::wave_count_small
- 1, 1, PF_ENUM
| PF_CTL_COMBO
, organ_wave_names
, "perc_fm_waveform", "P: Modulator Wave" },
384 { 6, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "perc_fm_harmonic", "P: Modulator Frq" },
385 { 0, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "perc_vel2fm", "P: Vel->FM" },
387 { 0, 0, organ_enums::perctrig_count
- 1, 0, PF_ENUM
| PF_CTL_COMBO
, organ_percussion_trigger_names
, "perc_trigger", "P: Trigger" },
388 { 90, 0,360, 361, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "perc_stereo", "P: Stereo Phase" },
390 { 0, 0, 1, 0, PF_BOOL
| PF_CTL_TOGGLE
, NULL
, "filter_chain", "Filter 1 To 2" },
391 { 0.1, 0, 1, 100, PF_FLOAT
| PF_SCALE_GAIN
| PF_CTL_KNOB
| PF_PROP_OUTPUT_GAIN
, NULL
, "master", "Volume" },
393 { 2000, 20, 20000, 100, PF_FLOAT
| PF_SCALE_LOG
| PF_UNIT_HZ
| PF_CTL_KNOB
, NULL
, "f1_cutoff", "F1 Cutoff" },
394 { 2, 0.7, 8, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
, NULL
, "f1_res", "F1 Res" },
395 { 8000, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "f1_env1", "F1 Env1" },
396 { 0, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "f1_env2", "F1 Env2" },
397 { 0, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "f1_env3", "F1 Env3" },
398 { 0, 0, 2, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "f1_keyf", "F1 KeyFollow" },
400 { 2000, 20, 20000, 100, PF_FLOAT
| PF_SCALE_LOG
| PF_UNIT_HZ
| PF_CTL_KNOB
, NULL
, "f2_cutoff", "F2 Cutoff" },
401 { 2, 0.7, 8, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
, NULL
, "f2_res", "F2 Res" },
402 { 0, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "f2_env1", "F2 Env1" },
403 { 8000, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "f2_env2", "F2 Env2" },
404 { 0, -10800,10800, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "f2_env3", "F2 Env3" },
405 { 0, 0, 2, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "f2_keyf", "F2 KeyFollow" },
407 { 1, 1,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr_a", "EG1 Attack" },
408 { 350, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr_d", "EG1 Decay" },
409 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr_s", "EG1 Sustain" },
410 { 50, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr_r", "EG1 Release" },
411 { 0, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr_v", "EG1 VelMod" },
412 { 0, 0, organ_enums::ampctl_count
- 1,
413 0, PF_INT
| PF_CTL_COMBO
, organ_ampctl_names
, "eg1_amp_ctl", "EG1 To Amp"},
415 { 1, 1,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr2_a", "EG2 Attack" },
416 { 350, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr2_d", "EG2 Decay" },
417 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr2_s", "EG2 Sustain" },
418 { 50, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr2_r", "EG2 Release" },
419 { 0, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr2_v", "EG2 VelMod" },
420 { 0, 0, organ_enums::ampctl_count
- 1,
421 0, PF_INT
| PF_CTL_COMBO
, organ_ampctl_names
, "eg2_amp_ctl", "EG2 To Amp"},
423 { 1, 1,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr3_a", "EG3 Attack" },
424 { 350, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr3_d", "EG3 Decay" },
425 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr3_s", "EG3 Sustain" },
426 { 50, 10,20000, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_MSEC
, NULL
, "adsr3_r", "EG3 Release" },
427 { 0, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
, NULL
, "adsr3_v", "EG3 VelMod" },
428 { 0, 0, organ_enums::ampctl_count
- 1,
429 0, PF_INT
| PF_CTL_COMBO
, organ_ampctl_names
, "eg3_amp_ctl", "EG3 To Amp"},
431 { 6.6, 0.01, 80, 0, PF_FLOAT
| PF_SCALE_LOG
| PF_CTL_KNOB
| PF_UNIT_HZ
, NULL
, "vib_rate", "Vib Rate" },
432 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "vib_amt", "Vib Mod Amt" },
433 { 0.5, 0, 1, 0, PF_FLOAT
| PF_SCALE_PERC
| PF_CTL_KNOB
, NULL
, "vib_wet", "Vib Wet" },
434 { 180, 0, 360, 0, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_DEG
, NULL
, "vib_phase", "Vib Stereo" },
435 { organ_enums::lfomode_global
, 0, organ_enums::lfomode_count
- 1, 0, PF_ENUM
| PF_CTL_COMBO
, organ_vibrato_mode_names
, "vib_mode", "Vib Mode" },
436 // { 0, 0, organ_enums::ampctl_count - 1,
437 // 0, PF_INT | PF_CTL_COMBO, organ_ampctl_names, "vel_amp_ctl", "Vel To Amp"},
439 { -12, -24, 24, 49, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_SEMITONES
, NULL
, "transpose", "Transpose" },
440 { 0, -100, 100, 201, PF_FLOAT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
| PF_UNIT_CENTS
, NULL
, "detune", "Detune" },
442 { 16, 1, 32, 32, PF_INT
| PF_SCALE_LINEAR
| PF_CTL_KNOB
, NULL
, "polyphony", "Polyphony" },
444 { 0, 0, 0, 0, PF_STRING
| PF_PROP_MSGCONTEXT
, &organ_init_map_curve
, "map_curve", "Key mapping curve" },
447 ////////////////////////////////////////////////////////////////////////////
449 void calf_plugins::get_all_plugins(std::vector
<plugin_metadata_iface
*> &plugins
)
451 #define PER_MODULE_ITEM(name, isSynth, jackname) plugins.push_back(new name##_metadata);
452 #define PER_SMALL_MODULE_ITEM(...)
453 #include <calf/modulelist.h>