Play SoundFont
WARNING
Node.js does not implement AudioContext, which requires monkey patching.
Start Example Synth
With smplr
First parse the soundfont into smplr
, which must be installed.
TypeScript
import { Soundfont2Sampler } from "smplr"
import { SoundFont3 } from "soundfont3"
const context = new AudioContext()
const sampler = new Soundfont2Sampler(context, {
// For file data, use base64 data url
url: "https://smpldsnds.github.io/soundfonts/soundfonts/galaxy-electric-pianos.sf2",
createSoundfont: (data) => new SoundFont3(data),
})
Then load an instrument.
TypeScript
sampler.load.then(() => {
// Loads first instrument
sampler.loadInstrument(sampler.instrumentNames[0])
})
Play a note.
TypeScript
midiCode = 60 // Middle C MIDI code
durationSeconds = 1
sampler.start({
note: midiCode,
duration: durationSeconds
})
AudioContext on Node.js
DANGER
There are many 'AudioContext' reimplementations for Node.js. This solution uses the most popular reimplementation, which is not even in alpha. A stable solution is unlikely to appear soon.
Install web-audio-api.
Bash
npm i web-audio-api
Then monkey patch AudioContext.
TypeScript
import { AudioContext } from 'node-web-audio-api'
// @ts-expect-error AudioContext undefined in Node.js
global.AudioContext = AudioContext
Reading from a file may require conversion to base64 data url.
TypeScript
import { readFileSync } from 'fs'
const bufferToDataUrl = (buffer: Buffer) => {
return `data:;base64,${buffer.toString('base64')}`
}
const soundFontBuffer = readFileSync('soundFontFile.sf3')
const soundFontDataUrl = bufferToDataUrl(soundFontBuffer)