2010-03-18 7 views
4

Je suis actuellement en train de mettre en œuvre une application pour effectuer certaines tâches sur des fichiers MIDI, et mon problème actuel est de sortir les notes que j'ai lues dans un fichier LilyPond. J'ai fusionné les événements note_on et note_off en objet note unique avec un début absolu et une durée absolue, mais je ne vois pas vraiment comment convertir cette durée en notation musicale réelle. J'ai deviné qu'une durée de 376 est une noire dans le fichier que je suis en train de lire parce que je connais la chanson, et évidemment 188 est une huitième note, mais cela ne généralise certainement pas tous les fichiers MIDI.Durée réelle de la note de la durée MIDI

Des idées?

Répondre

7

Par défaut, un fichier MIDI est réglé sur un tempo de 120 bpm et le bloc MThd du fichier vous indique la résolution en termes de "impulsions par noire" (ppqn).

Si le ppqn est, disons, 96 qu'un delta de 96 ticks est une noire. Si vous êtes intéressé par la durée réelle (en secondes) de chaque son, vous devriez également considérer le "tempo" qui peut être modifié par un événement "FF 51 03 tt tt tt"; les trois octets sont les microsecondes pour une noire.

Avec ces deux valeurs, vous devriez trouver ce dont vous avez besoin. Attention, la durée dans le fichier midi peut être approximative, surtout si ce fichier MIDI est l'enregistrement d'un joueur humain.

J'ai mis en place une bibliothèque C pour lire/écrire midifiles il y a longtemps: https://github.com/rdentato/middl au cas où cela pourrait être utile (ça fait pas mal de temps que je ne regarde pas le code, n'hésitez pas à demander s'il y a quelque chose pas clair).

Je suggère de suivre cette approche:

  1. choisir une « note minimale » qui est compatible avec votre division (par exemple 1/128) et l'utiliser comme une sorte de grille.
  2. Alignez chaque note sur la ligne de grille la plus proche (c'est-à-dire sur le multiple entier le plus proche du nœud minimal)
  3. Convertissez-la en notation standard (par exemple, une noire, une note huit pointée, etc ...).

Dans votre cas, prenez 1/32 comme note minimale et 384 comme division (ce qui équivaudrait à 48 ticks). Pour votre note de 376 tick vous aurez 376/48 = 7.8 que vous arrondissez à 8 (l'entier le plus proche) et 8/32 = 1/4.

Si vous trouvez une note dont la durée est de 193 ticks, vous pouvez voir qu'il s'agit d'une note de 1/8 puisque 193/48 est 4.02 (que vous pouvez arrondir à 4) et 4/32 = 1/8. En continuant ce raisonnement, vous pouvez voir qu'une note de durée 671 ticks devrait être une double noire. En fait, 671 devrait être approché à 672 (le multiple le plus proche de 48) qui est 14 * 48. Donc, votre note est un 14/32 -> 7/16 -> (1/16 + 2/16 + 4/16) -> 1/16 + 1/8 + 1/4.

Si vous êtes à l'aise d'utiliser des nombres binaires, vous pouvez remarquer que 14 est 1110 et de là, dériver directement la présence de 1/16, 1/4 et 1/8. Comme autre exemple, une note de 480 ticks de durée est une noire à égalité avec une note de 1/16 depuis 480 = 48 * 10 et 10 est 1010 en binaire.

Les triplés et autres groupes rendraient les choses un peu plus complexes. Ce n'est pas par hasard que les valeurs de division les plus communes sont 96 (3 * 2^5), 192 (3 * 2^6) et 384 (3 * 2^7); De cette façon, les triplets peuvent être représentés avec un nombre entier de graduations.

Vous devrez peut-être deviner ou simplifier dans certaines situations, c'est pourquoi aucun programme "de notation midi à standard" ne peut être précis à 100%.

+0

J'ai corrigé le lien vers ma bibliothèque et ajouté quelques exemples. –

+0

Merci pour les explications, les multiples de l'entier le plus proche de la durée/ticks semblent faire le travail. Cela s'avère beaucoup plus compliqué que ce à quoi je m'attendais, puisque certaines notes doivent être réparties entre plusieurs mesures - je m'attendais à ce que LilyPond s'en charge, mais ce n'est pas le cas. –

+1

Si Lilypond n'est pas une exigence stricte, et vous avez juste besoin d'un moyen d'imprimer un score, jetez un oeil à ABC (http://abc.sourceforge.net) ou pmw (http://www.quercite.com/pmw .html) ils pourraient être plus faciles à utiliser que Lilypond. –