ComplexRes
2013 by Till Bovermann, Julian Parker
This page accompanies the paper Dynamic FM synthesis using a network of complex resonator filters by Julian Parker and Till Bovermann, presented at SMC 2013. It was developed as part of the DEIND project. The paper can be found here.
Abstract Link to heading
There is a strong analogy between the sinusoidal operator used in FM synthesis, and the resonator filter. When implemented in a direct-form structure, a resonator filter is not suitable for use as a substitute for an FM operator, as it is not stable under centre frequency modulation. Recent, more robust resonator filter structures have made this use a possibility. We examine the properties of this structure that makes it appropriate for this application, and describe how a network of these filters can be combined to form a dynamic FM synthesis network. We discuss the possible range of sounds that can be produced by this structure, and describe its application to a performance system for improvised electroacoustic music.
ComplexRes
is available as a plugin for SuperCollider. For sources and details on how to install, see the official sc3-plugin repository.
BibTeX Link to heading
@inproceedings{parker2013-dyn,
Address = {Stockholm},
Author = {Parker, J. and Bovermann, T.},
Booktitle = {Proceedings of the Sound and Music Computing Conference 2013},
Pages = {668 -- 673},
Publisher = {KTH Royal Institute of Technology, Sound and Music Computing Group},
Title = {Dynamic FM synthesis using a network of complex resonator filters},
Year = {2013}}
Basic sound examples Link to heading
Output (wav) of modulated complex resonator excited with an impulse. Centre frequency f_c = 1028 Hz
, modulated with a 642 Hz sinusoid with a modulation depth of 998 Hz. The decay time τ of the filter is 2 seconds.
Output (wav) of a four-resonator feedforward system, excited by an impulse.
Code examples Link to heading
The central implementation elements for the Compar
/ComparFeedback
instruments are given below. Full code examples including GUI control elements can be downloaded as a gist from here.
Central element of the Compar
instrument:
// FM network
dst = freqs.inject([filterIn, 0], {|in, freq, i|
tmpIter = ComplexRes.ar( filterIn,
freq + (fms[i] * in[0]),
decays[i] );
[ tmpIter * amps[i], in[1] + tmpIter ] });
dst = Mix.ar(dst * [1, amps.sum * numNodes.reciprocal]);
Central element of the ComparFeedback
instrument:
// FM network
feedbacks = LocalIn.ar(numOscs);
filterIn = preAmp * in;
oscs = freqs.inject([], {|oscArray, freq, i|
tmpOsc = ComplexRes.ar(filterIn,
freq
+ oscArray.inject(0, {|sum, osc, j|
// modulators from already instantiated oscs
sum + (feedbacks[j] * modParams[i][j]) })
+ (numOscs - 1 - Array.iota(numOscs - (i))).inject(0, {|sum, g|
// modulators from to be instantiated oscs
sum + (feedbacks[g] * modParams[i][g]) }),
decays[i]
);
oscArray ++ tmpOsc;
}); // end inject
LocalOut.ar(oscs); // feedback is pre-"fader"
filterOut = oscs * amps * postAmp;