A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 94 lines 2.1 kB view raw
1/* (C) Guenter Geiger <geiger@epy.co.at> */ 2 3 4/* 5 6 These filter coefficients computations are taken from 7 http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt 8 9 written by Robert Bristow-Johnson 10 11*/ 12 13#ifdef ROCKBOX 14#include "plugin.h" 15#include "../../pdbox.h" 16#include "../src/m_pd.h" 17#include "../../math.h" 18#include "filters.h" 19#else /* ROCKBOX */ 20#include "../src/m_pd.h" 21#ifdef NT 22#pragma warning( disable : 4244 ) 23#pragma warning( disable : 4305 ) 24#endif 25#include <math.h> 26#include "filters.h" 27#endif /* ROCKBOX */ 28 29 30/* ------------------- lowpass ----------------------------*/ 31 32static t_class *lowpass_class; 33 34void lowpass_bang(t_rbjfilter *x) 35{ 36 t_atom at[5]; 37 t_float omega = e_omega(x->x_freq,x->x_rate); 38 t_float alpha = e_alpha(x->x_bw*0.01,omega); 39 t_float b1 = 1 - cos(omega); 40 t_float b0 = b1/2.; 41 t_float b2 = b0; 42 t_float a0 = 1 + alpha; 43 t_float a1 = -2.*cos(omega); 44 t_float a2 = 1 - alpha; 45 46/* post("bang %f %f %f",x->x_freq, x->x_gain, x->x_bw); */ 47 48 if (!check_stability(-a1/a0,-a2/a0,b0/a0,b1/a0,b2/a0)) { 49 post("lowpass: filter unstable -> resetting"); 50 a0=1.;a1=0.;a2=0.; 51 b0=1.;b1=0.;b2=0.; 52 } 53 54 SETFLOAT(at,-a1/a0); 55 SETFLOAT(at+1,-a2/a0); 56 SETFLOAT(at+2,b0/a0); 57 SETFLOAT(at+3,b1/a0); 58 SETFLOAT(at+4,b2/a0); 59 60 outlet_list(x->x_obj.ob_outlet,&s_list,5,at); 61} 62 63 64void lowpass_float(t_rbjfilter *x,t_floatarg f) 65{ 66 x->x_freq = f; 67 lowpass_bang(x); 68} 69 70 71static void *lowpass_new(t_floatarg f,t_floatarg bw) 72{ 73 t_rbjfilter *x = (t_rbjfilter *)pd_new(lowpass_class); 74 75 x->x_rate = 44100.0; 76 outlet_new(&x->x_obj,&s_float); 77/* floatinlet_new(&x->x_obj, &x->x_gain); */ 78 floatinlet_new(&x->x_obj, &x->x_bw); 79 80 if (f > 0.) x->x_freq = f; 81 if (bw > 0.) x->x_bw = bw; 82 return (x); 83} 84 85 86void lowpass_setup(void) 87{ 88 lowpass_class = class_new(gensym("lowpass"), (t_newmethod)lowpass_new, 0, 89 sizeof(t_rbjfilter), 0,A_DEFFLOAT,A_DEFFLOAT,0); 90 class_addbang(lowpass_class,lowpass_bang); 91 class_addfloat(lowpass_class,lowpass_float); 92} 93 94