A Dataset of Structure Annotations for EDM Tracks in DJ Mixes
dataset
ββ mixes.jsonl # DJ mix metadata including tracklists
ββ tracks.jsonl # Individual track metadata
ββ mixesdb_genres.jsonl # All genres of DJ mixes collected from MixesDB
ββ beats/
β ββ mixes/
β β ββ <MIX_ID>.beat.json # Beats of the mix
β ββ tracks/
β ββ <TRACK_ID>.beat.json # Beats of the track
ββ alignments/ # Mix-to-track alignments
β ββ <MIX_ID>.align.jsonl # including estimated mix points
ββ structures/ # Human-annotated structure annotations
ββ beats/
β ββ <TRACK_KEY>.beat.csv # Beats and downbeats
ββ segments.json # Tempo and functional segment boundaries with labels
https://www.youtube.com/watch?v=<TRACK_ID>.*.jsonl files are JSON Lines files, each containing one JSON object per line.mixes.jsonl | Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the DJ mix assigned by this dataset. |
title | string | Title of the DJ mix from MixesDB. |
url | string | URL of the DJ mix on MixesDB. |
audio_source | string | Source of the audio file (soundcloud, mixcloud, youtube, or html_audio). |
audio_url | string | URL of the audio file. |
duration | number | Duration of the DJ mix in seconds. |
num_identified_tracks | integer | Number of tracks in the DJ mix that have been identified by MixesDB. |
frac_identified_tracks | number | Fraction of identified tracks (num_identified_tracks divided by num_total_tracks). |
num_total_tracks | integer | Total number of tracks in the DJ mix, according to MixesDB. |
num_available_transitions | integer | Number of available transitions in the DJ mix. |
num_timestamps | integer | Number of timestamps in the DJ mix, parsed from [NN] patterns in track titles. About 38% of mixes have timestamps. |
tracklist | array | List of tracks in the DJ mix. Each entry has: Β Β id: YouTube video ID (string or null)Β Β title: Track title from MixesDB. |
genres | array | Genres extracted by filtering genre tags from tags. |
tags | array | List of tags from MixesDB. |
{
"id": "mix3225",
"title": "2016-08-30 - Joey Beltram - Transmissions 140",
"url": "https://www.mixesdb.com/w/2016-08-30_-_Joey_Beltram_-_Transmissions_140",
"audio_source": "soundcloud",
"audio_url": "https://soundcloud.com/djborisnyc/transmissions-140-with-joey",
"duration": 3600.065306,
"num_identified_tracks": 20,
"frac_identified_tracks": 0.8695652174,
"num_total_tracks": 23,
"num_available_transitions": 16,
"num_timestamps": 0,
"tracklist": [
{
"id": "nCICZPgEhAk",
"title": "Pig&Dan - Chez Dre [Drumcode]"
},
{
"id": null,
"title": "Nigel Richards & GhettoBlaster Feat. Robert Armani - Bang The Box (Joey Beltram Remix)"
},
{
"id": "HjMuAdaYIMc",
"title": "D-Unity - Slippin [1605]"
},
{
"id": "fKRHlYJQibw",
"title": "Boris - Language (Carlo Lio Remix) [Transmit]"
},
{
"id": "aEASTKctDJo",
"title": "Gary Beck - Timeline (P\u00e4r Grindvik Remix) [BEK]"
},
{
"id": null,
"title": "Slam - Significance"
},
{
"id": "M0hjKPRgVqk",
"title": "Ian Pooley - Celtic Cross (Len Faki Remix) [Figure]"
},
{
"id": "rREATieGXgY",
"title": "Adam Beyer & Mark Reeve - Nine Of You [Drumcode]"
},
{
"id": "bC3xQwua0ao",
"title": "Umek - Inhumane Visions"
},
{
"id": "wV5A2yqRMh8",
"title": "A. Mochi - C2M [Figure]"
},
{
"id": "8MiSjl9XULo",
"title": "Simone Tavazzi - Nitro (Joey Beltram Remix) [Unknown Territory]"
},
{
"id": "t8u3hCYrkrg",
"title": "Owen Offset - Inhale (Joey Beltram Remix)"
},
{
"id": "Jr4Vk8ZcoQc",
"title": "Oliver Deutschmann - Asylum [Slim]"
},
{
"id": "5WvMql1Ejzs",
"title": "Secret Cinema & Egbert - Maximaal [Drumcode]"
},
{
"id": "UtF88HgRJ2g",
"title": "Bart Skils - Voodoo Child [Drumcode]"
},
{
"id": "bfuutcmHbGM",
"title": "Nick & Danny Chatelain - Acid (Coyu Remix) [Suara]"
},
{
"id": "AoWKSZpZKQ0",
"title": "Advent & Industrialyzer - Evil Bee [Kombination Research]"
},
{
"id": "rpHv3LT592I",
"title": "Carlo Lio - Welcome To The Flipside [Suara]"
},
{
"id": "lrrHQn69Ngg",
"title": "DJ Murphy - Out Cold (Joey Beltram Remix) [Dolma]"
},
{
"id": "TUxODzHrU94",
"title": "Egbert - Dieper [GEM]"
},
{
"id": null,
"title": "Boris - Can You Hear Me [Alleanza]"
},
{
"id": "-9AzxrzSEbU",
"title": "Sian & Luigi Madonna - Royal Oak [Octopus]"
},
{
"id": "cpVUZKZL3Ho",
"title": "Kaiserdisco - Bonkers [Drumcode]"
}
],
"genres": [
"Techno",
"Tech House"
],
"tags": [
{
"key": "Category:Joey Beltram",
"url": "https://www.mixesdb.com/w/Category:Joey_Beltram"
},
{
"key": "Category:Transmissions",
"url": "https://www.mixesdb.com/w/Category:Transmissions"
},
{
"key": "Category:Techno",
"url": "https://www.mixesdb.com/w/Category:Techno"
},
{
"key": "Category:Tech House",
"url": "https://www.mixesdb.com/w/Category:Tech_House"
}
]
}
tracks.jsonl mixes.jsonl.| Field | Type | Description |
|---|---|---|
id | string | Track ID (YouTube video ID). |
play_count | integer | Total occurrences of this track in the dataset. |
title | string | Chosen track title (aggregated from MixesDB listings). |
duration | number | Track duration in seconds. |
played_at | array | List of mix IDs in which this track appears. |
mix3225. Its metadata is shown below:{
"id": "5WvMql1Ejzs",
"play_count": 10,
"title": "Secret Cinema & Egbert - Maximaal [Drumcode - DC159]",
"duration": 525.288,
"played_at": [
"mix2872",
"mix3185",
"mix3195",
"mix3210",
"mix3223",
"mix3225",
"mix3488",
"mix3639",
"mix3724",
"mix4477"
]
}
beats/mixes/<MIX_ID>.beat.json beats/tracks/<TRACK_ID>.beat.json | Field | Description |
|---|---|
track_id | Track ID. |
beats | List of beat times in seconds. |
mix3325: {
"mix_id": "mix3325",
"beats": [1.17, 1.66, 2.15, ... , 5470.35, 5470.82, 5471.29]
}
5WvMql1Ejzs: {
"track_id": "5WvMql1Ejzs",
"beats": [0.17, 0.64, 1.11, ... , 509.72, 510.19, 510.66]
}
alignments/<MIX_ID>.align.jsonl *_mix and when they occur in the track *_track.*_beat_* and time in seconds *_time_*.| Field | Description |
|---|---|
mix_id | DJ mix ID. |
track_id | Track ID. |
mixin_time_mix | Mix-in time in seconds (in the mix). |
mixout_time_mix | Mix-out time in seconds (in the mix). |
mixin_time_track | Mix-in time in seconds (in the track). |
mixout_time_track | Mix-out time in seconds (in the track). |
mixin_beat_mix | Mix-in beat index (in the mix). |
mixout_beat_mix | Mix-out beat index (in the mix). |
mixin_beat_track | Mix-in beat index (in the track). |
mixout_beat_track | Mix-out beat index (in the track). |
match_rate | Proportion of correctly aligned beats relative to the total number of beats in the track. |
matched_beats | Number of correctly aligned beats. |
matched_time_mix | Correctly aligned time in seconds (in the mix). |
matched_time_track | Correctly aligned time in seconds (in the track). |
cost | DTW cost. |
wp | Warping path: list of [track_beat, mix_beat] index pairs from DTW. |
mix3225 and the example track above 5WvMql1Ejzs: {
"mix_id": "mix3225",
"track_id": "5WvMql1Ejzs",
"mixin_time_mix": 2359.72,
"mixout_time_mix": 2460.8,
"mixin_time_track": 267.83,
"mixout_time_track": 368.14,
"mixin_beat_mix": 4975,
"mixout_beat_mix": 5189,
"mixin_beat_track": 571,
"mixout_beat_track": 785,
"match_rate": 0.1917930419,
"matched_beats": 215,
"matched_time_mix": 101.08,
"matched_time_track": 100.31,
"cost": 0.4504659436,
"wp": [
[ 785, 5189 ],
[ 784, 5188 ],
[ 783, 5187 ],
[ 782, 5186 ],
[ 781, 5185 ],
...
[ 575, 4979 ],
[ 574, 4978 ],
[ 573, 4977 ],
[ 572, 4976 ],
[ 571, 4975 ]
]
}
mixin_time_mix=2359.72) in the mix and at 4:28 (mixin_time_track=267.83) in the track.mixout_time_mix=2460.8) in the mix and at 6:08 (mixout_time_track=368.14) in the track.0019.5WvMql1Ejzs instead of 5WvMql1Ejzs).structures/segments.json, while beats and downbeats are available in structures/beats/<TRACK_KEY>.beat.csv.Schema for segments.json
| Field | Description |
|---|---|
key | Unique identifier for the subset with structure annotations. |
index | Track index in the subset. |
id | Track ID in the entire dataset, which is the YouTube video ID. |
title | Track title from tracks.jsonl. |
fold | Fold index for 8-fold cross-validation of structure analysis model. |
genre | Genre annotated manually referencing Beatport. |
duration | Duration in seconds. |
play_count | Number of times the track has been played in this dataset from tracks.jsonl. |
average_bpm | Average tempo in beats per minute. |
tempos | List of tempos in beats per minute. If multiple tempos exist, the tempo changes, the tempo applies from start to the next tempo. beat_position_in_bar is the beat index in the bar, 1 indicates the downbeat. |
sections | List of sections. |
played_at | List of DJ mix IDs where the track has been played. |
Schema for <TRACK_KEY>.beat.csv
| Field | Description |
|---|---|
time | Time of the beat in seconds. |
downbeat | Beat position in the bar; 1 denotes the downbeat. |
section | Functional segment label for the beat. |
Entry for the example track 5WvMql1Ejzs in segments.json:
{
"key": "0019.5WvMql1Ejzs",
"index": 19,
"id": "5WvMql1Ejzs",
"title": "Secret Cinema & Egbert - Maximaal [Drumcode - DC159]",
"fold": 2,
"genre": "Techno",
"duration": 525.25861678,
"play_count": 10,
"average_bpm": 128.0,
"tempos": [
{
"start": 0.179,
"bpm": 128.0,
"beat_position_in_bar": 1
}
],
"sections": [
{
"name": "intro",
"start": 0.179,
"end": 15.179
},
{
"name": "buildup",
"start": 15.179,
"end": 60.179
},
{
"name": "buildup",
"start": 60.179,
"end": 105.179
},
{
"name": "cooldown",
"start": 105.179,
"end": 135.179
},
{
"name": "breakdown",
"start": 135.179,
"end": 180.179
},
{
"name": "drop",
"start": 180.179,
"end": 240.179
},
{
"name": "cooldown",
"start": 240.179,
"end": 270.179
},
{
"name": "breakdown",
"start": 270.179,
"end": 300.179
},
{
"name": "drop",
"start": 300.179,
"end": 360.179
},
{
"name": "cooldown",
"start": 360.179,
"end": 480.178
},
{
"name": "outro",
"start": 480.178,
"end": 495.178
},
{
"name": "altoutro",
"start": 495.178,
"end": 525.25861678
}
],
"played_at": [
"mix2872",
"mix3185",
"mix3195",
"mix3210",
"mix3223",
"mix3225",
"mix3488",
"mix3639",
"mix3724",
"mix4477"
]
}
Beats for track 5WvMql1Ejzs (5WvMql1Ejzs.beat.csv):
time,downbeat,section
0.179,1,intro
0.6478,2,intro
1.1165,3,intro
1.5853,4,intro
2.054,1,intro
2.5228,2,intro
2.9915,3,intro
...
Music is hard to explain with text alone. Hearing the structure is often clearer than describing it.
Below we provide two audio examples: one track with a straightforward structure, and another with an ambiguous structure that led us to exclude it from the annotated subset.
| Timestamp | Function | Description |
|---|---|---|
| 0:00 | Intro | Percussive opening. |
| 0:15 | Buildup | Gradual increase in energy. |
| 0:45 | Breakdown | Sudden drop in energy; strings heighten tension further. |
| 1:17 | Drop | First full-energy drop. |
| 1:32 | Drop | Consecutive drop; new synth enters, so marked as boundary. |
| 1:47 | Drop | Consecutive drop; rhythmic pattern changes, marked again. |
| 2:02 | Breakdown | Second breakdown. |
| 2:34 | Drop | Second drop begins. |
| 2:49 | Drop | Consecutive drop; new synth/voice enters, marked boundary. |
| 3:04 | Drop | Consecutive drop; rhythmic shift similar to prior. |
| 3:19 | Outro | Percussive closing. |
NOTE: Clicking timestamps will jump to the corresponding time in the video.
This section describes two ambiguous examples that led us to exclude them since it is difficult to establish consistent annotation criteria across all tracks and all annotators. We have organized the musical cues to illustrate why this is challenging.
Most excluded tracks correspond to this case. This track is difficult to segment because instruments enter and exit gradually. Additionally, the energy remains almost constant throughout the track.
| Timestamp | Description |
|---|---|
| 0:00 | Intro. |
| 0:43 | Kick drum fades in. |
| 1:35 | Short percussive synth fades in. |
| 1:50 | Vocal (βstep backβ) fades in. |
| 2:00 | Bass synth fades in. |
| 2:45 | Synth added. |
| 2:59 | Ride added. |
| 3:13 | Ride removed. |
| 3:42 | Breakdown. |
| 4:25 | Second part begins. |
| 4:39 | Ride removed. |
| 5:08 | Ride returns. |
| 5:45 | Synths removed; track begins fading out. |
| 6:19 | Ambient outro. |
NOTE: Clicking timestamps will jump to the corresponding time in the video.
This track was excluded due to its highly repetitive structure.
| Timestamp | Description |
|---|---|
| 0:00 | Intro. |
| 0:46 | Clap added. |
| 1:17 | Vocal added. |
| 1:48 | Vocal removed; new synth added. |
| 2:19 | Synth removed; vocal returns. |
| 2:35 | Synth returns; both synth and vocal playing. |
| 2:46 | Short 2-bar breakdown. |
| 2:50 | Vocal removed; synth continues. |
| 3:07 | Vocal returns; synth continues. |
| 3:21 | Synth removed. |
| 3:52 | Vocal removed; synth returns. Rhythmic pattern changes. |
| 4:23 | New bass synth fades in. |
| 4:31 | Synth removed; bass synth starts fading out. |
| 4:50 | Synth returns. |
| 4:54 | Ambient outro. |
NOTE: Clicking timestamps will jump to the corresponding time in the video.
This section describes how to annotate track structures using Rekordbox and convert the annotations to JSON format. The image below shows an example screenshot of Rekordbox annotating 0004.0EWbonj7f18. We use Rekordboxβs memory cues to annotate segments, assisted by Rekordboxβs track analysis for beat and downbeat annotation.
mp3 files since their time offset can vary depending on the decoder.
python convert_rekordbox_xml_to_json.py to convert the XML file to JSON format.