Frequency Modulation (FM) Synthesis
A prominent, yet not always clearly understood, synthesis process is
Frequency Modulation.
It had been used widely for radio transmission, but was not used for music
until the early 1970s when John Chowning discovered its usefulness.
FM synthesis is quite efficient in that it can create complex sounds from
a few simple sine waves.
The Yamaha DX7 synthesisizer was the first widely availible synthesizer
to use FM synthesis.
Below is the diagram of a simple implementation in jMusic.
As you can see, there are two wavetables, each of which uses a sine wave
oscillator.
The top-most wavetable is called the 'modulator' because it is not heard
directly, just indirectly via the effect it has on the bottom wavetable,
which is called the 'carrier'.
There are two important varibles which effect the timbre, firstly, the
relative frequencies of the carrier and modulator.
This is referred to as the modulation ratio or the C:M ratio.
For example, if the carrier frequency is 400hz and the modulator frequency
is 600hz, then the C:M ratio is 1.5.
The C:M ratio will determine the spread of overtones produced, and thus
the timbre.
Simple integer ratios will produce harmonic (pleasant) sounds while non-simple
ratios will produce inharmonic (clanging) sounds.
The second imporant variable is the amplitude of the modulator, called
the 'modulation index.'
The modulation index will effect the loudness of the sideband overtones,
so the higher the modulation index the more prominent the n overtones
will be.
In this way the modulation index acts similarly to a low pass filter in
a subtractive synthesis system.
The final Audio file will sound like this:
To simply use FM (rather than mess with it)
try the FMTest class in the demos directory of the jMusic download.
Lets have a closer look at the core of the
FM instrument class.
public void createChain()throws AOException{
Value modFrequency = new Value(this, this.sampleRate,
this.channels, Value.NOTE_PITCH);
Oscillator modulator = new Oscillator(modFrequency, Oscillator.SINE_WAVE, Oscillator.FREQUENCY); modulator.setFrqRatio(frqRatio); modulator.setAmp((float)modIndex); Envelope env = new Envelope(modulator, new double[] {0.0, 0.0, 0.5, 1.0, 1.0, 0.0});
Value constFreq = new Value(this, this.sampleRate, this.channels,
Value.NOTE_PITCH);
Add add = new Add(new AudioObject[] {constFreq, env});
Oscillator carrier = new Oscillator(add, Oscillator.SINE_WAVE,
Oscillator.FREQUENCY);
Envelope env2 = new Envelope(carrier,
new double[] {0.0, 0.0, 0.1, 1.0, 1.0, 0.0});
Volume amp = new Volume(env2); //, 200.0);
SampleOut sout = new SampleOut(amp);
} |
A class to test this instrument is shown
below:
Click here to view source.
import jm.JMC; import jm.music.data.*; import jm.midi.*; import jm.audio.*; import util.View; import util.Write;
public final class FMTest implements JMC{
public static void main(String[] args){
Score s = new Score();
Part p = new Part("Flute",0);
Phrase phr = new Phrase();
SimpleFMInst inst = new SimpleFMInst(22000, 400, 7.2);
Instrument[] ensemble = {inst};
for(int i=0;i<6;i++) {
Note n = new Note(A2+i*6, 0.5*(i+1));
phr.addNote(n);
}
p.addPhrase(phr);
s.addPart(p);
s.show();
Write.au(s, "FMTest.au",ensemble);
}
} |
How the SimpleFMInst is created?
There are three parametres in its constructor:
The first is the sample rate, the second is the Modulation index,
and the last is the Carrier/Modulator pitch ratio.
Try playing with the settings and see how it affects the sound!
|