How to Set Cue Points Automatically in VirtualDJ (POIs and Loops)

Updated · by the MixGoat team · Tool: Cues & Loops

Short answer

VirtualDJ does not generate hot cues from the music. On analysis it writes a beatgrid anchor and automix in and out points into database.xml, and the autoCue setting only decides where a loaded track parks; the cue pads stay empty until you press them. To fill them automatically, run MixGoat's Cues & Loops on the files: a local model scores cue positions, a separate pass finds bar-length loops, and Save writes them as Poi elements (Type="cue" with a pad Num, Type="loop" with a Slot) into the matching Song entry of database.xml, after copying the file to database.xml.bak. VirtualDJ must be closed while it writes. Detection is free on every plan; saving into VirtualDJ is the GOAT step. Open VirtualDJ afterwards and the points appear as each track is loaded.

Step by step

  1. 1

    Quit VirtualDJ and let MixGoat find database.xml

    VirtualDJ rewrites database.xml while it runs, so MixGoat refuses to save into a running copy and asks you to close it. On macOS it looks for ~/Library/Application Support/VirtualDJ/database.xml; on Windows it checks %LOCALAPPDATA%\VirtualDJ, Documents\VirtualDJ and %APPDATA%\VirtualDJ in that order. If you see "VirtualDJ not detected. Install it and run once to create the library.", launch VirtualDJ once so the file exists, or point MixGoat at it with Change location.

  2. 2

    Add the tracks VirtualDJ already knows

    In Prepare → Cues & Loops, add files, a folder or a playlist. Use the same paths VirtualDJ has in its browser: MixGoat matches each result to a Song entry by its FilePath attribute (and the drive-relative form VirtualDJ uses for external drives), so a track added from a different path would get a second entry instead of cues on the one you play.

  3. 3

    Choose how many pads and which loop lengths

    Set Max hot cues to the number of pads you actually use; the default skin shows 8, and MixGoat writes Num 1 to 8. Cues that miss the cap are written as POIs without a pad number, which VirtualDJ shows as plain markers. Turn on Detect loops, pick lengths from 4, 8, 16 and 32 bars, and set Max loops; loops go into VirtualDJ's separate saved-loop slots, so they never steal a cue pad.

  4. 4

    Leave the memory-cue option alone

    "Save cues as" offers Hot cues or Memory cues, but memory cues are a Rekordbox concept. Whatever you pick, VirtualDJ receives hot cues. Keep "Snap cues to beatgrid" on: VirtualDJ stores Pos in seconds with one decimal, and a snapped cue lands on the Scan beatgrid it already has, the same way its own smartCue option quantises a pad press.

  5. 5

    Detect and review

    Detection runs on your computer and is free. Pads are numbered left to right with the standard pad colours, stored as the decimal ARGB value VirtualDJ expects in the Poi's Color attribute. Loops get names such as "Groove 16 bars" so they read clearly in the saved-loop pads.

  6. 6

    Save with VirtualDJ selected as a target

    Under "Write cues & loops to" enable VirtualDJ. MixGoat copies database.xml to database.xml.bak, then rewrites the matching Song entries: existing beatgrid, automix and remix POIs are kept, the entry's cue and loop POIs are replaced by the new list. Tracks on an external volume get their POIs written into that drive's own VirtualDJ/database.xml. A save with an empty list clears that track's cues, so do not save a track you cleared by accident.

  7. 7

    Open VirtualDJ and load a track

    MixGoat's own post-save note reads "Cues load when tracks are first played." VirtualDJ reads database.xml at launch, and the pads light up the first time each track is loaded to a deck. If a pad stays empty, check the browser: a red title means the file is not at the path the POIs are attached to.

How VirtualDJ stores cue points: the POI model

Everything VirtualDJ knows about a track's timeline is a Poi element inside that track's Song entry in database.xml. The Type attribute says what it is: cue for a hot cue (Num is the 1-based pad), loop for a saved loop (Size is the length in seconds, Slot is the saved-loop slot, Num is -1), beatgrid for the grid anchor, automix for the mix in and out points, remix for the remix points used by the remix pads, and action for a point that fires a script. Pos is the position in seconds, Name is optional, Color is an ARGB number.

You can see and edit all of this in the POI editor, reached from a track's right-click menu. It is the only place in VirtualDJ where you can bulk-edit points on a track, but it still works one track at a time, which is why a detector is the practical route for a large library.

What VirtualDJ automates, and what it leaves to you

VirtualDJ's analysis writes BPM, key and a beatgrid anchor into the Scan element, and it computes automix points so Automix can blend tracks unattended. Options in Settings control what happens when a track loads: autoCue moves the playhead to the first cue or first beat, and smartCue snaps pad presses to the grid. None of that creates a hot cue at the drop, the breakdown or the vocal. Serato is the same; Rekordbox can drop a memory cue on the first beat; Traktor places the grid marker. The comparison across all four apps is in the general guide at mixgoat.com/guides/automatic-cue-points, and the loop side is at mixgoat.com/guides/automatic-loops.

  • Automatic in VirtualDJ: BPM, key, beatgrid anchor, automix in and out points, gain.
  • Manual in VirtualDJ: hot cue pads, saved loops, remix points, POI names and colours.
  • MixGoat adds: hot cues (1 to 8 pads plus unnumbered markers) and saved loops with slots, written into the existing Song entries.

Why MixGoat edits the entry instead of re-importing the track

Because POIs hang off the FilePath of a Song entry, adding a track again from a different location gives VirtualDJ two entries and the pads on the one you play stay empty. MixGoat's writer matches by FilePath first, injects the new POIs into the existing entry, and only creates a new Song (with Tags, length and POIs) when the path is genuinely unknown to the database. It also leaves the file's Version attribute on the VirtualDJ_Database root untouched, so a 2025 database stays a 2025 database and VirtualDJ does not try to migrate it.

The same writer is used by the free migration when you bring cues in from Rekordbox, Serato or Traktor. For the other apps' behaviour see mixgoat.com/guides/auto-cue-points-rekordbox, mixgoat.com/guides/auto-cue-points-serato and mixgoat.com/guides/auto-cue-points-traktor.

Set VirtualDJ cue points automatically with MixGoat

Detection is free on every plan. Saving POIs into database.xml is part of the GOAT plan.

Set VirtualDJ cue points automatically with MixGoat

Frequently asked questions

Where are POIs stored in VirtualDJ?
As Poi elements inside each track's Song entry in database.xml: Documents\VirtualDJ on Windows, ~/Library/Application Support/VirtualDJ on macOS, and a VirtualDJ/database.xml at the root of every external drive that holds tracks. They are not written into the audio files.
Can VirtualDJ set hot cues automatically?
No. It sets the beatgrid, automix points and gain during analysis, and autoCue only moves the playhead on load. Hot cues are placed by pressing a pad or in the POI editor, or by an external detector that writes into database.xml.
How many hot cues does VirtualDJ support?
Far more than the eight pads the default skin shows; the hot_cue action accepts higher numbers and skins can page through them. MixGoat writes at most eight numbered pads per track and stores anything beyond that as unnumbered POIs.
Do saved loops take up hot cue pads in VirtualDJ?
No. VirtualDJ keeps loops in their own slot bank, stored as Type="loop" with a Slot attribute and Num="-1". MixGoat writes them that way, so eight cues and eight loops can coexist on one track.
Why do my new cues not show up in VirtualDJ?
Usually one of three things: VirtualDJ was open during the save and overwrote database.xml on exit, the track is on a different path than the one MixGoat wrote to, or you have not loaded the track yet. Cues appear when the track is first loaded to a deck after the save.