@shren/faustwasm
v0.0.25
Published
WebAssembly version of Faust Compiler
Downloads
41
Readme
FaustWasm
WebAssembly version of Faust Compiler for Node.js and web browsers, built with Emscripten 2.0.25
Usage
Please use a stable version of Node.js 16+ to work with this project.
Use the command line interface
Clone and get into this project:
git clone https://github.com/fr0stbyter/faustwasm
cd faustwasm
Generate WebAssembly version of a Faust DSP
For example:
rm -rf test/out # make sure you are under the faustwasm directory.
node scripts/faust2wasm.js test/mono.dsp test/out
or
rm -rf test/out # make sure you are under the faustwasm directory.
node scripts/faust2wasm.js test/poly.dsp test/out -poly
You can create standalone DSP on a web page using the same command line
rm -rf test/out # make sure you are under the faustwasm directory.
node scripts/faust2wasm.js test/rev.dsp test/out -standalone
Generate SVG Diagrams of a Faust DSP
For example:
rm -rf test/out # make sure you are under the faustwasm directory.
node scripts/faust2svg.js test/mono.dsp test/out
The main diagram should be in test/out/process.svg
.
Generate or process audio files
Options:
-bs <num>
to setup the rendering buffer size in frames (default: 64)-bd 16|24|32
to setup the output file bit-depth (default: 16)-c <samples>
to setup the output file length in frames, when -ct is not used (default: SR*5)-in <inputWav.wav>
specify an input file to process-sr <num>
to setup the output file sample rate (default: 44100) See this help:
node scripts/faust2sndfile.js -h
For example:
rm -rf test/out # make sure you are under the faustwasm directory.
mkdir test/out
node scripts/faust2sndfile.js test/p-dj.dsp test/out/p-dj.wav -c 192000 -sr 48000 -bd 24
Now the test/out/p-dj.wav
should be generated.
node scripts/faust2sndfile.js test/rev.dsp test/out/p-dj-rev.wav -c 192000 -sr 48000 -bd 24 -in test/out/p-dj.wav
Use the JavaScript Module
npm i -D @shren/faustwasm
In JavaScript:
const FaustWasm = require("@shren/faustwasm");
const path = require("path");
const fs = require("fs");
const {
instantiateFaustModuleFromFile,
LibFaust,
WavEncoder,
FaustMonoDspGenerator,
FaustCompiler,
FaustSvgDiagrams
} = FaustWasm;
(async () => {
const faustModulePath = path.join(__dirname, "../node_modules/@shren/faustwasm/ libfaust-wasm/libfaust-wasm.js");
// initialize the libfaust wasm
const faustModule = await instantiateFaustModuleFromFile(faustModulePath);
// Get the Faust compiler
const libFaust = new LibFaust(faustModule);
console.log(libFaust.version());
const compiler = new FaustCompiler(libFaust);
const generator = new FaustMonoDspGenerator();
const sampleRate = 48000;
const name = "Djembe"
const argv = ["-I", "libraries/"];
const code = `
import("stdfaust.lib");
process = ba.pulsen(1, 10000) : pm.djembe(60, 0.3, 0.4, 1);
`;
// Compile the DSP
await generator.compile(compiler, name, code, argv.join(" "));
const processor = await generator.createOfflineProcessor(sampleRate, 1024);
// Generate SVG diagrams.
const svgDiagrams = new FaustSvgDiagrams(compiler);
const svgs = svgDiagrams.from(name, code, argv.join(" "));
console.log(Object.keys(svgs));
const out = processor.render(null, 192000);
const wav = WavEncoder.encode(out, { sampleRate, bitDepth: 24 });
// The wav file is generated
fs.writeFileSync(`${__dirname}/out.wav`, new Uint8Array(wav));
})();
Use in a web browser
(async () => {
const {
instantiateFaustModuleFromFile,
LibFaust,
WavEncoder,
FaustMonoDspGenerator,
FaustCompiler,
FaustSvgDiagrams
} = await import("../node_modules/@shren/faustwasm/dist/esm/index.js");
// initialize the libfaust wasm
const faustModule = await instantiateFaustModuleFromFile("../node_modules/@shren/faustwasm/libfaust-wasm/libfaust-wasm.js");
// Get the Faust compiler
const libFaust = new LibFaust(faustModule);
window.libFaust = libFaust;
console.log(libFaust.version());
const compiler = new FaustCompiler(libFaust);
const generator = new FaustMonoDspGenerator();
const sampleRate = 48000;
const name = "Djembe"
const argv = ["-I", "libraries/"];
const code = `
import("stdfaust.lib");
process = ba.pulsen(1, 10000) : pm.djembe(60, 0.3, 0.4, 1);
`;
// Compile the DSP
await generator.compile(compiler, name, code, argv.join(" "));
const processor = await generator.createOfflineProcessor(sampleRate, 1024);
// Generate SVG diagrams.
const svgDiagrams = new FaustSvgDiagrams(compiler);
const svgs = svgDiagrams.from(name, code, argv.join(" "));
console.log(Object.keys(svgs));
const out = processor.render(null, 192000);
const wav = WavEncoder.encode(out, { sampleRate, bitDepth: 24 });
// The wav file is generated
const blob = new Blob([wav], { type: "audio/wav" });
const player = document.createElement("audio");
player.controls = true;
player.src = URL.createObjectURL(blob);
document.body.appendChild(player);
const svg = document.createElement("div");
svg.innerHTML = svgs["process.svg"];
document.body.appendChild(svg);
})();
Build
npm run build