2024-04-16 My contributions (and additional fixes from other authors) have been merged into the main Pure-data repository, and so should be part of the next release. My contributes to LibPd will hopefully be merged soon: see github.com/libpd/libpd/pull/395
Pure-data compiled with Emscripten.
Run Pd patches (without GUI) in a web browser.
There is also WebPd with a limited subset of Pd functionality. empd is full Pd vanilla -nogui.
Emscripten compiles C to HTML, Javascript and Web Assembly. A small stub program written in C interfaces between libpd and SDL2 Audio API (which is implemented by Emscripten). The patch files are preloaded into Emscripten's virtual filesystem at compile time.
Pd uses C function pointers internally. Emscripten is stricter about calling function pointers with the exact type of the function (in C, extra arguments and return values are ignored). This means Pd has to be modified to do extra type checking: this bloats some code from 6 cases to 60 cases. to consider. Also pd_objectmaker has to be handled even more specially in various places. Bugs may remain in some code paths, because these type errors are only exposed at runtime. In particular, graphical array objects are reported not to be working, while tables without work ok.
Pd uses dynamic linking to load external plugins. This is not supported in Emscripten, so all needed externals have to be statically linked at compile time.
First install and activate the emscripten environment.
git clone https://github.com/emscripten-core/emsdk.git cd emsdk ./emsdk install latest ./emsdk activate latest source ./emsdk_env.sh cd ..
git clone --recursive https://github.com/claudeha/libpd.git cd libpd git checkout emscripten cd pure-data git remote add claudeha https://github.com/claudeha/pure-data.git git fetch claudeha git checkout claudeha/emscripten cd .. mkdir build cd build emcmake cmake .. -DPD_UTILS:BOOL=OFF -DCMAKE_BUILD_TYPE=Release emmake make cd ..
cd samples/emscripten/pdtest emmake make cd ..
To load in a browser you need a web server (local filesystem might not work). For example:
python -m SimpleHTTPServer 8080 & firefox http://localhost:8080/pdtest/pdtest.html chromium http://localhost:8080/pdtest/index.html
Google requires interaction with the page for audio (which drives the Pd scheduler) to start, so if nothing is happening try clicking.
Gem support is not for the faint hearted at this stage. Shared library support (which is really static in Emscripten) is blocked on an Emscripten/LLVM bug: emscripten#9726 so you have to compile a static library, which Gem doesn't have as a single file so you need to link many separate .a files. You also need to compile GLU first, patched to use Regal for OpenGL 1 support.
git clone https://github.com/claudeha/glu.git cd glu git checkout emscripten ./autogen.sh GL_CFLAGS="-s USE_REGAL=1 -DAPIENTRY=" GL_LIBS="-s USE_REGAL=1" \ emconfigure ./configure --enable-static --disable-shared GL_CFLAGS="-s USE_REGAL=1 -DAPIENTRY=" GL_LIBS="-s USE_REGAL=1" \ emmake make cd .. git clone https://code.mathr.co.uk/Gem.git cd Gem git checkout emscripten ./autogen.sh GL_CFLAGS="-s USE_REGAL=1" GL_LIBS="-s USE_REGAL=1" \ GLU_CFLAGS="-I$(pwd)/../glu/include" GLU_LIBS="$(pwd)/../glu/.libs/libGLU.a" \ emconfigure ./configure --enable-static --disable-shared \ --with-pd="$(pwd)/../libpd/pure-data" --disable-multicontext GL_CFLAGS="-s USE_REGAL=1" GL_LIBS="-s USE_REGAL=1" \ GLU_CFLAGS="-I$(pwd)/../glu/include" GLU_LIBS="$(pwd)/../glu/.libs/libGLU.a" \ emmake make -k cd src rm Gem.a emar rs Gem.a Gem_la-Version.o `find -iname "lib*.o"` cd ../../libpd/samples/emscripten/gemtest emmake make cd .. python -m SimpleHTTPServer 8080 & firefox http://localhost:8080/gemtest/gemtest.html chromium http://localhost:8080/gemtest/index.html
Using a chroot for the sole purpose helps isolate from the rest of your system, which helps with reproducibility and license auditing. Here are three scripts:
You need about 6GB disk space total.
One less trivial patch I tested uses 6% of one core at 2.2GHz in native Pd, but 12% of one core at 2.2GHz in Firefox 64. So performance is around 2x worse than native. This is with a Release build, with a Debug build of empd add another 10x slowdown on top.
Please report any issues specific to empd (if you have issues reproducible in upstream pure-data or libpd or Gem or regal or emscripten, please report to those projects first).
My changes are Copyright (C) 2019,2020 Claude Heiland-Allen. The changes to pure-data are under the pure-data license. The changes to libpd are under the libpd license. The changes to Gem are under the Gem license. The changes to regal are under the regal license. The changes to glu are under the glu license.
Be aware of your legal obligations when publishing patches on the web using empd, as far as I can tell this counts as binary distribution (I am no lawyer, you may wish to consult one). See also: emscripten issue #6824 license terms for generated code.
This software is copyrighted by Miller Puckette and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software is copyrighted by Miller Puckette and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
GEM - Graphics Environment for Multimedia Copyright © 1997-2000 Mark Danks Copyright © Günter Geiger Copyright © 2001-2011 IOhannes m zmölnig, Copyright © 2003-2007 James Tittle II, Copyright © 2003-2008 Chris Clepper This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. In the official GEM distribution, the GNU General Public License is in the file GnuGPL.LICENSE
Copyright (c) 2011-2012 NVIDIA Corporation Copyright (c) 2011-2012 Cass Everitt Copyright (c) 2012 Scott Nations Copyright (c) 2012 Mathias Schott Copyright (c) 2012 Nigel Stewart Copyright (c) 2015 Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
See also licenses of 3rd-party dependencies of regal.
Emscripten is dual licensed. MIT:
Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
or University of Illinois/NCSA Open Source License:
Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution. Neither the names of Mozilla, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
Emscripten uses portions of Node.js code under MIT license:
Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Emscripten bundles musl libc under MIT license:
Copyright © 2005-2014 Rich Felker, et al. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice including the dates of first publication and either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Silicon Graphics, Inc. shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Silicon Graphics, Inc.