X-Git-Url: https://scm.cri.minesparis.psl.eu/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/architecture/maxmsp.lib diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/maxmsp.lib b/interpreter/preprocessor/faust-0.9.47mr3/architecture/maxmsp.lib new file mode 100644 index 0000000..27b2e92 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/architecture/maxmsp.lib @@ -0,0 +1,226 @@ +/************************************************************************ + ************************************************************************ + FAUST library file + Copyright (C) 2003-2011 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + ************************************************************************ + ************************************************************************/ + +declare name "MaxMSP compatibility Library"; +declare author "GRAME"; +declare copyright "GRAME"; +declare version "1.0"; +declare license "LGPL"; + +import("music.lib"); + + +atodb = db2lin; + +//------------------------------------------------------------------------- +// +// Implementation of MaxMSP filtercoeff +// +// from : Cookbook formulae for audio EQ biquad filter coefficients +// by : Robert Bristow-Johnson +// URL : http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt +// +//------------------------------------------------------------------------- + +filtercoeff(f0, dBgain, Q) = environment +{ + //---------------------------------------- + // biquad coeffs for various filters + // usage : filtercoeff(f0, dBgain, Q).LPF + //---------------------------------------- + + LPF = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = (1 - cos(w0))/2; + b1 = 1 - cos(w0); + b2 = (1 - cos(w0))/2; + a0 = 1 + alpha; + a1 = -2*cos(w0); + a2 = 1 - alpha; + }; + + HPF = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = (1 + cos(w0))/2; + b1 = -1 - cos(w0); + b2 = (1 + cos(w0))/2; + a0 = 1 + alpha; + a1 = -2*cos(w0); + a2 = 1 - alpha; + }; + + BPF = rbjcoef( a0, a1, a2, b0, b1, b2 ) // constant 0 dB peak gain + with { + b0 = alpha; + b1 = 0; + b2 = -alpha; + a0 = 1 + alpha; + a1 = -2*cos(w0); + a2 = 1 - alpha; + }; + + notch = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = 1; + b1 = -2*cos(w0); + b2 = 1; + a0 = 1 + alpha; + a1 = -2*cos(w0); + a2 = 1 - alpha; + }; + + APF = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = 1 - alpha; + b1 = -2*cos(w0); + b2 = 1 + alpha; + a0 = 1 + alpha; + a1 = -2*cos(w0); + a2 = 1 - alpha; + }; + + peakingEQ = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = 1 + alpha*A; + b1 = -2*cos(w0); + b2 = 1 - alpha*A; + a0 = 1 + alpha/A; + a1 = -2*cos(w0); + a2 = 1 - alpha/A; + }; + + peakNotch = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = 1 + alpha*G; + b1 = -2*cos(w0); + b2 = 1 - alpha*G; + a0 = 1 + alpha/G; + a1 = -2*cos(w0); + a2 = 1 - alpha/G; + }; + + lowShelf = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = A*( (A+1) - (A-1)*cos(w0) + 2*sqrt(A)*alpha ); + b1 = 2*A*( (A-1) - (A+1)*cos(w0) ); + b2 = A*( (A+1) - (A-1)*cos(w0) - 2*sqrt(A)*alpha ); + a0 = (A+1) + (A-1)*cos(w0) + 2*sqrt(A)*alpha; + a1 = -2*( (A-1) + (A+1)*cos(w0) ); + a2 = (A+1) + (A-1)*cos(w0) - 2*sqrt(A)*alpha; + }; + + highShelf = rbjcoef( a0, a1, a2, b0, b1, b2 ) + with { + b0 = A*( (A+1) + (A-1)*cos(w0) + 2*sqrt(A)*alpha ); + b1 = -2*A*( (A-1) + (A+1)*cos(w0) ); + b2 = A*( (A+1) + (A-1)*cos(w0) - 2*sqrt(A)*alpha ); + a0 = (A+1) - (A-1)*cos(w0) + 2*sqrt(A)*alpha; + a1 = 2*( (A-1) - (A+1)*cos(w0) ); + a2 = (A+1) - (A-1)*cos(w0) - 2*sqrt(A)*alpha; + }; + + // --------------------- implementation ------------------------------ + + // convert rbj coeffs to biquad coeffs + rbjcoef(a0,a1,a2,b0,b1,b2) = (b0/a0, b1/a0, b2/a0,-a1/a0,-a2/a0); + + // common values +// alpha = sin(w0)/(2*Q); +// w0 = 2*PI*f0/Fs; + alpha = sin(w0)/(2*max(0.001,Q)); + w0 = 2*PI*max(0,f0)/Fs; + Fs = SR; + A = 10^(dBgain/40); // (for peaking and shelving EQ filters only) + G = sqrt(max(0.00001, dBgain)); // When gain is a linear values (i.e. not in dB) +}; + + +//------------------------------------------------------------------------- +// Implementation of MaxMSP biquad~ +// y[n] = a0 * x[n] + a1 * x[n-1] + a2 * x[n-2] + b1 * y[n-1] + b2 * y[n-2] +//------------------------------------------------------------------------- + +biquad(x,a0,a1,a2,b1,b2) = x : conv3(a0, a1, a2) : + ~ conv2(b1, b2) + with { + conv2(c0,c1,x) = c0*x+c1*x'; + conv3(c0,c1,c2,x) = c0*x+c1*x'+c2*x''; + }; + + +//------------------------------------------------------------------------- +// +// Filters using filtercoeff and biquad +// +//------------------------------------------------------------------------- + + +// Low Pass Filter +LPF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).LPF : biquad; + +// High Pass Filter +HPF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).HPF : biquad; + +// Band Pass Filter +BPF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).BPF : biquad; + +// notch Filter +notch(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).notch : biquad; + +// All Pass Filter +APF(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).APF : biquad; + +// ???? +peakingEQ(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).peakingEQ : biquad; + +// Max peakNotch is like peakingEQ but with a linear gain +peakNotch(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).peakNotch : biquad; + +// ???? +lowShelf(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).lowShelf : biquad; + +// ???? +highShelf(x, f0, gain, Q) = x , filtercoeff(f0,gain,Q).highShelf : biquad; + + + + +//------------------------------------------------------------------------- +// Implementation of Max/MSP line~. Generate signal ramp or envelope +// +// USAGE : line(value, time) +// value : the desired output value +// time : the interpolation time to reach this value (in milliseconds) +// +// NOTE : the interpolation process is restarted every time the desired +// output value changes. The interpolation time is sampled only then. +//------------------------------------------------------------------------- + +line (value, time) = state ~ ( _ , _ ) : ! , _ + with { + state (t , c) = nt , if( nt <= 0 , value , c + (value - c) / nt) + with { + nt = if( value != value' , samples, t - 1) ; + samples = time * SR / 1000.0 ; + } ; + } ; + +