Pure Data added to VCV Prototype

Did you get any progress with Arduino data in and out? I’m also trying to do with “comport.” To use Pd externals in VCV Prototype seems to need to build VCV Prototype from source, isn’t it? I built from the source, but I got just error log says “error… couldn’t create”

If you have any tips, please let me know. thanks.

I didn’t get very far with that, After i installed pduino v0.6 in pure data via the “find externals” menu item, i played around with the pduino examples in pure data for a while. It was easy to get it to read a pot on the arduino uno analog in.

But I didn’t really get it working in vcv Prototype - someone with more brains may be able to, I constantly stumble on Pd basics. So, I can’t answer your questions on that.

It works better for me to make a USB midi class compliant device to get the same functionaliy.

I just noticed there is Rack 2 and was wondering what this means for the Prototype module. Is it alive? If not, is it going to be revived? Is there something we should / can do? Please forgive the ignorance, we weren’t following what going on.

1 Like

Just checked, doesn’t look like it’s there yet. But it probably will be. I hope it will, just made a Prototype/PD granular sample player a few weeks back, that I would like to use at some point :slight_smile:

But still some modules to go, before I can adapt to V2.

1 Like

I’m also wondering if there are plans for Prototype to make it to V2…?! @Jens.Peter.Nielsen @Vortico any chance you could toss out a quick response if/when for this one??

I have no clue of when - I’m not affiliated with VCV in any way.

But having read this I have no doubt we will get VCV Prototype in Rack2 eventually. It was a “selling point” of Rack 2, that VCV would see to that all v1.1.6 opensource plugins were ported (if the porting was straight forward). When? when!

The latest commit to VCV prototype was 1 month ago - please be patient.

1 Like

Apologies - I thought since you posted much of the official update news you were on team with Andrew/VCV! I’m a newbie to the forums

Definitely very willing to be patient, just was very curious since having PD/etc would be a major addition along with the new arsenal!

Hope everyone involved with VCV knows how over the moon appreciative we all are for this major release of Rack 2. It’s legitimately opening up mew frontiers in sound design and recording (for lil’ ‘ol me, at least!)

1 Like

I was looking for Prototype also. Looks like Andrew created a v2 branch a few weeks ago. If somebody’s feeling adventurous they can try compiling. I might try it on my Linux box soon to see if it works, but it’s not a proper release build environment.

I tried (Windows 11 & Msys64-MinGW64)

git clone --branch v2 https://github.com/VCVRack/VCV-Prototype

And did the makefile changes suggested by @Steve_Russell

But I got errors in make dep

In file included from libpd_wrapper/z_libpd.c:23:
./pure-data/src/s_stuff.h:153:53: note: expected 't_audiosettings *' {aka 'struct _audiosettings *'} but argument is of type 'int'
  153 | EXTERN void sys_set_audio_settings(t_audiosettings *as);
      |                                    ~~~~~~~~~~~~~~~~~^~
