ComplexRes

— Dynamic FM synthesis

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;