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 65. 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 105. fmpair/fmpair2.