00 /**********************************************************************
01 Copyright (c) 2014 Mark C. Erickson
02
03 Permission is hereby granted, free of charge, to any person obtaining
04 a copy of this software and associated documentation files (the
05 "Software"), to deal in the Software without restriction, including
06 without limitation the rights to use, copy, modify, merge, publish,
07 distribute, sublicense, and/or sell copies of the Software, and to
08 permit persons to whom the Software is furnished to do so, subject to
09 the following conditions:
10
11 The above copyright notice and this permission notice shall be included
12 in all copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 **********************************************************************/
22
Disclaimer...
23 desc:EQ, Biquad, v1.0.1
24
25 slider1:0<0,7,1{Low-Pass,High-Pass,Bandpass,Notch,All-Pass,Peak,Low-Shelf,High-Shelf}>Type
26 slider2:0<-18,18,0.1>Boost/Cut
27 slider3:1000<20,20000,1>Frequency
28 slider4:2<.25,10,0.1>Q
29 slider5:0<-20,12,0.1>Output Gain
30
31
32 @init
33 a0=1;
34 a1=-1.66365511325602; // LUFS 44k prefileter
35 a2=0.71259542807323;
36 b0=1.53084123005035;
37 b1=-2.65097999515473;
38 b2=1.16907907992159;
39
40 x=0;
41 x1=0;
42 x2=0;
43 y=0;
44 y1=0;
45 y2=0;
46
47 mFreq = 1000.0;
48 mType = 0;
49 mBoost = 0.0;
50 mSR = srate;
51 mBW = 2.0;
52 mGain = 0.0;
53
54
55 @slider
56 mType = slider1;
57 mBoost = slider2;
58 mFreq = slider3;
59 mQ = slider4;
60 mGain = slider5;
61 gain = pow( 10.0, mGain / 20.0 );
62
63 A = sqrt( pow( 10.0, mBoost / 20.0 ));
64 omega = 2.0 * $pi * mFreq / mSR;
65 sn = sin( omega );
66 cs = cos( omega );
67 alpha = sn / ( 2 * mQ );
68 beta = sqrt(A) / mQ;
69
70 // LPF
71 mType == 0 ? (
72 b0 = (1 - cs) / 2.0;
73 b1 = 1 - cs;
74 b2 = (1 - cs) / 2.0;
75 a0 = 1 + alpha;
76 a1 = -2 * cs;
77 a2 = 1 - alpha;
78 );
79
80 // HPF
81 mType == 1 ? (
82 b0 = (1 + cs) / 2.0;
83 b1 = -(1 + cs);
84 b2 = (1 + cs) / 2.0;
85 a0 = 1 + alpha;
86 a1 = -2 * cs;
87 a2 = 1 - alpha;
88 );
89
90 // BP
91 mType == 2 ? (
92 b0 = alpha;
93 b1 = 0;
94 b2 = -alpha;
95 a0 = 1 + alpha;
96 a1 = -2 * cs;
97 a2 = 1 - alpha;
98 );
99
100 // NOTCH
101 mType == 3 ? (
102 b0 = 1;
103 b1 = -2 * cs;
104 b2 = 1;
105 a0 = 1 + alpha;
106 a1 = -2 * cs;
107 a2 = 1 - alpha;
108 );
109
110 // APF
111 mType == 4 ? (
112 b0 = 1.0 - alpha;
113 b1 = -2.0 * cs;
114 b2 = 1.0 + alpha;
115 a0 = 1.0 + alpha;
116 a1 = -2.0 * cs;
117 a2 = 1.0 - alpha;
118 );
119
120 // PEAK
121 mType == 5 ? (
122 b0 = 1.0 + ( alpha * A );
123 b1 = -2.0 * cs;
124 b2 = 1.0 - ( alpha * A );
125 a0 = 1.0 + ( alpha / A );
126 a1 = -2.0 * cs;
127 a2 = 1.0 - ( alpha / A );
128 );
129
130 // LSHELF
131 mType == 6 ? (
132 b0 = A * ((A + 1) - (A - 1) * cs + beta * sn);
133 b1 = 2 * A * ((A - 1) - (A + 1) * cs);
134 b2 = A * ((A + 1) - (A - 1) * cs - beta * sn);
135 a0 = (A + 1) + (A - 1) * cs + beta * sn;
136 a1 = -2 * ((A - 1) + (A + 1) * cs);
137 a2 = (A + 1) + (A - 1) * cs - beta * sn;
138 );
139
140 // HSHELF
141 mType == 7 ? (
142 b0 = A * ((A + 1) + (A - 1) * cs + beta * sn);
143 b1 = -2 * A * ((A - 1) + (A + 1) * cs);
144 b2 = A * ((A + 1) + (A - 1) * cs - beta * sn);
145 a0 = (A + 1) - (A - 1) * cs + beta * sn;
146 a1 = 2 * ((A - 1) - (A + 1) * cs);
147 a2 = (A + 1) - (A - 1) * cs - beta * sn;
148 );
149
150 // precompute the coefficients //
151 q0 = b0 / a0;
152 q1 = b1 / a0;
153 q2 = b2 / a0;
154 q3 = a1 / a0;
155 q4 = a2 / a0;
156
157
158 @sample
159 x2 = x1;
160 x1 = x;
161 x = spl0;
162 y2 = y1;
163 y1 = y;
164 y = q0*x + q1*x1 + q2*x2 - q3*y1 - q4*y2;
165 spl0 = y * gain;
166