The Batik-plays-Mozart corpus

February 2, 2026 · View on GitHub

The Batik-plays-Mozart corpus is a piano performance-to-score dataset containing 12 complete Mozart Piano Sonatas (36 distinct movements) performed on a computer-monitored Bösendorfer grand piano by Viennese concert pianist Roland Batik. The performances are provided in MIDI format and note-aligned with scores in the New Mozart Edition and musicological harmony, cadence and phrase annotations previously published in The Annotated Mozart Sonatas.

This repository contains all performances in MIDI, scores in MusicXML and alignments in match file format. The audio files are commercially available.

Corpus

sonatanum_pnotesduration (min)match (%)insertion (%)deletion (%)
KV2797,78916.2294.0875.7800.130
KV2806,27714.7295.7933.9830.223
KV2817,03014.4390.459.3930.160
KV2825,76114.7796.1973.4670.337
KV2838,23117.4295.6574.2330.107
KV28413,38625.9493.7636.0330.203
KV3307,86918.4996.8573.0470.100
KV33111,76022.6698.2831.3700.347
KV3329,01317.8593.4176.2100.373
KV3339,13720.4196.6903.1370.173
KV4577,29018.2596.0433.8430.110
KV5338,87822.1297.0272.8370.137
Total102,421223.2895.3554.4440.2

main branch

This branch provides the curated data in the following formats:

├── match                       # alignments in match file format
├── midi                        # performance midi files
├── score_parts_annotated       # score parts corresponding to the unfolded performed score structure, aligned to the harmony, cadence and phrase annotations
├── scores                      # score musicxml files
├── scores_edited               # score musicxml files edited to fit the performance structure
├── annotations                 # the annotations provided by the authors of The Annotated Mozart Sonatas, linked as a submodule

curate_data branch

This branch supports linking and 'curating' the data as described in the paper.

audio_aligned_midi branch

This branch provides audio-adjusted MIDI and match files to correct MIDI-audio asynchronies due to different internal clocks resulting from different recording devices. This version should be used when working with both symbolic and audio recordings of the data.

Setup

  • Install dependencies from yaml file: conda env create -f mozart_batik.yml
  • Initiate the submodules if this step is not done automatically on cloning: git submodule update --init
  • To create the score2score and perf2score2annotations alignments, run: python ./main.py

Structure

After running python main.py, you will get the following repository structure:

annotations             # the musicological annotations, linked as a submodule
data                    # the input data needed to create the alignments
perf2score              # the performance-score-annotations alignments
plots                   # the plots for the two experiments described in the paper
score2score             # the old inferred scores linked to the New Mozart Edition score
stats                   # some statistics on the dataset
utils                   # helper functions for creating the dataset
main.py                 
env.yml                 

score2score subdir structure

Each movement-wise directory is structured as follows:

├── KV279
|   ├── kv279_1
|   |   ├── aligned_note_ids        # score note ids aligned
|   |   ├── sparts_from_match       # score note arrays created from old alignment files
|   |   ├── sparts_from_musicxml    # score note arrays created from New Mozart Edition score files
|   |   ├── sparts_preprocessed     # both score note arrays preprocessed
|   ├── kv279_2
|   ├── kv279_3
├── KV280
├── ...

perf2score subdir structure

Each movement-wise directory contains the following files:

├── KV279
|   ├── kv279_1
|   |   ├── alignment.csv               # performance-score alignment expressed as aligned note-id pairs
|   |   ├── kv279_1.match               # performance-score alignment in matchfile
|   |   ├── kv279_1.mid                 # performance MIDI
|   |   ├── kv279_1.musicxml            # score musicxml
|   |   ├── ppart.csv                   # the performed part, parsed using partitura
|   |   ├── spart_annotated_min.csv     # the score part without any repeated sections
|   |   ├── spart_annotated.csv         # the unfolded score part with all annotation types
|   |   ├── spart_cadence.csv           # the unfolded score part with cadence annotations
|   |   ├── spart_harmony.csv           # ... harmony annotations
|   |   ├── spart_phrases.csv           # ... phrase annotations
|   |   ├── spart.csv                   # the unfolded score part, parsed using partitura
|   ├── kv279_2
|   ├── kv279_3
├── KV280
├── ...

Code example

The file formats in this repository are well handled using the partitura library:

# import the library
import partitura as pt

# load a match file
performance, alignment = pt.load_match("batik_plays_mozart/match/some_file.match")

# load a musicxml score
score = pt.load-musicxml("batik_plays_mozart/scores_edited/some_score.musicxml")

# performances play some repeats and leave others, the scores in the scores_edited
# directory only contain the repeats and navigation markers that were actually played.
# in order to create a list of notes that corresponds to the performance from the score
# we unfold maximally but do not repeat after markes like dal segno or da capo:
unfolded_score_part = pt.score.unfold_part_maximal(score[0], ignore_leaps = False)

# now we can get a note list or do other processing
unfolded_score_part.note_array()

Citing

If you use this dataset in your research, please cite the relevant paper:

@inproceedings{hu2023batik,
    title = {{The Batik-plays-Mozart Corpus: Linking Performance to Score to Musicological Annotations}},
    author = {Hu, Patricia and Widmer, Gerhard},
    booktitle = {{Proceedings of the International Society for Music Information Retrieval Conference (ISMIR)}},
    year = {2023}
}

Acknowledgments

This work is supported by the European Research Council (ERC) under the EU’s Horizon 2020 research & innovation programme, grant agreement No. 10101937 ("Whither Music?").