← TOOLSTOOLS — SONG PERFORMANCE JSON

SONG PERFORMANCE JSON

a song's words, in time

PLAIN JSONCC BY 4.0NO ACCOUNT

One song, one file: the words, what they are called in each language, the tempo, and when each line arrives. Plain text you can open in any editor.

The whole document is the Song Performance JSON. The timeline is one section inside it, not the thing itself.

ONE WRITER, ONE READER

Bombista writes it. Pregonero performs from it. That is the whole ownership rule, and it is what lets a file move between two programs without either of them having to trust the other's state.

A song's id is its filename. The file libertad.json holds the song libertad and may be called nothing else.

THE KEYS

keytypewhat it holds
titlestringAs you would print it on a poster
artiststring
notesstringFor the performer at a music stand. Capo 5, acordes de Lam
title_translationsobjectLanguage code to title
tempoobjectbpm, numerator, denominator, and optionally countInBars
lyricsarrayOne entry per line: language code to the line
timelinearrayOne entry per lyric line: start and end, in seconds
timelineVersionnumberExactly 2
timelineSignedOffstringISO timestamp. It claims a review actually happened
linesHashstringGuards the timeline against the words changing underneath it
leadInobjectdurationSec, source, confidence
introobjectLanguage code to the tagline on the intro card. Written by hand

Key order carries no meaning in JSON and you should not infer any. A file listing these in another order is exactly as valid.

FOUR RULES THAT ARE THE CONTRACT

A song with no recording is complete. It carries none of the five timing keys. Absence is a state; incompleteness is a fault. None of them is a manual song; any of them demands all of them.

Tempo is written whole or not at all. Half a tempo breaks the pulse while the scaling keeps working, which is worse than no tempo at all. bpm is the felt pulse, so in a compound meter it is the dotted quarter: a DAW at 100 in 6/8 is 66.67 here.

countInBars is omitted when it is zero. Zero and absent both mean no count-in, and there is one representation of that rather than two.

Translations are never generated here. No tool in the suite writes a translation or asks for one to be invented. The lines arrive from outside, however you made them.

A REAL FILE

This is Pimiento, whole and unedited: nineteen sung lines, nineteen timings, four languages, and a tempo that was measured rather than guessed. Nothing is trimmed and nothing is invented — the page renders the same file you can download below.

