Crystal FM Polysynth
The Crystal FM is a D.I.Y. digital synthesizer that uses a Teensy 4.1 microcontroller to “upgrade” an existing MIDI controller into a stand-alone 8-voice polysynth. This converts the non-sound-producing MIDI keyboard into a musical instrument with its own identity, sound generation capabilities, and creative constraints. Though this project draws heavily from established synthesizer technology and design, the Crystal FM concept could be developed into a cheaper, more sustainable alternative to commercially available polyphonic synthesizers that still provides the hands-on experience of “knob-per-function” controls.
Currently, the Crystal FM is based on simple 2-operator FM synthesis, and was designed to make efficient use of the 16 available controls to facilitate the widest range of classic synth sounds. Due to this simplicity, the control interface is particularly intuitive and beginner-friendly, much more akin to an analog synth than a DX-7. Each voice, programmed in Faust, has two operator pairs (allowing for detune, 5ths, or octaves), a low pass filter, and several predefined mappings of LFOs, envelopes, and velocity. MIDI note and parameter messages are sent from the Novation Launchkey keyboard to the Teensy via USB, allowing for full use of the existing knobs, sliders, and velocity sensitive keyboard. The voice assignment and control mappings are programmed in C++.
Process
This synth began as the final project for my Digital Sound Synthesis (PAT 462) course at U of M, which was open ended in topic with a deadline of about a month. My primary goal was to make a polyphonic digital synth based around the Teensy 4.1 microcontroller. I had learned how to program virtual synthesizers using the coding language Faust and had worked with Teensy previously, and wanted to combine these two areas of knowledge to transfer one of my Faust synthesizers into a more permanent, tactile format.
I started by following along with a tutorial for a Teensy monosynth using the Teensy audio library in C++. I then modified it to use an exported Faust class for one of its voices, then expanded to include 2, then 4, then 8 voices, working my way through the logic for voice stealing through some trial and error. While I was initially considering recreating one of my more complicated additive synths from the class, I eventually decided on FM due to its wide range of possible timbres achieved with just two sine waves– I did not want the complexity of the synth engine getting in the way of the tight development schedule and goal of achieving 8-voice polyphony.
I also did not know how I would be making the interface, so I wanted to minimize the number of knobs I would need to wire up, attempting to select the 6-8 most essential synth parameters (Volume, FM intensity, FM frequency, Attack, Decay, Sustain, Release?). At the suggestion of a friend, I later realized that the simplest option was to use a MIDI keyboard with knobs and simply make use of MIDI parameter messages rather than build my own interface. Nevertheless, my economic approach in selecting synth features paid off as it kept the synth manageable in scope and allowed me flexibility in adding features I saw as “musically useful” while playing the prototype instrument.
The final task was determining how to link and power the Teensy and MIDI keyboard. After some false starts, I found that not only could the Teensy act as a USB host, but it supplied enough power to the Novation keyboard that no additional hardware was needed.