How AutoQ Picks
AutoQ · picking reference
Every track AutoQ tops the queue up with passed through eight stages. Three of them can throw a track out; three of them bend which track wins. This is what each one is actually deciding, in plain terms.
- removes tracks — they do not come back
- bends which track wins
- you set this
Stage by stage
Something asks for tracks
The queue dropped below its threshold, a track changed, you pressed Refresh or ON‑AIR, or you sent tracks to AutoQ. Nothing runs on a timer — every fill has a cause.
In the log: the fill is recorded. The reason it fired is Debug‑only.
Who is driving
AutoQ picks if it is enabled and Pick mode is not Off. Otherwise TrueShuffle picks, if that is on. Otherwise nothing fills the queue.
Pick mode does double duty: it is also the radio’s on‑air switch. Setting it to Off stops the radio and hands the queue to TrueShuffle in the same move.
In the log: the mode is named on each fill.
What is even eligible
A set of hard gates. Each removes tracks from consideration, and nothing further down can put them back — no score, no boost, no reaction.
In the log: four of the six, at the default level. Length, spoken word, freshness and your filter each report what they removed. The ban list does not. But none of them write unless the pool was rebuilt — on a routine fill it is reused from cache, and then the counts were never taken rather than merely never shown.
Where we are aiming
The center is a point in mood space — roughly, how upbeat and how energetic. A running station, journey or program sets it explicitly, and that center wins over everything, including the album you just started by hand. It is written to disk, so it comes back after a restart.
With no run on, AutoQ follows the music instead: the track playing now, or failing that the average of what is already queued ahead. Both need the track to have been analyzed — an unanalyzed track cannot supply a center. Reach then decides how far from that point to look, widening on its own if too few tracks qualify.
In the log: Debug only. The center, whether it was followed or explicit, the reach and the pool size are all written — and none of it appears on a default install.
Which of those we prefer
Every surviving track gets a score. What lifts it: how well it matches your taste, what you have said about this track before, what you have said about this artist, and a small nudge for never having heard it. What pushes it down: having played it recently.
Taste matching only does anything once you have reacted to something. With no reactions at all that part of the score is flat across the library, and the ranking is decided by the rest.
In the log: the top of the list at Debug, each track’s own breakdown at Trace. Every component that went into a score is written down — taste, track history, artist history, recency, diversity, exploration, mood, unheard. Two levels below anything a default install records.
Spread it out
Caps on how many tracks one artist or one genre may contribute. A track over its quota is not demoted, it is dropped. A station can be set genre‑free, which suspends the genre cap so a metal station stays metal.
In the log: at Trace. Both the cap that skipped a track and the quota breach that zeroed it are written down — at the lowest level there is. So on a default install a quota drop still looks identical to a track that simply scored low.
The sequence
The flow shapes the run: a smooth glide, a wave, a build, a wind‑down. Continuity tries to keep neighbouring tracks in compatible key, tempo and texture. Slide deliberately breaks the sameness every so often — but it can only choose from tracks stage 4 already selected, so it can jar, it cannot wander off.
In the log: nothing at all. The ordering pass writes no lines.
Into the queue
Tracks are appended to the now playing list, each stamped in memory with who queued it and why. Anything you do to the queue yourself — drag, remove, insert — happens outside all of the above.
In the log: the count queued. The stamp is never written out, and edits you make by hand leave no trace.
One chain, five doors
The eight stages above describe the automatic top‑up — the fill that runs when the queue gets low. Generate, Connect, playing a station and the single‑track pick each enter the same machinery by a different door and run a different subset of it. The single‑track pick draws no aiming point at all; Generate and journeys each draw their own. So what happened to a track, and what was written down about it, depends on which door it came in by.
Where reactions land
A reaction is not one thing. The same tap does up to four different jobs depending on what is running at that moment, and only the first is unconditional.
The practical consequence
If the queue drifts out of a station’s lane and you downvote it, that only sticks to the station if the station is still running. If the radio dropped out from under you first, the same tap taught your library only — and the station will make the same mistake next time.
Where the two numbers come from
Every stage above works on two numbers per track — how bright or dark it sounds, and how calm or driving. Almost everything AutoQ does is arithmetic on those two, so it is worth knowing where they come from, because they do not come from the same place for every track in your library.
A track that has been analysed gets them from a trained model: a regression fitted against 180 hand‑rated anchor tracks, reading 24 measurements taken off the audio itself. That model is on by default, so this is the normal case.
A track that has never been analysed does not go through that model with the measurements left blank. It goes to a separate, much cheaper estimate: start in the middle, look the genre up in a table of curated starting points, tint the result with tempo and your rating, tint it again very slightly by year. It is a guess, and it is meant to be — it exists so an unscanned library still plays rather than stalling.
The case worth knowing about
If a track has no genre, or a genre the table does not recognise, that guess never moves off the middle. And the middle is not a neutral opinion — it is a position, sitting closest to the calm and mellow end of the space and furthest from anything extreme. A library with little analysis behind it therefore does not drift randomly. It drifts to the middle, which is the first fault described below.
How good those numbers are
Not equally good, and the gap is structural rather than a defect. Measured against the ratings it was fitted on, the model predicts energy far better than it predicts mood. Energy follows fairly directly from things a machine can measure — loudness, brightness, tempo. Bright‑versus‑dark leans on harmony, lyrics and cultural context, which audio measurements only partly carry. A loud bright track can read as happier than it is; the genre starting points exist partly to pull the worst of that back, and they are a hand‑tuned correction rather than a fix.
Some libraries carry a second, independent opinion. Files that have passed through Sony’s software or a Walkman‑family device come back carrying that ecosystem’s own analysis, which MBXHub projects onto the same two axes and uses alongside its own. Where it is present it is a free second reading taken by someone else’s method; where it is absent — most of a typical library — it simply says nothing. It is also opaque: what its channels individually mean belongs to Sony, so it is used as a signal, never as a label.
The two ways it goes wrong
Both of the reports we have map onto specific stages, and they are not the same fault.
A whole block that does not match what you were playing
That is stage 4, and slide has nothing to do with it. Slide can only pick from tracks the center already selected, so it can produce one jarring neighbour — not a coherent block of something else. A block that hangs together but ignores your album means the aiming point was wrong, and there are only two ways for that to happen: a saved station or journey center is still steering from an earlier session, or nothing in play was analyzed, so there is no center and the whole library is in play.
Telling them apart: a stale center produces something coherent. No center at all produces something scattered.
The queue quietly hands over to TrueShuffle
That is stage 2. Pick mode is both the picker choice and the radio’s on‑air switch, and the Settings dialog reads that dropdown once, when it opens. If the radio starts or stops while the dialog sits open, saving writes the stale value back over the live one — and a stale Off takes the radio down and hands the queue to TrueShuffle.
Why the log will not settle this today
On a default install the log records that a fill happened, how many tracks it added, and — only when the pool was rebuilt rather than reused — what each eligibility gate removed. Everything that would explain the choice sits below that. The aiming point, whether it was followed or explicit, the reach and the pool size are written at Debug. Each track’s score breakdown and every quota drop are written at Trace. And debug output is suppressed outright unless debug mode is switched on, whatever the configured level says — so both tiers are dark by default. The ordering pass writes nothing at any level, the queue stamp is never written out, and edits you make by hand leave no trace.
So the lines that would explain a bad fill mostly exist. On the machine where the bad fill happened, at the level it was running, they were never written — and nothing ties the ones that were to a single fill.
Footnote: where this lives in the code
| Stage | File |
|---|---|
| 1 · Trigger | PluginEventBroadcaster — queue-low check, auto-fill |
| 2 · Driver | QueueDriver.Effective |
| 3 · Pool | AutoQEngine.GetCandidateTracks |
| 4 · Center | AutoQEngine.ApplyFunnelPoolDraw, .FollowCenter, RadioRuntime, FunnelPoolSelector |
| 5 · Score | AutoQEngine.ScoreTrack, SessionTracker, StationInfluenceStore |
| 6 · Quotas | AutoQEngine.GetDiversityPenalty, .SelectWithDiversityCap |
| 7 · Order | Core/Pfs/PfsOrderer, FlowState, ContinuityScorer |
| 8 · Queue | QueueProvenance, QueueHandlers |
| Reactions | AutoQEngine.OnReaction — fans to SessionTracker, StationInfluenceStore, RadioRuntime.NudgeCenter |