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 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)
fosc scheme function is defined
in 66. fosc.
fmpair node is similar to
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
(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.