LMMS
Loading...
Searching...
No Matches
tap_reverb.h
Go to the documentation of this file.
1/* -*- linux-c -*-
2 Copyright (C) 2004 Tom Szilagyi
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17*/
18#ifndef _ISOC99_SOURCE
19#define _ISOC99_SOURCE
20#endif
21
22#include "tap_platform.h"
23#include <stdint.h>
24
25
26
27/* The Unique ID of the plugin: */
28
29#define ID_STEREO 2142
30
31/* The port numbers for the plugin: */
32
33#define DECAY 0
34#define DRYLEVEL 1
35#define WETLEVEL 2
36#define COMBS_EN 3 /* comb filters on/off */
37#define ALLPS_EN 4 /* allpass filters on/off */
38#define BANDPASS_EN 5 /* bandpass filters on/off */
39#define STEREO_ENH 6 /* stereo enhanced mode on/off */
40#define MODE 7
41
42#define INPUT_L 8
43#define OUTPUT_L 9
44#define INPUT_R 10
45#define OUTPUT_R 11
46
47/* Total number of ports */
48
49#define PORTCOUNT_STEREO 12
50
51/* Global constants (times in ms, bwidth in octaves) */
52
53#define MAX_COMBS 20
54#define MAX_ALLPS 20
55#define MAX_DECAY 10000.0f
56#define MAX_COMB_DELAY 250.0f
57#define MAX_ALLP_DELAY 20.0f
58#define BANDPASS_BWIDTH 1.5f
59#define FREQ_RESP_BWIDTH 3.0f
60#define ENH_STEREO_RATIO 0.998f
61
62/* compensation ratio of freq_resp in fb_gain calc */
63#define FR_R_COMP 0.75f
64
65/* push a sample into a ringbuffer and return the sample falling out */
66static inline
68push_buffer(rev_t insample, rev_t * buffer,
69 unsigned long buflen, unsigned long * pos) {
70
71 rev_t outsample;
72
73 outsample = buffer[*pos];
74 buffer[(*pos)++] = insample;
75
76 if (*pos >= buflen)
77 *pos = 0;
78
79 return outsample;
80}
81
82/* read a value from a ringbuffer.
83 * n == 0 returns the oldest sample from the buffer.
84 * n == buflen-1 returns the sample written to the buffer
85 * at the last push_buffer call.
86 * n must not exceed buflen-1, or your computer will explode.
87 */
88static inline
90read_buffer(rev_t * buffer, unsigned long buflen,
91 unsigned long pos, unsigned long n) {
92
93 while (n + pos >= buflen)
94 n -= buflen;
95 return buffer[n + pos];
96}
97
98
99/* overwrites a value in a ringbuffer, but pos stays the same.
100 * n == 0 overwrites the oldest sample pushed in the buffer.
101 * n == buflen-1 overwrites the sample written to the buffer
102 * at the last push_buffer call.
103 * n must not exceed buflen-1, or your computer... you know.
104 */
105static inline
106void
107write_buffer(rev_t insample, rev_t * buffer, unsigned long buflen,
108 unsigned long pos, unsigned long n) {
109
110 while (n + pos >= buflen)
111 n -= buflen;
112 buffer[n + pos] = insample;
113}
114
115#define db2lin(x) ((x) > -90.0f ? powf(10.0f, (x) * 0.05f) : 0.0f)
116#define ABS(x) (x)>0.0f?(x):-1.0f*(x)
117#define LN_2_2 0.34657359f
118#define LIMIT(v,l,u) ((v)<(l)?(l):((v)>(u)?(u):(v)))
119
120#define BIQUAD_TYPE float
121typedef BIQUAD_TYPE bq_t;
122
123typedef struct {
124 bq_t a1;
125 bq_t a2;
126 bq_t b0;
127 bq_t b1;
128 bq_t b2;
133} biquad;
134
135
136static inline void biquad_init(biquad *f) {
137
138 f->x1 = 0.0f;
139 f->x2 = 0.0f;
140 f->y1 = 0.0f;
141 f->y2 = 0.0f;
142}
143
144static inline
145void
146eq_set_params(biquad *f, bq_t fc, bq_t gain, bq_t bw, bq_t fs) {
147
148 bq_t w = 2.0f * M_PI * LIMIT(fc, 1.0f, fs/2.0f) / fs;
149 bq_t cw = cosf(w);
150 bq_t sw = sinf(w);
151 bq_t J = pow(10.0f, gain * 0.025f);
152 bq_t g = sw * sinhf(LN_2_2 * LIMIT(bw, 0.0001f, 4.0f) * w / sw);
153 bq_t a0r = 1.0f / (1.0f + (g / J));
154
155 f->b0 = (1.0f + (g * J)) * a0r;
156 f->b1 = (-2.0f * cw) * a0r;
157 f->b2 = (1.0f - (g * J)) * a0r;
158 f->a1 = -(f->b1);
159 f->a2 = ((g / J) - 1.0f) * a0r;
160}
161
162static inline void lp_set_params(biquad *f, bq_t fc, bq_t bw, bq_t fs) {
163 bq_t omega = 2.0 * M_PI * fc/fs;
164 bq_t sn = sin(omega);
165 bq_t cs = cos(omega);
166 bq_t alpha = sn * sinh(M_LN2 / 2.0 * bw * omega / sn);
167 const float a0r = 1.0 / (1.0 + alpha);
168 f->b0 = a0r * (1.0 - cs) * 0.5;
169 f->b1 = a0r * (1.0 - cs);
170 f->b2 = a0r * (1.0 - cs) * 0.5;
171 f->a1 = a0r * (2.0 * cs);
172 f->a2 = a0r * (alpha - 1.0);
173}
174
175static inline
176void
178{
179 bq_t omega = 2.0 * M_PI * fc/fs;
180 bq_t sn = sin(omega);
181 bq_t cs = cos(omega);
182 bq_t alpha = sn * sinh(M_LN2 / 2.0 * bw * omega / sn);
183 const float a0r = 1.0 / (1.0 + alpha);
184 f->b0 = a0r * (1.0 + cs) * 0.5;
185 f->b1 = a0r * -(1.0 + cs);
186 f->b2 = a0r * (1.0 + cs) * 0.5;
187 f->a1 = a0r * (2.0 * cs);
188 f->a2 = a0r * (alpha - 1.0);
189}
190
191static inline
192rev_t
194
195 union {
196 rev_t y;
197 uint32_t y_int;
198 } u;
199
200 u.y = f->b0 * x + f->b1 * f->x1 + f->b2 * f->x2
201 + f->a1 * f->y1 + f->a2 * f->y2;
202#ifdef REVERB_CALC_FLOAT
203 if ((u.y_int & 0x7f800000) == 0)
204 u.y = 0.0f;
205#endif
206 f->x2 = f->x1;
207 f->x1 = x;
208 f->y2 = f->y1;
209 f->y1 = u.y;
210
211 return u.y;
212}
213
214
215
216typedef struct {
217 float feedback;
218 float fb_gain;
221 unsigned long buflen;
222 unsigned long * buffer_pos;
226
227typedef struct {
228 float feedback;
229 float fb_gain;
230 float in_gain;
232 unsigned long buflen;
233 unsigned long * buffer_pos;
236
237
238/* The structure used to hold port connection information and state */
239
240typedef struct {
241 unsigned long num_combs; /* total number of comb filters */
242 unsigned long num_allps; /* total number of allpass filters */
245 biquad * low_pass; /* ptr to 2 low-pass filters */
246 biquad * high_pass; /* ptr to 2 high-pass filters */
247 unsigned long sample_rate;
248
252 LADSPA_Data * combs_en; /* on/off */
253 LADSPA_Data * allps_en; /* on/off */
254 LADSPA_Data * bandpass_en; /* on/off */
255 LADSPA_Data * stereo_enh; /* on/off */
257
262
266
268} Reverb;
269
275
280
#define M_LN2
Definition compat.h:146
#define M_PI
Definition compat.h:149
UINT_D64 w
Definition inflate.c:942
int y
Definition inflate.c:1588
int g
Definition inflate.c:1573
struct huft * u[BMAX]
Definition inflate.c:1583
unsigned x[BMAX+1]
Definition inflate.c:1586
unsigned f
Definition inflate.c:1572
float LADSPA_Data
Definition ladspa.h:84
unsigned int uint32_t
Definition mid.cpp:100
Definition tap_reverb.h:276
LADSPA_Data feedback
Definition tap_reverb.h:278
LADSPA_Data delay
Definition tap_reverb.h:277
Definition tap_reverb.h:227
rev_t last_out
Definition tap_reverb.h:234
rev_t * ringbuffer
Definition tap_reverb.h:231
unsigned long * buffer_pos
Definition tap_reverb.h:233
unsigned long buflen
Definition tap_reverb.h:232
float fb_gain
Definition tap_reverb.h:229
float feedback
Definition tap_reverb.h:228
float in_gain
Definition tap_reverb.h:230
Definition tap_reverb.h:270
LADSPA_Data delay
Definition tap_reverb.h:271
LADSPA_Data feedback
Definition tap_reverb.h:272
LADSPA_Data freq_resp
Definition tap_reverb.h:273
Definition tap_reverb.h:216
rev_t * ringbuffer
Definition tap_reverb.h:220
float fb_gain
Definition tap_reverb.h:218
float freq_resp
Definition tap_reverb.h:219
unsigned long buflen
Definition tap_reverb.h:221
float feedback
Definition tap_reverb.h:217
unsigned long * buffer_pos
Definition tap_reverb.h:222
rev_t last_out
Definition tap_reverb.h:224
biquad * filter
Definition tap_reverb.h:223
Definition tap_reverb.h:281
unsigned long num_allps
Definition tap_reverb.h:283
ALLP_DATA allps[MAX_ALLPS]
Definition tap_reverb.h:285
LADSPA_Data bandpass_high
Definition tap_reverb.h:287
LADSPA_Data bandpass_low
Definition tap_reverb.h:286
COMB_DATA combs[MAX_COMBS]
Definition tap_reverb.h:284
unsigned long num_combs
Definition tap_reverb.h:282
Definition tap_reverb.h:240
biquad * high_pass
Definition tap_reverb.h:246
LADSPA_Data * decay
Definition tap_reverb.h:249
LADSPA_Data old_mode
Definition tap_reverb.h:265
LADSPA_Data * input_L
Definition tap_reverb.h:258
ALLP_FILTER * allps
Definition tap_reverb.h:244
LADSPA_Data * mode
Definition tap_reverb.h:256
LADSPA_Data * drylevel
Definition tap_reverb.h:250
LADSPA_Data * stereo_enh
Definition tap_reverb.h:255
LADSPA_Data old_stereo_enh
Definition tap_reverb.h:264
LADSPA_Data * output_R
Definition tap_reverb.h:261
LADSPA_Data * wetlevel
Definition tap_reverb.h:251
LADSPA_Data * combs_en
Definition tap_reverb.h:252
unsigned long num_allps
Definition tap_reverb.h:242
biquad * low_pass
Definition tap_reverb.h:245
LADSPA_Data * output_L
Definition tap_reverb.h:259
unsigned long sample_rate
Definition tap_reverb.h:247
LADSPA_Data * bandpass_en
Definition tap_reverb.h:254
unsigned long num_combs
Definition tap_reverb.h:241
LADSPA_Data * input_R
Definition tap_reverb.h:260
COMB_FILTER * combs
Definition tap_reverb.h:243
LADSPA_Data old_decay
Definition tap_reverb.h:263
LADSPA_Data * allps_en
Definition tap_reverb.h:253
LADSPA_Data run_adding_gain
Definition tap_reverb.h:267
Definition biquad.h:21
bq_t x2
Definition biquad.h:28
bq_t x1
Definition biquad.h:27
bq_t y1
Definition biquad.h:29
bq_t y2
Definition biquad.h:30
#define BIQUAD_TYPE
Definition biquad.h:13
#define LN_2_2
Definition biquad.h:4
BIQUAD_TYPE bq_t
Definition biquad.h:16
sample rev_t
Definition tap_reverb.c:47
#define MAX_ALLPS
Definition tap_reverb.h:54
static void biquad_init(biquad *f)
Definition tap_reverb.h:136
#define MAX_COMBS
Definition tap_reverb.h:53
static void write_buffer(rev_t insample, rev_t *buffer, unsigned long buflen, unsigned long pos, unsigned long n)
Definition tap_reverb.h:107
static rev_t read_buffer(rev_t *buffer, unsigned long buflen, unsigned long pos, unsigned long n)
Definition tap_reverb.h:90
static void eq_set_params(biquad *f, bq_t fc, bq_t gain, bq_t bw, bq_t fs)
Definition tap_reverb.h:146
static rev_t biquad_run(biquad *f, rev_t x)
Definition tap_reverb.h:193
static void lp_set_params(biquad *f, bq_t fc, bq_t bw, bq_t fs)
Definition tap_reverb.h:162
static void hp_set_params(biquad *f, bq_t fc, bq_t bw, bq_t fs)
Definition tap_reverb.h:177
static rev_t push_buffer(rev_t insample, rev_t *buffer, unsigned long buflen, unsigned long *pos)
Definition tap_reverb.h:68
#define LIMIT(v, l, u)
Definition tap_reverb.h:118
int n
Definition crypt.c:458