TheArtist Music Transformer β F4 (Pop 1K Mix, jazz-leaning)
Jazz-adapted chord model fine-tuned from the Phase-0 pop baseline with a 1,000-sequence pop rehearsal buffer β the jazz-leaning endpoint of the mix-ratio sweep, one of six checkpoints released with Empirical Study of Pop and Jazz Mix Ratios for Genre-Adaptive Chord Generation (Lee, 2026). It posts the highest jazz top-1 accuracy in the collection (81.50%) at the cost of 1.19 pop points, and is TheArtist app's recommended checkpoint for jazz. Recommended for jazz-flavoured chord composition (chord symbols only β no melody or audio generation); F3 (ft-pop50) is the balanced alternative and F1 (ft-pop80) the pop-leaning endpoint.
Paper Β· Code Β· Demo Β· All models
Served-weights note. The released
best.ptis the minimum-mixed-validation-loss checkpoint (epoch 4 β pop 83.38 / jazz 80.68 on the same test sets); the Evaluation table below shows the paper's epoch-6 best-jazz figures. The released F1, cited here as the pop-leaning endpoint, is itself weight-identical to the Phase-0 baseline (a checkpoint-selection artifact β see the F1 card); this checkpoint's weights are hash-distinct from both.
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 | 6 (released best.pt = epoch 4; see note above) |
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-pop29")
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 | 83.02% | 81.50% |
| Top-5 accuracy | 96.93% | 92.59% |
| Perplexity | 1.80 | 2.26 |
| Ξ vs. Phase-0 baseline | β1.19 | +8.64 |
F4 produces the most jazz-flavoured continuations among the released checkpoints β secondary dominants, tritone substitutions, modal interchange, and ii-V chains across distant keys β at the cost of roughly one point of pop top-1 accuracy.
Per-genre real-song eval
Teacher-forced token-level metrics; on this set F4 peaks on hip_hop (90.34%) and struggles most on classical (49.65%). This is auxiliary signal β the 11 per-genre LoRA adapters are the recommended path beyond pop and jazz β for the eight genres without a matching token in the 351-token vocabulary (all but rock, blues, and bossa) the F-series decodes without genre conditioning.
| Genre | n_songs | Top-1 (%) | Top-5 (%) | val_loss |
|---|---|---|---|---|
| pop | 10 | 85.57 | 95.91 | 0.5859 |
| rock | 10 | 87.28 | 97.50 | 0.4677 |
| jazz | 10 | 71.42 | 85.54 | 1.3367 |
| blues | 10 | 81.99 | 93.86 | 0.7970 |
| bossa | 10 | 82.62 | 95.73 | 0.7226 |
| classical | 10 | 49.65 | 81.51 | 2.1079 |
| country | 10 | 86.30 | 98.18 | 0.5191 |
| electronic | 10 | 86.81 | 98.48 | 0.5100 |
| folk | 10 | 84.81 | 98.63 | 0.5337 |
| funk | 10 | 83.39 | 96.13 | 0.6959 |
| gospel | 10 | 80.25 | 96.58 | 0.7343 |
| hip_hop | 10 | 90.34 | 98.58 | 0.3982 |
| rnb_soul | 10 | 85.04 | 97.04 | 0.5907 |
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 1,000 pop rehearsal sequences (seed 42). Pop:jazz β 0.66:1 β less pop than jazz in the mix. Underlying corpora and licenses: Chordonomicon (CC BY-NC 4.0), McGill Billboard (CC0), Jazz Harmony Treebank (public), JazzStandards / iReal Pro (community redistribution), Weimar Jazz Database (ODbL), JAAH (research-use public).
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
- 7