MUS-X Synth open for beta testing

I have been working on my Synthesizer for almost half a year, and it is getting close to be finished. Since it is a larger project, I would kindly ask anyone interested to beta test it: GitHub - Jojosito/MUS-X at synth

The binaries are available here: Synth · Jojosito/MUS-X@d012121 · GitHub Download the right one for your OS and extract it to your Rack user folder (check Installing & Running - VCV Rack Manual for detailed instructions)

It is a 2 oscillator, dual filter VA with a unique approach to modulation.

Here are some things I would be happy to get feedback on:

  • How do you like the concept?
  • How do you like the sound?
  • Are the parameter ranges and modulation ranges ok?
  • I had some rare crashed during development, did you encounter any crashes? (I think this is fixed now)
  • Anything I should explain better in the manual? (I did not yet write a complete manual, just the most important points)
  • Features you might miss (e.g. certain filter types)

Also if you happen to program some nice patches and wouldn’t mind to share them, I can maybe include some as factory presets.

Once it is ready, it will be released for free as an open source module.

Working patch: MUS-X-Synth.vcv (2.1 KB)

4 Likes

I can’t compile at the moment, but I would like to test your synth,
so it would be cool if yoou could provide windows binaries to test,
or if someone else could share them if you don’t mind.

1 Like

I wouldn’t mind if someone builds and shares the binaries. Otherwise I can check tomorrow if I can build them (I am on Linux and haven’t yet built any windows binaries).

2 Likes

I tried building on the vcv toolchain, but I got these errors:

Summary
make -j1 docker-plugin-build PLUGIN_DIR=./plugins/MUS-X/
mkdir -p plugin-build
docker run --rm --interactive --tty --volume=./plugins/MUS-X/:/home/build/plugin-src --volume=/home/jpn/github/rack-plugin-toolchain/plugin-build:/home/build/rack-plugin-toolchain/plugin-build --volume=/home/jpn/github/rack-plugin-toolchain/Rack-SDK-mac-x64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-x64 --volume=/home/jpn/github/rack-plugin-toolchain/Rack-SDK-mac-arm64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64 --volume=/home/jpn/github/rack-plugin-toolchain/Rack-SDK-win-x64:/home/build/rack-plugin-toolchain/Rack-SDK-win-x64 --volume=/home/jpn/github/rack-plugin-toolchain/Rack-SDK-lin-x64:/home/build/rack-plugin-toolchain/Rack-SDK-lin-x64 --env PLUGIN_DIR=/home/build/plugin-src rack-plugin-toolchain:14 /bin/bash -c "make plugin-build -j1"
make plugin-build-mac-x64
make[1]: Entering directory '/home/build/rack-plugin-toolchain'
cd /home/build/plugin-src && make clean
make[2]: Entering directory '/home/build/plugin-src'

[... cut some lines ...]

src/Synth.cpp:338:50: error: implicit instantiation of undefined template 'std::array<std::basic_string<char>, 23>'
                static const std::array<std::string, nSources> sourceLabelMap = {
                                                               ^
/home/build/rack-plugin-toolchain/local/osxcross/bin/../SDK/MacOSX11.1.sdk/usr/include/c++/v1/__tuple:219:64: note: template is declared here
template <class _Tp, size_t _Size> struct _LIBCPP_TEMPLATE_VIS array;
                                                               ^
src/Synth.cpp:369:55: error: implicit instantiation of undefined template 'std::array<std::basic_string<char>, 50>'
                static const std::array<std::string, nDestinations> destinationLabelMap = {
                                                                    ^
/home/build/rack-plugin-toolchain/local/osxcross/bin/../SDK/MacOSX11.1.sdk/usr/include/c++/v1/__tuple:219:64: note: template is declared here
template <class _Tp, size_t _Size> struct _LIBCPP_TEMPLATE_VIS array;
                                                               ^
src/Synth.cpp:453:50: error: implicit instantiation of undefined template 'std::array<std::basic_string<char>, 23>'
                for (size_t iSource = 0; iSource < sourceLabels.size(); iSource++)
                                                               ^
/home/build/rack-plugin-toolchain/local/osxcross/bin/../SDK/MacOSX11.1.sdk/usr/include/c++/v1/__tuple:219:64: note: template is declared here
template <class _Tp, size_t _Size> struct _LIBCPP_TEMPLATE_VIS array;
                                                               ^
src/Synth.cpp:464:32: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                label = destinationLabels[iDest - nMixChannels] + " routing (filter 1 / filter 2)";
                                                        ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
src/Synth.cpp:468:32: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                label = destinationLabels[iDest] + " volume";
                                                        ~~~~~~~~~~~~~~~~~^~~~~~
src/Synth.cpp:472:32: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                label = destinationLabels[iDest];
                                                        ~~~~~~~~~~~~~~~~~^~~~~~
src/Synth.cpp:483:60: error: type 'const std::array<std::string, nSources>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nSources>') does not provide a subscript operator
                                configSwitch(iSource, 0, 1, 0, "Assign " + sourceLabels[iSource], {modulatesLabel, "active" + modulatesLabel})->ParamQuantity::randomizeEnabled = false;
                                                                           ~~~~~~~~~~~~^~~~~~~~
src/Synth.cpp:487:60: error: type 'const std::array<std::string, nSources>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nSources>') does not provide a subscript operator
                                configSwitch(iSource, 0, 1, 0, "Assign " + sourceLabels[iSource], {"", "active"})->ParamQuantity::randomizeEnabled = false;
                                                                           ~~~~~~~~~~~~^~~~~~~~
