MiMi-d - creating a new software synth for Zynthian

Aw, you’ve got to be kidding, it can’t be that simple … :slight_smile: I always thought ‘Search for engines’ did some form of upstream search for new repositories, or something like that. Never thought that it would just search for whatever happens to be on the system.

(It actually seems to be ‘Search for LV2 Plugins’, but perhaps that is on Stable, and it’s been changed in Testing and the new oram as it finds more than LV2:s? Anyway, clicking on it eventually finds MiMi-d on a system where it’s been newly built, although it seems to take a while; when clicking on the (wide) button, it turns red, but then nothing happens and the page appears to load for quite some time (like, a minute or so), until it turns black again. In the end it works at any rate.)

Anyway, this means that to give MiMi-d a test run, clone the repo into some good place as described in step 2 above, which will install it into /usr/local/lib/lv2/MiMi-d.lv2/ , from where it will be picked up by webconf when searching for new LV2 plugins. Very nice.

(I should note to anyone wanting to try this out that there are still details that are in a state of flux even though the basic architecture is fairly set, so saving patches will not necessarily mean they will load properly with a later version; nevertheless of course feel free to have a go and I’d appreciate any comments anyone my have).

3 Likes

Search for engines is improved in oram. It is faster and fails less often. What it actually does is snag the system for engines and parse detail (which accounts for the slowness) then creates a cache of the details.

I will give mimi a try.

2 Likes

A lot of the MiMi-d is a rather standard virtual analog synthesizer, but a couple of the hidden gems are:

  • Audio rate modulation of the filter. (Osc Common page). Especially effective with filter resonance turned up almost to self oscillation, and the modulation oscillator (osc 2) running several octaves above the oscillator fed into the ordinary audio input to the filter (osc 1).
  • Variable sync level. (Osc Common page). By setting the level considerable less than max and setting osc 2 (master) at a higher frequency than the osc1 (slave), and sweeping the slave, weird arpeggio sounds ensue.
  • VCA drive. (VCA page). Simulates an overdriven VCA. Attempts to be more subtle than a straightforward distortion.
  • LFOs can be run in one shot mode which turns them into envelope generators. The ‘rise’ and ‘fall’ waveforms are intended for this, which are like ‘soft sawtooths’ that don’t have immediate attack or decay times, respectively.
  • In LFO key sync mode, the LFOs are separate per voice, which creates a more varied and living modulation.
  • LFOs can be stopped (freq = 0), which allows the controller (aftertouch, modwheel or velocity) set by the Controller parameter to directly control the modulation destination (when the waveform is set to square wave). If the waveform is set to S/H and LFO key sync is on, a new random modulation level is output for each key pressed.
4 Likes

I have managed to install this but had some issues and comments.

  • Using webconf to search for new engines in Oram did not find MiMi-d. I tried a few times with reboots inbetween but it didn’t work until I ran webconf in a debugger and steped through at which point it worked. I can’t figure out what caused it to fail. lv2ls was showing it. Maybe there is an issue with webconf running the detection / cache build. (It has been fragile in the past and has been refactored in Oram to improve this.)
  • It would be advantageous to have some (at least one) presets.
  • There is a parameter in the page “Ctrls” without a name.
  • I can’t figure out how to make a monophonic mode work as expected / desired. Pressing a second key should/could change note with portamento, legato, etc.
    [Edit] Setting KeyAssignRob and KeyAssignRes gives expected monophonic keyboard control but there seems no “auto portamento” / legato mode to allow pitch slide only when previous key is held.
  • There are parameters in “Key Assign” pages that have cryptic names like, “KeyAssignRsz”. These may offer a solution to the previous point but I don’t know what they do.
  • The default sound has Osc 1 level = 0 and Osc 2 level = 1. This confused me for a few seconds as my logical brain expected the first oscilator to be sounding by default.
  • The filters can squeak at high freq / res settings which I think is by design giving some rich colour - super nice!
  • There are other cryptic parameter names (as well as those mentioned above), e.g. “FenvInvert”. It would be good to have more descriptive names for all controls.
  • There are 2 controls in the “Miscellaneous” page called, “Unused 1” and “Unused 2”. I would recommend removing the controls and the page.
  • CPU load varies dramatically but for a single note seems to peak about 14% so I rate this as a variable, medium load plugin. For comparison Pianoteq is variable with load about 26% for single note playing and setBfree has a constant load of approx 9%, i.e. it does not vary based on notes played.
    [Ediit] I tested a bit more and MiMi-d JACK CPU load is approx. 2% when idle and 27% when playing 8 notes simultaneously. My judgement is it remains in the variable medium load band.

