Dynamic FM synthesis

Till Bovermann, Julian Parker (2013)

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.


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.


    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

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 998Hz. The decay time τ of the filter is 2 seconds.

Output (wav) of a four-resonator feedforward system, excited by an impulse.

Code examples

The central implementation elements for the Compar/ComparFeedback instruments are given below. Full code examples including GUI control elements can be downloaded here.

Central element of the Compar instrument:

// FM network
dst = freqs.inject([filterIn, 0], {|in, freq, i|
  tmpIter = filterIn,
    freq + (fms[i] * in[0]),
    decays[i] );
  [ tmpIter * amps[i], in[1] + tmpIter ] });
dst = * [1,  amps.sum * numNodes.reciprocal]);

Central element of the ComparFeedback instrument:

// FM network
feedbacks =;

filterIn = preAmp * in;
oscs = freqs.inject([], {|oscArray, freq, i|
  tmpOsc =,
    + 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]) }),
  oscArray ++ tmpOsc;
}); // end inject; // feedback is pre-"fader"
filterOut = oscs * amps * postAmp;

Articles related to ComplexRes are tagged with 'ugen'.