Cherry Audio GX-80

I have tested the idea with a simple script in ReaJS. It works! The code works as a MIDI thru except for the selected channel. For that channel, the last played note is remembered and channel pressure messages are converted to poly AT.

I must stress that I had never programmed in ReaJS before…there are probably better ways to do it. I have just had a look at this website

and I have figured it out from other scripts (I also dig out an old book: Advanced MIDI User’s Guide by R.A.Penfold, published in 1991!)

Here is the code:

desc: pseudo-poly-AT //tags: convert pressure to poly AT

slider2:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Input Channel

@init
slider2=1;
noteOn=$x90;
chPress=$xD0;
polyAT=$xA0;
lastNote=0;
@slider

midiCH=slider2

@block

while(
midirecv(off,msgt,msg1,msg23)?
(
(msgt==(noteOn|midiCH))?(
lastNote=msg1;
);

(msgt==(chPress|midiCH)) ? (
    midisend(off, polyAT|midiCH,lastNote,msg1); ) : (midisend(off, msgt,msg1,msg23);
);

1;

):0;
);

Edit: Attached a zip file with the ReaJS script. Just uncompress it in the midi effects folder (on my system it is: C:\VstPlugin64\ReaPlugs\JS\Effects\midi, since I place all my 64bit plugins in VstPlugin64).

midipressuretopoly.zip (432 Bytes)

6 Likes

Well done!
I can’t wait to hear how this works with other poly AT synths!

I have tested it with the GX-80 demo and with SurgeXT.

It would be interesting to have a list of all VST plugins which recognize poly AT.

Cheers!

Gabriel

2 Likes

Well Omnisphere, Diva,Cherry Audio’s Sines and Dreamsynth for starters.

3 Likes

Ok, so I have tested it with Sines and pseudo-AT really shines here! :grinning:

BTW, I own a few Cherry Audio plugins (CA2600, Eight Voice, Miniverse, Elka-X, Sines, Voltage Modular). I have noticed that the last they released (mainly Elka-X and Sines) really stress my system. I easily get well above 100% Time Load, just playing a few four-note chords in sequence.

I have tried switching effects off and reducing polyphony, but the problem is still there (though somewhat reduced). My system is not particularly old:

CPU: Ryzen 5 3400 G (6MB cache, 4.2 GHZ Max boost) actual base speed 3.7 GHz
MotherBoard; Asus PRIME B450M-K II micro ATX
HD: Samsung NVMe M.2 MZ-V7E500 500GB
RAM: G.skill Ripjaws V 32 GB (2x16) DDR4-3000Mhz

I have a Steinberg UR22 mkII interface with the latest ASIO driver and I set Cantabile to 44.1kHz, 512 buffer size, double buffered.

Any hints on how to reduce the load are very much appreciated! :wink:

Gabriel

Edit: I forgot to mention that I have already implemented the Glitch Free suggestions and I have run a Decrapifier script to get rid of useless Windows garbage.

2 Likes

Is there a primer on how to get started with JSFX in Cantabile?

The possibilities for me (on a WindSynth) seem appetizing, and I’m trying to reduce the startup curve …

Is ReaJS the only option? I’ve read (other discussion groups) that JSFX itself is significantly more advanced than the “older” ReaJS, and that you can run JSFX under YSFX (https://linuxmusicians.com/viewtopic.php?t=24295), so I’m confused as to which path to attempt …

Any simple description for using this programmable, MIDI-munging technology in Cantabile would really help … THANKS!!

This is absolutely excellent!!!

I see this
“ the same API used by compiled REAPER plug-ins and extensions)”

Can that script be used to produce a VST plugin, along the lines of PIZ MIDI?

I don’t know if one can “compile” the script and so obtain a standalone VST plugin, i.e. with no need of loading ReaJS VST in order to run the script.
As I mentioned, I am new to this business. :wink:

What I have done is to load the (free) ReaJS VST plugin in Cantabile. Then I loaded my script into it. Cantabile can even remember the loaded script (each ReaJS script is just a preset from the point of view of Cantabile). So it’s already very close to having a standalone plugin.

Gabriel

Edit: Ok, I recognize that a “standalone plugin” is some kind of oxymoron… :rofl:

Edit2: I still think that we should check with @brad if this function could be implemented in a filter. I can think also of possible variations when it comes to the latched note: it could be the last played, or the oldest one among the still pressed notes, or the last one played with a velocity above a given threshold…

1 Like

Not really Cantabile-specific, but here is the general programming guide:
https://www.reaper.fm/sdk/js/js.php

Mainly, JSFX is for programming audio plugins, but it can also be useful for MIDI plugins; here is a specific section on MIDI:
https://www.reaper.fm/sdk/js/midi.php#js_midi

You just need to accept that MIDI plugins process MIDI data in blocks of buffer size, so all MIDI events have a “sample” timestamp (offset) within that buffer. You process MIDI events in the @block section of your code, loop through all MIDI events using while ( midirecv(mpos, msg1, msg2,msg3) ?(…)) and output new events using midisend(mpos, msg1, msg2,msg3), with “mpos” being the position within the buffer.

When you process them, best keep the offset (mpos) intact - or, if your processing affects the time, respect the buffer-chunk processing. You may need to spread your output across multiple buffers, e. g. when creating tempo-based volume ramps, so a bit of clever state management is necessary.

JSFX takes a bit of getting used to - it doesn’t look like C, Java or other “classic” language, but it still is essentially a procedural language.