src/Synth.cpp:501:43: error: type 'const std::array<std::string, nSources>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nSources>') does not provide a subscript operator
                                std::string sourceLabel = sourceLabels[activeSourceAssign - 1];
                                                          ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
src/Synth.cpp:512:61: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                                "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                                   ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:517:61: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                                "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                                   ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:522:61: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                                "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                                   ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:532:61: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                                "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                                   ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:537:61: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                                "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                                   ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:542:61: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                                "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                                   ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:548:60: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                                        "Assign " + sourceLabel + " to " + destinationLabels[i],
                                                                                           ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:560:53: error: type 'const std::array<std::string, nDestinations>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nDestinations>') does not provide a subscript operator
                                std::string destinationLabel = destinationLabels[i];
                                                               ~~~~~~~~~~~~~~~~~^~
src/Synth.cpp:685:57: error: type 'const std::array<std::string, nSources>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nSources>') does not provide a subscript operator
                                                        param->modulatedByTooltips.push_back(sourceLabels[iSource - 1]);
                                                                                             ~~~~~~~~~~~~^~~~~~~~~~~~
src/Synth.cpp:699:44: error: type 'const std::array<std::string, nSources>' (aka 'const array<basic_string<char, char_traits<char>, allocator<char>>, nSources>') does not provide a subscript operator
                                        std::string sourceLabel = sourceLabels[activeSourceAssign - 1];
                                                                  ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
fatal error: too many errors emitted, stopping now [-ferror-limit=]
11 warnings and 20 errors generated.
make[2]: *** [/home/build/rack-plugin-toolchain/Rack-SDK-mac-x64/compile.mk:79: build/src/Synth.cpp.o] Error 1
make[2]: Leaving directory '/home/build/plugin-src'
make[1]: *** [Makefile:243: plugin-build-mac-x64] Error 2
make[1]: Leaving directory '/home/build/rack-plugin-toolchain'
make: *** [Makefile:195: plugin-build] Error 2
make: *** [Makefile:351: docker-plugin-build] Error 2

The fix to those is just add an #include <array> at the very top of Synth.cpp. With that I could build in the toolchain.

@jojo if you want automated builds from GitHub from free (which I can’t recommend highly enough) qno maintains a set of GitHub actions. GitHub - qno/vcv-plugin-github-actions-example: Example repository for building and publishing a VCV Rack plugin with GitHub Actions. I use those on every single one of my plugins!

3 Likes

Use the toolchain.

Thank you, Paul.

I fixed the mac compiler errors and warnings and set up the github action.

1 Like

I compiled it fine on my M1 (arm64) mac, but no Synth to be seen, did you forget to push it?

Did you clone the synth branch?

I cloned what you linked at the top

Edit: ok, a git switch synth is needed to get the synth to compile after you clone what is linked at the top

Binaries are now also available here: fix mac compiler warnings · Jojosito/MUS-X@7e5c82f · GitHub

OK, quick test drive, the envelopes are just as long as the gate is so pretty much not how an envelope should work in my mind. The releases do nothing. at 0 or at full, no change in how long the release is.Apart from that, it can make some really interesting sounds.

Thanks! In the default patch, Env 2 is assigned to the amp. Try turning up the release while in base mode (i.e. the rings are green).

OK, maybe I am a bit thick (might need a demo video with explanation on how to drive this). If I don’t randomize it I can’t even get any sound. The attached setup should in my mind produce sound, but isn’t. So this is far from intuitive as any other synth at least put out some sound on gate and V/Oct being plugged in, even if just a blip (Opulus for example).

Mus-X_Synth_Test_NoSound.vcv (14.0 KB)

Ignore the Host module, it is hosting Buster se (an SSL Bus Compressor emulation)

The amp volume is turned down to 0. The modulation for the amp is multiplicative, so there will be no sound when amp is turned down to 0.

OK, maybe change the default settings of the knobs so it produces sound on gate and V/Oct being plugged in as a staring spot. Would be better than having to first figure out the whole module before being able to explore.

Also a default routings one can override so the non-mapped knobs do something but overridden when mapped would be great.

I created a template.vcvm patch that should be loaded by default. And it produces sound when just V/Oct and Gate are connected. I will add another factory preset which can be loaded as an INIT patch.

I don’t understand your second point.

For example, the gate should by default be mapped to amp volume and OSC volume methinks and the V/Oct in by default should be routed to both Osv Seni controls

OK, just grabbed the latest build. Still not quite working as I can get my head around, so i give up until someone produces a good walkthrough of how this beast works (@Omri_Cohen ?)

Agree, and this is exactly what the template.vcvm does. Not sure why is not loaded for you. I updated the binaries and included an additional INIT factory preset.