Skip to content
digegoPublic

About

A cyber-physical programming environment

Resources

Stars

1.5k stars

Watchers

72 watching

Forks

Latest commit

 

History

5,584 Commits

Folders and files

Repository files navigation

Extempore

Build & test Sanitizers Release

Extempore is a live-coding environment for music and audio. It pairs a Scheme interpreter with xtlang---a statically-typed lisp that compiles to LLVM IR at runtime---so you can reshape a running program while it keeps making sound. Runs on Linux (x86_64 and aarch64), macOS (Apple Silicon) and Windows (x86_64).

What's new in v0.11.0

v0.11.0 is a robustness release driven by a full-codebase review---nothing changes about the language, but a lot changes underneath it. CHANGELOG.md has the detail; the headlines:

  • A security fix worth upgrading for --- a running Extempore turned each incoming OSC message into Scheme source text with its address interpolated unescaped, so any host that could reach the OSC server could evaluate arbitrary code in the session.
  • Errors stop disappearing --- sys:load used to swallow every error in a file it loaded, so a broken library could AOT-compile "successfully". It now reports each failing form and returns #f, which surfaced (and fixed) five examples that had quietly stopped working.
  • Memory safety through the C++ runtime --- every Scheme FFI primitive is registered with its real name and arity, so a wrong call is a Scheme error rather than a segfault, and the zone allocator, OSC send path, IFF chunk scanner and a dozen fixed buffers no longer write past their ends.
  • Relocatable installs --- the binary looks for runtime/, libs/ and examples/ beside itself, so an unzipped release runs from any working directory and can be moved wherever you like.
  • Less vendored code --- the 2019 Networking TS snapshot and PCRE 8.38 are gone; sockets go through one small shim on every platform and regular expressions use PCRE2 10.48.
  • Behaviour worth knowing about before you upgrade --- pcg32_boundedrand now matches reference PCG32, so seeded streams differ; io:osc:set-integer-64bit? and io:osc:send-from-server-socket? are removed; and topclock no longer starts its network loop at load when *topclock-autostart* is #f.

Extempore's current stack came together over v0.9.0 and v0.10.0: LLVM 22.1.6 with the ORC JIT (in place of the legacy MCJIT), s7 Scheme (in place of TinyScheme), a single constraint-based type inference engine in the xtlang compiler, a C++20 runtime, first-class Linux aarch64, and an interactive --repl (Linux and macOS only). Graphics is now a lean set of WebGPU bindings (via wgpu-native, enabled with -DEXTERNAL_SHLIBS_GRAPHICS=ON); the old OpenGL stack has been retired. If you hit any breakage, please file an issue with a minimal reproducible example where you can.

Getting started

The easy way

Download the latest binary release for your platform and unzip it. The folder is self-contained --- keep it together, but put it wherever you like --- and extempore (extempore.exe on Windows) runs from any working directory.

Then, set up your text editor of choice and away you go.

Note: the VSCode extension used to offer an Extempore: Download binary command for one-click setup. It hasn't been updated for the current releases and may not work --- downloading the release manually is the safest option for now.

Note on macOS first launch: the binaries aren't signed with an Apple Developer ID, so on first launch macOS will refuse to run them ("apple could not verify ... is free of malware"). Despite the wording, this means Apple hasn't checked the binary, not that anything malicious has been detected --- the release is built in public from the source in this repository by the Release workflow, and you can rebuild it yourself from source if you'd prefer (see below). Signing with a Developer ID requires a paid Apple Developer account, which Extempore (as a research project) doesn't currently maintain.

To clear the quarantine flag on the whole unzipped folder in one go, run:

xattr -dr com.apple.quarantine /path/to/extempore

(replace the path with wherever you unzipped it, e.g. ~/Downloads/extempore). After that, extempore will launch normally.

Build from source

For more information, check out BUILDING.md.

Extempore's CMake build process downloads and builds all the dependencies you need (including LLVM). So, if you've got a C++ compiler, git, CMake >= 3.28 and Ninja, here are some one-liner build commands.

On Linux/macOS (and on Windows from a Visual Studio developer prompt):

git clone https://github.com/digego/extempore && cd extempore && cmake --preset default -DASSETS=ON && cmake --build build

--preset default is a Ninja + Release build with the tests enabled; see CMakePresets.json (and BUILDING.md) for the others.

Note on build time: the first build takes ~10-30 minutes because LLVM is compiled from source. Subsequent builds reuse the cached LLVM artifacts under build/_deps/.

Note on ASSETS: the ASSETS build-time option (boolean, default OFF) is set to ON above. This will download the Extempore binary assets --- required for many of the examples, but adds a ~250MB download to the build process. If you'd rather not do that, and are happy with some of the examples not working, then set -DASSETS=OFF instead.

Note on running: an in-tree build keeps its runtime files (runtime/, libs/, examples/) in the source tree, so run it in place (build/extempore). If you'd rather have a self-contained tree somewhere else, cmake --install build --prefix

copies the binary and its runtime files into ; that tree can be moved anywhere and run from any working directory --- see BUILDING.md.

Hear your first sine wave

With Extempore running and an editor connected to port 7099, evaluate this and you should hear a 440 Hz tone:

(bind-func dsp:DSP
  (lambda (in time chan data)
    (* 0.5 (sin (* STWOPI 440.0 (/ (i64tof time) SRf))))))
(dsp:set! dsp)

The full example lives at examples/core/hello-sine.xtm.

See Extempore in action

Check out these videos:

Contributors

The Extempore core team is Andrew Sorensen & Ben Swift. Andrew created Extempore and remains its BDFL; Ben is the current maintainer. For issues and questions the mailing list is the best place to start, but you can also email Ben directly. Many others have contributed to Extempore's development (see the full list) --- including Jim Kuhn, whose significant performance improvements don't show up in the commit logs but for which we're very grateful.

Docs & Community

Extempore documentation can be found at https://extemporelang.github.io/

You can also join the Extempore community:

Cite Extempore

Licence

Copyright (c) 2011-2026, Andrew Sorensen

All rights reserved.

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.

Neither the name of the authors nor other contributors may be used to endorse or promote products derived from this software without specific prior written permission.

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 OWNER 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.

About

A cyber-physical programming environment

Resources

Stars

1.5k stars

Watchers

72 watching

Forks

Releases

Packages

Used by

Contributors

Languages