libpd_wrapper/z_libpd.c:163:3: error: too many arguments to function 'sys_set_audio_settings'
  163 |   sys_set_audio_settings(1, indev, 1, inch,
      |   ^~~~~~~~~~~~~~~~~~~~~~
In file included from libpd_wrapper/z_libpd.c:23:
./pure-data/src/s_stuff.h:153:13: note: declared here
  153 | EXTERN void sys_set_audio_settings(t_audiosettings *as);
      |             ^~~~~~~~~~~~~~~~~~~~~~
make[1]: *** [<builtin>: libpd_wrapper/z_libpd.o] Error 1
make[1]: Leaving directory '/home/jpn99/github/Rack2/Rack/plugins/VCV-Prototype/dep/libpd'
make: *** [Makefile:242: dep/lib/libpd.a] Error 2
2 Likes

No idea what I’m doing, but here it goes:

I had the same error.

In the Makefile referenced above I commented out:

cd dep/libpd && git checkout 5772a612527f06597d44d195843307ad0e3578fe

And changed the variables vult/faust/supercollider to zero:

VULT ?= 0
FAUST ?= 0
SUPERCOLLIDER ?= 0

In Prototype.cpp I added:

#include <string>
#include <codecvt>
#include <locale>

And changed:

std::wstring commandW = string::toWstring(command);

to

std::wstring commandW = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(command);

It compiled and installed, but loading scripts results in: “No engine for …<lua/js/pd> extension”. Creating a new script results in: "File extension “.pd/js/lua not recognized.”

Managed to (mostly) build it as well, on Linux (couple minor tweaks and Faust still fails to compile).

However I also see a No engine for ..pd extension << notice there is an extra . here. The code that generates this message:

	// Create script engine from path extension
		std::string extension = system::getExtension(path);
		scriptEngine = createScriptEngine(extension);
		if (!scriptEngine) {
			message = string::f("No engine for .%s extension", extension.c_str());
			return;
		}
		scriptEngine->module = this;

So it seems that Rack2’s system::getExtension() retains the . on extension. You then have to prepend it for each of the engines.

What I needed to do was the following changes:

Make sure GH links use https only (needed for submodules in Vult, didn’t feel like completely replacing my ssh keys just yet):

echo -e '[url "https://github.com/"]\n  insteadOf = "git://github.com/"' >> ~/.gitconfig

And then these changes to VCV-Prototype:

diff --git a/Makefile b/Makefile
index c1e56bb..6ff4fa6 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@ PYTHON ?= 0
 SUPERCOLLIDER ?= 1
 VULT ?= 1
 LIBPD ?= 1
-FAUST ?= 1
+FAUST ?= 0
 
 # Vult depends on both LuaJIT and QuickJS
 ifeq ($(VULT), 1)
@@ -195,7 +195,7 @@ SOURCES += src/VultEngine.cpp
 vult := dep/vult/vultc.h
 vult := dep/vult/vultc.h
 $(vult):
        cd dep && mkdir -p vult
-       cd dep/vult && $(WGET) "https://github.com/modlfo/vult/releases/download/v0.4.12/vultc.h"
+       cd dep/vult && $(WGET) "https://github.com/vult-dsp/vult/releases/download/v0.4.12/vultc.h"
        $(SHA256) $(vult) 3e80f6d30defe7df2804568f0314dbb33e6bf69d53d18a804c8b8132cf5ad146
 FLAGS += -Idep/vult
 DEPS += $(vult)
@@ -223,7 +223,7 @@ endif
 
 $(libpd):
        cd dep && git clone "https://github.com/libpd/libpd.git" --recursive
-       cd dep/libpd && git checkout 5772a612527f06597d44d195843307ad0e3578fe
+       cd dep/libpd && git checkout 49a12f048c4e4b6089e185d5946dcd51e05becd3
        
 ifdef ARCH_MAC
        # libpd's Makefile is handmade, and it doesn't honor CFLAGS and LDFLAGS environments.
diff --git a/src/LibPDEngine.cpp b/src/LibPDEngine.cpp
index 7be549f..1786ce2 100644
--- a/src/LibPDEngine.cpp
+++ b/src/LibPDEngine.cpp
@@ -331,5 +331,5 @@ void LibPDEngine::sendInitialStates(const ProcessBlock* block) {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-       addScriptEngine<LibPDEngine>("pd");
+       addScriptEngine<LibPDEngine>(".pd");
 }
diff --git a/src/Prototype.cpp b/src/Prototype.cpp
index 71c0673..ab2f2c2 100644
--- a/src/Prototype.cpp
+++ b/src/Prototype.cpp
@@ -594,7 +594,7 @@ struct Prototype : Module {
                if (path == "")
                        return "";
                // HACK check if extension is .pd
-               if (system::getExtension(path) == "pd")
+               if (system::getExtension(path) == ".pd")
                        return settingsPdEditorPath;
                return settingsEditorPath;
        }

Haven’t tested the other scripting engines yet, but Pd works for me now.

So with Faust I’m stuck on this:

g++ -o plugin.so build/src/Prototype.cpp.o build/src/QuickJSEngine.cpp.o build/src/LuaJITEngine.cpp.o build/src/SuperColliderEngine.cpp.o build/src/VultEngine.cpp.o build/src/LibPDEngine.cpp.o build/src/FaustEngine.cpp.o dep/lib/libefsw-static-release.a dep/lib/quickjs/libquickjs.a dep/lib/libluajit-5.1.a dep/supercollider/build/lang/libsclang.a dep/supercollider/build/external_libraries/libtlsf.a dep/supercollider/build/external_libraries/hidapi/linux/libhidapi.a dep/supercollider/build/external_libraries/hidapi/hidapi_parser/libhidapi_parser.a dep/supercollider/build/external_libraries/libboost_thread_lib.a dep/supercollider/build/external_libraries/libboost_system_lib.a dep/supercollider/build/external_libraries/libboost_regex_lib.a dep/supercollider/build/external_libraries/libboost_filesystem_lib.a dep/supercollider/build/external_libraries/libyaml.a dep/lib/libpd.a dep/lib/libfaust.a -lpthread -lasound -ludev -shared -L../Rack/ -lRack -Wl,-rpath=/tmp/Rack2 -static-libstdc++ -static-libgcc 
/usr/bin/ld: dep/lib/libfaust.a(errormsg.cpp.o): in function `yyerror(char const*)':
/home/dreamer/Sources/_audio/_rack/VCV-Prototype/dep/faust/compiler/errors/errormsg.cpp:64: multiple definition of `yyerror(char const*)'; dep/supercollider/build/lang/libsclang.a(PyrLexer.cpp.o):/home/dreamer/Sources/_audio/_rack/VCV-Prototype/dep/supercollider/lang/LangSource/PyrLexer.cpp:1293: first defined here
/usr/bin/ld: dep/lib/libfaust.a(faustlexer.cpp.o):/home/dreamer/Sources/_audio/_rack/VCV-Prototype/dep/faust/build/faustdir/faustlexer.cpp:819: multiple definition of `yytext'; dep/supercollider/build/lang/libsclang.a(PyrLexer.cpp.o):/home/dreamer/Sources/_audio/_rack/VCV-Prototype/dep/supercollider/lang/LangSource/PyrLexer.cpp:104: first defined here
/usr/bin/ld: dep/lib/libfaust.a(faustlexer.cpp.o): in function `yylex()':
/home/dreamer/Sources/_audio/_rack/VCV-Prototype/dep/faust/build/faustdir/faustlexer.cpp:1033: multiple definition of `yylex()'; dep/supercollider/build/lang/libsclang.a(PyrLexer.cpp.o):/home/dreamer/Sources/_audio/_rack/VCV-Prototype/dep/supercollider/lang/LangSource/PyrLexer.cpp:359: first defined here
collect2: error: ld returned 1 exit status
make: *** [../Rack//compile.mk:62: plugin.so] Error 1

Vult just gets stuck on Compiling... so also not functional yet for me.

The rest (Pd, JS, Supercollider) seem to work fine after adding the . to their extensions.

That was helpful. I managed to compile a working windows version without Faust and Supercollider. PureData works. So does lua and js. Loading a vult script results in the message “Compiling…”. The error I get on Supercollider when running make after make dep is:

fatal: destination path 'supercollider' already exists and is not an empty directory.

Here’s what I changed:

diff --git a/Makefile b/Makefile
index c1e56bb..b8da746 100644
--- a/Makefile
+++ b/Makefile
@@ -16,10 +16,10 @@ DUKTAPE ?= 0
 QUICKJS ?= 1
 LUAJIT ?= 1
 PYTHON ?= 0
-SUPERCOLLIDER ?= 1
+SUPERCOLLIDER ?= 0
 VULT ?= 1
 LIBPD ?= 1
-FAUST ?= 1
+FAUST ?= 0
 
 # Vult depends on both LuaJIT and QuickJS
 ifeq ($(VULT), 1)
@@ -29,14 +29,27 @@ endif
 
 
 # Entropia File System Watcher
-efsw := dep/lib/libefsw-static-release.a
+ifdef ARCH_WIN
+	efsw := dep/lib/efsw-static-release.lib
+else
+	efsw := dep/lib/libefsw-static-release.a
+endif
 DEPS += $(efsw)
 OBJECTS += $(efsw)
 $(efsw):
+ifdef ARCH_WIN
+	cd efsw && premake5 gmake
+	cd efsw && $(MAKE) -C make/* config=release_x86_64 efsw-static-lib
+else
 	cd efsw && premake4 gmake
 	cd efsw && $(MAKE) -C make/* config=release efsw-static-lib
+endif
 	mkdir -p dep/lib dep/include
+ifdef ARCH_WIN
+	cd efsw && cp lib/efsw-static-release.lib $(DEP_PATH)/lib/
+else
 	cd efsw && cp lib/libefsw-static-release.a $(DEP_PATH)/lib/
+endif
 	cd efsw && cp -R include/efsw $(DEP_PATH)/include/
 
 
@@ -195,7 +208,7 @@ SOURCES += src/VultEngine.cpp
 vult := dep/vult/vultc.h
 $(vult):
 	cd dep && mkdir -p vult
-	cd dep/vult && $(WGET) "https://github.com/modlfo/vult/releases/download/v0.4.12/vultc.h"
+	cd dep/vult && $(WGET) "https://github.com/vult-dsp/vult/releases/download/v0.4.12/vultc.h"
 	$(SHA256) $(vult) 3e80f6d30defe7df2804568f0314dbb33e6bf69d53d18a804c8b8132cf5ad146
 FLAGS += -Idep/vult
 DEPS += $(vult)
@@ -223,7 +236,7 @@ endif
 
 $(libpd):
 	cd dep && git clone "https://github.com/libpd/libpd.git" --recursive
-	cd dep/libpd && git checkout 5772a612527f06597d44d195843307ad0e3578fe
+	cd dep/libpd && git checkout 49a12f048c4e4b6089e185d5946dcd51e05becd3
 	
 ifdef ARCH_MAC
 	# libpd's Makefile is handmade, and it doesn't honor CFLAGS and LDFLAGS environments.
diff --git a/src/DuktapeEngine.cpp b/src/DuktapeEngine.cpp
index d9db2b9..b4ac027 100644
--- a/src/DuktapeEngine.cpp
+++ b/src/DuktapeEngine.cpp
@@ -219,5 +219,5 @@ struct DuktapeEngine : ScriptEngine {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<DuktapeEngine>("js");
+	addScriptEngine<DuktapeEngine>(".js");
 }
diff --git a/src/FaustEngine.cpp b/src/FaustEngine.cpp
index 6d6a987..3803c8c 100644
--- a/src/FaustEngine.cpp
+++ b/src/FaustEngine.cpp
@@ -369,5 +369,5 @@ private:
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<FaustEngine>("dsp");
+	addScriptEngine<FaustEngine>(".dsp");
 }
diff --git a/src/LibPDEngine.cpp b/src/LibPDEngine.cpp
index 7be549f..1786ce2 100644
--- a/src/LibPDEngine.cpp
+++ b/src/LibPDEngine.cpp
@@ -331,5 +331,5 @@ void LibPDEngine::sendInitialStates(const ProcessBlock* block) {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<LibPDEngine>("pd");
+	addScriptEngine<LibPDEngine>(".pd");
 }
diff --git a/src/LuaJITEngine.cpp b/src/LuaJITEngine.cpp
index 0ec77ef..a2167a6 100644
--- a/src/LuaJITEngine.cpp
+++ b/src/LuaJITEngine.cpp
@@ -246,5 +246,5 @@ struct LuaJITEngine : ScriptEngine {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<LuaJITEngine>("lua");
+	addScriptEngine<LuaJITEngine>(".lua");
 }
diff --git a/src/Prototype.cpp b/src/Prototype.cpp
index 71c0673..ddaa511 100644
--- a/src/Prototype.cpp
+++ b/src/Prototype.cpp
@@ -504,7 +504,7 @@ struct Prototype : Module {
 		(void) std::system(command.c_str());
 #elif defined ARCH_WIN
 		std::string command = editorPath + " \"" + path + "\"";
-		std::wstring commandW = string::toWstring(command);
+		std::wstring commandW = rack::string::UTF8toUTF16(command);
 		STARTUPINFOW startupInfo;
 		std::memset(&startupInfo, 0, sizeof(startupInfo));
 		startupInfo.cb = sizeof(startupInfo);
diff --git a/src/PythonEngine.cpp b/src/PythonEngine.cpp
index edcb0ec..022699f 100644
--- a/src/PythonEngine.cpp
+++ b/src/PythonEngine.cpp
@@ -252,5 +252,5 @@ struct PythonEngine : ScriptEngine {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<PythonEngine>("py");
+	addScriptEngine<PythonEngine>(".py");
 }
diff --git a/src/QuickJSEngine.cpp b/src/QuickJSEngine.cpp
index d137d9b..b1de404 100644
--- a/src/QuickJSEngine.cpp
+++ b/src/QuickJSEngine.cpp
@@ -329,5 +329,5 @@ struct QuickJSEngine : ScriptEngine {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-  addScriptEngine<QuickJSEngine>("js");
+  addScriptEngine<QuickJSEngine>(".js");
 }
diff --git a/src/SuperColliderEngine.cpp b/src/SuperColliderEngine.cpp
index 6db72b1..910c0df 100644
--- a/src/SuperColliderEngine.cpp
+++ b/src/SuperColliderEngine.cpp
@@ -405,6 +405,6 @@ bool SC_VcvPrototypeClient::copyArrayOfFloatArrays(const PyrSlot& inSlot, const
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<SuperColliderEngine>("sc");
-	addScriptEngine<SuperColliderEngine>("scd");
+	addScriptEngine<SuperColliderEngine>(".sc");
+	addScriptEngine<SuperColliderEngine>(".scd");
 }
diff --git a/src/VultEngine.cpp b/src/VultEngine.cpp
index 4370f53..d911aa7 100644
--- a/src/VultEngine.cpp
+++ b/src/VultEngine.cpp
@@ -150,5 +150,5 @@ struct VultEngine : ScriptEngine {
 
 __attribute__((constructor(1000)))
 static void constructor() {
-	addScriptEngine<VultEngine>("vult");
+	addScriptEngine<VultEngine>(".vult");
 }
1 Like

Note that in order to run Vult scripts you need to have enabled the Js and Lua engines. If any of those are disabled the Vult scripts will not work.

I did, as it’s enabled by default and I didn’t disable it :wink:

Is there some other way to debug Vult stuck on “compiling” ?

1 Like

Hi, are there any news on Prototype version 2?

See here: Vult on VCV-Prototype works again - #37 by Steve_Russell

Thanks @Steve_Russell … no news since March tho

Is VCV Prototype no longer available? Is there another way to run scripts in VCV Rack? Thanks!

IIRC Prototype can only be built from source, because some variants for which language(s) is available can’t coexist, and in some case, dependencies must be installed separately.