Currently there is no way that I know to “compile” JSFX scripts to plugins - there are other options if you want to create portable plugins, e.g. Blue Cat’s Plug’n’Script.

Cheers,

Torsten

3 Likes

It’s pretty impressive I did some videos with wind controller with it first came out. Their apps will “phone home” to check for updates, you can turn automatic updates off as a work around. I know that’s an annoyance for some.

1 Like

There is no doubt that some patches stress systems on the recent Cherry synths and that to get unlimited potential (you might quantify that as using the most demanding possible patch and still retain enough headroom to work on a project or employ other plugins in a host like Cantabile) a recent high powered CPU is recommended. Having said that, I am running very nice GX-80 patches on my aging live machine, a circa 2012 Lenovo T420, at a buffer of 256 samples on a Focusrite Saffire.
You can turn off unused ranks - try alternative effects as you’ve suggested. On the subject of polyphony I’ve requested that Cherry consider providing user defined polyphony instead of forcing 2/4/8/16. You can imagine the jump in demand between 8 and 16. Those release times hang over and the demand becomes huge. The same applies even between 4 and 8 voices.
The fact is, 5 or 6 voices is a very nice limit to set. It allows sophisticated chording and keeps releases in check. If Cherry allow for the same kind of definable polyphony that we see in their other instruments, it will tame, arguably, the hungriest of their creations to date, and allow quite serviceable computers to use, IMO, the most stunning synth they have developed so far.
PIZ MIDI do make a polyphony MIDI plugin. It does help a bit. Set the GX-80 to 8 voice and set the polyphony to 5 or 6.
That doesn’t deal with the release issue but I’ve found it somewhat effective.
I do hope we see a polyphony option like that in their other instruments. That will be a huge CPU saver.
As you’ve used Glitch Free you’re probably in good shape, but it pays to check that all CPU cores are active and nothing is parked.

3 Likes

Yeah, I passed on Sines because of it. Almost didn’t demo GX-80 figuring it would be even worse. Fortunately its completely doable cpu wise and is completely awesome sound wise.

2 Likes

Yes, no such problem with the GX-80 demo I’ve tried.
I have done some extra test with Sines and it seems that the only thing which really helps (as @Ade said) is to reduce the polyphony (switching effects off and shorting release times have almost no effect on Time Load).

Gabriel

1 Like

I’m not a keys player, but what I know from sequencing I would completely agree that Cherry providing this option would be a great addition.

1 Like

OK - I have your script running in Sines. First off, thank you for having a go at this. It could be a real game changer for some synths when there’s no access to Poly AT.
I do have an Elka MK88 with a Kurzweil Ribbon control for exactly this CS-80 scenario but it’s simply great to have this kind of expression via regular channel pressure.
So far, it seems that the script is randomly not resetting to off resulting in new notes coming in modulated before pressure is applied.
Have you found this?
I’m going to check it with Omnisphere,

1 Like

Could be the hungriest, on reexamination. I’ve been so wrapped up in the GX-80 that it’s a pleasant surprise to see it being handled pretty well on a decade old Thinkpad.
Gabriel’s script is definitely getting close to what could be done on other synths which handle polyAT.
Omnisphere is not so exciting in this regard. No truly polyphonic LFO depth as far as I can tell. Their Poly LFO (number 8) is simply executing its cycle independently and I’ve not found any info to the contrary.
DIVA was always lovely with poly AT and it works OK with Gabriel’s script. The issue is, I think, that the pressure value is not resetting reliably, and new notes can come in at high values.
I really would love to see a Cantabile filter for this trick - but it would also be great to see the minor glitches ironed out in the ReaJS script.

2 Likes

Looks like the script doesn’t reset Poly AT for the previous note when a new one comes in; it simply starts translating channel pressure to a new note Poly AT for the new note going forward. As long as you release AT on held notes before triggering a new one, this doesn’t hurt, but if you hold one note with a bit of pressure, then hit a new one, all following pressure will then be translated to Poly AT for the new note - the previous note’s Poly AT will be stuck.

An easy solution to the script would be to send a Poly AT of zero for the previous note whenever a new note is struck. This may be a bit abrupt, so a smoother solution would be to initiate a ramp-down of Poly AT from the current level over some time, but that would be a lot more complex to script.

Cheers,

Torsten

2 Likes

I also passed on Sines for this reason. From what i’ve read here, it seems some people have no trouble with it, while some of us see huge CPU loads. I wonder if maybe the program just doesn’t play well with Windows 7 (as on my computer), or are folks on Win 10 seeing the same thing ?

– Jimbo

I’m on an ancient Xeon cpu that still packs a good punch but maybe doesn’t have an instruction set needed for good performance of Sines? I know it won’t even run Modo Drums because of missing instruction set according to IK. But oddly does run Modo Bass.

I think we have to acknowledge that these older computers are not packing the punch that the most recent CPUs provide, and it’s not unreasonable for software houses to author for the current standard of performance and OS.
At some point the software leaves the hardware behind so here’s something I’ll be checking today …
My studio desktops are running the typical Vienna Ensemble network. VSL, in their infinite wisdom, filter poly AT completely because they feel it can screw up their software. Seems a bit over cautious, but that’s it.
However, pseudo poly AT generated within a plug-in is immune to that restriction, plus, one gets independent buffering for each frame of VEP, up to 4x the ASIO buffer. That could be a way getting a more sympathetic performance.
You can network to a frame on your local computer- within Cantabile. Might be worth a try.
Sledgehammer approach but, hey, cheaper than an M1! :crazy_face:

1 Like