There is no skip button · Part 3

Can a points game teach an AI DJ to mix?

My AI radio station kept playing reggae after reggae, and no rule could stop it, because the DJ can’t count back. So I gave it a game to play instead, and here’s how that went, along with a few other things that went wrong.

A line drawing of the same large old table radio from Parts I and II. A board-game track of plain squares winds across the ground in front of it, and a tiny figure bends to move an ochre game pawn forward one square.

In the first post about Space & Time, my AI radio station, which runs on open-source software called SUB/WAVE, I said I was saving the deep technical version, and the long list of things that went wrong, for another post. The second post turned into a setup guide instead. This is the one I promised: what happens after the station is running and I’m the one living with it.

I listen to the station pretty much all day, every day, so patterns and anomalies are easy for me to notice. Some of them took me a while.

Tuning a station like this has one big benefit: everything can be measured. Every pick the DJ makes is logged, so my agent can go back and score them after the fact. That’s how I know my Saturday show made smooth moves 99 percent of the time, while two of my weekday shows managed only 37 or 38 percent. (A move counts as smooth when the two records sound more alike than three out of four random pairs.)

There are challenges too. The DJ is a language model with a persona, a paragraph of plain English about who it is, and it has no memory from one pick to the next. Prompting is inexact: I can tell it exactly what I want, and it can still do something else. And the space for rules is small. Each show, a block of hours with its own description of how those hours should feel, gets 2,000 characters of instructions, which is a few paragraphs.

I.

I was on a long drive with a friend, with the station playing, when it occurred to me that we’d been listening to reggae for a long time. I don’t know how many tracks into the run we were before I noticed. I only noticed at all because I was listening through his ears.

My first rule for every DJ is flow. Each move should match the energy, mood and tempo of the record before it, so the music never lurches from one feel to another. In practice, the DJ finds its next record by searching the approved list (the records I’ve cleared for the station) for ones that sound like the record on air, and it picks from the closest.

That should cause clumps in any genre. But for some reason reggae seems more powerful than other genres. Its share of airtime is fine: reggae is about 22 percent of the approved list and about 21 percent of what aired. The runs are the problem. In two weeks it amassed 131 runs of three or more reggae tracks in a row, where the same plays in random order would give about 37. The longest was 25, on a Sunday, which is where the last post ended. Funk runs long too, and I don’t know why either one clusters so tightly.

When my agent replayed 13 moments from my Sunday show, the sound-alike search offered reggae about 62 percent of the time when reggae was on air. In all 10 cases where it offered something else, the DJ still picked reggae.

It also can’t see the pattern. The DJ sees the track on air and the short private notes it left itself on its last three picks, twelve words each, none of them about genre. The only repeat check in the software looks at artist names. Nothing tells it that it has been playing reggae for an hour.

From the DJ’s point of view, every one of those picks was a good one. Each was smooth and on brief, by a different artist, and it just kept making the same good choice.

The first fix was a rule: change genre at least every three tracks. It lasted less than an hour. A rule like that asks the DJ to count back, and it can’t.

II.

Later on in the ride, I was thinking about how to solve it, and it struck me that game mechanics might be a simple way to get the behavior I wanted strictly through prompting.

The rules are necessarily short, because they have to fit in each show’s 2,000 characters alongside everything else the show needs. A smooth transition is worth 5 points. A smooth transition into a new genre is worth 8. A jarring one is worth nothing. A track that has never aired gets 2 extra points. The idea is to keep the groove going while giving the DJ a reason to mix up the styles.

The appeal is that every pick can be scored from what the DJ can actually see: the record on air and the candidates in front of it. It doesn’t have to remember anything. The station keeps the score, not the DJ, because a model with no memory between picks can’t be trusted to keep its own. The scorer, a small program my agent wrote, grades every pick by the same rules. It showed that my shows had opposite problems: the weekend shows were smooth but stuck (the Archivist, my Sunday DJ, changed genre on only about a third of its picks), while the weekday shows changed genre plenty but jumped around. One score pushes both in the right direction.

