Using VSTPlugin with Tidal

Thanks so much @mrreason & @mattia.paterna for this proof of concept!

I couldn't get this to work and filed an issue here, I think I might just be misunderstanding something:

Hey @jarm and thanks for trying out the experimental TidalVST. And sorry for the late reply. Today I was able to look into the issue.

You need to simply execute this statement in TidalCycles before you can use the vst statement:

vstName = pS "vstName"
vst name = s "vst" # vstName name

It is defined in this file: TidalVST/newFunctions.hs at main · thgrund/TidalVST · GitHub

Let me know if there is any further problem.

Progress!

I took a big step in simplifying the setup and becoming more flexible by being able to apply SuperDirt effects to the VST instruments. This is done by creating a VST plugin as SynthDef in SuperCollider and routing it into the SynthDef bus and linking the SynthGroup.

And the error message disappeared. I would say this is a huge step in creating a more generic approach.

The source code is updated and can be found (as always) here: GitHub - thgrund/TidalVST: Using Supercolliders VSTPluginController to control VST plugins with TidalCycles

I made a small showcase. You can find it here:

5 Likes

Hi. Love the plugin. However I have problems with frequent clipping which is not present using VSTPlugin in supercollider directly. Increasing fadeTime helps a little. I tried with Surge XT, Dexed and Odin2 vsts mono and poly modes. Maybe there is some parameter or hack that can help? Thanks

Glad to hear you're having fun with it! I've heard of clipping occurring, but I haven't had that problem yet. I would install Dexed and try to reproduce it. Do you have some information for me here? Something like what preset are you using and what does your TidalCycles code look like?

After a long debug session yesterady I realized that there is a problem with the event duration in combination with the ~dirt.server.makeBundle. But the solution could be a little bit complicated.
I think it's needed to re-build the SuperDirt midi event type to a vst-midi event type. There is a proxy interface that I could use.
And work with a thread scheduler with the event latency and the sustain value to manually trigger noteOn and noteOffs in sync with the rest of the event. I hoped there is a simpler solution (like I played a vst_midi event triggered by a dirt event.).
This in combination with an envelope in the VSTPlugin SynthDef should remove the clipping.

Btw. I tested everything with the Dexed Plugin. I will try to fix it asap because I would like to try a "one synthesizer challenge" with Dexed and this Tidal-VST. Sooo my motivation is huge to fix this.

3 Likes

Thanks. Glad to hear u found a problem. I want to ask or at least get pointers (maybe I will try to dig in myself) for 2 other things:

  1. Is it possible to have .scd file load automatically on Tidal/SuperDirt startup and make vsts permanent (or respawan but with pre-kill parameters). Because now at least for me I have to evaluate code in .scd by hand after startup and if I use kill in SC I need to reeavulate it again.
  2. Does code needs a lot of modifications to work with VST effects or is it matter of only changing synth definition and event type?

The short answer is that it is certainly all possible. But I can not estimate the effort and what is a good solution here.

But I always call it proof of concept because I am not able to answer all questions. What is important to me about my approach is that it works together with SuperDirt (otherwise there is the other approach with Ableton Studio).

But there is not yet a solution for everything, so everyone is free to contribute here and for help I am always grateful.

But for transparency, my next steps are:

  • Make playing VST instruments more robust (avoid clipping etc.)
  • And make the code more scalable, so that you can run 7 VST instruments in parallel, for example.

Next progress! I think I solved the clipping issue as I described here

You can try it out now:

3 Likes

That seems to have done the trick. Interestingly I was exploring a similar path this weekend but wasn't successful in getting good results.

Excellent work @mrreason

@qaciwq I might have a solution for you. Let me get some time to package it up and post my current version here.

2 Likes

Hi. Appreciate the update. I tried new code, but encountered similar clipping as before. I made short 1 min video in vimeo Vimeo of test using VSTPlugin directly and then Dexed.scd code.

Unfortunately I can not see your definition of the triggerFunc function. For me it looks like you have a function with makeBundle because I see that there are multiple notes triggered even when this should not be possible with your pattern:

