6OP-DX module development Blog

Hello,

Since recent announcements (incl. screen captures & temporary YT videos), I feel better to create a development blog about the work-in-progress 6OP-DX module, a 6-operator FM (Phase Modulation) synthesizer.

First words: 6OP-DX is not a 100% DX7-clone (but I’ll hope very close as possible). It’s mainly a 6-operator algorithm-based PM (phase modulation) synthesizer module. It can import DX7 SysEx files (VMEM 32-voice bank, VCED single-voice, format autodetection & corrections) and can export to DX7 SysEx files (choice for VMEM 32-voice bank file, or VCED single-voice file). It provides additional features than real synthesizer.

A big beast: 117HP wide size module (1920x1080+ display is required, when zoom is set to 100%).

All synthesis parameters are based on DX7 parameters (either potentiometers and momentary buttons), all are in front of your eyes (no “partials” or sub-pages).

Can host 4 banks (INT, CART1, CART2, CART3) of 32 voices (presets) each, at the same time.

All important MIDI-based inputs are implemented at the leftmost side of the module: V/OCT for notes/pitches, GATE, VELocity, AFTertouch, PB (pitchbend wheel), MW (modwheel), and RETRIGger.

Nine CV input (monophonic) jacks, for extra modulations. CV9 input jack may be used to select bank & voice by a voltage (0V→+10V range). This feature - disabled by default - may be enabled from Preferences screen (via OSD pull-down menu, when voice/bank and algorithm are displayed).

Supports upto 16 voices of polyphony (the module can be forced as Monophonic, for any voice you’ll want).

Six discrete operator outputs (EG or waveform, independent), PITCH EG output, LFO output.

Master (mono) output, with its (not-motorized) potentiometer.

:warning: Please notice the real DX7 hardware wasn’t stereo, but mono!

Large color “touchscreen”, two multipurpose continuous encoders and two momentary buttons (right side above the touchscreen), and OSD coloured-scheme labels displayed below these controls.

MONOPHONIC momentary button (and its green LED), usable per-voice, useful for glissandos.

PANIC button designed to freeze the audio engines and envelopes reset, when required.

6OP-DX modules offers 32 FM algorithms (strictly identical than the DX7 hardware).

Motorized potentiometers (speed can be tweaked or turned off from Preferences screen, including a preview sequence by running OP1 EG motors while you selected another speed setting).

Operator’s BREAKPOINT parameter (per operator) can be learned, by using your MIDI controller.

Many displays layouts on touchscreen:

  • Default parameters view on touchscreen display.
  • Into an “emulated” DX7 genuine LCD, backlit LCD (retrofit), or OLED (retrofit), 16x2 characters, plus the red 7-segment LED (who indicates the current voice number, followed by a “.” while the parameters are changed since last save - like the real DX7 does!).

Eight models (plates): Aluminium (the lone who are using LCD for mini displays, instead of blue LED), Stage Repro, (new) Cobalt, Absolute Night, Dark “Signature”, Fort Knox “Signature”, (new) Oxide “Signature”, and Titanium “Signature”. Only Aluminium model (first in list) uses LCD as mini-displays, instead of blue LED-based mini-displays.

The new themes (aka Model) introduced by 6OP-DX module (blue Cobalt, and Oxide “Signature”):

11 Likes

Will there be custom algorithms like opsix where you can do freeform routing between operators?

First sound calibration, vs. the excellent Dexed, C3 (middle C4 on MIDI controller, without transpose).

I don’t use MarkI engine resolution at the moment (surely a bitcrusher or something similar to emulate real DX7’s 12-bit DAC chipset, like Arturia’s DX7-V is emulating, too). Using my own C++ code (buffered computed sine datas), because Dexed doesn’t implement SIMD technologies, unfortunately. My first milestone is to use pure sines for all operators, and all algorithms.

3 Likes

After a detour to enhance KlokSpid MkII (useful feature requested by user, here), now it’s time to return to 6OP-DX module development!

OhmerPrems v2.6.10 Pre-Release “Nightly Build” 2026.02.10 is available. What’s new/updated (Feb. 10th - 01:30PM GMT+1/France).

