11
#define _ISOC9X_SOURCE 1
12
#define _ISOC99_SOURCE 1
13
#define __USE_ISOC99 1
14
#define __USE_ISOC9X 1
21
#define _WINDOWS_DLL_EXPORT_ __declspec(dllexport)
23
void _init(); // forward declaration
25
#define _WINDOWS_DLL_EXPORT_
28
#line 10 "freq_tracker_1418.xml"
30
#include "ladspa-util.h"
32
#define FREQTRACKER_SPEED 0
33
#define FREQTRACKER_INPUT 1
34
#define FREQTRACKER_FREQ 2
36
static LADSPA_Descriptor *freqTrackerDescriptor = NULL;
47
LADSPA_Data run_adding_gain;
51
const LADSPA_Descriptor *ladspa_descriptor(unsigned long index) {
61
return freqTrackerDescriptor;
67
static void activateFreqTracker(LADSPA_Handle instance) {
68
FreqTracker *plugin_data = (FreqTracker *)instance;
69
int cross_time = plugin_data->cross_time;
70
LADSPA_Data f = plugin_data->f;
71
LADSPA_Data fo = plugin_data->fo;
72
float fs = plugin_data->fs;
73
LADSPA_Data last_amp = plugin_data->last_amp;
74
#line 27 "freq_tracker_1418.xml"
79
plugin_data->cross_time = cross_time;
83
plugin_data->last_amp = last_amp;
87
static void cleanupFreqTracker(LADSPA_Handle instance) {
91
static void connectPortFreqTracker(
92
LADSPA_Handle instance,
97
plugin = (FreqTracker *)instance;
99
case FREQTRACKER_SPEED:
100
plugin->speed = data;
102
case FREQTRACKER_INPUT:
103
plugin->input = data;
105
case FREQTRACKER_FREQ:
111
static LADSPA_Handle instantiateFreqTracker(
112
const LADSPA_Descriptor *descriptor,
113
unsigned long s_rate) {
114
FreqTracker *plugin_data = (FreqTracker *)malloc(sizeof(FreqTracker));
119
LADSPA_Data last_amp;
121
#line 19 "freq_tracker_1418.xml"
128
plugin_data->cross_time = cross_time;
130
plugin_data->fo = fo;
131
plugin_data->fs = fs;
132
plugin_data->last_amp = last_amp;
134
return (LADSPA_Handle)plugin_data;
141
#define buffer_write(b, v) (b = v)
143
#define RUN_REPLACING 1
145
static void runFreqTracker(LADSPA_Handle instance, unsigned long sample_count) {
146
FreqTracker *plugin_data = (FreqTracker *)instance;
148
/* Tracking speed (float value) */
149
const LADSPA_Data speed = *(plugin_data->speed);
151
/* Input (array of floats of length sample_count) */
152
const LADSPA_Data * const input = plugin_data->input;
154
/* Frequency (Hz) (array of floats of length sample_count) */
155
LADSPA_Data * const freq = plugin_data->freq;
156
int cross_time = plugin_data->cross_time;
157
LADSPA_Data f = plugin_data->f;
158
LADSPA_Data fo = plugin_data->fo;
159
float fs = plugin_data->fs;
160
LADSPA_Data last_amp = plugin_data->last_amp;
162
#line 34 "freq_tracker_1418.xml"
164
float xm1 = last_amp;
165
const float damp_lp = (1.0f - speed) * 0.9f;
166
const float damp_lpi = 1.0f - damp_lp;
168
for (pos = 0; pos < sample_count; pos++) {
169
if (input[pos] < 0.0f && xm1 > 0.0f) {
170
if (cross_time > 3.0f) {
171
f = fs / ((float)cross_time * 2.0f);
177
fo = fo * damp_lp + f * damp_lpi;
178
fo = flush_to_zero(fo);
179
buffer_write(freq[pos], fo);
182
plugin_data->last_amp = xm1;
183
plugin_data->fo = fo;
185
plugin_data->cross_time = cross_time;
191
#define buffer_write(b, v) (b += (v) * run_adding_gain)
193
#define RUN_REPLACING 0
195
static void setRunAddingGainFreqTracker(LADSPA_Handle instance, LADSPA_Data gain) {
196
((FreqTracker *)instance)->run_adding_gain = gain;
199
static void runAddingFreqTracker(LADSPA_Handle instance, unsigned long sample_count) {
200
FreqTracker *plugin_data = (FreqTracker *)instance;
201
LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
203
/* Tracking speed (float value) */
204
const LADSPA_Data speed = *(plugin_data->speed);
206
/* Input (array of floats of length sample_count) */
207
const LADSPA_Data * const input = plugin_data->input;
209
/* Frequency (Hz) (array of floats of length sample_count) */
210
LADSPA_Data * const freq = plugin_data->freq;
211
int cross_time = plugin_data->cross_time;
212
LADSPA_Data f = plugin_data->f;
213
LADSPA_Data fo = plugin_data->fo;
214
float fs = plugin_data->fs;
215
LADSPA_Data last_amp = plugin_data->last_amp;
217
#line 34 "freq_tracker_1418.xml"
219
float xm1 = last_amp;
220
const float damp_lp = (1.0f - speed) * 0.9f;
221
const float damp_lpi = 1.0f - damp_lp;
223
for (pos = 0; pos < sample_count; pos++) {
224
if (input[pos] < 0.0f && xm1 > 0.0f) {
225
if (cross_time > 3.0f) {
226
f = fs / ((float)cross_time * 2.0f);
232
fo = fo * damp_lp + f * damp_lpi;
233
fo = flush_to_zero(fo);
234
buffer_write(freq[pos], fo);
237
plugin_data->last_amp = xm1;
238
plugin_data->fo = fo;
240
plugin_data->cross_time = cross_time;
245
LADSPA_PortDescriptor *port_descriptors;
246
LADSPA_PortRangeHint *port_range_hints;
249
#define D_(s) dgettext(PACKAGE, s)
250
setlocale(LC_ALL, "");
251
bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR);
257
freqTrackerDescriptor =
258
(LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));
260
if (freqTrackerDescriptor) {
261
freqTrackerDescriptor->UniqueID = 1418;
262
freqTrackerDescriptor->Label = "freqTracker";
263
freqTrackerDescriptor->Properties =
264
LADSPA_PROPERTY_HARD_RT_CAPABLE;
265
freqTrackerDescriptor->Name =
266
D_("Frequency tracker");
267
freqTrackerDescriptor->Maker =
268
"Steve Harris <steve@plugin.org.uk>";
269
freqTrackerDescriptor->Copyright =
271
freqTrackerDescriptor->PortCount = 3;
273
port_descriptors = (LADSPA_PortDescriptor *)calloc(3,
274
sizeof(LADSPA_PortDescriptor));
275
freqTrackerDescriptor->PortDescriptors =
276
(const LADSPA_PortDescriptor *)port_descriptors;
278
port_range_hints = (LADSPA_PortRangeHint *)calloc(3,
279
sizeof(LADSPA_PortRangeHint));
280
freqTrackerDescriptor->PortRangeHints =
281
(const LADSPA_PortRangeHint *)port_range_hints;
283
port_names = (char **)calloc(3, sizeof(char*));
284
freqTrackerDescriptor->PortNames =
285
(const char **)port_names;
287
/* Parameters for Tracking speed */
288
port_descriptors[FREQTRACKER_SPEED] =
289
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
290
port_names[FREQTRACKER_SPEED] =
291
D_("Tracking speed");
292
port_range_hints[FREQTRACKER_SPEED].HintDescriptor =
293
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE;
294
port_range_hints[FREQTRACKER_SPEED].LowerBound = 0;
295
port_range_hints[FREQTRACKER_SPEED].UpperBound = 1;
297
/* Parameters for Input */
298
port_descriptors[FREQTRACKER_INPUT] =
299
LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
300
port_names[FREQTRACKER_INPUT] =
302
port_range_hints[FREQTRACKER_INPUT].HintDescriptor = 0;
304
/* Parameters for Frequency (Hz) */
305
port_descriptors[FREQTRACKER_FREQ] =
306
LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
307
port_names[FREQTRACKER_FREQ] =
308
D_("Frequency (Hz)");
309
port_range_hints[FREQTRACKER_FREQ].HintDescriptor = 0;
311
freqTrackerDescriptor->activate = activateFreqTracker;
312
freqTrackerDescriptor->cleanup = cleanupFreqTracker;
313
freqTrackerDescriptor->connect_port = connectPortFreqTracker;
314
freqTrackerDescriptor->deactivate = NULL;
315
freqTrackerDescriptor->instantiate = instantiateFreqTracker;
316
freqTrackerDescriptor->run = runFreqTracker;
317
freqTrackerDescriptor->run_adding = runAddingFreqTracker;
318
freqTrackerDescriptor->set_run_adding_gain = setRunAddingGainFreqTracker;
323
if (freqTrackerDescriptor) {
324
free((LADSPA_PortDescriptor *)freqTrackerDescriptor->PortDescriptors);
325
free((char **)freqTrackerDescriptor->PortNames);
326
free((LADSPA_PortRangeHint *)freqTrackerDescriptor->PortRangeHints);
327
free(freqTrackerDescriptor);