I love this plugin*. Well done @ricard! @jofemodo I think we should add it to Oram. (I know - not core enhancement but it is a good addition and pretty much just-works!)

(*) I have been known to lose the love as I start to find issues with my latest favourite analouge synth emulation so this endorsement may expire soon! :wink:

[Edit] The tuning is off. With oscilators and master tuning set to neutral position the output is sharp (over frequency). This needs to be fixed urgently.

3 Likes

Thanks @riban for all your comments (also in the MiMi-d github issue tracker)!

I agree that the tuning issue is serious; I’m wondering if it’s some sample rate calculation thing, as 48000/44100 is about the observed offset of one and half semitone.

I tried installing it on Oram too, primarily to see if any dependencies needed to be installed (they didn’t; on my ordinary (stable) SD card I’ve built other synths so I can’t remember what’s been pulled in besides what is standard in Zynthian). My experience was that after ‘make install’, I tried ‘Search for new engines’ a couple of times, but it didn’t find it. I then rebooted, still not in the list, then I did ‘Search for new engines’ again, still not there, then I rebooted a second time, and now it turned up in the list. So it was like after installing the software package, a reboot was needed for the webconf to be able to pick it up, for some reason, and after the scanning operation is completed, a second reboot is required. It’s like the webconf doesn’t update some internal cache.