The stuff done today (6OP-DX only):

  • Now each instance is able to host (load/import/create/edit) upto 4 banks of 32 voices (presets) each (INTernal + 3 CARTridges), advance to next bank (or cycle to INT.) via CART. / INT. button located above the right side of the touchscreen (alongside MENU button) - screen capture below.
  • Have replaced OnSave() / OnAdd() methods by “json” equivalent, despite 16516 bytes per module… Seems to work fine, however, including user presets (.vcvm files) & module(s) selections (.vcvs files).
  • Drop-down menu (by using MENU button) is operational, but many features are, at the moment disabled/grayed. Only all three INITs are 100% operational. :wink: “Preferences…” page is ready for implementation (frame is ready, but… empty at the moment).
  • No more left mouse click over Ohmer logo. Instead, while the “Preferences” page is visible, by turning left continuous encoder this changes the touchscreen brightness (more “steps” for fine brightness setting).
  • Few “cosmetic” enhancements & fixes on touchscreen.
  • Revision of “sequences” & priorities about right-mouse click over envelope generators potentiometers (planned feature for graphic curve editor), and operator’s BREAKPOINT parameter vs. “MIDI learning” feature, now more flexible than previous implementation.


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

1 Like

As “Preferences” (global) setting, when checked, now CV9 (voltage from 0V upto +10V) selects the bank (INT. / CART1. / CART2. / CART3.) and the voice (preset) from 01 to 32 inside bank! It’s a kind of MIDI “Bank Select” + “Program Change” but via analog voltage!

:warning: This CV9 option will appears as grayed/disabled in case of CV9 is already assigned as modulation source, from (future) Modulation Matrix screen.

While CV9 option is enabled AND CV9 input jack is connected, the left continuous encoder doesn’t permit to select another voice (preset). Also, on the same principle, the left multipurpose button doesn’t permit to select next bank. You’ll can notice their respective labels on screen are grayed (instead of blue/cyan), like this:

:information_source: This feature is operational and is working as expected. For CPU usage limitation (by using the CV9 scenario), CV9 input jack is checked every 4096 DSP frames (approx. every 0.08s @ 48000Hz sample rate). Bank and/or voice (preset) is/are switched only as required!


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!).

Implemented KEYBOARD SPLIT & RESPONSE “PART”, as global setting (from Preferences), all actual Preferences shown below are fully operational:

Hovered control turns it to yellow (instead of blue/cyan), except disabled controls (who are grayed, like “Genuine 12-bit DAC” checkbox, because this feature isn’t available). When yellow, a left mouse click check the checkbox, select the option (radio-buttons), or do a related action (like LEARN and arrows).

LEARN button is disabled/grayed until both V/OCT and GATE input jacks are connected. When both are connected, this button permits to “listen” your MIDI controller (if both V/OCT and GATE are attached to a well-configured MIDI→CV module) and define the split point regardling note you’ve pressed from your MIDI controller (instead of set it by clicking over left/right arrows).

Left arrow is grayed when A-1 is selected as split point (A-1 is the lowest possible note supported by 6OP-DX module, exactly like DX7 hardware). In this case, if LOWER option is selected, the module ignores all notes, except A-1.

Right arrow is grayed when C8 is selected as split point (C8 is the highest possible note supported by 6OP-DX module, exactly like DX7 hardware). In this case, if UPPER option is selected, the module ignores all notes, except C8.


:red_question_mark: Why the SPLIT feature implementation in 6OP-DX module?

It’s an unoffical feature (not supported by the real DX7 synthesizer), a kind of “extra” feature offered by 6OP-DX module.

By using two 6OP-DX modules, split points on each set as -1/+1 semitone (or same note), one may respond on lower incoming notes, other module on upper incoming notes: in this case, you’ve made a… “DX1 equivalent” set as split mode in your rack!

Of course, zones may overlap (common zone of the keyboard, for partial layering).

:warning: Defined split point is part of split zone (inclusive). As example, if you set C2 as split point, and choose LOWER option (from Preferences), all notes from A-1 to included C2 are part of keyboard response zone (any note higher than C2 is ignored, in this scenario).

:information_source: Any 6OP-DX module may be transposed from -24 to +24 semitones (like the real DX7 does), by using the TRANSPOSE potentiometer (located at the rightmost side of the panel); or (not yet developed), by using a modulation source who modulates around TRANSPOSE parameter.


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

1 Like

Feb. 14th @ 07:45PM (GMT+1):

Changes:

  • Have enhanced the “LEARN” feature (split point) from Preferences screen, in particular when you click on other element (or outside the touchscreen), this abort learning.
  • Rightmost side of the module, have removed the headsets logo (confusion about “stereo”).
  • Rightmost side of the module, OUTPUTS was replaced by OUTPUT.
  • Using more efficient code (SIMD ifelse) for polyphony detection over leftmost input jacks.
  • Demo/Free only: now the LEVEL pot reduces the volume of troublesome tones/noises too.
  • Demo/Free only: delay between troublesome tones/noises is increased a bit (no given info, however).

