TheArtist Music Transformer β€” F3 (Pop 2.5K Mix)

Jazz-adapted chord model fine-tuned from the Phase-0 pop baseline with a 2,500-sequence pop rehearsal buffer β€” the paper's sweet spot: the minimum rehearsal volume that fully preserves pop fluency (top-1 within 0.01 points of the baseline) while delivering essentially the full jazz gain (+8.13 points top-1). One of six checkpoints from Empirical Study of Pop and Jazz Mix Ratios for Genre-Adaptive Chord Generation (Lee, 2026).

Recommended balanced default for chord-composition workflows that need fluency in both pop and jazz registers; F1 (ft-pop80) and F4 (ft-pop29) are the stylistic endpoints when a more committed pop- or jazz-leaning identity is desired.

Paper Β· Code Β· Demo Β· All models

Served-weights note. The released best.pt is the minimum-mixed-validation-loss checkpoint (epoch 4 β€” pop 84.06 / jazz 79.77 top-1 on the same test sets); the evaluation table below reports the paper's epoch-9 best-jazz metrics (Table 4). This checkpoint is hash-distinct from both Phase-0 and the released F1 base β€” F1 itself is weight-identical to the Phase-0 pop baseline (a checkpoint-selection artifact; see the F1 card) β€” so where F1 is cited as the pop-leaning endpoint, it denotes pop-baseline behavior.

Model details

Field Value
Architecture Music Transformer with relative positional attention
Parameters 25,661,440
Vocabulary size 351 tokens
Max sequence length 256
d_model / heads / FFN / layers 512 / 8 / 2048 / 8
Fine-tune resumed from Phase-0 pop baseline
Best epoch (paper) 9

Usage

Requires torch, huggingface_hub. The repo bundles model.py and tokenizer.py, so nothing needs to be cloned from GitHub.

import sys
import torch
from huggingface_hub import snapshot_download

# Download the full repo (model.py, tokenizer.py, best.pt, config.json).
ckpt_dir = snapshot_download(repo_id="PearlLeeStudio/TheArtist-MusicTransformer-ft-pop50")
sys.path.insert(0, ckpt_dir)  # so the next two imports resolve

from model import MusicTransformer
from tokenizer import ChordTokenizer

tokenizer = ChordTokenizer()
ckpt = torch.load(f"{ckpt_dir}/best.pt", map_location="cpu", weights_only=False)
model = MusicTransformer(
    vocab_size=tokenizer.vocab_size,
    d_model=512, n_heads=8, d_ff=2048, n_layers=8,
    max_seq_len=256, dropout=0.0, pad_id=tokenizer.pad_id,
)
model.load_state_dict(ckpt["model_state_dict"])
model.eval()

# Prompt = ii-V-I in C major; ask for a jazz-flavoured continuation.
song = {
    "key": "Cmaj", "time_signature": "4/4", "genre": "jazz",
    "bars": [["Dm7", "G7"], ["Cmaj7"]],
}
prompt_ids = tokenizer.encode_sequence(song)[:-1]
ids = torch.tensor([prompt_ids])
with torch.no_grad():
    for _ in range(32):
        logits = model(ids)
        next_id = torch.multinomial(
            torch.softmax(logits[:, -1, :] / 0.8, dim=-1), 1,
        )
        ids = torch.cat([ids, next_id], dim=-1)
        if next_id.item() == tokenizer.eos_id:
            break
print(tokenizer.decode(ids[0].tolist()))

For per-genre adaptation beyond pop and jazz, see the 11 LoRA adapter repos at PearlLeeStudio β€” they chain on the released ft-pop80 (F1) base, not this checkpoint.

Evaluation

Held-out per-genre test sets:

Metric Pop test Jazz test
Top-1 accuracy 84.20% 80.99%
Top-5 accuracy 96.87% 92.63%
Perplexity 1.82 2.29
Ξ” vs. Phase-0 baseline βˆ’0.01 +8.13

Qualitative samples introduce secondary dominants, chromatic passing diminished chords, and other jazz voice-leading vocabulary that the Phase-0 baseline does not produce.

Per-genre real-song eval

Genre n_songs Top-1 (%) Top-5 (%) val_loss
pop 10 86.31 95.80 0.5821
rock 10 87.05 97.40 0.4669
jazz 10 71.01 86.70 1.3335
blues 10 81.86 93.90 0.8056
bossa 10 82.02 95.81 0.7311
classical 10 49.73 83.61 2.1032
country 10 85.96 98.24 0.5182
electronic 10 87.02 98.29 0.5093
folk 10 84.80 98.70 0.5285
funk 10 83.99 96.27 0.6901
gospel 10 79.76 96.71 0.7359
hip_hop 10 89.92 98.62 0.4002
rnb_soul 10 84.99 97.06 0.5885

On this eval set F3 peaks on hip_hop (89.92%) and struggles most on classical (49.73%). The 11 per-genre LoRA adapters are the recommended path for the genres beyond pop and jazz β€” F-series rows for the eight genres without a [GENRE:X] token in the 351-token vocabulary reflect decoding without genre conditioning (the token is omitted).

130 songs (10 per genre Γ— 13 genres, seed 42) drawn from held-out val/test partitions β€” pop from McGill Billboard (CC0), jazz from public standards corpora, classical from Bach chorales, the other ten genres from the matching Chordonomicon subsets (CC BY-NC 4.0; titles are Spotify track IDs by upstream policy).

Training data

All 1,513 jazz training sequences plus 2,500 pop rehearsal sequences (seed 42); pop:jazz β‰ˆ 1.65:1. Jazz sequences draw from the Jazz Harmony Treebank (public), JazzStandards / iReal Pro (community redistribution), the Weimar Jazz Database (ODbL), and JAAH (research-use); pop pretraining and rehearsal data come from Chordonomicon (CC BY-NC 4.0) and McGill Billboard (CC0).

License

CC BY-NC 4.0 (weights; matching Chordonomicon, the dominant training corpus). Research, paper replication, portfolio, and demo use are permitted; commercial use is not.

Citation

@misc{lee2026chordmix,
  title         = {Empirical Study of Pop and Jazz Mix Ratios for Genre-Adaptive Chord Generation},
  author        = {Lee, Jinju},
  year          = {2026},
  eprint        = {2605.04998},
  archivePrefix = {arXiv}
}

@misc{lee2026chordtimeseries,
  title         = {How Far Can Chord-Symbol Time-Series Adaptation Carry Genre Identity?},
  author        = {Lee, Jinju},
  year          = {2026},
  eprint        = {2606.07334},
  archivePrefix = {arXiv}
}
Downloads last month
473
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Papers for PearlLeeStudio/TheArtist-MusicTransformer-ft-pop50