Surge XT

I’ve done a bit of research now.
Nothing is accessible through the Zynthian UI.

SURGE XT have 8 macros, and by default, they are blank.

By default, the macros are assigned to midi CC 41-48, which is often mapped by default to knobs or slider banks for a lot of midi controllers.

Midi CC can be assigned to any paramaters.

I will try to create some simple patch and test how the CC midi signals will pass.

From the log file, I calculated that there are 1274 factory presets and 4742 3rdparty presets available.

If I’m very fast and it takes me 15 seconds to manually process one preset, I’ll need over 25 hours of time. (and subsequently a stay in an madhouse).

I also created a tar.gz file with all the files from the /usr/share/surge-xt/ directory. It is 205MB in size, so I can’t put it on github so that it is available for anyone interested in contributing to the development of LV2 form of presets, usable for Zynthian.

Studying the manual, I found out that the Surge XT now has built-in OSC access as well. :slight_smile: I’m wondering if it could be used to generate presets.

1 Like

I love oram, MIDI CC in Chain options is a super cool feature. It was enough to select the right CC and the internal learning of Midi works in SURGE XT.

Example with filter and cut off mapped to CC midi

Anyone familiar with developer of jalv lv2 plugin host?
If it was possible to control the saving of the lv2 preset from the command line, it would help our problem, and not only with the Surge XT.

Something along the lines of (for already launched jalv with Surge XT):
jalv.gtk --save_lv2_preset "name of preset"

In combination with the OSC command for loading a specific preset (in the Surge XT standard), the generation of lv2 presets for Zynthian could be automated.

This already exists in the jalv’s command line interface. Simply type “help” to see the available commands.

Anyway, i think we should ask surge developers to generate the LV2 presets when building the program. It’s the right thing. Pianoteq developers added a CLI option for this.

Regards,

I know the boss is always right. I went through both the help and the man page and couldn’t find any similar option. It’s simple, if I can’t find it, I can’t use it.
That’s why I agree and the best thing to do is to ask the Surge developers to add an option to generate lv2 presets.

This is the help from zynthian’s jalv CLI:

> help
Commands:
  help              Display this help message
  controls          Print settable control values
  monitors          Print output control values
  presets           Print available presets
  preset URI        Set preset
  save preset [BANK_URI,] LABEL
                    Save preset (BANK_URI is optional)
  set INDEX VALUE   Set control value by port index
  set SYMBOL VALUE  Set control value by symbol
  SYMBOL = VALUE    Set control value by symbol

Anyway, we should ask surgeXT developers to generate LV2 presets on build.
Could you open a feature request in the surgeXT repository? After you do it, send the link and all zynthian users interested on this (all??) would push a little bit by reposting “+1” and things like this :wink:

Regards,

Regards,

2 Likes

yes, I tried this too, but it doesn’t respond to help at all…

Thanks @jofemodo and thanks for your patience.

OK, I’ll try to write a request to Surge developers.

Perhaps the “help” command is not implemented in “jalv.gtk”. I was using “jalv”. Anyway, the save preset command is :wink:

Regards,

1 Like

Thanks @ToFF for your binaries! I was able to install Surge-XT and it works. What I noticed on your GitHub page is, that the data folder with the presets, wavetables etc. is missing.
One problem I found, Surge-XT has 6 outputs, when added to a chain, the first output is routed to input a, the remaining 5 to input b, so the stereo distribution is very uneven. Most likely only the first two outputs would be needed.

(Edit - added screenshot)

I got stuck on how big the file is, so I quickly created an archive with preset factors. Unzip it to the /usr/share/surge-xt directory in Zynthian.

surge-factory-presets.zip 19 MB

Interesting… I’ll see how it is for me during the day. Now I have a clean oram installed and I’m trying some surprisingly new drum plugins.

1 Like

It was no problem for me, I copied the whole folder from my desktop computer.

Done :slight_smile:

1 Like

The first result is not very encouraging. I followed the recommended procedure and all the presets are generated into the main manifest in the directory /usr/lib/aarch64-linux-gnu/lv2/Surge XT.lv2