Regarding the CPU load, it’s interesting that you get 27% which I assume is on the V5; I get 42% or so on V4 with 8 voices playing (which is about 5% or so more than the OB-Xd which bugs me a bit but its not surprising since the MiMI-d does have more features. The DSP code is not especially optimized and basically runs the whole synth for every sample produced, but that on the other hand means that the sound is free from stepped envelopes and LFO waveforms.

Incidentally, the parameter called ‘Economy Mode’ on the ‘DSP Control’ page controls if the plugin runs all (selected) voices continuously (Off) or only when they are producing sound (On). Like several other features, this one has been inherited from OB-Xd; I don’t know how useful it is in practice, but I find it handy for testing the CPU load.

Regarding the lone parameter on the Ctrl page, this (port) seems to be something internal / integral to the framework so I’m not sure I can do much about it (I’ve seen other synths have similar parameters); I’ll have to look closer at it.

Unused 1 and 2 are inherited from OB-Xd, and I’ve used them during development for quickly adding internal settings at arbitrary points in the code for experimentation without actually having to add a new parameter every time. They should really go away now.

I agree a lot of parameters could have better naming, so I think the next step will be to look over the parameter names and also write some form of at least shortform to explain the not-so-obvious parts, like the key assigment settings.

As you noted, KeyAsgnRes (Restore) stores keys that are pressed but for which no voice can be allocated (because KeyAsgnRob is set to Off) so that they can be allocated once keys are released and voices become available. This also works in polyphonic mode, which can be handy when playing slow string patches. You are correct in that there is no auto portamento, although regarding legato there is a single trig setting in the KeyAsgnStrg setting where it’s possible to set if the assignment is legato when just playing note on, or both for note on and note off. Again, this works not only when playing monophonically, but also in polyphonically.

This smorgasbord of key assign settings are a carryover from the MiMi-a where I went wild with key assign modes partly for fun and to extend what are normally mono legato modes to also work polyphonically and partly because I really wanted the player to have control over it.

Anyway, I’ll have a look at the above points and post updates in this thread.

4 Likes

I’ve fixed the master tuning issue (more specifically, the tuning when not running at 44100) on the master branch. If anyone wants to update, it’s better to check out the repository anew as I had to do a rebase on master.

Auto portamento is also in the works, but so far only on my dev branch (also upstream, but tends to get rebased often).

Working on the rest; when reviewing the parameter list I’ve realized there are a few issues with things like the symbol names and parameter ranges, so I’ve taken the rather large step to redo the parameters in depth, updating not only the descriptions but also the symbols and value ranges. Unfortunately that means that old patches won’t load properly, but I figured it’s better to take this step now before it has become widespread and hopefully it will be more future proof going forward.

5 Likes

Zynth don’t run on a Pi5 & @riban hadn’t got one last time he was audited.

  1. cloning the GitHub - polluxsynth/audio-plugins: Audio plugins using the Distrho Plugin Framework repo into, say,
    /root/src/audio-plugins, and doing make && make install in this directory, which builds the code (checking out the DPF framework as a subdirectory if needed), and installs the resulting lv2 bundle it in /usr/local/lib/lv2 . (So yes, since my previous post the Makefile will now do everything from a simple ‘make’).

Hi @ricard!

First of all, congratulations for your work!!
I have been testing a little bit the MiMi-d and i really like it. I would love to include it in the zynthian collection, but it would be nice to fix some little issues before. I agree most of the points from the list @riban posted above. You really made a fantastic work with MiMi-d. The list is super-short and most points seems trivial to fix.

IMHO, the important points to fix are:

  • It would be advantageous to have some (at least one) presets. => Really!! A small preset collection is highly desirable, so users can evaluate the kind of sounds MiMi-d can generate.

  • There is a parameter in the page “Ctrls” without a name. The port’s symbol is “lv2_port_2”.

  • There are 2 controls in the “Miscellaneous” page called, “Unused 1” and “Unused 2”. I would recommend removing the controls and the page.

  • I can’t figure out how to make a monophonic mode work as expected / desired. Pressing a second key should/could change note with portamento, legato, etc.
    [Edit] Setting KeyAssignRob and KeyAssignRes gives expected monophonic keyboard control but there seems no “auto portamento” / legato mode to allow pitch slide only when previous key is held.
    [Edit Jofemodo] You should consider chosing better defaults for KeyAssign, so users don’t need to tweak KeyAssign parameters to get a playable MONO behavior.

  • The default sound has Osc 1 level = 0 and Osc 2 level = 1. This confused me for a few seconds as my logical brain expected the first oscilator to be sounding by default.

Less important, but probably easy to improve:

  • There are parameters in “Key Assign” pages that have cryptic names like, “KeyAssignRsz”. These may offer a solution to the previous point but I don’t know what they do.
  • There are other cryptic parameter names (as well as those mentioned above), e.g. “FenvInvert”. It would be good to have more descriptive names for all controls.

I will continue testing tomorrow, at a higher volume, and i will send you more feedback.

Thanks a lot!

2 Likes

Thanks @jofemodo for testing! I basically agree with all your points; in particular, I that the parameter names need a bit of a rework, and also that some ‘factory presets’ would be in order, partly to get started, but also to showcase some of the more esoteric features which one might not stumble across otherwise. I’ve also been working on a rudimentary manual which explains the architecture and parameters (a preliminary version is available at https://butoba.net/downloads/mimid-manual.pdf but beware that it refers to the revised parameter, so is not completely compatible with the master branch (it should be in sync with the dev branch however which contains the bleeding edge development)).

I’ve already done most of the parameter rework, and in doing so I’ve discovered that there are a number of changes that should be made which unfortunately break compatibility with the original parameter symbols and value ranges, but I figured it’s better to make the change now, and hopefully end up with something more future proof (for instance, allowing additions to modulation destinations), rather than make changes later, and break peoples patches down the line.

Thanks again for the feedback. I feel in a way that I may have asked for it too early given the changes needed in the parameters, but on the other hand it’s better to get feedback early so that the resulting changes can be implemented before a ‘proper’ release.

(BTW, you are welcome to test the dev branch which contains the bleeding edge development, but this branch also tends to be dynamic and get rebased often because I use it as a repository for communicating between my laptop and my Zynthian, so it tends to be a bit of a moving target which I can understand would be frustrating for others).

3 Likes

We should wait until the refactor is complete before including in Zynthian stable, i.e. if it is not ready for Oram release then we bump it to the next release. So in a change to my initial suggestions, let’s not add to Oram just yet. Users have instructions on how to add this manually if they want to join the testing. Once @ricard is happy that it is stable we could then add it. (This doesn’t mean it never makes it to Oram. Sometimes we do add features after a stable release - if we deem them worthy!)

I sometimes do that with Zynthian but as you say, it isn’t good for other users. I haven’t engaged my brain yet to solve this conundrum. I am sure there is a workflow that supports moving files around locally. (Not just manual file copy that can be a bore.)

Good work on the manual. It is the sign of devotion and quality when a developer or team write good documentation. I know how dull it can get (on the umpteenth revision).

2 Likes

Fantastic @ricard! I just added the PDF link to the wiki:

https://wiki.zynthian.org/index.php/MiMi-d

Is it in the main branch? I will wait you confirm to test again …
If you have time, please, prepare a small preset collection. I really would like to include the MiMi-d in the oram release :wink:

Regards,

2 Likes

The changes are not on the master branch yet (still a few things to iron out), although if you do want to test you can check out the dev branch, which has the latest updates (but also tends to get rebased and changed a lot since I use it for communication between my laptop and Zynthian when testing).

I’m working on a set of ‘factory’ patches too, now that the parameters are getting stable.

I’ll post an update when I’ve merged the changes to master.

When is oram scheduled for release?

7 Likes

Hi @ricard and @zynthianers!

The last Oram update includes the MiMi-d synth. The synth engine is very stable and have a solid and fat sound. An excellent piece of digital luthierism. It’s a pity we still have no presets to demo the capabilities. It’s a complex beast. Please, pleaseeeee, consider creating a few :wink:

BTW, i put this description in the engines DB:

Subtractive, 2 oscillator, sub oscillator, 24dB resonant LP filter, 6dB HP filter, 2 ADSSR, 2 LFO / AD envelope generators.

It can’t be much longer because the limited space in the zynthian UI. Probably you would prefer something more emotional. Feel free to send me the text.

Enjoy!

6 Likes

Thanks for including the MiMi-d and the kind words @jofemodo !

I’ve been spending the last couple of weeks creating some “factory” patches and in the process stabilizing the code, also taking some of the comments I’ve got from @riban and others into consideration. While creating the patches I discovered numerous bugs and inconsistencies, most of them non fatal, but there were a couple of bugs in the envelope generator code which could crash the plugin in some cases (actually, it was only the currently playing voice which crashed which was even more confusing). I’ll try to merge the changes to master within a couple of days, and publish an update, together with the patches.

Unfortunately, some of the changes mean that the patch format is not 100% backwards compatible - one of the changes has involved changing the parameter ranges, so I decided to make some sweeping changes to future proof the instrument as much as possible, so I don’t have to make this type of change again (which breaks everyone’s patches).

Stay tuned.

I’ll also see if I can come up with a better description for the UI.

3 Likes

So, finally, there is a major MiMi-d update on the master branch. Due to various (minor) rebases, either make a fresh clone of the repository, or use git fetch && git reset --hard origin/master when updating.

The update now includes a set of ‘Factory’ presets (the ‘Factory’ bank), which is installed along with the plugin itself when make install is invoked. There are certainly more that could be made, and the existing ones could be tweaked more, but I figured it’s better to get them out in the wild sooner rather than later.

While creating the patches I discovered a number of bugs and inconsistencies, which has led to a change of the preset format (mainly, parameter ranges have been changed from being 0 to 1 for all parameters, to being 0 to 10 for most continuous parameters, and integer steps for enumerated ones), meaning that presets created with the previous version will not load properly. I realize this is a disruptive change, but hopefully thanks to the changes introduced will not have to be done again even when adding features in the future.

As before, to install, clone GitHub - polluxsynth/audio-plugins: Audio plugins using the Distrho Plugin Framework into, say,
/root/src/audio-plugins, and do make && make install in that directory. This will install the plugin and presets into /usr/local/lib/lv2 . After that, perform the webconf “LV2 plugins - Search for new plugins and presets”, likely with some secret combination of a reboot and running the function again which I have yet to discover.

Thanks to everyone for inspiration and comments on the initial version.

@jofemodo Please bring in this version as soon as possible to oram.

@riban There are some of your suggestions which did not make it to this release. Due to the problems I discovered while creating the Factory presets, I decided to have a ‘feature freeze’ and stabilize the code before going on.

9 Likes

Done! MiMi-d will be updated next time users update their zynthian software (oram).

Thanks a lot!!

7 Likes

Perhaps something like this which focuses on the salient features of the synth:

Subtractive 2 oscillator synth with xmod, 6-24 dB ladder filter (LPF) with audio rate modulation, HPF and VCA overdrive.

1 Like

Tonight’s evening jam with Torso T-1:
MiMi-d - Synth Brass
MiMi-d - E Bass
Surge XT - Psiome Send Sound / Neuro Mini

Thanks to @ricard and other helpers.
The presets helped a lot because I wasn’t able to wring the right sounds out of the initial settings

2 Likes

I was wondering how the original was operated and found this video. I like how fast he dialed on that keyboard. And another thing, there is an E-MU module in the back, I don’t know why, but I have two E-MU racks with full ROM slots. And I really like MiMi-d in Zynthian.

P.S. @ricard The offer to redraw the pictures in the manual is still valid.

1 Like