Museums used to buy a locked-down narration appliance per gallery: little boxes with a cartridge that played a single-language commentary on a timer, and nothing else. Then visitors started asking for the same narration in four languages, the gift shop wanted closing-time chimes, and someone decided that the Victorian wing should have a different schedule from the mezzanine exhibition. At that point the appliances become the bottleneck. One Multilarm box replaces them all.
A regional museum with four themed galleries, a temporary-exhibition space on the first floor, and a cafe-plus-gift-shop that closes fifteen minutes before the rest of the building. Each gallery has its own in-ceiling speakers and its own amplifier, already installed. What was missing was a single scheduler that respected the museum’s opening hours, the language rotation for the narrations, and the fact that the temporary exhibition swaps out every eight weeks with a completely different audio script.
The gallery narration is a two-minute commentary that plays every fifteen minutes. It needs to cycle through four languages — English, Spanish, French, German — so a visitor standing in the gallery for fifteen minutes always hears their language at some point. The Multilarm way is one narration folder per language plus an AlarmIndexData that walks through them in order:
<MAConfig><RecurEveryDay>True</RecurEveryDay></MAConfig>
<MAConfig><TimeDelimiter>|</TimeDelimiter></MAConfig>
<MAConfig><AlarmPath>C:\Museum\Narration\Victorian\EN|C:\Museum\Narration\Victorian\ES|C:\Museum\Narration\Victorian\FR|C:\Museum\Narration\Victorian\DE</AlarmPath></MAConfig>
<MAConfig><AlarmIndexData>1|2|3|4|1|2|3|4|1|2|3|4|1|2|3|4</AlarmIndexData></MAConfig>
<MAConfig><DateAndTimeData>10:00|10:15|10:30|10:45|11:00|11:15|11:30|11:45|12:00|12:15|12:30|12:45|13:00|13:15|13:30|13:45</DateAndTimeData></MAConfig>
Each language folder holds its own recording; Multilarm picks a file at random within the folder, so swapping in a new Spanish recording is just a file drop. The 10:00 slot pulls from index 1 (EN), 10:15 from index 2 (ES), and so on. Extend the cycle by adding more time slots and more folder indices — a fifth language is one extra folder and one extra digit in every AlarmIndexData cycle.
Galleries need different content at the same moment — the Victorian wing at 10:15 plays Spanish while the Dinosaur hall plays its English intro. That rules out mirroring. Instead, each gallery runs as its own Multilarm instance via the --config <path> switch, and each config pins a different PlaybackDevice plus its own WebRemotePort:
Multilarm.exe --config zones\gallery-victorian.xml
Multilarm.exe --config zones\gallery-dinosaur.xml
Multilarm.exe --config zones\gallery-mezzanine.xml
Each gallery’s config carries its own DateAndTimeData and language-rotation AlarmIndexData, so schedules never collide. Device indices came straight out of the Ctrl+O device dump during install. One instance promoted to Hub mode (Ctrl+H) aggregates every gallery’s heartbeat on /hub so the whole estate is one page.
Museums close on a specific minute and need to tell visitors politely, in each gallery, that the building is closing. The message changes in wording based on time-to-close (“the museum closes in fifteen minutes” → “five minutes”). Writing pre-recorded versions per language per gallery is a dozen files no one wants to maintain. Multilarm’s TextData + TextToSpeech pairing speaks the message straight from the console text using the pre-recorded word library in TTSPath:
<MAConfig><TextToSpeech>True</TextToSpeech></MAConfig>
<MAConfig><TTSPath>{app}/TTS</TTSPath></MAConfig>
<MAConfig><TTSFileFormat>mp3</TTSFileFormat></MAConfig>
<MAConfig><TTSChimePath>{app}/Chime/softbell.mp3</TTSChimePath></MAConfig>
<MAConfig><TextDelimiter>|</TextDelimiter></MAConfig>
<MAConfig><TextData>The museum is open. Next tour in #TIMETOALARM+1#.|The museum will close in fifteen minutes. Please make your way to the exit.|The museum will close in five minutes. Thank you for visiting.</TextData></MAConfig>
The TTSChimePath plays a soft bell tone ahead of each spoken announcement so visitors look up. Because every gallery is an independent instance, the closing announcement can either be baked into each instance’s schedule (played locally) or delivered by a dedicated “announcements” instance with MirrorDevices listing every gallery’s output — one fire, every speaker, same second. The flat TextData format means edits are one string, not twelve XML blocks.
The first-floor exhibition space hosts a different show every eight weeks. Each show has its own narration folder. Rather than rewrite the schedule every exhibition, the whole variant lives in its own config file and AlternateConfig date-scopes the switch-over automatically at midnight:
<MAConfig><AlternateConfig>exhib-autumn2026.xml,00:00-23:59,d=09-01-2026-10-26-2026|exhib-winter2026.xml,00:00-23:59,d=10-27-2026-12-31-2026</AlternateConfig></MAConfig>
Each entry is filename,time-range,date-filter; the first rule matching today selects the config for the day, otherwise the default Multilarm.config.xml loads. On the Monday an exhibition opens, the curator drops the new exhib-winter2026.xml into the application root and extends the AlternateConfig rule — no SSH, no restart, hot-reload picks up the change on the next tick. Unparseable or missing alternate files fall back to the default with a yellow warning rather than crashing, so a typo is a warning, not an outage.
The cafe has its own soundtrack — ambient music from a folder of licensed tracks — and closes fifteen minutes before the rest of the museum. It runs as its own Multilarm instance with its own PlaybackDevice, its own TTS closing announcement at 16:30, and Multilarm’s virtual radio filling all non-alarm airtime with shuffled playback from a folder:
<MAConfig><PlayRadio>Local</PlayRadio></MAConfig>
<MAConfig><RadioFolder>C:\Museum\Cafe\Music</RadioFolder></MAConfig>
<MAConfig><RadioFileFormat>mp3</RadioFileFormat></MAConfig>
<MAConfig><CrossfadeMs>2500</CrossfadeMs></MAConfig>
Multilarm shuffles RadioFolder continuously, crossfading between tracks, and ducks automatically whenever an alarm fires (closing announcement, TTS chime). The curator uses Ctrl+N or the Web Remote’s Skip button to move past any track that lands badly in a quiet cafe moment; the startup audio health check warns at boot if the folder is empty.
Every narration fire is written to Multilarm.playlist.log: timestamp, alarm name, folder, and the specific file picked. At the end of the month the head curator has a complete record of which narrations played where, how many times, and in which language. For grant reporting, that log goes into the visitor-engagement metrics. It is not a spreadsheet someone has to fill in.
--config per gallery) let staggered gallery audio coexist with simultaneous closing announcements via a separate mirror-group instance.TextData handles closing-time messages without a cabinet full of pre-recorded variants.PlayRadio + RadioFolder) keeps the cafe on seamless shuffled music between scheduled alarms.A museum is a multi-zone, multi-lingual, multi-schedule audio environment masquerading as a building. Multilarm treats it like one XML. Download the binary and point it at your galleries.