What Music And Museum 29 Actually Is
I've spent the last few years working with museum audio installations and interactive exhibits, and I ran into Music And Museum 29 when I was building a spatial audio system for a small contemporary art gallery. It's an open-source toolkit designed specifically for looping, crossfading, and spatially positioning audio in museum environments. Think of it as a stripped-down alternative to something like Ableton Live coupled with an Ambisonic renderer, but built for people who don't have a dedicated sound engineer on staff. Here's how you actually get it running without spending two days wrestling with dependencies. First, download it from the official GitHub repo at github.com/music-and-museum-29/core. Clone it locally. The project uses Python 3.10 or later, so make sure your virtual environment is set up before installing requirements. Run pip install -r requirements.txt and then python main.py --init to generate the config files. Once initialized, you'll see a folder structure that looks like this: config files in ./cfg/, your audio assets go into ./media/, and the output logs land in ./logs/. The main configuration file is ./cfg/default.json. This is where you define zones, playback sequences, and crossfade timings.
Let me give you a concrete example. Say you have a gallery with three rooms and you want a different ambient track playing in each, with a 3-second crossfade when a visitor moves between zones. You'd structure your config like this: { Save that and run
"zones": [
{"id": "room_1", "position": [0, 0, 0], "radius": 5.0, "audio_file": "./media/ambient_1.wav"},
{"id": "room_2", "position": [8, 0, 0], "radius": 4.5, "audio_file": "./media/ambient_2.wav"}
],
"crossfade_duration": 3.0,
"output_device": "default"
}python main.py --play --config ./cfg/default.json. You should hear the first zone's audio begin immediately. Move your testing source or physical sensor into the second zone's radius and watch the crossfade kick in.
Common Problems and What I Learned the Hard Way
The biggest issue I ran into wasn't with the software itself but with how it handles low-bitrate or heavily compressed audio files. Early on, I dropped in some MP3s I'd ripped from a streaming service, assuming they'd work fine since the documentation didn't explicitly say otherwise. What happened was a noticeable 400-millisecond stutter whenever the crossfade triggered. The internal resampler was choking on the variable sample rates hidden in those MP3s. The workaround was simple once I figured it out: convert everything to WAV, 44.1kHz, 16-bit PCM before adding them to the media folder. I wrote a quick bash script to batch-convert an entire directory:for f in *.mp3; do ffmpeg -i "$f" -ar 44100 -acodec pcm_s16le "${f%.mp3}.wav"; done. That eliminated the stutters entirely. It took about 12 minutes to convert a library of 80 tracks on a mid-range laptop. Another edge case that caught me off guard: if you're running this on a Raspberry Pi 4 (which is common for museum installations due to cost), the CPU usage spikes to nearly 90% during crossfade transitions. I thought it was a bug at first. It's not a bug, it's just the real-time DSP doing more math than the Pi's single-core ffmpeg backend can handle smoothly. The fix was switching to the --backend=alsa flag with a lowered buffer size, which dropped CPU usage to around 60% during transitions. Not perfect, but stable enough for a gallery environment where audio quality doesn't need to be reference-grade.
Get the Full Details

Advanced Configuration You Should Know About
Most people stop at basic zone-based playback. But Music And Museum 29 supports something called weighted zone blending, which is useful when rooms overlap. Instead of a hard crossfade based purely on proximity, you can assign a weight to each zone. For example, if Room A has a weight of 1.0 and Room B has a weight of 0.6, the system will prioritize Room A's audio even when you're closer to Room B's center point. This is critical for spaces where you don't want the ambient track from a nearby exhibit bleeding into a quiet reading area. You configure this in the same JSON file by adding a "weight" key to each zone object. Here's what that looks like: {
"zones": [
{"id": "quiet_zone", "position": [0, 0, 0], "radius": 3.0, "audio_file": "./media/silence_pad.wav", "weight": 1.0},
{"id": "loud_zone", "position": [6, 0, 0], "radius": 5.0, "audio_file": "./media/drone_7.wav", "weight": 0.4}
],
"crossfade_duration": 2.5,
"blend_mode": "weighted"
}
The blend_mode flag is what tells the engine to use weighting instead of raw distance. Default is "distance", so if you add weights without changing this flag, nothing happens and you'll wonder why it's not working. I wasted about three hours on that one before checking the source code.
Limitations That Matter
I want to be blunt about where this tool falls short. It doesn't support live input processing, meaning you can't route a microphone or instrument through it in real time. If you're building an interactive installation that responds to audience movement or sound, you'll need to layer something like TouchDesigner or Max/MSP on top. Music And Museum 29 can output OSC messages, though, so you can send zone-trigger events to another program that handles the live processing. It also has no built-in web interface for remote control. You manage everything through config files and CLI commands. In a museum setting where the exhibit curator needs to swap out tracks weekly, this means either training them to edit JSON or writing a thin wrapper script that gives them a simple file-rename interface. I ended up building a Flask app that let the curators upload new WAV files through a browser and automatically reloaded the config. Took me about two weekends of evening work, but it saved the team countless hours over the following year. Performance on older hardware is another concern. I tested this on a 2018 MacBook Air and it was borderline usable for a single zone with long crossfades. Two overlapping zones caused audible dropouts. If you're deploying this on constrained machines, keep your zone count under five and your crossfade durations under four seconds.

Final Practical Notes
The documentation is adequate but not exhaustive. The README covers the basics well, but the advanced features like weighted blending and OSC output are only documented in the source code comments. I'd recommend reading through ./src/engine.py and ./src/config_parser.py if you plan to go beyond simple playback loops. Version 29 specifically added better handling for stereo-to-Ambisonic downmixing, which is worth upgrading to if your installation uses any binaural content. The earlier versions would phase-cancel certain frequencies when converting, making some tracks sound noticeably thinner through headphones or directional speakers. The 29 update fixed that by using a proper mid-side encoding approach before the Ambisonic transform. If you're deciding whether to use this for a serious installation, my honest take is that it's solid for small-to-medium galleries with straightforward playback needs. For large-scale multi-room installations with complex interactive triggers, you'd be better off investing time in a full DAW-based solution or hiring someone who already knows the ecosystem. But for something like a small contemporary space with three or four ambient zones, Music And Museum 29 does the job without the overhead.