:warning: OhmerPrems members who have a valid license key aren’t concerned by Free/Demo troublesome tones/noises, of course!


:information_source: Please keep in mind while the module (plugin) is remaining as “ALPHA” pre-release (aka version 2.6.10), the 6OP-DX module doesn’t output any synthesizer sound (except Free/Demo troublesome tones or noises).

About Free/Demo, to be clear:

  • Troublesome tones or noises (not critical for hardwares & ears) approx. every minute, sent to every output jack (either main Master output and all six OP OUTPUT).
  • DEMO is displayed as status label on touchscreen (just below MONOPHONIC button/LED) in orange label while tone/noise is played. Also, all six OP output LEDs are turned orange color at the same time.
  • Synthesizer parameters are not saved/recalled (all four banks return to INIT.). Any sound design stuff, or loaded/imported bank, is lost as soon as you close VCV Rack 2!

All global settings (from Preferences, and contextual menu) are saved and recalled. They’re no other limitation, and please consider all features are fully usable (no interruption / not stucked), even during seconds of “Demo” tone/noise!

Have added cable(s) status / monophony / polyphony information, at the top-right side of the touchscreen:

:warning: 6OP-DX module requires at least “V/OCT” and “GATE” to operate (shown by the first three screen capture above). For additional features (offered by DX7 parameters, or by specific modulations), other input(s) may be used regardling your needs, such velocity, aftertouch, PW/MW wheels, and so on…

In case you’re using multiple MIDI→CV modules (different polyphony settings), the number of polyphony channels is based on V/OCT and GATE inputs only, always the minimum value.

Other MIDI-based inputs jacks like VEL., AFT., and RETRIG. also use the minimum polyphony value (defined by V/OCT or GATE). Both wheels (PW and MW) are single channel, however.

The polyphony is dictated by MIDI→CV module(s) setting (from their respective contextual menus). In case of usage of different MIDI→CV modules as sources, for left-side inputs (V/OCT to RETRIG. input jacks), the 6OP-DX module selects the highest possible polyphony setting.

A particular Monophonic setting (from Preferences screen, as checkbox) will force the 6OP-DX module to use polyphonic channels as… monophony (portamento / glissando articulations). For some categories of sounds, like basses, drums or leads, it will better to set the MIDI→CV module as monophonic.

Few enhancements today (tonight Monday 16th - 01:00AM GMT+1/France):

  • Relocated 6OP-DX text, now precisely centered along the two buttons (vertically along OP1 label). Thanks to (anonymous) beta-tester for this pertinent suggestion! :ok_hand:
  • FIXED a (non critical) display issue during OP BREAKPOINT learning (any operator), and you disconnect any cable, the touchscreen is nearly empty (no LCD/OLED display, algorithm area is empty too), and concerned OP BREAKPOINT stays armed for learning.
  • Have added complementary COARSE/FINE/DETUNE below the LCD/OLED display while mouse cursor is flying over any COARSE, FINE or DETUNE potentiometer (the LCD/OLED display the effective ratio or fixed frequency in Hz).
  • OPERATOR OUTPUT LEDs (x6) are removed (they’re useless, area is more “clear”, and… CPU save!).
  • Now on INITialize (either current voice/preset, current bank, or all banks) - can be done from “MENU” button, also all banks by using Ctrl+I (Command+I on Mac) / Initialize, or simply by adding a new 6OP-DX module in the rack, selected algorithm is 1, only operators 1 and 2 are turned on (the left “tower’), OP1 LEVEL (operator 1 as carrier) is maxed to 99, and OP2 LEVEL (operator 2 as modulator, modulating… operator 1) is set to half 50. Other operators are switched off, and their respective levels are set to 00 (second screen capture, below) in order to start sound design from fresh “2-op voice”…

3 Likes

(moved below as lastest post)…

hello,

any chance to see which parameter is altered ?

or is it too complicated?

Enjoy

Karl

Hello, nope, it’s too complicated. And… what’s happen if many are altered in 15 seconds range? (delays prior every autosave).

