36 years ago or so, I built an analog (more or less) polyphonic synthesizer, dubbed the MiMi-a (The MiMi-a page).
It was my main axe for several years, but eventually when virtual analog synths entered the market big time (starting with the Nord Lead) I abandoned the idea of building synths and jumped on the VA bandwagon. I had a Nord Lead 2 for many years, and a couple of years ago I started a voyage through various other virtual analogs, having gotten tired of the Nord Lead 2 sound.
During this time I was constantly longing just to make at least a few changes in what I felt were shortcomings in the architecture. But it would be a lot of work to reverse engineer and subsequently modify a commercial machine, and I also had a look at various DIY projects such as Axoloti but even if I did some experimentation it never really went anywhere.
A couple of years ago, Zynthian arrived on the horizon, and eventually in my studio. Having submitted a couple of patches to ZynAddSubFX, a month ago I turned my eye towards a shortcoming of OB-Xd, namely the filter tracking parameter, which is on/off only, which is an understandable design choice in the original hardware synth, but not really in software - and OB-Xd already has a number of deviations from the real deal not to warrant this limitation.
After having dug out the code for OB-Xd and perused it, it turned out that this was actually just a GUI limitation, resulting in a patch for Zynthian (Add continuous filter keyboard follow in OB-Xd · Issue #902 · zynthian/zynthian-issue-tracking · GitHub).
However, looking at the DSP code for the OB-Xd it dawned on me that this was really a box of synth Lego blocks that could readily be assembled in any way. To start with, the filter and oscillators are really excellent, the filter being one of the best VA filters I’ve heard (and it’s been used by other projects such as preenFM2 I believe too), and the oscillators have no aliasing that I can hear. But I’ve never been pleased with the architecture of Oberheim synths such as the OB-Xa.
Fairly quickly the idea emerged to create a digital rendering of the MiMi-a . Dubbed simply the MiMi-d, the idea is not to create a clone, but instead utilize design concepts from the MiMi-a: 5 stage envelopes (ADSRs with an additional sustain time), bipolar envelope modulation, audio rate filter modulation, full control over voice allocation, and other things.
The idea is not to create a monster synth like the Surge or anything like that, but more of a full-fledged but not overdone polyphonic synthesizer, with two oscillators plus one sub, ladder and multimode filters, three envelopes and two LFOs. The MiMi-a in its time was inspired by the MemoryMoog, even though the final result turned out rather differently in many ways, and one could say that the MiMi-d again picks up this queue. There are some nice features in the OB-Xd that I will reuse too.
Work is still underway, slowly, and what I’m basically doing is starting with the OB-Xd and chiseling away, modifying, adding bits etc until I’m left with the MiMi-a. The plan is first and foremost to create a plugin for the Zynthian native UI, because I really love the way the Zynthian GUI operates. A proper plugin GUI might come later if I have (or anyone else for that matter) enough stamina to get that far.
Prototype MiMi-d parameter page
So far, most of the modules except the sub oscillator are in place, but there are lot of details that are still sketchy, and the parameter pages are in a bit of a haphazard order.
More information including Github links, on the project home page MiMi-d home page
One thing I’d like to know, is how best to add a synth plugin to Zynthian. So far I’ve hacked a description into /zynthian/config/jalv/plugins.json, but I’m assuming this should be done in some structured way, as the file is obviously not intended to be edited manually, having no line breaks; also, I’ve created a .ttl file for Zynthian in /zynthian/zynthian-data/lv2-custom/MiMi-d.lv2/MiMi-d.ttl, and just copy it to the plugin binary directory manually, but I’m sure there’s a better way to do this. I’ve not delved into how to do this properly, having decided to focus on the actual plugin first, so the information is perhaps readily available already.