8v FM-2x 4
Author: Scott Gravenhorst
Verilog, designed for Spartan-3E SK, certainly adaptable for others.
8 Voice 2 Operator FM MIDI Polysynth
8vFM-2x4 is an 8 voice two operator FM MIDI polysynth. Each voice is comprised of 4 two operator FM sound generators which can be individually tuned, configured and modulated.
I have concluded that it is a misnomer to call this a 2 operator FM synthesizer. It is, in fact, an 8 operator FM synth with a 4 x 2-OP fixed structure.
Please note that I understand that this type of synthesizer, though commonly referred to as "FM" is in fact not a frequency modulated system. Instead, it is a phase modulated or "PM" system.
The main reason I wanted to do this project was for bells and chimes. I had heard that FM is good for them. I had tried doing them with a linear arithmetic synth design (GateManPoly/8), but bells and chimes were lackluster in that synth.
The math involved is:
X(t) = sin( w(t) + A * sin( B * w(t) ) )
A is the modulation index and B is the carrier to modulation ratio.
This is a very well known formula used by John Chowning in his 2 operator FM experiments.
In my implementation, B is set as a numeric value which remains constant once set for a patch. A is modulatable with an ADSR.
The B value controls the timbre character where A controls the "amount" of modulation and deviation from a pure sine wave. As can be seen in the formula, if A is zero, then the output X(t) will be a simple sine wave. So if A is modulated (such as with an ADSR), from some value down to zero, the character will start with many harmonics which will all fade away by the time A gets to zero.
The Verilog code I will post here will compile for a Spartan-3E Starter Kit. It requires an external MIDI interface (schematic is available in the source code zip file as well as other places on this website). The design as posted works with the 12 bit onboard DAC.
This synthesizer does a good job of imitating bells and chimes and can have a very metallic character depending on the values chosen for the B parameter for each of the 4 generators that can contribute to a sound. Very rich characters are possible by making them all different and playing with tuning of the generators.
- 8vFM-2x4_synth_bell.wav - A sample of a bell/chime patch.
- 8vFM-2x4_random_samples.mp3 - This 320 Kbps mono MP3 file contains samples of several different settings of mostly the B parameters. All of the samples use all 4 FM sound generators per voice. Essentially, I sat there noodling around with settings with the recorder running and then edited out the crap and long silences. This represents a small fraction of the kinds of sounds possible.
- 8vFM-2x4_steel_gong.wav - 8vFM-2x4_steel_gong.wav
FM Sound Generator Block Diagram:
The above image is a block diagram for one 2 operator FM sound generator. Four such sound generators comprise each of the 8 polyphonic voices. The ADSRs' control values and GATE signal, pitch value and carrier:modulation ratio (B parameter) are all supplied by the MIDI controller either via sysex (or serial connect) or by the MIDI messages sent during performance. 'NCO' represents a phase accumulator oscillator, 'Sine' represents a sine lookup table and 'Bias' represents a configuration slider value which sets the minimum value for modulation index.
- 8vFM-2x4.zip - ver_d Source code zip file, updated Apr 29, 2009
Here is a modified version that adds microtone capability and is 16 voice polyphonic instead of only 8. This version will also operate in the normal western chromatic scale mode as well.
- Microtonal_FM_Bell_Synth_ver_f.zip - ver_f ported to Spartan-3E Starter Kit. Last updated Dec 22, 2010.
- VB_NET_2008_Express_Edition___Microtonal_Bell_Synth_Patch_Editor.zip - This is the project for the patch editor which will compile and run under VB.NET 2008 Express Edition which is free from Microsoft. The patch editor transmits sysex formatted data via a PC COM port at 19.2 kBaud.
Many thanks to Eric Brombaugh who answered my questions regarding the math and how FM synths are commonly configured and controlled.