Contact: ken.wessen@gmail.com
Cherchez la FM is a 4 oscillator Eurorack FM voice module, offerring direct panel control for nearly every aspect of the voice configuration:
Twenty distinct algorithms are provided — including a limited selection that employ waveforms other than sine, and a non-FM 4 oscillator option with sine and triangle based variable wave folding. These options are shown in the algorithm illustration above.
Some more detail of the interface is in the Control section at the end of this guide.
Here is a demo of the initial prototype of the CLFM module.
For an interactive introduction to FM synthesis and algorithms, see the FM Synthesis section in my online Constructive Synthesis book.
Schematic | Panel |
Top layer layout |
Bottom layer layout |
At each stage carefully check continuity according to the schematic, orientation of components, and ensure there are no short circuits.
The code will build with a standard install of Teensyduino, since the required libraries: ADC, Audio, Bounce2, Encoder, MIDI and USB MIDI support are all included out of the box.
The FM library code is in the src subdirectory.
Important! Do not attempt to connect the Teensy's micro-usb port to your computer while the module is being powered by the 10 pin header. It is quite handy to be able to use the usb Serial port while the module is in a rack, but to do so you need to disconnect the usb power — either by using a special usb cable with the power wire cut (usually coloured red), or by cutting the jumper on the Teensy board that connects VUSB and VIN.
Calibration of the V/Oct CV input is required. Easiest is to adjust the following section of code in the main .ino file:
... // Serial.println(saveraw); /* Calibration data C2 input is 33 C7 input is 3489 scaling factor f ~ 60 / (3489 - 33) pitch_cv = (raw - 33) * f; */ const float fbase = 33; const float f = 60.0 / (3489 - fbase); ...
Uncomment the saveraw output and see the values when playing C2 and C7. Use the measured values to calculate an appropriate scaling factor.
There is also a trim pot on the underside of the board for hardware-based scaling adjustment.
The FM code is quite computationally expensive, but well handled by the Teensy 4.1 at its default clockspeed of 600MHz. If you wish to overclock, be aware of the extra current required, and the power (I²R) going through the 10Ω resistor R9.
However, there are some aspects that are less obvious and somewhat hidden, and I will describe those here.
I use 4 pots for the envelopes as follows: First I use a slide switch to select the envelope "mode" - one of AD, ASR, ADSR or Independent. Then, in each mode, the 4 pots are used in different ways.
However, a straightforward implementation of the operator 2 feedback alternatives would mean some cases are redundant. Specifically, algorithms 14, 15 and 20 would just just relabellings of algorithms 4, 5 and 10 respectively. I thought it would be better to make them provide genuinely different sonic possibilities, and so I implemented the following idea that works well, provides plenty of additional sound possibilities, and doesn't require any complicated or magic interaction with the controls.
Algorithms 14, 15 and 17 introduce operators with triangle or square wave oscillators to provide variation from their operator 4 feedback analogues, as shown by the small illustration in the top right of their box in the above figure.
More signifcantly, algorithm 20 now has 2 sine wave oscillators and 2 triangle wave oscillators, and the fine tuning controls are overridden to perform wave folding. A clockwise rotation folds the wave symmetrically, while an anti-clockwise rotation folds asymmetrically.