DJustify: Reason-and-Verify DJ Planning for Pop Transitions and Story-Driven Sets

Wei-Han Hsu1,2*, Li-Jie Lin3*, Po-Hsuan Lai3, Po-Hsiang Huang4, Jeng-Yue Liu5, Li Su2, Yi-Hsuan Yang6

1Data Science Degree Program, National Taiwan University and Academia Sinica, Taipei, Taiwan
2Institute of Information Science, Academia Sinica, Taipei, Taiwan
3National Taiwan University, Taipei   4Taiwan AI Labs, Taipei   5Carnegie Mellon University, USA
6AI Center of Research Excellence (AI-CoRE), National Taiwan University, Taipei, Taiwan
*Equal contribution.
Submitted to ICASSP 2027

DJustify overview. Top, the DJ-transition system: a seed track and song pool pass through pre-processing and retrieval into a verify-planning loop, where Qwen3.6-35B-A3B selects track B, cue points, and the mixing skill, renders track A plus B, and a checker (vocal, energy, structure, pairing) either sends a failed plan back for repair or outputs the transition. Bottom, the DJ-set system: a story description becomes a valence-arousal curve, tracks are selected along it, and the same verify-planning loop builds the set one next track at a time.

DJustify puts an LLM in a reason-propose-verify-repair loop that jointly chooses the next track, the cue points, and the mixing technique, then checks every plan on the rendered audio.

Abstract

Automatic DJ systems mostly target electronic dance music, whose regular structure makes rule-based mixing relatively easier. Vocal-rich popular music is harder: which track to play next, where to cue it, and which transition to use are tied together, so fixed rules handle them poorly. We present DJustify, a pop AI-DJ that puts an LLM in a reason-propose-verify-repair loop and lets it choose the next track, cue points, and mixing technique together. The LLM samples several transition plans; an external acoustic checker then scores the rendered audio and triggers repair when a check fails. Sampling keeps several candidate transitions per track pair instead of one fixed mix. In blind listening tests our transitions beat Mosaikbox, a reimplemented crossfade, and a cue baseline that reuses the crossfade’s cues; that last comparison shows most of the margin comes from cue placement. The same planner also picks and orders a set along an emotion arc: this improves story coherence over a no-story ablation, and within a set story and transition ratings show no measurable gap from a human DJ. The checker mainly adds reliability, not higher average quality: it repairs rare but audible errors such as cut vocals, while the planner stays non-deterministic.

Audio Demos

Transition Comparison

Each system mixes the same outgoing track. Ours is the full system; Ours-C drops the checker, and Ours-C-R drops the reasoning as well.

Human DJ (reference)
0:00 / 0:50
Mosaikbox
0:00 / 0:50
Bittner'17 (Spotify)
0:00 / 0:50
Ours (Bittner cues)
0:00 / 0:50
Ours-C-R
0:00 / 0:50
Ours-C
0:00 / 0:50
Ours
0:00 / 0:50
Human DJ (reference)
0:00 / 0:50
Mosaikbox
0:00 / 0:50
Bittner'17 (Spotify)
0:00 / 0:50
Ours (Bittner cues)
0:00 / 0:50
Ours-C-R
0:00 / 0:50
Ours-C
0:00 / 0:50
Ours
0:00 / 0:50
Human DJ (reference)
0:00 / 0:50
Mosaikbox
0:00 / 0:50
Bittner'17 (Spotify)
0:00 / 0:50
Ours (Bittner cues)
0:00 / 0:50
Ours-C-R
0:00 / 0:50
Ours-C
0:00 / 0:50
Ours
0:00 / 0:50
Human DJ (reference)
0:00 / 0:50
Mosaikbox
0:00 / 0:50
Bittner'17 (Spotify)
0:00 / 0:50
Ours (Bittner cues)
0:00 / 0:50
Ours-C-R
0:00 / 0:50
Ours-C
0:00 / 0:50
Ours
0:00 / 0:50

Checker Rescue

Without the checker, Ours-C leaves an audible flaw at the seam. The checker flags it and Ours repairs the plan.

Ours-C
0:00 / 0:50
Ours
0:00 / 0:50
Ours-C
0:00 / 0:50
Ours
0:00 / 0:50

Constrained Diversity

Same track pair, three samples: where a fixed rule returns one mix, our planner varies technique and cue point.

Blend
0:00 / 1:00
Filter
0:00 / 1:00
Echo
0:00 / 1:00

Story-Driven DJ Sets

Story prompt

“Starts hurt and fed up, falls in love again, and ends in regret.”

Ours (Story)
0:00 / 2:58
Lyrics heard in the set (translated to English)
囂張 (Arrogant)
  • How arrogant can you be
  • My heart beats wild for you
  • You say I'm not needed, so I should just leave
favorite
  • Loving you, I became someone new
  • You bring out my best side
  • You are my favorite baby
She's Gone
  • Cause what I've done, I've made this way
  • I took her love like candy from a child
  • While I was loving another all the while
Story prompt

“A sweet romance begins, slowly gets complicated, and ends with me alone and sad.”

Ours (Story)
0:00 / 3:02
Lyrics heard in the set (translated to English)
No Sense
  • Won't you pull up to me now
  • I'm going in with you
  • It don't make sense
After Last Night
  • Damn, I don't even know who I was last night
  • I think I'm in love with you
  • You woke up and I can't get you out of my head
在那遙遠的地方 (In That Faraway Place)
  • But you're never by my side
  • My heart is full of missing you
  • You said true love isn't afraid of distance
Story prompt

“Starts curious and unsure, falls harder and harder, and ends hopeful.”

Ours (Story)
0:00 / 2:56
Lyrics heard in the set (translated to English)
星座 (Zodiac Signs)
  • Studying the zodiac for new clues
  • Tell me how to win that heart
  • Just like you, impossible to read
Can't Leave Alone
  • See you all the damn time
  • Love you in front of the entire world
  • I can't leave alone
Hello
  • Will the day ever come when I hold her hand
  • I'm working up my courage
  • Maybe we'll work out
Story prompt

“Starts chill and easygoing, builds up, and ends in a full-on party.”

Ours (Story)
0:00 / 2:57
Lyrics heard in the set (translated to English)
Beef Noodle Soup
  • Walkin' through the town, sayin' what up to my people
  • What a good day to be happy now
  • It got me feelin' like a kid again
鬼地方 (Godforsaken Place)
  • Wind and sun, never worried about catching a cold
  • This is how we roll
  • Time to leave this damn place
The Next Episode
  • Get my drink on, and my smoke on
  • It's the next episode
  • We gon' rock it till the wheels fall off