It looks like this.

@prefix lv2:   <http://lv2plug.in/ns/lv2core#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix pset:  <http://lv2plug.in/ns/ext/presets#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix ui:    <http://lv2plug.in/ns/extensions/ui#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .

<https://surge-synthesizer.github.io/lv2/surge-xt>
	a lv2:Plugin ;
	lv2:binary <libSurge%20XT.so> ;
	rdfs:seeAlso <dsp.ttl> .

<https://surge-synthesizer.github.io/lv2/surge-xt:UI>
	a ui:X11UI ;
	lv2:binary <libSurge%20XT.so> ;
	rdfs:seeAlso <ui.ttl> .

<https://surge-synthesizer.github.io/lv2/surge-xt:preset1>
	a pset:Preset ;
	lv2:appliesTo <https://surge-synthesizer.github.io/lv2/surge-xt> ;
	rdfs:label "INIT OR DROPPED" ;
	state:state [ <https://surge-synthesizer.github.io/lv2/surge-xt:Program> "0"^^xsd:int ; ] .

<https://surge-synthesizer.github.io/lv2/surge-xt:preset2>
	a pset:Preset ;
	lv2:appliesTo <https://surge-synthesizer.github.io/lv2/surge-xt> ;
	rdfs:label "Basses / Attacky" ;
	state:state [ <https://surge-synthesizer.github.io/lv2/surge-xt:Program> "1"^^xsd:int ; ] .

<https://surge-synthesizer.github.io/lv2/surge-xt:preset3>
	a pset:Preset ;
	lv2:appliesTo <https://surge-synthesizer.github.io/lv2/surge-xt> ;
	rdfs:label "Basses / Bass 1" ;
	state:state [ <https://surge-synthesizer.github.io/lv2/surge-xt:Program> "2"^^xsd:int ; ] .

In the natural GUI, it looks like this when selecting a preset

I’m trying another way, but it’s getting frustrating.
I send jalv CLI commands from bash but nothing happens. I miss Return. Does anyone have a simple example of how to get into the Jalv CLI from bash or python?

I would like to test if it would work:

  • Set preset via OSC
  • Save it via jalv CLI

The CLI only works in the console versions of jalv. It does not work in the GUI versions. Run jalv and not jalv.gtk.

1 Like

It works in graphics binaries, too, like jalv.gtk.
I will try tomorrow.

Regards

IIRC jalv.gtk CLI was broken and it got fixed but there are missing commands, including help. I think we added save command to our forked version and we may not have added it to the variants like jalv.gtk, jalv.qt5, etc. It was a while ago so my memory isn’t good on it but I suspect this may be the issue.

Anyway, I am not sure how helpful this is. Jalv preset control is for LV2 presets so I don’t think you can load an instance of SurgeXT into jalv with a native preset then save it as a LV2 preset all from the CLI.

BTW - I can’t get Surge to run on my V5 running Oram updated today (2024-04-18) with VNC enabled. The native GUI seems to crash jalv.gtk. I can start it with jalv.qt5 but that does not give the native GUI. Also, it looks like I have Surge rather than Surge XT. Sorry! I see that these issues are known and that Surge XT is not yet integrated with Oram. I will grab @ToFF’s binaries.

The plan is to load the native preset using the OSC command (Surge XT has support for it)
/patch/load /Library/Application Support/Surge XT/patches_factory/Plucks/Clean
and then over jalv CLI save LV2 preset

1 Like

Please see why it connects in jackd with this noncorect way.

From:
src/surge-xt/SurgeSynthProcessor.cpp
Line 45:

SurgeSynthProcessor::SurgeSynthProcessor()
    : juce::AudioProcessor(BusesProperties()
                               .withOutput("Output", juce::AudioChannelSet::stereo(), true)
                               .withInput("Sidechain", juce::AudioChannelSet::stereo(), true)
                               .withOutput("Scene A", juce::AudioChannelSet::stereo(), false)
                               .withOutput("Scene B", juce::AudioChannelSet::stereo(), false))

Could this be a build-option for only one stereo output?