Skip to content
On this page

Introduction

Goal

soundworks is an open-source creative coding framework for distributed applications based on Web technologies. Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

At its core, soundworks is primarily focused on synchronization of data and states amonst clients, and on simplifying their control both localy and remotely.

Another important feature is that one soundworks is to make no distinction between browsers or Node.js runtimes. As such it can be used to prototype and develop distributed applications running exclusively or partly on embedded hardware such as Rapberry Pi while using the same architecture, codebase and principles.

high level architecture

Despite the "sound" in soundworks, the framework doesn't do any choice for you regarding the audio library you might use (be it low-level Web Audio API or higher level libraries) and more generally on the rendering aspects of your application. Therefore, it can also be suited to develop applications outside the audio realm, such as distributed applications focused on graphics or multi-user collaborative games.

Philosophy

soundworks has been and is still primarily developped as an experimental platform for artistic and scientific research in the domain of music and arts. As such the code base is considered as an experimental platform which embodies a dynamic relation and a dialog betwenn "epistemic things"_ and "technical objects", to quote Rheinberger.

Such an approach has strong implications on the design and maintenance of the code base, as it must evolve in such way to keep questionning the theory and practices it embodies (in order to not be "reduced to the simple demonstration of a phenomenon" - to quote Rheinberger again).

To mitigate this need of change and mutation with the contradictory need of stability required by software development, we opted for a modular architecture and to follow the semver approach. We hope this choice will minimize the maintenance burden of existing application while allowing the framework to evolve according to novel research questions.

Finally, both for maintenance and philosophical reasons, one of the goal of soundworks is to follow Web Standarts as close as possible. As such, the code base is developped in pure JavaScript and will only integrate language features that have reach Stage 3. For example, while we hope to propose some "type" files derived from the JSDoc for TypeScript users in a near future (and the fact that it works or not is not in our hands), this won't be implemented into the code base until the type annotation proposal has evolved.

Architecture

The core of soundworks framework mainly provides the following fonctionnalities:

Client and server initalization

The soundworks Client and Server abstrations, which are the main entry points of soundworks, are responsible to do all the nitty-gritty of creating a distributed application: running an http server, setting up WebSockets, properly sharing configuration objets, handling initialization process, etc.

See the Getting Started tutorial

Distributed shared states

The StateManager component provides tools to help you create synchronized states among your distributed devices. The component is specifically designed to help implement remote control and monitoring which is a key feature for rapid prototyping real-time distributed applications where you want to control many devices from a single point.

See the State Manager tutorial

distributed shared states

Plugin host

soundworks also implements a plugin system to add new and more specific functionnalities to the core framework. For example, we provide plugins for synchronizing clocks, working with the filesystem or to dynamically script parts of application at runtime. All plugins live in their own repository and are versionned at their own pace to simplify future evolutions.

See the Plugin Platform Init tutorial