In about 1994, I wrote software for Windows 3.1 that let me add icons over an image in the app window and then create timed sounds and effects using these icons to represent the locations of the outputs. I built a crude timeline editor that triggered items only at 1/4-second intervals, or something similar. I could also associate an audio file with an output. I don’t recall some of the details, although I can compile and run this app now, and some of it works. A lot of it doesn’t.

Audio output was routed through three sound cards in the computer, giving me six mono channels. I had to mix the left and right channels into stereo data to feed the sound cards. By combining the data on the fly, I could play any WAV file at any time on any of the six channels.

Those six channels were connected to a box I built using TTL logic components that would select any of 8 speakers for a given sound channel. The TTL components were driven by the computer’s parallel port, and by writing an address followed by data, I could store output signals on 64 lines in the box. Audio control lines ran to relays inside the box, connecting the sound card’s line-out to the correct speaker channel. Those speaker outputs were routed out of the box via legacy stereo systems to amplify the sound. I don’t recall whether we amplified the signal before or after the TTL logic box, but I suspect we didn’t feed amplified signals through the tiny relays because that just seemed wrong. Maybe we could have done that.

The TTL box also provided 5V outputs via Darlington transistor arrays. I think that, like how logic is built internally, we had a constant 5V power line running through each pair of wires and grounded the negative line to turn on external relays. We routed these wires to relays that controlled strobe lights, regular lights, and smoke machines. Since the software handled the audio and effects lines, we could easily sync a lightning flash with a follow-up thunderclap.

Now, 30 years later, I’m writing that same software for the Mac. Except it’s not exactly the same. The intention is to do the same thing with audio, and later with effects, but the internals are totally different.

I was inspired to do this after watching a video in which an audio engineer used software to design new entrance audio for the Haunted Mansion at Disneyland (or maybe it was Disney World; they didn’t say, or I didn’t notice). I realized that the software would actually be pretty easy to write. I’ve been writing software for more than 30 years, so most software is easy to write. And I could do things never imagined back in the early 1990’s (at least not by me).

That’s why I’m spending just a few hours a week working on a Mac app to do what I did 30+ years ago but better. The name Spectrophonix is just a working name (I hope), since all the good names for audio and effects queuing software are taken. Since the original app was called “spook.exe”, it made sense to at least carry on the “haunted house” theme with the name. And the icon I “made” looks cool too.

The most prominent feature of this app will be how it mixes audio on the fly, just like before, but in a way that lets sounds play through multiple speakers so their position can be controlled. And since the position can be controlled like this, sounds will move, not just play from one place. As with the original Spook App, I will include a map view where any image can be used as the background. The map view will include a sizing feature so speaker locations reflect their real-world positions. The map will include path-editing tools to control the movement of the sounds.

The app will also include a timeline view that resembles modern audio-editing software. There will be groups of tracks, so audio overlap and group length can be precisely controlled. Each audio clip will have a target on the map that is either a single speaker or a positioning/movement element. Instead of selecting a speaker from a group, as in the old software, the system can play a sound through all speakers if needed, and it will be mixed with the other sounds playing on those speakers.

Right now, I’m also stuck aggregating multiple audio devices in the software. I wanted to use the MIDI configuration tool on macOS to create an aggregate device that combines multiple USB audio devices into a single device. But that proved problematic because the configuration was lost when I unplugged my USB hub, which connected my external devices. So I’ll also be synchronizing multiple audio devices to a single clock bydouble buffering the audio and resampling the data as it’s streamed to the devices.

So far, the most challenging part of the project has been getting the Mac window and view API to do what I need. They (Apple) provide many built-in elements, such as buttons, sliders, text entry widgets, etc., but the split view controls are sub-par when it comes to customization and elegant collapsing of panels. I also had to create my own button bar to mimic Apple’s approach to modern “Liquid Glass” apps.

The Spectrophonix App UI

The video above shows the app from a few weeks ago. Below is a more up-to-date image with the audio device selection panel visible:

Spectrophonix UI Audio Device Selection

You can see lots of nice “things” in this image. The audio device selection is real; those are the devices available on the Mac (when the USB hub is plugged in). The volume and test tone don’t work yet because I haven’t programmed an audio mixer. But the timeline and map views, as well as the sidebar, can be resized and collapsed (hidden), with reasonable constraints, such as the sidebar not exceeding 50% of the window width.

Here is another image with a “borrowed” ride attraction map I’m using as a placeholder until I can create my own. I will not ship the software using stolen art, but for development, I needed something quick to see how real art would look.

Spectrophonix Map with Background

This is the state of it so far. I’m just now getting to a point in the project where I’ll be creating save files and related assets. I’ll also be working on the audio engine.

This is a fun side project, and I don’t know how far I can go with it. I also need to keep working on the Linkage app, which is my bigger, more critical hobby project. But for the few hours a week I can put into this, it’s coming along nicely.