Repository navigation
EN Install Audio Toolchain
Français · Type: how-to · Audience: author · Context: engine repository, created project · Status: ready · Applies from: 3.7.0
npm run audio is the engine repository's Mega Drive pipeline: it turns a MIDI (or an audio file) into a Sega Mega
Drive arrangement (YM2612 FM, SN76489 PSG and DAC drums) and synthesises a game's sound effects from the same bank of
sounds, so every track and every blip of a game share one sonic identity. This page installs what it runs on. How to
write a track, the palette and the spec are on Music and Sound effects.
A machine where npm run audio -- setup has downloaded Furnace and a General MIDI SoundFont, and where the pipeline
renders a spec into .fur, .wav, .vgm and .mp3 with its QA report. Optionally, a Python 3.11 virtual environment
that transcribes audio sources to MIDI.
- The engine repository.
npm run audiois a script of itspackage.json(python3 tools/audio.py, which runstools/audio/mdpipe);quest-n-clickhas noaudiocommand for a created project. - Furnace is pinned to 0.6.8.3 (
FURNACE_VERSIONintools/audio/mdpipe/render.py). - The pipeline is a tool for authors, not part of the game: a game plays the
.mp3files it produced.
Limit ·
audio-repository-onlyThe pipeline is offered in the engine repository only. Its files are inside the engine package (node_modules/quest-n-click/tools/audio/), but no command of a created project runs it, and running it from there has not been checked.
| Tool | Used for | Install |
|---|---|---|
| Python 3 with NumPy | every command |
python3 -m pip install -r requirements.txt (Requirements) |
| ffmpeg | encoding the .mp3, loudness |
brew install ffmpeg, or your system's package |
| fluidsynth | the General MIDI reference render, to compare with the arrangement |
brew install fluid-synth, or your system's package |
| curl |
setup's downloads |
usually present |
| Furnace 0.6.8.3 | rendering the arrangement (.wav, per-channel .wav, .vgm) |
npm run audio -- setup on macOS and Linux (below) |
uv and Python 3.11 |
audio sources (a .wav, .mp3, .flac transcribed to MIDI) |
optional, step 3 |
At the root of the engine repository, on your machine.
-
Install ffmpeg and fluidsynth (macOS with Homebrew):
# anywhere brew install ffmpeg fluid-synth
-
Download Furnace and the SoundFont, once per machine:
# at the root of the engine repository npm run audio -- setupOn macOS it downloads Furnace's
.dmgfor your processor (arm64 or Intel) from Furnace's GitHub release, copiesFurnace.appand clears its quarantine; on Linux it downloads the x86_64.tar.gz. Both go totools/audio/.furnace/(ignored by git). The SoundFont isGeneralUser-GS.sf2, downloaded beside it. It prints the paths of both at the end.
-
Optional, for audio sources (not MIDI): a Python 3.11 virtual environment with the transcription modules (
basic-pitch, NumPy;demucsis optional, large, and pullstorch):# at the root of the engine repository uv venv --python 3.11 tools/audio/.venv uv pip install --python tools/audio/.venv/bin/python -r tools/audio/requirements-audio.txtnpm run audiocallspython3, which does not see this environment. For an audio source, run the pipeline with the environment's Python (or activate it first):# at the root of the engine repository tools/audio/.venv/bin/python tools/audio.py ingest song.wav games/<id>/audio/projects/<slug>
-
Run the pipeline once:
# at the root of the engine repository npm run audio -- ingest song.mid games/<id>/audio/projects/<slug> # MIDI (or .wav/.mp3, step 3) npm run audio -- all games/<id>/audio/projects/<slug>/spec.json # .fur + .wav + .vgm + .mp3 + QA report npm run audio -- sfx games/<id>/audio/sfx.json # the game's sound effects → audio/sfx/*.mp3 npm run assets # ships audio/ to public/assets
In this order: the variable FURNACE_BIN, then
tools/audio/.furnace/Furnace.app/Contents/MacOS/Furnace, tools/audio/.furnace/furnace, then a furnace on your
PATH. None found: Furnace not found: run python -m mdpipe setup or set FURNACE_BIN.
setup does not download Furnace on Windows (Furnace ships a zip there): it stops with
mdpipe: install Furnace 0.6.8.3 yourself on Windows and put its executable in …/tools/audio/.furnace (the Mega Drive pipeline downloads it on macOS and Linux only). Install that version yourself and put its executable there, or name it
with FURNACE_BIN. The rest of the pipeline is unchanged.
Furnace is GPL-2.0: it is downloaded on your machine, never bundled with the engine or a game.
Furnace plays SN76489 tone channels two octaves above the written note; the builder compensates, so specs use real
pitches (keep PSG notes ≥ A2). The DAC has no volume: dynamics are separate samples (snare / ghost). One note per
channel, four effects per cell, 32nd-note rows at 60 Hz with a groove for the tempo.
setup ends with Furnace: <path> and SoundFont: <path>. all writes the .fur, .wav, .vgm and .mp3 of the
spec and its QA report in the project's folder. npm run doctor says whether ffmpeg is there; it does not check
fluidsynth, Furnace or uv.
| Symptom | Cause | Fix |
|---|---|---|
Furnace not found: run python -m mdpipe setup or set FURNACE_BIN |
Step 2 not done, or Windows | Step 2, or FURNACE_BIN=<path to furnace>
|
needs fluidsynth (brew install fluid-synth) and python -m mdpipe setup for the SoundFont |
fluidsynth or the SoundFont missing | Steps 1 and 2 |
missing "basic_pitch": pip install "basic-pitch[onnx]" (python <= 3.11 recommended) |
An audio source run without the environment of step 3 | Step 3, and run ingest with tools/audio/.venv/bin/python
|
ffmpeg not found |
ffmpeg missing from PATH
|
Step 1 |
tools/audio/.furnace/ (Furnace and the SoundFont) and tools/audio/.venv/, both outside git; the project folders
under games/<id>/audio/projects/, and games/<id>/audio/sfx/*.mp3 for the sound effects.
Delete tools/audio/.furnace/ and tools/audio/.venv/; setup downloads Furnace again.
- Music (the palette, the spec, the workflow), Sound effects
- Requirements, Image toolchain
-
tools/audio/README.md,tools/audio/mdpipe/render.py,tools/audio/requirements-audio.txt
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.4.0 r1, documentation revision · révision de la documentation 8dc717c69acb62c4742b69c54a7e7dfb620f75d8.
Earlier versions and permalinks · versions précédentes et liens permanents: https://wanoo.github.io/quest-n-click/docs/
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Start (6)
Play (9)
Install (17)
- Requirements
- Install from the release archive
- Install from npm, once published
- Install from the repository to work on the engine
- doctor: checking your machine
- Image toolchain
- Audio toolchain: ffmpeg, fluidsynth, Furnace, uv
- Upgrade
- Upgrade notes: 4.4
- Upgrade notes: 4.3
- Upgrade notes: 4.2
- Upgrade notes: 4.1
- Upgrade notes: v3
- Upgrade notes: v2 to v3
- Coming from web-scumm
- Package reference
- Install troubleshooting
Create a game (55)
- Your first game
- Layout of a created project and of the engine repository
- The working loop
- Content principles and the identity contract
- Rooms
- Geometry: placement, walk zones, masks, layers, camera
- Something is visible but unreachable
- Reactions
- Game commands
- Conditions
- Flags, variables and events: which to use
- Custom code
- Characters
- Items and inventory
- World map
- Dialogues
- Scripts and events
- Moving characters: patrols and walks
- Exits
- Chapters and objectives
- State and saves: persistent or temporary, renaming an id, migrations
- Staging: wide rooms and animations
- The stage: lights, particles, floors
- Skin and fonts
- Title and credits
- Heroes: several characters and hero choice
- Built-in minigames
- A custom minigame
- Translations
- Music in stems
- Sound effects
- Voices: per language and per hero
- Images: prompts, cutting sheets, transparency, scale
- Asset provenance
- The storyboard, source of truth
- Puzzle design
- Classic mechanics
- Review pages
- DSL reference
- Checking your game
- What the solver proves
- Solver options
- Playtests
- Remix
- Speedrun for authors
- The sealed ending
- Production template
- Example games
- Working with an AI
- Build and release a game
- Publish on GitHub Pages
- The static game on Clever Cloud
- Other static hosts
- Sub-path, cache and service worker, incomplete deploys, going back
- Testing on a phone over the LAN
Local Studio (24)
- The local Studio: overview and launch
- Edit a room
- Placement and stage
- Preview, apply, undo
- Storyboard
- Assets and cutting
- Check: validator, solver, critical path, heat, health, coverage
- Before and after captures
- Semantic diff
- Play and replay a session
- Rule explainer
- Language and objectives
- Voices and the heroes × languages matrix
- Map
- Notes
- Remix in the Studio
- Music
- The Assistant: bring your own key
- Demo mode and studio-apply
- Local and LAN security
- Studio API
- Local MCP: setting up each client
- MCP tools
- Studio troubleshooting
Team Studio (21)
- What runs where
- Concepts: revision, transaction, span, lease, preview, build
- Starting as an invited dev
- Working together day to day
- Roles and actions: the full matrix
- Invitations
- Managing members
- Write refused on the hosted Studio: stale base revision (409)
- Write refused on the hosted Studio: span locked (423)
- Recovering after a lost lease, a disconnection or a stale preview
- Comments
- Map and semantic diff
- Publishing builds
- Remote MCP
- The game in Git
- Upgrading the engine of a hosted game
- Hosted assets
- The server's command line
- Health and metrics routes
- Trying it locally with compose.yml
- Known limits
Clever Cloud (23)
- Clever Cloud: overview, cost and prerequisites
- Apps and add-ons
- Domains and TLS
- Keycloak
- Generic OIDC and GitLab
- Configuration
- First deployment
- Backups
- RPO and RTO
- Restore the Studio on a fresh installation
- Redeploys
- Upgrading the server and checking state after a migration
- Limits of going back
- Monitoring
- Security
- Rotating keys
- Recovering admin access
- Changing domain or OIDC provider
- Worker, PostgreSQL or Cellar down
- Exporting the game and leaving the installation
- Retention
- Clever Cloud troubleshooting
- Costs and teardown
Reality Bridge and connectors (16)
- The Reality Bridge: what it is
- Quick start
- Guarantees
- Install and run the Bridge
- Backup and restore
- Several tenants
- Signals and the manifest
- The Bridge's command line
- Connectors overview
- Email connector
- Telnet connector
- SSH connector
- Open Badges connector
- The connector SDK
- Security: Biscuit and signatures
- Bridge and connector troubleshooting
Contribute (25)
- Welcome
- Developer setup
- The dev loop
- Before a pull request
- Conventions
- Writing documentation
- Architecture
- Code tour
- Import boundaries
- Which tests run when
- Mutation testing
- The coverage ratchet
- The quality baseline
- CI explained
- Field passes
- Benchmarks
- Releasing
- npm packages
- Decisions and ADRs
- Governance
- Bot pull requests
- Contributing with AI agents
- Security policy
- Code of conduct
- Licences and credits