One of the things I want to do next is keep a high-score board for each DJ, and encourage them to compete against their own personal bests and against one another.

As we dove deeper, we started to surface all the qualities of the transitions we were looking for, and where they varied from show to show. The first and most obvious was key. As I put it at the time, “this is core dj craft.” Only about 24 percent of the DJ’s moves landed in a compatible key, roughly what you’d get by chance, even though it had already been told to prefer a close one. So a compatible key now earns 2 more points. There was a catch: the DJ could see the keys of the records it was choosing between, but not the key of the one on air.

Golden Age, my hip hop show, had a different set of considerations. It plays only hip hop and rap from 1990 to 1999, so inside it, “a new genre” can only mean moving between those two labels. Its brief also cares more about the talk: credits over praise, meaning the producer, the samples and the crew.

The game went live on all eight shows on a Saturday night. Sunday belongs to the Archivist, the show with the longest runs. That day we added one more sentence to its instructions, telling it to break the run. It didn’t. After that sentence went in, the show played runs of 28 and 23, and the 28 was the longest run on record.

III.

That wasn’t the first time the station had a mind of its own. A few favorites from the long list:

Slow records by Curtis Mayfield, Thelonious Monk and Al Green were analyzed at double their actual tempo. That doesn’t mean they played twice as fast. The metadata just stored double the real number, so you get strange transitions and strange track choices. Mayfield’s “Never Say You Can’t Survive,” a slow ballad, was stored at 152 beats per minute. The DJ followed Jeff Beck’s “Sophie” with a slow Jimi Hendrix blues and gave its reason as “Matching the 161 BPM tempo.” At one point, 1,802 tracks were stored at exactly 161.5.

Then there’s pronunciation. The voice engine guesses how to say a word from its spelling, and it often guesses wrong. Nina Simone, my most-played artist, came out as SIM-ohn. Jamie xx became “Jamie twenty.” Toots and the Maytals became Toots and the “Maytles.” Dennis Alcapone came out “al-kay-pone.” And years were read as quantities, so a 1967 album came out as “one thousand nine hundred sixty-seven.”

After hearing those, I couldn’t take it anymore. It’s not the biggest part of the experience, but it’s still the experience. It was grating, and it needed fixing.

The fix is a pronunciation list in SUB/WAVE’s settings. Each row respells one word the way it should sound, like “Cymande → Sigh-mahnday,” and the voice uses it only when it speaks; the name on screen stays the same. Getting the rows right turned out to be a little craft of its own. A one-word respelling always stresses the first syllable, and nothing moves it. To land the stress later, you join the stressed syllable to the next one, which is how “Sigh-mahnday” gets its stress in the middle.

The list had room for only 100 rows, and the years were eating it. Because the voice read every year as a quantity, each year needed its own row (“1967 → nineteen sixty-seven”), and at one point 78 of the 100 rows were years.

None of those failures ruined the station. They made its logic visible.

Some changes are only possible at the code level, and the years were one of them. When we ran into those, we either filed issues (bug reports on the project’s public page), or fixed them ourselves and submitted the fixes to SUB/WAVE’s creator, Parminder Klair, as pull requests: proposed changes he can review and accept. Two of mine fixed the list. One makes the voice say years as words, and the other raises the limit to 500 rows. Today the list has 74 rows, and none of them is a year.

I should be clear that I don’t know Parminder. But I really respect the ambition of what he’s building, and I’m having a blast building on it and with it. When he responded to an issue I’d reported and fixed it, that was pretty cool. When he accepted my first pull request, it was my very first contribution to an open-source project that wasn’t my own. It felt amazing. He has accepted five of them so far.

IV.

For weeks the station had played one pre-recorded station ID between tracks: “You’re on a musical journey through space and time.” I wanted many more, in many voices, separate from the DJs. “The goal is to have a diversity of voices and messages for the pre-recorded station IDs.”

