Convert a Vamp Plugin to a JS Module » History » Version 3

Chris Cannam, 2017-06-20 10:04 AM

1 1 Chris Cannam
h1. Convert a Vamp Plugin to a JS Module
2 1 Chris Cannam
3 1 Chris Cannam
This page will describe how to take an existing Vamp plugin library, in the form of C++/C source code, and recompile it into a Javascript module that provides the "Piper":/projects/piper interface.
4 1 Chris Cannam
5 1 Chris Cannam
The process is a bit tricky, but it should only have to be done once for each plugin library, as the Javascript build is portable (unlike native builds of the original plugins which have to be re-done for each platform).
6 1 Chris Cannam
7 1 Chris Cannam
The process is also complicated by any third-party library code that the plugin may use. It's not possible to take an existing native library file (whether .a, .lib, .so, .dylib or .dll) and convert that to Javascript -- you have to add the original library source files to your build. This could be tricky to do if the library has any particular configuration requirements.
8 2 Chris Cannam
9 3 Chris Cannam
h4. An illustrative Docker file
10 2 Chris Cannam
11 2 Chris Cannam
To accompany this explanation, you can "find an example Docker file here":https://github.com/piper-audio/piper-vamp-js/blob/master/examples/docker/Dockerfile which actually carries out the process of converting and building a plugin library within a Docker container. This is not an especially convenient way to do it, but it should make explicit all of the necessary steps in a more-or-less reproducible way.
12 2 Chris Cannam
13 2 Chris Cannam
h4. Prerequisites
14 2 Chris Cannam
15 2 Chris Cannam
You will need the following:
16 2 Chris Cannam
17 2 Chris Cannam
* A typical Unix-like system - this has been tested using Arch Linux and macOS
18 2 Chris Cannam
* A sufficiently recent version of the Emscripten C++-to-Javascript compiler
19 2 Chris Cannam
* Typical native C/C++ build tools
20 2 Chris Cannam
* Node.js environment, to run the tests
21 2 Chris Cannam
22 2 Chris Cannam
You will need to have the following repositories checked out. The build process expects that all of these will be checked out into a common parent directory.
23 2 Chris Cannam
24 2 Chris Cannam
* "Piper":/projects/piper - basic schema
25 2 Chris Cannam
* "Piper Vamp C++":/projects/piper-cpp - supporting C++ code
26 2 Chris Cannam
* "Piper Vamp JS":/projects/piper-vamp-js - Javascript adapter code
27 2 Chris Cannam
* "Vamp Plugin SDK":/projects/vamp-plugin-sdk - Vamp SDK used by both of the last two
28 3 Chris Cannam
* The source code for your own plugin library which you intend to convert
29 1 Chris Cannam
30 1 Chris Cannam
Also create a new directory for the JS module to be compiled in. You will need to provide a Makefile and a main file (in C++, to be cross-compiled to JS along with everything else) for this module so it makes sense to have a dedicated directory (and likely a version control repository) to put them in.
31 3 Chris Cannam
32 3 Chris Cannam
h4. Build the dependencies and tools
33 3 Chris Cannam
34 3 Chris Cannam
Not all of the dependent repositories need to be compiled: the ones that do are the Vamp Plugin SDK and Piper Vamp JS.
35 3 Chris Cannam
36 3 Chris Cannam
Build and install the Vamp plugin SDK. On Linux this is
37 3 Chris Cannam
38 3 Chris Cannam
<pre>
39 3 Chris Cannam
$ cd vamp-plugin-sdk ; ./configure && make && sudo make install
40 3 Chris Cannam
</pre>
41 3 Chris Cannam
42 3 Chris Cannam
Build the Piper Vamp JS repository:
43 3 Chris Cannam
44 3 Chris Cannam
<pre>
45 3 Chris Cannam
$ cd piper-vamp-js ; make
46 3 Chris Cannam
</pre>
47 3 Chris Cannam
48 3 Chris Cannam
This should produce a generator program in @bin/piper-vamp-stub-generator@ which we will use in a moment.
49 3 Chris Cannam
50 3 Chris Cannam
h4. Prepare your own plugin library
51 3 Chris Cannam
52 3 Chris Cannam
Compile your own Vamp plugin library in the normal way, i.e. as a native Vamp plugin for your current platform. This is necessary so that the conversion stub generator program can query the plugin.
53 3 Chris Cannam
54 3 Chris Cannam
Add its location to the @VAMP_PATH@ environment variable. You should also check that the @.cat@ category file and the @.n3@ or @.ttl@ RDF description file for the plugin are available in the same location as the plugin library itself. (If the plugin doesn't have those files, consider making them? They're helpful for other Vamp plugin hosts as well.)
55 3 Chris Cannam
56 3 Chris Cannam
h4. Prepare the JS module code folder
57 3 Chris Cannam
58 3 Chris Cannam
In your new working directory for the converted code, generate an initial version of the module main entry point using the generator program in @piper-vamp-js@. This will only work if your plugin library is in the @VAMP_PATH@.
59 3 Chris Cannam
60 3 Chris Cannam
<pre>
61 3 Chris Cannam
$ ../piper-vamp-js/bin/piper-vamp-stub-generator plugin-library-name > plugin-library-name.cpp
62 3 Chris Cannam
</pre>
63 3 Chris Cannam
64 3 Chris Cannam
replacing @plugin-library-name@ with the name of your plugin library. Be sure to run this in the right directory - the (initially empty) one for your new JS module, not the original plugin directory (as that could overwrite the original plugin code).