It is a well known analogue synthesis technique; set the resonance so high that the filter goes into self oscillation and then play it as a separate tone source.
Can we do something similar with the filters on Sonic Field? The answer would appear to be yes; indeed I managed to take it a little further and mimic some of the filter based flute effects I got out of the Waldorf Pulse II analogue synthesiser. First, let us have a listen to that analogue filter playing technique:
Filter Playing Demo
Getting that sound required a little more than making the filter into a simple oscillator. To get the full effect the filter is tuned to almost oscillate; then white noise and a tiny bit of a triangle wave at the correct pitch is fed in. The triangle wave acts as a 'seed' to make sure the filter snaps to the correct pitch; without this the filter can take a long time to settle down to the correct frequency and the resulting tone wandering is like fingernails on a blackboard. The white noise makes sure the filter does oscillate and do so strongly so that we then do not really hear any of the triangle wave.
In Sonic Field we have the RBJ 'peaking' filter. This acts like an 'almost oscillating' filter when the resonance is set very high indeed. Recently I have written a python module to wrap the RBJ filters so that they are a little easier to use; it is these wrapped versions I will discuss using here.
Here is the signal generator I created. This was used to play the third voice in this piece (start about 1/3 of the way through if you want to here just the effect:
Pontchartrain Folk Mix
@sf_parallel def tuned_wind(length,freq): sigs=[] for i in range(1,3): sig=byquad_filter( 'peak', byquad_filter( 'peak', sf.Mix( clean_noise(length,freq), sf.Pcnt10(sf.SineWave(length,freq)) ), 1.0, 64 ), freq, 0.1, 64 ) sig=byquad_filter( 'peak', sig, freq, 1.0, 128 ) sig=sf.FixSize(excite(sig,1.0,2.0)) sig=sf.FixSize(sf.Saturate(sf.NumericVolume(sig,2.0))) sig=create_vibrato( sig,length, longer_than=0.5, rate=2.5, at=0.45, depth=0.5, pitch_depth=0.02 ) sigs.append(sig) sig=mix(sigs) return sf.FixSize(polish(sig,freq))
OK, I might have written it in a clearer way. What is does is chain 3 RBJ peaking filters in sequence. The inner filter is fed with a mix of a triangle wave and white noise just like with the Waldorf.
byquad_filter( 'peak', sf.Mix( clean_noise(length,freq), sf.Pcnt10(sf.SineWave(length,freq)) ), 1.0, 64 ), freq, 0.1, 64 )
That creates a tone which is recognisably a note but very noisy. To get the full effect I then pass that through two more filters, one with a resonance of 128 and a Q of 1 and finally one with a lower resonance of 64 but a Q (width) of 0.1 (which is very narrow). This makes the note sound. However, it is very unstable in volume. To even this out, I overlay three renderings of the note. Each rendering is fed with different white noise so is unstable in volume at different positions; the end result is usably stable but still has a very organic, variable sound to it.
I liked the unstable sound so much I mixed it with a more traditional additive synthesis flute sound to make this re-imagining of Bach's BWV 1013 part 2. For this piece, the tuned filter noise consistently sound as though they are after then transitional flue synthesis due to the way the filter effect takes a few milliseconds to 'get going'. To compensate I delayed the traditional synth'ed flute a little which makes the two sound as though they are simultaneous.