Fundamentals
Export Targets
Code Export
Patcher UI
Special Topics
RNBO Raspberry Pi OSCQuery Runner
Loading a RNBO Device in the Browser
Now that we know how to create an AudioContext, we're ready to go about creating a RNBO device.
Now that we know how to create an AudioContext, we're ready to go about creating a RNBO device. As a prerequisite, we should make sure that the page we want to run RNBO in is being served, and not simply loaded from a file:// URL. In other words, if you just double-click a .html file to open it in the browser, your RNBO device will fail to load (see https://github.com/Cycling74/rnbo.example.webpage for more information). For security reasons, the browser will not enable WebAssembly or AudioWorklets for any page loaded with a file:// URL scheme. Without these two browser technologies, RNBO can't load.
If you're looking for a simple way to start an HTTP server on your machine, and you have Node installed, you can launch a static HTTP server from the command line by running npx http-server.
Assuming you've exported your patcher to a file patcher.export.json, you can use fetch to get the contents of the file. Then, parse the raw contents as JSON and pass the result to RNBO.createDevice. Note that this relies on asynchronous JavaScript functions, so we have to be careful to await these asynchronous functions.
// Get createDevice from the rnbo.js library
const { createDevice } = require("@rnbo/js");
// Create AudioContext
let WAContext = window.AudioContext || window.webkitAudioContext;
let context = new WAContext();
const setup = async () => {
let rawPatcher = await fetch("patcher.export.json");
let patcher = await rawPatcher.json();
let device = await createDevice({ context, patcher });
// This connects the device to audio output, but you may still need to call context.resume()
// from a user-initiated function.
device.node.connect(context.destination);
};
// We can't await an asynchronous function at the top level, so we create an asynchronous
// function setup, and then call it without waiting for the result.
setup();