Furthermore the clipping problem is harder to solve with the newest version of the VSTPlugin extension.
To avoid clipping, you may have to set the fadeInTime to 0.01 and set a begin value greater than 0 in the pattern. But this is only a small dirty hack (but it works).

I made a new showcase to demonstrate the current state of TidalVST. All sounds come exclusively from the VST plugin Dexed. The drum sounds are played as samples, but all other sounds are generated live from seven plugin instances:

Also, with the new version of the VSTPlugin extension, I am able to create and load presets.
The only downer is that I don't seem to be able to apply an envelope to the VST SynthDef. To avoid clipping, you may have to set the fadeInTime to 0.01 and set a begin value greater than 0 in the pattern. But this is only a small dirty hack (but it works).

You can find my SuperCollider code from the small example here:

5 Likes

Wow, great! @mrreason

I believe one of the significant unique points of using Tidal is that it is easy to trigger a massive number of parameters simultaneously with a simple code.

I think we can dive deeper into legendary synthesizers by combining them with Tidal VST. (I am trying to do it through Ableton Live, but it costs too much overhead memory and manual work...)

1 Like

Thanks for the updates @mrreason!

I'm trying to get up and running on an M1 machine and having some struggles, don't know if you've had similar issues; Building SuperCollider (and plugins) on Mac M1 - #25 by jarm - Development - scsynth

Edit: Build issues solved: Testing on Apple Silicon (Mac Mini M1) (#137) · Issues · Pure Data libraries / vstplugin · GitLab

1 Like

When I add the example TidalVST.scd to my Boot.hs like so:

s.waitForBoot {
	~dirt = SuperDirt(2, s);
	~dirt.loadSoundFiles;
	s.sync;
	~dirt.start(57120, [0, 2, 4, 6, 8, 10, 12, 14]);
    ("/path/to/TidalVST/TidalVST.scd").load;
};

I get this syntax error on boot (referring to TidalVST/TidalVST.scd at main · thgrund/TidalVST · GitHub):

ERROR: syntax error, unexpected '(', expecting $end
  in interpreted text
  line 20 char 1:

  (
  ^
  var diversions = ();
-----------------------------------
ERROR: Command line parse failed

Another thing I spotted comparing TidalVST.scd to MrReasonsSetup.scd is:

var serverMessage = { |synth|
	[\out, ~out, \sustain, ~sustain].asControlInput.flop.do { |each|
		~dirt.server.sendMsg(\s_new,
			\VST,
			-1, // no id
			1, // add action: addToTail
			currentEnvironment.at(\synthGroup), // send to group
			*each.asOSCArgArray // append all other args
		)
	}
};

Shouldn't that \VST be replaced with synth, even for this demo example?

Thank you @superpeachman!

I believe one of the significant unique points of using Tidal is that it is easy to trigger a massive number of parameters simultaneously with a simple code.

I agree! I feel like I'm still at the beginning of TidalVST, even if you can change parameters and busses.
But you can already experiment with it well.

I know you didn't ask a question, but I wanted to take the chance to say that
~instruments.at(\dexed).gui in SuperCollider helps to start with the parameter mapping. Found this out myself only recently

You can map the parameter 0 from the VST plugin with varg0 = pF "varg0" for example.

I think we can dive deeper into legendary synthesizers by combining them with Tidal VST.

I would find that extremely exciting :slight_smile:

2 Likes

I'm glad to hear that! I have not yet switched to M1, so thanks for the tip. I haven't encountered this problem yet, but I'm glad to hear that it's been fixed.

Another thing I spotted comparing TidalVST.scd to MrReasonsSetup.scd is:

For me it looks like that in MrReasonsSetup everything is fine but I updated it for TidalVST.scd - thanks!

I get this syntax error on boot

You need to remove the brackets in the scd file and store the synthdef in the global synthdef store (or you separate TidalVST.scd and the Synthdef in two files and load them).
At least it worked for me.

1 Like

Not sure if this is helpful at this point but this is my current setup for playing VST with tidal :slight_smile:

4 Likes

not sure if i missed this somewhere in the thread, but would setting this up and doing this make it possible to use effect vsts in tidal?