The VCV Rack’s autosave feature (or saving patch/preset/selection file “cancels” parameter change(s), because altered parameter(s) are (automatically) validated + saved.

:wink:

Since recently, it was a “discard” / “save” changes feature (by 2 buttons + large LED), but it was too problematic in term of saving and memory usage (4 banks of more than 140 parameters per voice x 32 voices x 4 banks of 32 voices), also this wasn’t user-friendly, finally (opinions given by other users here in private, and from beta testers). By this way I removed it… (no more large LED & two buttons above the touchscreen).

But today I go back just a bit, the indicated period (dot) is just for info, also to offer a kind of authenticity, regardling the real DX7 hardware does!

Do not forget the synthesizer parameter(s) is/are altered by… the user! (except during load/import operations, obviously). Future modulations (including by “absolute values”) don’t alter the synth parameters themselves!

:information_source: Synthesizer parameters I mention often are located inside the 6 operator sections + rightmost side of the module (LFO section, PITCH EG section, and so on, except MASTER LEVEL - not a part of synth parameter), plus the selected ALGORITHM, plus MONOPHONIC state button/LED.

Tuesday 17th February (00:05AM GMT+1) blog…

Like the DX7 hardware does, when a synthesizer parameter is altered, a trailing red dot is displayed, until next save operation (either by VCV Rack’s autosave feature - every 15s, or by saving the patch as .vcv file, as .vcvm preset, or as .vcvs modules selection).

New feature (was planned): operator copy:


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

1 Like

Wednesday 18th February (09:15AM GMT+1) - v2.6.10 “Alpha” pre-release “Nightly Build”.

Packages for manual installation are available here!

What’s new:

  • All potentiometers logic was entirely reworked. Now, all have “detents”.
  • All controls have an explicit name (useful in most DAWs), like OP1 COARSE.
  • Previous Motorized potentiometers from contextual menu was migrated to Preferences screen (bottom). Instead of 5 “motor speed presets” by previous context menu (Off, Fast, Moderate, Slow, and Turtle), now the motors can be turned off (obviously) or fine tweaked as expected speed (from fastest to slowest, as percent), via the right continuous encoder (labelled MOTORZ.). Please see screen capture below. While you’re changing the current setting by the continuous encoder, you get a “preview” sequence of moving potentiometers (the 8x OP1 EG pots), in realtime (during 2~10 seconds, depending the selected setting). By this way, you’ll can choose the motor speed you’ll want precisely! :wink: Default “factory” setting is 10% SLOWEST on fresh added module in the rack, or by doing a full module reset.


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

1 Like

Thursday February 19th, 01:00AM (GMT+1/France time):

What’s new:

  • CANCELLED AT THE MOMENT / DELAYED –> Added fully working randomize parameters via Randomize command from context menu, or by Ctrl+R shortcut (Cmd+R on MacOS X platforms), all synthesizer parameters for current voice, are correctly randomized, including current algorithm. However, all OPerator ON/OFF switches are forced to ON by randomization, it’s normal! The new voice (preset) name becomes… RANDOMIZED (of course, can be renamed). Other voices (and banks) stay untouched. Global settings (via Preferences, or contextual menu) and - future - modulations remain untouched, too.
  • File error messages (mainly on SysEx importation) who appear in red box, now require to press the OK button (right side above touchscreen) to close the displayed error message.
  • Some internal feature tweaks (near invisible by the end-user).
  • Not critical yet, but inside OhmerPrems C++ source files, I’ve replaced the DEPRECATED void onRandomize() by void onRandomize(const RandomizeEvent& e). Modifications are made for 6OP-DX, FroeZe, and QuadPercs modules (KlokSpid, KordZ, and all expanders modules aren’t concerned, however).

:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

Friday February 20th, 06:45AM (GMT+1/France time):

  • 06:45AM update → Entirely reworked LFO section (for all panels). Now LFO and OSC labels are bigger, more readable @ 100% zoom, SYNC over buttons becomes KEY SYNC. Both LFO & OSC buttons are (horizontally) well-centered above LFO DELAY potentiometer (looking better), and better LFO & OSC LEDs placement (aligned on their text edges).
  • DONE: Now the file error red box is displayed over the algorithm (on-screen display), instead of on black background in previous releases. More aesthetic (IMHO). Screen capture below.
  • DONE: a bit shorter “boot sequence” (reduced from 1.5s to 1s) when adding a new 6OP-DX in rack, on .vcv file load, or on module reset.
  • DONE: tedious stuff (the top task in the “To Do” list, below) have replaced some “math +/- with constants” (as display adjustment helpers) by final fixed values, for DX7-like LCD/OLED display (I love proper & optimized code :wink: ).
  • FIXED (non critial) issue concerning unexpected (possible) behaviors (regardling contexts) from OP2 to OP6 sections (due to tests I’ve made on OP1, but not reported to other OP due to… forgot! lol).
  • REMOVED (cancelled): Randomize feature (it’s a nonsense to randomize any FM/PM parameters, to obtain 99.9999% of time… a crappy noise!). However, acceptable results on randomize is to pick any other algorithm. Another possible way of randomization would be controlled randomizations, most elegant, to offer a kind of “sweet spots” as base, like basic bass, basic percussion/bell, basic electric piano, basic organ, or anything who sound correctly… No decision at the moment (may be implemented later).

The reworked LFO section (zoom @ 100%, 1920x1080):

The file I/O error condition (here while importing a corrupted SysEx file):

:warning: On file error condition (red box), all controls are locked until you press “OK” button.


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

Saturday February 21th, 06:20AM (GMT+1/France time):

  • Added a CV9 input jack (it may used as bank + voice select role by voltage from 0V to +10V, instead of CV8 in previous release). This feature can be enabled/disabled from Preferences screen (by default: disabled).
  • Added a MONOPHONIC (button + green LED), will work not as global, but per voice (per preset), instead! :wink: Like Plogue’s chipsynth OPS7 VSTi plugin does! Please notice SysEx files aren’t concerned, because DX7 SysEx file formats doesn’t support this (extra) feature. Previous “Monophonic” checkbox (as global segging) from “Preferences” screen, was removed, BTW.
  • OUTPUT OPERATORS jacks by default will output polyphonic OP envelopes (they’re AMP envelopes) as default feature. Each output may be “disabled” (checkbox) to output OP’s audio-like, instead, independently for each output. From Preferences screen (the redesigned group of six checkboxes).
  • FIXED: the ‘INOP.’ left & right continuous encoders after successfully loaded a .6opdx file!

:warning: AT THE MOMENT, THE MODULE DOESN’T OUTPUT ANYTHING! No sound on master output, no output to OPERATOR OUTPUTS too. Thanks for your understanding!

By default, every OP’s output will deliver the related OP amplitude envelope, aka OP EG (all checkboxes are checked by default). When unchecked, the relevant OP output jack(s) will deliver a sine or a PM-modulated (audio-compliant) waveform, as “partial” instead (depending the current algorithm, and where the operator is located in the algorithm, as carrier, or modulator):


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

1 Like

Sunday February 22nd, 02:00AM (GMT+1/France time):

  • Fixed a weird bug while importing a DX7 SysEx file (VMEM 32-voice only), the PITCH RATE 3 parameter was the same than RATE 1, due to “typo” in the C++ source code!
  • Reworked outputs section, two new output jacks (above existing OP1 and OP2) designed to output PITCH EG (envelope), and LFO.
  • All small 2mm LEDs (OP ON/ON x6, KEY SYNC LFO and KEY SYNC OSC) are remplaced by medium 3mm LEDs.

The final result (all panels are fixed) - 1920x1080p, 100% zoom level, Dark “Signature” panel:

P. EG is the discrete PITCH EG (pitch envelope) output.

LFO is… explicit :wink:

3mm LEDs (medium size, all LEDs on the panel), 1920x1080 @ 100% zoom level:


:information_source: (please always see lastest post in this topic, below, for package download links - Thanks!)

1 Like

Sunday February 22nd, evening dev. blog.

This is the daily activity:

No planned “Nightly Build” next night (from Sunday to Monday), next will be mi-week (night from Wednesday to Thurday, or the day after).

Few signifiant enhancements (mostly of them are “internal”), as visual, only custom color 3mm LED purple color for MONOPHONIC voice state (located above the touchscreen).

Have started monophonic/polyphonic C++ implementation (but not yet visible to the end-user).

Have balanced sections of C++ DSP code, handled by two DSP clocks .setDivision(x), one for all controls checking (done every 8 DSP frames), a second for less urgent tasks (LED management, CV9 as bank+voice select, panel change, done every 4096 DSP frames), in order to reduce CPU usage as possible.

Only audio engines and “MIDI”-source management (V/OCT, GATE, etc) will run as realtime (on every DSP frame, whatever the sample rate), SIMD processing only in polyphonic situations.

Next milestone finally will be audio processing implementation (prior external modulations, graphical EG editor, and some other extra features).

:warning: When audio processors will be enabled, shortly, please do not expect for a 100% DX-clone immediately! Be sure I’ll do most efforts as possible to be closest, but I’m working step by step…

:information_source: During early “betas” (first is expected for next mid-week, I’ll hope), troublesome tones/noises (for non-OhmerPrems members) will be temporary disabled.

1 Like

Your control-rate processing (checking knobs) can happen a lot less often than 8-frame intervals.

If you have a lot of parameters, another tactic that I’ve used is to amortize the processing: every x frames, check only some portion of your parameters. You can also prioritize params differently. If you have one that’s a performance trigger, you can check that more often than say, a major mode selector which could be checked very infrequently.

1 Like