1010 * @webBrief This is a band pass filter. 
1111 * @param parent PApplet: typically use "this" 
1212 **/ 
13- public  class  BandPass  extends  Effect <FilterBandPass > {
13+ public  class  BandPass  extends  Filter <FilterBandPass > {
14+ 
15+ 	// when set to a positive value (desired bandpass bandwidth in Hertz), any  
16+ 	// change to freq() will be followed by a re-calculation of Q that will  
17+ 	// produce the given bandwidth 
18+ 	private  float  bandwidth  = -1 ;
1419
1520	public  BandPass (PApplet  parent ) {
1621		super (parent );
@@ -22,39 +27,56 @@ protected FilterBandPass newInstance() {
2227	}
2328
2429	/** 
25- 	 * Set  the bandwidth for the  filter. 
30+ 	 * Sets  the bandwidth of this BandPass  filter. 
2631	 * @webref Effects:BandPass 
27- 	 * @webBrief Set the bandwidth for the filter. 
28- 	 * @param freq Bandwidth in Hz 
32+ 	 * @webBrief Sets the bandwidth for the filter. 
33+ 	 * @param bw the filter bandwidth in Hertz 
34+ 	 * @see BandPass#res() 
2935	 **/ 
3036	public  void  bw (float  bw ) {
31- 		// TODO check filter quality 
32- 		this .left .Q .set (this .left .frequency .get () / bw );
33- 		this .right .Q .set (this .right .frequency .get () / bw );
37+ 		this .bandwidth  = bw ;
38+ 		this .updateQ ();
39+ 	}
40+ 
41+ 	private  void  updateQ () {
42+ 		if  (this .bandwidth  > 0 ) {
43+ 			// TODO check if the value is still in the [0.1, 10] range? 
44+ 			this .res ((float ) this .left .frequency .get () / this .bandwidth );
45+ 		}
46+ 	}
47+ 
48+ 	/** 
49+ 	 * Sets a fixed Q factor for this filter. If you want to specify a fixed  
50+ 	 * bandwidth for this bandpass filter (in Hertz) that is maintained even as  
51+ 	 * the center frequency of the filter changes, use <code>bw(float)</code>  
52+ 	 * instead. 
53+ 	 * @webref Effects:BandPass 
54+ 	 * @webBrief Sets the resonance (or 'Q factor') of this filter. 
55+ 	 * @param q the desired Q factor, a value between 0.1 and 10 
56+ 	 * @see BandPass#bw() 
57+ 	 */ 
58+ 	public  void  res (float  q ) {
59+ 		super .res (q );
60+ 		this .bandwidth  = -1 ;
3461	}
3562
3663	/** 
37- 	 * Set  the cutoff  frequency for  the filter. 
64+ 	 * Sets  the center  frequency of  the filter. 
3865	 * @webref Effects:BandPass 
39- 	 * @webBrief Set  the cutoff  frequency for  the filter. 
40- 	 * @param freq Cutoff  frequency between 0 and 20000  
66+ 	 * @webBrief Sets  the center  frequency of  the filter. 
67+ 	 * @param freq the center  frequency in Hertz  
4168	 **/ 
4269	public  void  freq (float  freq ) {
43- 		this .left .frequency .set (freq );
44- 		this .right .frequency .set (freq );
45- 	}
46- 	
47- 	public  void  process (SoundObject  input , float  freq ) {
48- 		this .freq (freq );
49- 		this .process (input );
70+ 		super .freq (freq );
71+ 		this .updateQ ();
5072	}
5173
5274	/** 
5375	 * Start applying this bandpass filter to an input signal. 
5476	 * @webref Effects:BandPass 
55- 	 * @param input the sound source to apply the  filter to  
56- 	 * @param freq Cutoff  frequency between 0 and 20000  
57- 	 * @param bw Set  the bandwidth 
77+ 	 * @param input the sound source to filter 
78+ 	 * @param freq the center  frequency in Hertz  
79+ 	 * @param bw the filter  bandwidth in Hertz  
5880	 **/ 
5981	public  void  process (SoundObject  input , float  freq , float  bw ) {
6082		this .freq (freq );
@@ -63,11 +85,11 @@ public void process(SoundObject input, float freq, float bw) {
6385	}
6486
6587	/** 
66- 	 * Sets frequency and bandwidth of the filter with one method.   
88+ 	 * Sets frequency and bandwidth of the filter with one method. 
6789	 * @webref Effects:BandPass 
6890	 * @webBrief Sets frequency and bandwidth of the filter with one method. 
69- 	 * @param freq Set  the frequency 
70- 	 * @param bw Set  the bandwidth 
91+ 	 * @param freq the center  frequency in Hertz  
92+ 	 * @param bw the filter  bandwidth in Hertz  
7193	 **/ 
7294	public  void  set (float  freq , float  bw ) {
7395		this .freq (freq );
0 commit comments