The voices come from two places: public-domain archives, and people I know, who will each record a 20-second voice memo with their consent. The archive search had strict rules. Every clip had to be in the public domain, with the reason written down: a NASA film or a president speaking in office is a US government work, and a recording published before 1925 is out of copyright in the US. The speakers could not be living people. I wanted variety over count, across men and women, ages, accents and eras. Women’s voices are scarce in old archives, so the search went looking for them. Some archives, like the oral histories of formerly enslaved people, were off limits.

Two AI agents searched in parallel and found 86 voices, from 1888 to the 1980s: Florence Nightingale in 1890, Ernest Shackleton in 1910, Thomas Edison, presidents from Theodore Roosevelt to JFK at Rice (“We choose to go to the Moon”), the Mercury astronauts at their first press conference, wartime film narrators like James Stewart, Voice of America’s Willis Conover, Eleanor Roosevelt, Shirley Chisholm and Sally Ride. One clip was left out because its rights weren’t clear. A third agent cloned 84 of the voices with Chatterbox, an open-source voice-cloning model from Resemble AI. It ran on a Mac mini at home, about 25 minutes for the whole batch, and nothing went to an outside service.

Then it was my turn. The listening page puts each original clip next to its clone saying two test lines. I picked 39 of the 84. Then I rewrote the lines myself, 18 of them, like “This is Space and Time. Or is it?” and “There are no shortcuts through Space and Time.” Each voice got four lines at random, which makes 156 IDs. Each one is rendered three times, speech recognition checks every take against the script, and the clearest take is kept. I made the final cut by ear and kept 111 of the 156, in 36 voices. Then I had the same 18 lines read in the station’s five DJ voices too, and kept 71 of those 90. Since October 18, all of them have been on air, 182 new IDs in the rotation, and the station still plays about one every 15 tracks.

One voice I asked for by name: Neil Armstrong, saying “One small step for man, one giant leap through space and time.” The first try was a splice, the real NASA audio with a station voice finishing the line. It didn’t work for me, and neither did the real audio with a cloned ending. The take I kept is a clone made from the 1969 lunar audio, saying the whole line slowly, with a two-second pause after “man.” It’s on air now, one more ID in the pool.

A caveat: nobody listened to the clips during the search. The agents screened them with speech recognition, so a few speaker names come from catalogue data and could be wrong. A few clips also stand on thinner public-domain ground than the rest. Eleanor Roosevelt’s 1948 TV program, for one, is marked free to use by the archive that holds it, but the original copyright was never confirmed. The page credits every clip with its source and the reason it’s public domain.

V.

So, did the game work? On weekdays, the average score per pick is flat: about 4.5 points before the game and about 4.5 after.

Key-compatible picks jumped, from about 24 percent to 57 percent. But most of that jump arrived a day later with a new SUB/WAVE release that shows the DJ the key of the track on air, the one thing it couldn’t see before. The game’s share and the update’s share can’t be separated.

The reggae runs are better, though the Sunday of 28 makes it hard to give the game the credit. The next Sunday, the Archivist’s longest run was 14, and reggae took 43 percent of its airtime, down from 69 percent the Sunday before. But a new SUB/WAVE release and a cleanup of my library landed that same week, so I can’t say which change did it.

What I love about this kind of work is the experimenting. Every problem raises the same question: can I fix this by talking to the DJ, or does it need real code? Some things bend to a prompt and some don’t. I tried limiting my morning DJ to one-line scripts, to see whether shorter meant fewer station IDs that broke the rules. The one-liner didn’t hold. My answer to the IDs was code instead: a pull request, still waiting for Parminder, that lets each DJ read its own written lines word for word.

Right now the points game is at the prompt phase. I’ve already filed an issue about genre runs and offered to build a fix, and Parminder has fixed part of it for a different way the station picks records. If I can’t get the game working with prompting, the next step is to design a coded solution, open a pull request, and hope Parminder likes it.

Michael Lebowitz is the founder of Big Spaceship, acquired by MSQ Partners in 2024. He is a board director, advisor, and tinkerer in Brooklyn and Kinderhook, NY. More about Michael.