Mesure map: handling bar number across meter/repeats changes
Essai de prévoir une solution globale pour #522 et #798 (et #1031 (closed) à voir ensuite)
Dans les deux premiers cas, l'onset symbolique, en noires, est notre référence, le calcul du numéro de mesures (par Signature.ts
) est juste ce qu'on affiche à l'user (et que l'user peut rentrer dans des fichiers de référence). Tant qu'on ne traite pas #1031 (closed), cela pourrait se faire assez simplement dans le front.
Typiquement, pour #522 et http://www.dezrann.net/~/vivaldi/summer-1, on aurait:
"meter": [
{
"onset": 0,
"time-signature": "3/8"
},
{
"onset": 46.5,
"bar-number": 32,
/* The bar-number is optional, it could have been computed,
but, when it is given, it overrides any computed value */
"time-signature": "4/4"
}
{
"onset": 130.5,
"time-signature": "3/8"
}
]
Un cas plus complexe, avec #798, où la partition serait 1 2 3 4 5 6 7a 7b 8a 8b 9 10
avec aussi un changement de time-signature à la mesure 9, avec upbeats :
"meter": [
{
"onset": 0,
"time-signature": "4/4",
"actual-duration": "1/8",
"bar-number": "0" // by default 0 if actual-duration < time-signature
// 1 begins at 0.5
},
{
"onset": 24.5,
"bar-number": "7a",
// 7a begins at 24.5, no change in time-signature
// but the default time-signature-upbeat is 0
},
{
"onset": 28.5,
"bar-number": "7b"
},
// TODO: Change with actual-duration
{
"onset": 32,
"time-signature": "6/8",
"actual-duration": "1/8",
"bar-number": "9",
"bar-numbers": ["9a", "9b"] // possible two occurrences for a repeated section
// 9 (incomplete) begins at 32.0, 10 at 32.5
}
]
On est resté contigus et en partant à 1, mais bon, dans des cas bizarres, la numérotation des mesures pourrait être 10 11 12 13 14 58 59 60
, à chaque fois qu'il y a un bar-number
on prend cette valeur.
Notons que la proposition de permet pas encore de faire #1031 (closed), voir dans cette issue, mais elle permet déjà d'avoir une numérotation correcte (pour tous les cas de #798), même si cela correspond malheureusement à des onsets différents si on a des cas différents. Mais on verra cela ensuite pour #1031 (closed).
En profite-t-on pour ajouter de la structure, type 'mark': 'B'
pour une certaine partie ? Hum, probablement pas très universel, et on fait cela avec les labels...
Est-ce que cela apparaîtra directement dans info.json
ou dans un autre ? À la racine, meter.json
? Ou est-ce qu'on considère que c'est une "source" ? (bof).
Réflexion à raffiner
- Raffiner
- Regarder en particulier music21.meter, MEI, Verovio...
- Partir sur un ou deux fichiers tests, comme ci-dessus
- Mettre cela dans notre doc api
Implémentation
- front: gérer cela, tout dans Signature.ts ? Comme une Unit
onset-bar
? - Et dezrann-front#215 (closed) est le bienvenu pour avoir un retour/vérifier que c'est bon
- back (ensuite): générer cela avec nos deux backend