OPL2 FM Synth Module

The OPL2, aka the Yamaha YM3812, is a multi-voice FM synthesis sound chip. It was used in early PC sound cards such as the Adlib and a variety of other arcade machines and computers of the late 80s and early 90s. It operates completely digitally and produces sound via a specific DAC chip, the YM3014.

FM synthesis is an interesting way of producing sound and music but is particularly onerous to set up on a modular synth. These Yamaha chips (or clones thereof) are still easily and inexpensively available online. I decided a module showcasing the OPL2 would make a great addition to my modular.

The OPL2 is polyphonic – it supports up to 9 simultaneous voices. Each voice has two “operators” of an oscillator and an ADSR envelope modulating the oscillator’s amplitude [1]. These pairs of operators are configured either to work in parallel via additive synthesis, or in a series configuration with one operator modulating the other (frequency modulation). Additionally, one of the oscillators can “feedback” on itself.

So with a single OPL2 chip, you are getting something equivalent to dozens of traditional VCOs, VCAs, and ADSRs, albeit configured in a relatively restricted way.

The challenges with using such a device are two-fold: how does the synth player configure all these parameters, and how do you interface the device with traditional modular synth control voltages?

I ordered a handful of YM3812/YM3014 pairs and built a simple test circuit. Some of the parts I ordered arrived looking a bit dodgy, and this test jig assured me that they were functioning correctly.

The next step was to sketch the hardware interface. Following some prior work in the area by others, I decided an LCD-based menu system would be used to configure and save various “patches” for the device. Additionally, a set of CV inputs could be mapped to various parameters using these menus. Finally, various “chord modes” would be available to make use of all the polyphony available while keeping the module in the “monophonic” realm of my current modular.

With the hardware interface sketched out, it was time to tackle the menu problem I’d created for myself. Navigating around menus is in direct opposition to the design idiom of a modular synth, where every parameter is available for manipulation in real-time and simultaneously. The phenomenal amount of parameters available in the OPL2 prevents that from being practical. With about 12 parameters for each operator and a handful more that affect both operators in a voice together, a single YM3812 has 244 parameters. Additionally, most of the parameters would never be used and it’s unclear which. My goal, then, is creating a menu system that makes a more concise control surface while still exposing enough of that surface to allow the kinds of experimentation a modular synth player (that is, me) enjoys.

Without having any usage knowledge of the synth, I can’t build a good model for its operation. This means my first implementation will be relatively wide-open and flat to allow for as equal access to the many parameters as makes sense. To accomplish this, I have designed a set of shallowly nested menus:

  • Common
    • Vibrato depth
    • Tremolo depth
    • Operator configuration
  • Operator 1
    • Vibrato enable
    • Tremolo enable
    • EG type
    • Total level
    • Attack rate
    • Decay rate
    • Sustain level
    • Release rate
    • Multiple
    • Wave select
    • Feedback
  • Operator 2
    • (ditto Operator 1, except Feedback)
  • Chords
    • Voice 2 offset
    • Voice 3 offset
    • Voice 4 offset
    • Voice 5 offset
    • Voice 6 offset
    • Voice 7 offset
    • Voice 8 offset
    • Voice 9 offset

Of course, I have to build the interface to the modular and write all the software to see if this even makes sense. An alternative I want to explore that would reduce even this list of parameters is building the module a strict VCO. To do this, the parameter list would exclude all time-variant components. This would leave Feedback, Wave select, Multiple, and Sustain level for each operator and remove the Vibrato and Tremolo common parameters.

  • Common
    • Operator configuration
  • Operator 1
    • Multiple
    • Wave Select
    • Feedback
    • Sustain level
    • Total level (possibly redundant with Sustain)
  • Operator 2
    • (ditto Operator 1)
  • Voices offsets
    • Voice 2 offset
    • Voice 3 offset
    • Voice 4 offset
    • Voice 5 offset
    • Voice 6 offset
    • Voice 7 offset
    • Voice 8 offset
    • Voice 9 offset

Stay tuned for further posts on the development of the interface to this (potentially) very complicated module.

Footnotes

[1] In FM parlance, the OPL2 is a “two operator” system because each voice has two operators. The successor to the OPL2 is the aptly-name OPL3 which is a “four operator” system. Additional operators allow a wider variety of sounds with an equivalent increased level of configuration complexity.