Shared Timeline - Groups
A player can show more than one trackList, and each list decides on its own whether its tracks play together or one at a time. Combined with a shared timeline, this turns the player into an instrument chooser: every list covers one part of the arrangement, and the listener assembles an ensemble by picking one instrument per part.
The player below contains a four-part chorale. Each voice was recorded with several different instruments, all following the same conductor, so every recording shares one timeline and no alignment is needed. Pick a different instrument for any voice to hear how it changes the ensemble.
Audio data: S. Balke, A. Berndt, and M. Müller, “ChoraleBricks: A Modular Multitrack Dataset for Wind Music Research,” Transactions of the International Society for Music Information Retrieval, vol. 8, no. 1, pp. 39–54, 2025. Accompanying Website. Drese: Jesu geh voran. Original player.
How it works
Each voice is one trackList view with a soloGroup of its own:
{
"type": "trackList",
"tracks": ["sopranoFlute", "sopranoOboe", "sopranoClarinet", "sopranoTrumpet", "sopranoFlugelhorn"],
"soloGroup": 0,
"trackVolumeControls": true
}
soloGroup makes the rows of that list behave as radio buttons: selecting an instrument deselects the previous one, and the list always keeps one instrument active. It names the selection the list belongs to, and the alto, tenor, and bass lists name 1, 2, and 3, so choosing a different soprano instrument leaves the other voices untouched. Four numbers therefore give four independent choices, and four instruments sound at once.
Repeating a number does the opposite: lists that share one share the selection, so picking a track in either of them deselects whatever the other had. Four voices that all named 0 would let exactly one instrument sound in the whole player.
The same player could mix modes. A list without a soloGroup toggles its tracks independently, so an ordinary stem mixer can sit next to these comparison groups in one player.
A separator view in front of each list divides the voices:
{ "type": "separator", "thickness": 2 }
Each track declares its own starting state with solo, which selects the instrument the list opens with. A list whose tracks say nothing about solo opens with its first track.
Presets
The presets name a complete ensemble, one instrument per voice:
"brassChoir": {
"label": "Brass Choir",
"tracks": ["sopranoTrumpet", "altoFlugelhorn", "tenorBaritone", "bassTuba"]
}
A preset activates exactly the tracks it names. Where a preset names several tracks of one soloGroup, that selection keeps the first of them, so a preset always resolves to a single instrument per voice. The player opens with the first preset in the file.