FM Synthesis

FM Synthesis

frequency modulation synthesis, better known as FM synthesis, is a common sound synthesis technique that involves modulating the frequency of signals at audio-rate frequencies to produce spectrum.

This page aims to define some of the various ways to do FM synthesis in Monolith.

fosc

The fosc ugen implements a classic FM pair. The parameters it exposes are: frequency, amplitude, C:M ratio, and index. A wavetable must also be supplied as a lambda. This is usually a sine wave. Note that wavetable sizes are limited to power-of-2 sizes.

The scheme code below can be used to generate a 200hz FM oscillator with a 1:1 C:M ratio and a modulation index of 1.

(fosc 200 0.1 1 1 1 (lambda () (gen_sine (ftnew 4096))))
(out zz)

Here is the equivalent sound using inline runtcode:

(rvl "200 0.1 1 1 1 4096 ftnew gen_sine fosc")
(out zz)

The fosc scheme function is defined in 66. fosc.

fmpair/fmpair2

The fmpair node is similar to fosc (using the same code), except that it has a feedback option, and it doesn't take in amplitude.

Below is a 60hz FM pair with a 1:1 CM ratio, modulation index of 8, and the feedback amount being modulated by an LFO.

(fmpair
  (param 60)
  (param 1)
  (param 1)
  (param 8)
  (scale (flipper (phasor 0.2 0)) 0 0.9)
  (lambda () (gen_sine (ftnew 4096))))
(mul zz 0.2)
(out zz)

And the equivalent inline runt code:

(rvl "60 1 1 8")
(rvl "0.2 0 phasor flipper 0 0.9 scale")
(rvl "4096 ftnew gen_sine fmpair 0.2 mul")
(out zz)

fmpair2 works like fmpair, but it allows one to use different wavetables for the carrier and modulator. Here's the example from above using a wavetable gen_sinesum to create a carrier wavetable with a bit more spectrum:

(fmpair2
  (param 60)
  (param 1)
  (param 1)
  (param 8)
  (scale (flipper (phasor 0.2 0)) 0 0.7)
  (lambda () (gen_sine (ftnew 4096)))
  (lambda ()
    (gen_sinesum
      (ftnew 4096)
      "1 0.5 1 0.5 0.2 0.2 0.9" )))
(mul zz 0.2)
(out zz)

The fmpair scheme functions are defined in 106. fmpair/fmpair2.