{
  "title": "Pimiento",
  "artist": "Chango Pepper",
  "notes": "Capo 3, Acordes de DO",
  "title_translations": {
    "es": "Pimiento",
    "en": "Pepper Tree",
    "fr": "Pimentier",
    "nl": "Peperboom"
  },
  "tempo": {
    "bpm": 66.67,
    "numerator": 6,
    "denominator": 8,
    "countInBars": 1
  },
  "intro": {
    "es": "Las cosas esenciales que nos sostienen en la vida.",
    "en": "The essential things that carry us through life.",
    "fr": "Les choses essentielles qui nous portent dans la vie.",
    "nl": "De essentiële dingen die ons door het leven dragen."
  },
  "lyrics": [
    {
      "es": "Viejo pimiento,\nhoy vuelvo a visitarte",
      "en": "Old pepper tree,\ntoday I come back to see you,",
      "fr": "Vieux pimentier,\naujourd'hui je reviens te voir,",
      "nl": "Oude peperboom,\nvandaag kom ik je weer bezoeken,"
    },
    {
      "es": "Dicen que sabes tratar\nmales de poetas.",
      "en": "They say you know how to heal\na poet's wounds.",
      "fr": "On dit que tu sais soigner\nles peines des poètes.",
      "nl": "Men zegt dat jij weet hoe je\ndichterswonden heelt."
    },
    {
      "es": "Con el corazón afuera nací,",
      "en": "I was born with my heart outside,",
      "fr": "Je suis né le cœur à l'air,",
      "nl": "Ik werd geboren met mijn hart naar buiten,"
    },
    {
      "es": "desde niño quiere más que latir.",
      "en": "since childhood it wanted more than to beat.",
      "fr": "depuis l'enfance il veut plus que battre.",
      "nl": "al van jongs af wil het meer dan kloppen."
    },
    {
      "es": "No quiere que yo le cuente del mundo,",
      "en": "It won't hear my stories of the world,",
      "fr": "Il ne veut pas que je lui raconte le monde,",
      "nl": "Het wil niet dat ik het de wereld vertel,"
    },
    {
      "es": "por sí mismo él lo quiere sentir.",
      "en": "it wants to feel it by itself.",
      "fr": "il veut le sentir lui-même.",
      "nl": "het wil het zelf voelen."
    },
    {
      "es": "Viejo pimiento, mi refugio y mi lugar.",
      "en": "Old pepper tree, my refuge, my place.",
      "fr": "Vieux pimentier, mon refuge, mon lieu.",
      "nl": "Oude peperboom, mijn toevlucht, mijn plek."
    },
    {
      "es": "Desnudo el corazón,",
      "en": "The heart laid bare,",
      "fr": "Le cœur à nu,",
      "nl": "Het hart ontbloot,"
    },
    {
      "es": "todo lo atraviesa:",
      "en": "everything passes through it:",
      "fr": "tout le traverse :",
      "nl": "alles gaat erdoorheen:"
    },
    {
      "es": "Farol en tormentas,\npero se quiebra con un mirar.",
      "en": "A lantern in storms,\nyet a single glance can break it.",
      "fr": "Lanterne dans la tempête,\nmais un regard suffit à la briser.",
      "nl": "Een lantaarn in stormen,\nmaar één blik kan het breken."
    },
    {
      "es": "Ama rápido,",
      "en": "It loves quickly,",
      "fr": "Il aime vite,",
      "nl": "Het houdt snel lief,"
    },
    {
      "es": "sin medida va.",
      "en": "without measure it goes.",
      "fr": "sans mesure il va.",
      "nl": "zonder maat gaat het."
    },
    {
      "es": "Encuentra belleza en lo sencillo.",
      "en": "It finds beauty in simple things.",
      "fr": "Il trouve la beauté dans le simple.",
      "nl": "Het vindt schoonheid in het eenvoudige."
    },
    {
      "es": "Pero en su sangre carga con penas ajenas,",
      "en": "Yet in its blood it carries others' sorrows,",
      "fr": "Mais dans son sang il porte les peines des autres,",
      "nl": "Maar in zijn bloed draagt het andermans verdriet,"
    },
    {
      "es": "y se funde.",
      "en": "and dissolves in them.",
      "fr": "et s'y dissout.",
      "nl": "en lost daarin op."
    },
    {
      "es": "Si a quedarse afuera insiste,",
      "en": "If it insists on staying outside,",
      "fr": "S'il insiste pour rester dehors,",
      "nl": "Als het buiten wil blijven,"
    },
    {
      "es": "En tu sombra déjalo latir.",
      "en": "let it beat in your shade.",
      "fr": "laisse-le battre dans ton ombre.",
      "nl": "laat het kloppen in jouw schaduw."
    },
    {
      "es": "Viejo pimiento,\nfuiste el juego en mi infancia.",
      "en": "Old pepper tree,\nyou were the playground of my childhood.",
      "fr": "Vieux pimentier,\ntu fus le jeu de mon enfance.",
      "nl": "Oude peperboom,\nje was het spel van mijn jeugd."
    },
    {
      "es": "Me cubro con tus hojas pa volver a nacer.",
      "en": "I wrap myself in your leaves to be born again.",
      "fr": "Je me couvre de tes feuilles pour renaître.",
      "nl": "Ik hul me in je bladeren om opnieuw geboren te worden."
    }
  ],
  "timelineVersion": 2,
  "leadIn": {
    "durationSec": 8.92,
    "source": "measured",
    "confidence": "low",
    "apply": false
  },
  "timeline": [
    {
      "start": 0.0,
      "end": 9.52
    },
    {
      "start": 9.52,
      "end": 20.54
    },
    {
      "start": 20.54,
      "end": 28.62
    },
    {
      "start": 28.62,
      "end": 34.42
    },
    {
      "start": 34.42,
      "end": 40.98
    },
    {
      "start": 40.98,
      "end": 50.08
    },
    {
      "start": 50.08,
      "end": 58.56
    },
    {
      "start": 58.56,
      "end": 65.42
    },
    {
      "start": 65.42,
      "end": 69.54
    },
    {
      "start": 69.54,
      "end": 80.22
    },
    {
      "start": 80.22,
      "end": 83.74
    },
    {
      "start": 83.74,
      "end": 87.62
    },
    {
      "start": 87.62,
      "end": 95.84
    },
    {
      "start": 95.84,
      "end": 106.0
    },
    {
      "start": 106.0,
      "end": 122.1
    },
    {
      "start": 122.1,
      "end": 126.9
    },
    {
      "start": 126.9,
      "end": 135.5
    },
    {
      "start": 135.5,
      "end": 145.14
    },
    {
      "start": 145.14,
      "end": 165.22
    }
  ]
}
DOWNLOAD THIS EXAMPLE →

This is a snapshot of one real song file, taken on 16 August 2026. It is a copy kept here to illustrate the format, not a live mirror — the working file goes on changing, and this one stays as it was.

THE LICENCE

This page is CC BY 4.0. The format itself carries no licence, because a file format is not the kind of thing that can be owned. Any reference code is MIT, matching both tools.

CC BY 4.0 →