MBXHub

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.

Trigger queue ran low 1 Driver who picks 2 Pool what is eligible 3 Center where we aim 4 Score which we prefer 5 Quotas spread it out 6 Order the sequence 7 Queue appended 8 if a run is on else, if analyzed else The run’s own center Station, journey or program. Saved to disk, survives a restart, always wins. Follow the music The track playing now, else the average of what is already queued ahead. No center at all Nothing in play has been analyzed, so the whole library is fair game. Reach how far out we will look Set by Tightness. Wave reaches further. Widens on its own if too few qualify.
The chain, and the one branch that decides everything downstream. Stage 4 picks the aiming point. A running station or journey supplies it and beats everything else — including whatever you just put on by hand. Only with no run on does AutoQ follow the music. With nothing analyzed to follow there is no aiming point at all, and stages 5–7 work across the entire library.

Stage by stage

1

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.

Builder mode holds automatic top-ups queue threshold batch size

In the log: the fill is recorded. The reason it fired is Debug‑only.

2

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.

AutoQ enabled Pick mode TrueShuffle enabled

In the log: the mode is named on each fill.

3

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.

banned tracks your filter longer than the cap spoken word freshness rule the station’s own filter

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.

4

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.

the run’s saved center follow the music Tightness flow — Wave reaches further

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.

5

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.

taste match this track’s history this artist’s history played recently downvoted on this station upvoted on this station

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.

6

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.

artist quota genre quota genre-free station

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.

7

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.

flow continuity slide slide spacing and reach

In the log: nothing at all. The ordering pass writes no lines.

8

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.

stamped with driver and reason

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.

You react like · heart · fire dislike · ban always only during a station only during a run party mode Your library, permanently Weights this track and this artist, and shapes your taste profile. A ban is a hard exclude everywhere, for good, until you lift it. This station, stickily Up: the track gets a bump whenever this station plays. Down: dropped from this station’s picks only, elsewhere untouched. This run, right now The aiming point itself moves — toward the track on a thumbs up, more gently away on a thumbs down. Saved with the run. The party board Guest reactions light up the display and score the leaderboard. They do not change what gets picked.
Four destinations, three conditions. The library level always fires. The station level needs a station actually running — the same thumbs down given off‑station teaches nothing station‑specific. The run level needs a run with an aiming point. Party reactions are social only.

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

StageFile
1 · TriggerPluginEventBroadcaster — queue-low check, auto-fill
2 · DriverQueueDriver.Effective
3 · PoolAutoQEngine.GetCandidateTracks
4 · CenterAutoQEngine.ApplyFunnelPoolDraw, .FollowCenter, RadioRuntime, FunnelPoolSelector
5 · ScoreAutoQEngine.ScoreTrack, SessionTracker, StationInfluenceStore
6 · QuotasAutoQEngine.GetDiversityPenalty, .SelectWithDiversityCap
7 · OrderCore/Pfs/PfsOrderer, FlowState, ContinuityScorer
8 · QueueQueueProvenance, QueueHandlers
ReactionsAutoQEngine.OnReaction — fans to SessionTracker, StationInfluenceStore, RadioRuntime.NudgeCenter