Raveform

A Dataset of Structure Annotations for EDM Tracks in DJ Mixes

Quick Links

Dataset Structure

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

Dataset Components

DJ Mix Metadata

Schema

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.

Example

BORIS Β· Transmissions 140 with Joey Beltram
{
  "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"
    }
  ]
}

Track Metadata

Schema

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.

Example

{
  "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

Schema

Field Description
track_id Track ID.
beats List of beat times in seconds.

Example


Mix-to-Track Alignments

Schema

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.

Example


Structure Annotations

Schema

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.

Example

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
...

Segment Function Examples

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.

Straightforward Example

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.


Ambiguous Examples

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.

Ambiguous Example 1

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.

Why is this difficult to annotate?

Ambiguous Example 2

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.

Why is this difficult to annotate?


How to Annotate Structures

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.

Detailed Steps

  1. Open the track you want to annotate in Rekordbox. We do not recommend mp3 files since their time offset can vary depending on the decoder.
  2. Use Rekordbox's "Analyze Track" button to get the beat grid. Tip: It may work better with the "Analyze Track (Dynamic)" option if the BPM changes.
  3. Check beats and downbeats and adjust if necessary by clicking the "GRID" button.
  4. Set memory cues and label segment functions. If you have more than 10 segments, you can also use hot cues.
  5. In the track browser, you can use the "Comments" column as shown in the image below. We used it to filter out tracks and leave comments for discussion later. For example, if the comment starts with "pass.", we excluded the track automatically when running the python script.
  6. Go to "File" and click "Export Collection in XML format".
  7. Run python convert_rekordbox_xml_to_json.py to convert the XML file to JSON format.