Midifile est une bibliothèque de classes C ++ pour lire / écrire des fichiers MIDI standard. La bibliothèque se compose de 6 classes:
| Midi à | L'interface principale pour traiter avec les fichiers MIDI. La classe du midi apparaît comme un tableau bidimensionnel de médianes: la première dimension est une liste de pistes, et la deuxième dimension est une liste de médianes. |
| Liste médicale | Une structure de données qui gère la liste des médianes pour une piste de fichiers MIDI. |
| Médiocre | L'unité de stockage primaire pour les médiandes dans un midi. La classe se compose d'un horodatage de tick (delta ou absolu) et d'un vecteur d'octets de message MIDI (ou de messages de méta de fichier MIDI standard). |
| Médiation médiocre | La classe de base pour les médiums. Il s'agit d'un vecteur STL d'octets non signés représentant un message MIDI (ou méta). |
| Binasc | Une classe d'assistance pour Midifile qui permet la lecture / l'écriture de fichiers MIDI dans un format ASCII décrivant les octets des fichiers MIDI standard binaires. |
| Options | Une classe de commodité facultative utilisée pour l'analyse des options de ligne de commande dans les programmes d'exemples. Cette classe peut être supprimée de la bibliothèque car elle n'est pas nécessaire pour utiliser la classe Midifile. |
Voici un schéma de la façon dont les classes sont utilisées ensemble:

La classe MidiFile contient un vecteur de pistes stockées dans des objets MidiEventList . La MidiEventList est elle-même un vecteur de MidiEvent S, qui stocke chaque événement MIDI sur la piste. MidiEvent contiennent un horodatage et un MidiMessage qui est un vecteur de valeurs char non signées, stockant les octets bruts d'un message MIDI (ou méta-message).
La documentation est en construction à http://midifile.sapp.org. Des exemples essentiels pour la lecture et l'écriture de fichiers MIDI sont donnés ci-dessous.
Vous pouvez télécharger en tant que fichier zip à partir de la page GitHub pour la bibliothèque Midifile, ou si vous utilisez Git, puis téléchargez avec cette commande:
git clone https://github.com/craigsapp/midifile Cela créera le répertoire midifile avec le code source de la bibliothèque.
La bibliothèque peut être compilée avec la commande:
make library Cela créera le fichier lib/libmidifile.a qui peut être utilisé pour créer un lien vers des programmes qui utilisent la bibliothèque. Les exemples de programmes peuvent être compilés avec la commande:
make programs Cela compilera tous les exemples de programmes dans le répertoire des outils. Des exemples de programmes compilés seront stockés dans le répertoire bin . Pour compiler à la fois la bibliothèque et l'exemple de programmes en une seule étape, type:
make Pour compiler un seul programme, tel que createmidifile , Type:
make createmidifile Vous pouvez également placer vos propres programmes dans tools , tels que myprogram.cpp et pour compiler le type:
make myprogram Le programme compilé sera bin/myprogram .
La façon la plus simple d'utiliser la bibliothèque de midi dans votre propre projet est de copier les fichiers d'en-tête dans le répertoire include et les fichiers de code source dans le répertoire src dans votre propre projet. Vous n'avez pas besoin de copier Options.h ou Options.cpp car la classe MidiFile ne dépend pas d'eux. Les projets Verovio et Midiroll sur GitHub utilisent tous deux cette méthode pour utiliser la bibliothèque Midifile. Alternativement, vous pouvez débarquer le référentiel du midi et créer un fichier de bibliothèque compilé du code source qui peut être copié avec le contenu du répertoire include dans votre projet.
Le programme suivant répertorie tous les médiums dans un fichier MIDI. Le programme itère sur chaque piste, imprimant une liste de tous les événements MIDI sur la piste. Pour chaque événement, l'horodatage à tick absolu pour l'heure de performance du message MIDI est donné, suivi du message lui-même comme une liste d'octets hexadécimaux.
Vous pouvez exécuter la fonction MidiFile::doTimeAnalysis() pour convertir les horodatages de tiques absolus en secondes, selon les méta-messages de tempo dans le fichier (en utilisant un tempo par défaut de 120 quart de notes par minute s'il n'y a pas de méta-messages de tempo). L'heure de départ absolue de l'événement est indiquée dans la deuxième colonne de la sortie du programme.
La fonction MidiFile::linkNotePairs() peut être utilisée pour faire correspondre les notes et les notes. Lorsque cela est fait, vous pouvez accéder à la durée de la note avec MidiEvent::getDurationInSeconds() pour les messages de note. Les durées de note sont affichées dans la troisième colonne de la sortie du programme.
Notez que les classes de bibliothèque Midifile se trouvent dans l'espace de noms smf , donc using namespace smf; ou des préfixes smf:: sont nécessaires pour accéder aux classes.
# include " MidiFile.h "
# include " Options.h "
# include < iostream >
# include < iomanip >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. process (argc, argv);
MidiFile midifile;
if (options. getArgCount () == 0 ) midifile. read (cin);
else midifile. read (options. getArg ( 1 ));
midifile. doTimeAnalysis ();
midifile. linkNotePairs ();
int tracks = midifile. getTrackCount ();
cout << " TPQ: " << midifile. getTicksPerQuarterNote () << endl;
if (tracks > 1 ) cout << " TRACKS: " << tracks << endl;
for ( int track= 0 ; track<tracks; track++) {
if (tracks > 1 ) cout << " n Track " << track << endl;
cout << " Tick t Seconds t Dur t Message " << endl;
for ( int event= 0 ; event<midifile[track]. size (); event++) {
cout << dec << midifile[track][event]. tick ;
cout << ' t ' << dec << midifile[track][event]. seconds ;
cout << ' t ' ;
if (midifile[track][event]. isNoteOn ())
cout << midifile[track][event]. getDurationInSeconds ();
cout << ' t ' << hex;
for ( int i= 0 ; i<midifile[track][event]. size (); i++)
cout << ( int )midifile[track][event][i] << ' ' ;
cout << endl;
}
}
return 0 ;
} Le programme d'exemple ci-dessus lira le premier nom de fichier qu'il trouve sur la ligne de commande, ou il lira à partir de l'entrée standard si aucun argument n'est trouvé. Les fichiers MIDI standard binaires et les représentations ASCII des fichiers MIDI peuvent être entrés dans le programme. Par exemple, enregistrez le texte suivant dans un fichier appelé twinkle.txt pour utiliser comme données d'entrée. Ce contenu représente les octets hexagonaux pour un fichier MIDI standard, qui sera automatiquement analysé par la classe MidiFile .
4d 54 68 64 00 00 00 06 00 01 00 03 00 78 4d 54 72 6b 00 00 00 04 00 ff 2f
00 4d 54 72 6b 00 00 00 76 00 90 48 40 78 80 48 40 00 90 48 40 78 80 48 40
00 90 4f 40 78 80 4f 40 00 90 4f 40 78 80 4f 40 00 90 51 40 78 80 51 40 00
90 51 40 78 80 51 40 00 90 4f 40 81 70 80 4f 40 00 90 4d 40 78 80 4d 40 00
90 4d 40 78 80 4d 40 00 90 4c 40 78 80 4c 40 00 90 4c 40 78 80 4c 40 00 90
4a 40 78 80 4a 40 00 90 4a 40 78 80 4a 40 00 90 48 40 81 70 80 48 40 00 ff
2f 00 4d 54 72 6b 00 00 00 7d 00 90 30 40 78 80 30 40 00 90 3c 40 78 80 3c
40 00 90 40 40 78 80 40 40 00 90 3c 40 78 80 3c 40 00 90 41 40 78 80 41 40
00 90 3c 40 78 80 3c 40 00 90 40 40 78 80 40 40 00 90 3c 40 78 80 3c 40 00
90 3e 40 78 80 3e 40 00 90 3b 40 78 80 3b 40 00 90 3c 40 78 80 3c 40 00 90
39 40 78 80 39 40 00 90 35 40 78 80 35 40 00 90 37 40 78 80 37 40 00 90 30
40 81 70 80 30 40 00 ff 2f 00
Vous trouverez ci-dessous la sortie du programme d'exemple étant donné les données d'entrée ci-dessus. La valeur TPQ est la valeur Ticks-Per-Quarter-Note de l'en-tête MIDI. Dans cet exemple, chaque trimestre a une durée de 120 tiques de fichiers MIDI. Le fichier MIDI ci-dessus contient trois pistes, avec la première piste (la piste d'expression, n'ayant aucun contenu autre que le message de méta de fin de piste, ff 2f 00 en octets hexadécimaux. La deuxième piste commence par un message MIDI Note-on 90 48 40 (en hex) qui commencera à jouer au MIDI Note 72 (C Pitch One Octave au-dessus du milieu C) avec une forte formidable (40 hex = 64 dans la notation de décamal).
TPQ: 120 Pistes: 3 Piste 0 Tick Seconds Dur Message 0 0 ff 2f 0 Piste 1 Tick Seconds Dur Message 0 0 0,5 90 48 40 120 0,5 80 48 40 120 0,5 0,5 90 48 40 240 1 80 48 40 240 1 0,5 90 4f 40 360 1,5 80 4f 40 360 1,5 0,5 90 4f 40 480 2 80 4f 40 480 2 0,5 90 51 40 600 2.5 80 51 40 600 2,5 0,5 90 51 40 720 3 80 51 40 720 3 1 90 4f 40 960 4 80 4f 40 960 4 0,5 90 4d 40 1080 4.5 80 4d 40 1080 4,5 0,5 90 4d 40 1200 5 80 4d 40 1200 5 0,5 90 4c 40 1320 5.5 80 4C 40 1320 5,5 0,5 90 4c 40 1440 6 80 4c 40 1440 6 0,5 90 4A 40 1560 6,5 80 4A 40 1560 6,5 0,5 90 4A 40 1680 7 80 4A 40 1680 7 1 90 48 40 1920 8 80 48 40 1920 8 ff 2f 0 Piste 2 Tick Seconds Dur Message 0 0 0,5 90 30 40 120 0,5 80 30 40 120 0,5 0,5 90 3c 40 240 1 80 3C 40 240 1 0,5 90 40 40 360 1,5 80 40 40 360 1,5 0,5 90 3c 40 480 2 80 3c 40 480 2 0,5 90 41 40 600 2.5 80 41 40 600 2,5 0,5 90 3c 40 720 3 80 3C 40 720 3 0,5 90 40 40 840 3,5 80 40 40 840 3,5 0,5 90 3c 40 960 4 80 3c 40 960 4 0,5 90 3e 40 1080 4.5 80 3e 40 1080 4,5 0,5 90 3B 40 1200 5 80 3B 40 1200 5 0,5 90 3C 40 1320 5.5 80 3C 40 1320 5,5 0,5 90 39 40 1440 6 80 39 40 1440 6 0,5 90 35 40 1560 6,5 80 35 40 1560 6,5 0,5 90 37 40 1680 7 80 37 40 1680 7 1 90 30 40 1920 8 80 30 40 1920 8 ff 2f 0
Le comportement par défaut de la classe MidiFile est de stocker les temps de tiques absolus des événements MIDI, disponibles dans MidiEvent::tick , qui est le temps de tick depuis le début du fichier à l'événement en cours. Dans les fichiers MIDI standard, les tiques sont stockées sous forme de valeurs delta, où la coche indique la durée à attendre depuis le message précédent sur une piste. Pour accéder aux valeurs de tic delta, vous pouvez (1) subputer le temps de tick actuel du temps de tick précédent dans la liste, ou appeler MidiFile::makeDeltaTime() pour convertir les valeurs de tick absolu en valeurs de tic delta.
La fonction MidiFile::joinTracks() peut être utilisée pour convertir des données multiples en une seule séquence temporelle. L'opération joinTrack() peut être inversée en appelant la fonction MidiFile::splitTracks() . Voici un échantillon de programme qui rejoint les MidiEvents en une seule piste afin que les données puissent être traitées en une seule boucle:
# include " MidiFile.h "
# include " Options.h "
# include < iostream >
# include < iomanip >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. process (argc, argv);
MidiFile midifile;
if (options. getArgCount () > 0 ) midifile. read (options. getArg ( 1 ));
else midifile. read (cin);
cout << " TPQ: " << midifile. getTicksPerQuarterNote () << endl;
cout << " TRACKS: " << midifile. getTrackCount () << endl;
midifile. joinTracks ();
// midifile.getTrackCount() will now return "1", but original
// track assignments can be seen in .track field of MidiEvent.
cout << " TICK DELTA TRACK MIDI MESSAGE n " ;
cout << " ____________________________________ n " ;
MidiEvent* mev;
int deltatick;
for ( int event= 0 ; event < midifile[ 0 ]. size (); event++) {
mev = &midifile[ 0 ][event];
if (event == 0 ) deltatick = mev-> tick ;
else deltatick = mev-> tick - midifile[ 0 ][event- 1 ]. tick ;
cout << dec << mev-> tick ;
cout << ' t ' << deltatick;
cout << ' t ' << mev-> track ;
cout << ' t ' << hex;
for ( int i= 0 ; i < mev-> size (); i++)
cout << ( int )(*mev)[i] << ' ' ;
cout << endl;
}
return 0 ;
}Vous trouverez ci-dessous la nouvelle sortie unique. La première colonne est l'horodatage à tick absolu du message; La deuxième colonne est la valeur de tic delta; La troisième colonne est la valeur de piste d'origine; et la dernière colonne contient le message MIDI (en octets hexadécimaux).
TPQ: 120 Pistes: 3 Message midi de piste delta ____________________________________ 0 0 1 90 48 40 0 0 2 90 30 40 0 0 0 ff 2f 0 120 120 1 80 48 40 120 0 2 80 30 40 120 0 2 90 3C 40 120 0 1 90 48 40 240 120 2 80 3C 40 240 0 1 80 48 40 240 0 2 90 40 40 240 0 1 90 4f 40 360 120 2 80 40 40 360 0 1 80 4f 40 360 0 1 90 4f 40 360 0 2 90 3C 40 480 120 2 80 3C 40 480 0 1 80 4f 40 480 0 2 90 41 40 480 0 1 90 51 40 600 120 2 80 41 40 600 0 1 80 51 40 600 0 1 90 51 40 600 0 2 90 3C 40 720 120 1 80 51 40 720 0 2 80 3c 40 720 0 2 90 40 40 720 0 1 90 4f 40 840 120 2 80 40 40 840 0 2 90 3C 40 960 120 2 80 3C 40 960 0 1 80 4f 40 960 0 2 90 3E 40 960 0 1 90 4d 40 1080 120 1 80 4d 40 1080 0 2 80 3e 40 1080 0 2 90 3B 40 1080 0 1 90 4d 40 1200 120 1 80 4d 40 1200 0 2 80 3B 40 1200 0 2 90 3C 40 1200 0 1 90 4C 40 1320 120 1 80 4C 40 1320 0 2 80 3C 40 1320 0 1 90 4C 40 1320 0 2 90 39 40 1440 120 1 80 4C 40 1440 0 2 80 39 40 1440 0 1 90 4A 40 1440 0 2 90 35 40 1560 120 1 80 4A 40 1560 0 2 80 35 40 1560 0 2 90 37 40 1560 0 1 90 4A 40 1680 120 1 80 4A 40 1680 0 2 80 37 40 1680 0 2 90 30 40 1680 0 1 90 48 40 1920 240 1 80 48 40 1920 0 2 80 30 40 1920 0 1 ff 2f 0 1920 0 2 ff 2f 0
Vous trouverez ci-dessous un exemple de programme pour créer un fichier MIDI. Ce programme générera une séquence aléatoire de notes et les ajoutera à la fin de la piste. Par défaut, un objet MidiFile contient une seule piste et sera écrit en tant que fichier MIDI Type-0 à moins que d'autres pistes ne soient ajoutées. Après avoir ajouté des notes à la piste, il doit être trié en séquence de temps avant d'être écrit dans un fichier.
# include " MidiFile.h "
# include " Options.h "
# include < random >
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. define ( " n|note-count=i:10 " , " How many notes to randomly play " );
options. define ( " o|output-file=s " , " Output filename (stdout if none) " );
options. define ( " i|instrument=i:0 " , " General MIDI instrument number " );
options. define ( " x|hex=b " , " Hex byte-code output " );
options. process (argc, argv);
random_device rd;
mt19937 mt ( rd ());
uniform_int_distribution< int > starttime ( 0 , 100 );
uniform_int_distribution< int > duration ( 1 , 8 );
uniform_int_distribution< int > pitch ( 36 , 84 );
uniform_int_distribution< int > velocity ( 40 , 100 );
MidiFile midifile;
int track = 0 ;
int channel = 0 ;
int instr = options. getInteger ( " instrument " );
midifile. addTimbre (track, 0 , channel, instr);
int tpq = midifile. getTPQ ();
int count = options. getInteger ( " note-count " );
for ( int i= 0 ; i<count; i++) {
int starttick = int ( starttime (mt) / 4.0 * tpq);
int key = pitch (mt);
int endtick = starttick + int ( duration (mt) / 4.0 * tpq);
midifile. addNoteOn (track, starttick, channel, key, velocity (mt));
midifile. addNoteOff (track, endtick, channel, key);
}
midifile. sortTracks (); // Need to sort tracks since added events are
// appended to track in random tick order.
string filename = options. getString ( " output-file " );
if (filename. empty ()) {
if (options. getBoolean ( " hex " )) midifile. writeHex (cout);
else cout << midifile;
} else
midifile. write (filename);
return 0 ;
}Si aucun fichier de sortie n'est spécifié, le contenu du fichier MIDI sera imprimé dans le format Binasc en sortie standard, qui peut être lu dans un objet de midi et converti en un fichier MIDI standard (voir l'exemple de lecture / écriture plus bas sur la page pour comment le faire):
"MThd" ; MIDI header chunk marker
4'6 ; bytes to follow in header chunk
2'0 ; file format: Type-0 (single track)
2'1 ; number of tracks
2'120 ; ticks per quarter note
;;; TRACK 0 ----------------------------------
"MTrk" ; MIDI track chunk marker
4'89 ; bytes to follow in track chunk
v30 90 '74 '72 ; note-on D5
v150 90 '68 '88 ; note-on G#4
v0 90 '79 '83 ; note-on G5
v60 90 '74 '0 ; note-off D5
v150 90 '79 '0 ; note-off G5
v30 90 '68 '0 ; note-off G#4
v990 90 '60 '100 ; note-on C4
v90 90 '60 '0 ; note-off C4
v630 90 '83 '69 ; note-on B5
v60 90 '83 '0 ; note-off B5
v30 90 '56 '51 ; note-on G#3
v90 90 '56 '0 ; note-off G#3
v390 90 '78 '46 ; note-on F#5
v30 90 '60 '78 ; note-on C4
v90 90 '78 '0 ; note-off F#5
v0 90 '70 '56 ; note-on A#4
v60 90 '76 '100 ; note-on E5
v90 90 '60 '0 ; note-off C4
v30 90 '76 '0 ; note-off E5
v60 90 '70 '0 ; note-off A#4
v0 ff 2f v0 ; end-of-track
Voici les données MIDI visualisées avec l'exemple du programme Mid2Svg:

L'option -x peut être utilisée pour produire les données sous forme de codes d'octets hexadécimaux, l'option -n contrôle le nombre de notes, et -i # spécifie le numéro d'instrument à utiliser:
myprogram -n 100 -x -i 24produit le fichier midi de code octet hexadécimal:
4d 54 68 64 00 00 00 06 00 00 00 01 00 78 4d 54 72 6b 00 00 03 27 00 c0 18
1e 90 4d 2f 1e 90 31 5e 00 90 40 42 1e 90 47 55 1e 90 47 00 00 90 31 00 00
90 32 62 1e 90 43 2d 1e 90 43 00 00 90 3f 5f 1e 90 32 00 1e 90 4d 00 00 90
47 38 1e 90 51 33 1e 90 40 00 00 90 31 31 00 90 35 3a 1e 90 24 41 00 90 4d
4f 00 90 4e 32 1e 90 31 00 00 90 51 00 1e 90 4e 00 00 90 48 51 1e 90 3f 00
00 90 24 00 1e 90 47 00 1e 90 35 00 00 90 2c 61 1e 90 4d 63 3c 90 4d 00 00
90 48 00 00 90 33 30 1e 90 2c 00 00 90 4d 00 00 90 40 5f 00 90 45 5f 00 90
3e 58 00 90 3f 45 00 90 24 4a 1e 90 33 00 00 90 3c 3c 1e 90 32 38 1e 90 39
40 1e 90 53 43 1e 90 40 00 00 90 3f 00 00 90 3e 00 00 90 45 00 00 90 4d 62
1e 90 24 00 00 90 32 00 00 90 30 42 00 90 2d 28 1e 90 3c 00 00 90 4d 00 00
90 53 00 00 90 2a 45 3c 90 36 51 1e 90 39 00 00 90 2a 00 00 90 36 4b 3c 90
36 00 00 90 3e 5c 1e 90 2d 00 1e 90 30 00 00 90 3e 00 3c 90 41 48 00 90 37
3f 00 90 36 3a 00 90 41 51 00 90 46 38 3c 90 36 00 1e 90 36 00 00 90 46 00
00 90 36 58 1e 90 41 00 00 90 32 44 00 90 47 2a 1e 90 37 00 00 90 45 2b 1e
90 41 53 00 90 3e 2d 1e 90 3e 00 00 90 33 28 00 90 29 4b 1e 90 41 00 00 90
41 00 1e 90 29 00 00 90 49 51 1e 90 47 00 00 90 35 49 00 90 49 43 1e 90 35
00 00 90 45 00 00 90 36 00 00 90 27 5c 1e 90 32 00 1e 90 49 00 00 90 28 4d
1e 90 49 00 00 90 33 00 00 90 2e 44 1e 90 29 2b 3c 90 27 00 00 90 24 3e 00
90 28 53 00 90 52 51 1e 90 4d 4f 00 90 26 5c 1e 90 28 00 00 90 29 00 00 90
27 32 1e 90 28 00 00 90 2e 00 00 90 4d 00 1e 90 2f 28 1e 90 4a 5a 00 90 47
43 1e 90 4a 00 00 90 52 00 00 90 24 00 00 90 34 2f 1e 90 2f 00 00 90 3c 5e
00 90 28 4f 00 90 32 2d 1e 90 26 00 00 90 3c 00 00 90 27 00 00 90 53 63 1e
90 47 00 1e 90 32 00 00 90 44 5d 00 90 32 40 1e 90 28 00 00 90 46 46 1e 90
34 00 1e 90 2a 3e 1e 90 53 00 00 90 3a 3f 00 90 53 31 1e 90 28 5f 1e 90 28
00 00 90 46 00 00 90 53 00 00 90 2a 00 1e 90 32 00 00 90 3a 00 00 90 44 00
3c 90 33 4d 1e 90 53 57 00 90 54 30 1e 90 38 45 1e 90 2f 46 1e 90 2f 00 00
90 33 00 1e 90 3a 61 00 90 38 40 1e 90 54 00 00 90 27 37 1e 90 3a 00 00 90
53 00 00 90 32 29 1e 90 38 00 00 90 40 2b 00 90 36 41 1e 90 38 00 00 90 34
46 1e 90 27 00 5a 90 36 00 00 90 32 00 00 90 40 00 00 90 48 4a 5a 90 34 00
00 90 48 00 1e 90 29 62 00 90 3e 4d 1e 90 39 3e 00 90 4a 2d 00 90 40 2d 3c
90 39 00 00 90 4a 00 00 90 25 58 1e 90 29 00 00 90 41 37 00 90 45 4c 00 90
4d 64 1e 90 41 00 00 90 3e 00 1e 90 4d 00 3c 90 40 00 00 90 25 00 00 90 39
4a 3c 90 32 43 1e 90 45 4a 1e 90 45 00 3c 90 45 00 3c 90 32 00 00 90 39 00
00 ff 2f 00
Visualisation avec bin/mid2svg -s 6 -a 12 -v :

Voici un exemple de programme minimal qui convertit les codes d'octets hextromes ci-dessus en un fichier MIDI standard:
# include " MidiFile.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
if (argc != 3 ) return 1 ;
MidiFile midifile;
midifile. read (argv[ 1 ]);
if (midifile. status ()) midifile. write (argv[ 2 ]);
else cerr << " Problem reading MIDI file " << argv[ 1 ] << endl;
} La fonction MidiFile::read() identifiera automatiquement si l'entrée est un fichier MIDI standard binaire, une représentation de code d'octets hexares ou un fichier de syntaxe Binasc généralisé (qui comprend des codes d'octets). La fonction MidiFile::status() peut être vérifiée après avoir lu un fichier MIDI pour déterminer si le fichier a été lu sans problème.
Cet exemple utilise le MidiFile::getFileDurationInSeconds() pour calculer la durée d'un fichier MIDI. De plus, cet exemple montre comment traiter plusieurs fichiers d'entrée lors de l'utilisation de la classe d'options.
# include " MidiFile.h "
# include " Options.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. process (argc, argv);
MidiFile midifile;
if (options. getArgCount () == 0 ) {
midifile. read (cin);
cout << midifile. getFileDurationInSeconds () << " seconds " << endl;
} else {
int count = options. getArgCount ();
for ( int i= 0 ; i<count; i++) {
string filename = options. getArg (i+ 1 );
if (count > 1 ) cout << filename << " t " ;
midifile. read (filename);
cout << midifile. getFileDurationInSeconds () << " seconds " << endl;
}
}
return 0 ;
} La fonction MidiMessage::isText() renvoie True si le message est un méta-message texte. Le programme suivant fusionne toutes les pistes en une seule liste et fait une boucle pour vérifier les méta-messages de texte, en les imprimant lorsqu'il est trouvé. La fonction MidiMessage::getMetaContent() extrait la chaîne de texte du message des octets de fichier MIDI bruts.
# include " MidiFile.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
MidiFile midifile;
if (argc == 1 ) midifile. read (cin);
else midifile. read (argv[ 1 ]);
if (!midifile. status ()) {
cerr << " Problem reading MIDI file " << endl;
return 1 ;
}
midifile. joinTracks ();
for ( int i= 0 ; i<midifile[ 0 ]. getEventCount (); i++) {
if (midifile[ 0 ][i]. isText ()) {
string content = midifile[ 0 ][i]. getMetaContent ();
cout << content << endl;
}
}
return 0 ;
} L'extraction des paroles fonctionnerait de la même manière en utilisant .isLyricText() au lieu de .isText() , et un méta-message de piste est identifié par .isTrackName() .
Voici une démonstration de la conversion d'un fichier MIDI multi-track en un fichier MIDI unique:
# include " MidiFile.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
if (argc != 3 ) {
cerr << " Usage: " << argv[ 0 ] << " input output " << endl;
return 1 ;
}
MidiFile midifile;
midifile. read (argv[ 1 ]);
if (!midifile. status ()) {
cerr << " Problem reading MIDI file " << endl;
return 1 ;
}
midifile. joinTracks ();
midifile. write (argv[ 2 ]);
return 0 ;
}
La fonction .joinTracks() fusionne toutes les pistes en une seule piste. Et si un objet MidiFile n'a qu'une seule piste lorsqu'il est écrit, il sera écrit comme un fichier MIDI Type-0 (piste unique).
Dans les fichiers MIDI généraux, la piste de tambour est sur le 10e canal, qui est représentée par l'Integer 9. L'exemple suivant recherche dans les événements MIDI dans chaque piste jusqu'à ce qu'il trouve une note sur le canal 9:
# include " MidiFile.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
MidiFile midifile;
if (argc == 1 ) midifile. read (cin);
else midifile. read (argv[ 1 ]);
if (!midifile. status ()) {
cerr << " Problem reading MIDI file " << endl;
return 1 ;
}
bool found = false ;
for ( int i= 0 ; i<midifile. getTrackCount (); i++) {
for ( int j= 0 ; j<midifile[i]. getEventCount (); j++) {
if (midifile[i][j]. isNote ()) {
int channel = midifile[i][j]. getChannelNibble ();
if (channel == 9 ) {
found = true ;
break ;
}
}
}
if (found == true ) break ;
}
if (found) cout << " Has a percussion part. " << endl;
else cout << " Does not have a percussion part. " << endl;
return 0 ;
}Pour certaines applications d'analyse musicale, il est utile de supprimer les notes de percussion d'un fichier MIDI. Voici un exemple de la façon dont cela peut être fait avec la bibliothèque du midi.
# include " MidiFile.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
if (argc != 3 ) {
cerr << " Usage: " << argv[ 0 ] << " input output " << endl;
return 1 ;
}
MidiFile midifile;
midifile. read (argv[ 1 ]);
if (!midifile. status ()) {
cerr << " Problem reading MIDI file " << endl;
return 1 ;
}
for ( int i= 0 ; i<midifile. getTrackCount (); i++) {
for ( int j= 0 ; j<midifile[i]. getEventCount (); j++) {
if (midifile[i][j]. isNote ()) {
int channel = midifile[i][j]. getChannelNibble ();
if (channel == 9 ) {
midifile[i][j]. clear ();
}
}
}
}
midifile. removeEmpties (); // optional
midifile. write (argv[ 2 ]);
return 0 ;
} Pour supprimer un message MIDI, effacez sa classe de base vectorielle. Cela laissera un MidiEvent vide dans la piste, mais la fonction MidiFile::write() ignorera tout MidiMessage vide. La fonction MidiFile::removeEmpties() peut être appelée pour supprimer explicitement les MidiEvents vides de la piste.
Cet exemple montre comment transposer des notes dans un fichier MIDI. Des précautions doivent être prises pour éviter de transposer le canal 10 dans le MIDI général, car cela est réservé à la piste de tambour (et la plupart des fichiers MIDI utilisent la convention MIDI générale).
# include " MidiFile.h "
# include " Options.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. define ( " t|transpose=i:0 " , " Semitones to transpose by " );
options. process (argc, argv);
MidiFile midifile;
if (options. getArgCount () == 0 ) midifile. read (cin);
else midifile. read (options. getArg ( 1 ));
if (!midifile. status ()) {
cerr << " Could not read MIDI file " << endl;
return 1 ;
}
int transpose = options. getInteger ( " transpose " );
for ( int i= 0 ; i<midifile. getTrackCount (); i++) {
for ( int j= 0 ; j<midifile[i]. getEventCount (); j++) {
if (!midifile[i][j]. isNote ()) continue ;
if (midifile[i][j]. getChannel () == 9 ) continue ;
int newkey = transpose + midifile[i][j]. getP1 ();
midifile[i][j]. setP1 (newkey);
}
}
if (options. getArgCount () < 2 ) cout << midifile;
else midifile. write (options. getArg ( 2 ));
return 0 ;
}L'exemple suivant répertorie tous les numéros d'instrument utilisés dans un fichier MIDI. Il n'analyse pas la piste de batterie.
# include " MidiFile.h "
# include " Options.h "
# include < set >
# include < utility >
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. process (argc, argv);
MidiFile midifile;
if (options. getArgCount () == 0 ) midifile. read (cin);
else midifile. read (options. getArg ( 1 ));
if (!midifile. status ()) {
cerr << " Could not read MIDI file " << endl;
return 1 ;
}
pair< int , int > trackinst;
set<pair< int , int >> iset;
for ( int i= 0 ; i<midifile. getTrackCount (); i++) {
for ( int j= 0 ; j<midifile[i]. getEventCount (); j++) {
if (midifile[i][j]. isTimbre ()) {
trackinst. first = i;
trackinst. second = midifile[i][j]. getP1 ();
iset. insert (trackinst);
}
}
}
for ( auto it : iset)
cout << " Track: " << it. first << " t Instrument: " << it. second << endl;
return 0 ;
}Si vous souhaitez simuler des tempéraments dans un fichier MIDI standard sans synthétiseur qui connaît spécifiquement les tempéraments, cet exemple est utile. Chaque classe de pitch est placée dans une piste séparée et un canal MIDI. Un message de pitch-bend est ensuite ajouté au début de chaque piste dans chaque canal pour contrôler le tempérament. Des soins sont pris en compte pour éviter le canal MIDI 10, qui est réservé aux timbres de percussion en général MIDI.
# include " MidiFile.h "
# include < iostream >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
if (argc != 3 ) {
cerr << " Usage: " << argv[ 0 ] << " input output " << endl;
return 1 ;
}
MidiFile midifile;
midifile. read (argv[ 1 ]);
if (!midifile. status ()) {
cerr << " Problem reading MIDI file " << endl;
return 1 ;
}
midifile. joinTracks ();
for ( int i= 0 ; i<midifile[ 0 ]. getEventCount (); i++) {
midifile[ 0 ][i]. seq = 2 ;
if (!midifile[ 0 ][i]. isNote ()) {
midifile[ 0 ][i]. track = 0 ;
continue ;
}
int pc = midifile[ 0 ][i]. getP1 () % 12 ;
int channel = midifile[ 0 ][i]. getChannelNibble ();
if (channel != 9 ) {
midifile[ 0 ][i]. track = pc + 1 ;
if (pc >= 9 ) pc++;
midifile[ 0 ][i]. setChannelNibble (pc);
} else midifile[ 0 ][i]. track = 13 ;
}
midifile. splitTracks ();
double maxbend = 200.0 ; // typical pitch-bend depth in cents on synthesizers
// pythagorean tuning deviations from equal temperament in cents.
vector< double > pythagorean = {- 3.91 , 9.78 , 0.00 , - 9.78 , 3.91 , - 5.87 , 7.82 ,
- 1.96 , - 11.73 , 1.96 , - 7.82 , 5.87 };
for ( int i= 0 ; i< 12 ; i++) {
int maxtrack = midifile. getTrackCount ();
int track = i+ 1 ;
if (track >= maxtrack) break ;
int channel = i;
if (i >= 9 ) channel++;
double bend = pythagorean[i] / maxbend;
MidiEvent* me = midifile. addPitchBend (track, 0 , channel, bend);
me-> seq = 1 ;
}
midifile. sortTracks ();
midifile. write (argv[ 2 ]);
return 0 ;
} La fonction MidiFile::splitTracks() générera 13 ou 14 pistes. La piste 0 contiendra tous les messages MIDI non notes du fichier d'origine, tandis que les pistes 1 à 12 contiennent des notes d'une classe de hauteur spécifique sur les canaux MIDI 1-12, sauter le canal 10 (le canal de percussion MIDI général). Les notes de percussion seront placées sur la piste 13, mais resteront sur le canal 10.
L'utilisation de MidiEvent::seq étant définie sur 1 et 2 dans le programme est utilisée pour forcer les premières notes au moment du tick 0 à placer après que les messages de pitch de pitch insérés au même horodatage lorsque MidiFile::sortTracks() est appelé (les événements avec un numéro de séquence inférieur seront placés avant ceux avec un nombre plus élevé s'ils se produisent en même temps dans une piste lors du tri des événements dans la piste). Les messages de pitch-bend seraient probablement triés avant les notes de toute façon, mais l'utilisation seq devrait garantir qu'ils sont placés avant les premières notes.
Essayez ce programme sur Clavier bien colérique de Bach, livre I, fugue n ° 4 en mineur C-Sharp:
4d 54 68 64 00 00 00 06 00 01 00 06 00 78 4d 54 72 6b 00 00 00 13 00 ff 51 03 08 8e 6c 00 ff 58 04 02 01 30 08 00 ff 2f
00 4d 54 72 6b 00 00 09 bd b2 50 90 49 40 81 70 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80 4c 40 00 90 4b
40 83 60 80 4b 40 00 90 49 40 82 68 80 49 40 00 90 4b 40 78 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4b 40 78 80 4b 40 00
90 49 40 81 70 80 49 40 00 90 47 40 81 70 80 47 40 00 90 49 40 81 70 80 49 40 00 90 4b 40 81 70 80 4b 40 82 68 90 4c 40
78 80 4c 40 00 90 4b 40 78 80 4b 40 00 90 49 40 78 80 49 40 00 90 47 40 78 80 47 40 00 90 4b 40 78 80 4b 40 00 90 50 40
82 68 80 50 40 00 90 4e 40 78 80 4e 40 00 90 50 40 78 80 50 40 00 90 51 40 78 80 51 40 00 90 53 40 84 58 80 53 40 00 90
51 40 78 80 51 40 00 90 50 40 78 80 50 40 00 90 4e 40 78 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90
4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 83 60 80 49 40 00 90 47 40 82 68 80 47 40 00 90 49 40 78 80 49 40
00 90 47 40 78 80 47 40 00 90 45 40 78 80 45 40 00 90 44 40 81 70 80 44 40 00 90 46 40 78 80 46 40 00 90 47 40 78 80 47
40 00 90 49 40 81 70 80 49 40 00 90 47 40 83 60 80 47 40 00 90 46 40 81 70 80 46 40 00 90 47 40 84 58 80 47 40 00 90 49
40 78 80 49 40 00 90 4b 40 78 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4c 40 81 70 80 4c 40 00 90 4b 40 81 70 80 4b 40 00
90 4c 40 78 80 4c 40 00 90 4b 40 78 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4e 40 78 80 4e 40 00 90 50 40 3c 80 50 40 00
90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 51 40 3c 80 51 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00
90 4c 40 3c 80 4c 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 3c 80 4e 40 00
90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4e 40 3c 80 4e 40 00
90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00
90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00
90 4b 40 3c 80 4b 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00
90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40 00
90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 46 40 3c 80 46 40 00 90 49 40 3c 80 49 40 00 90 47 40 82 2c 80 47 40
00 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 47 40 3c 80 47 40 00 90 49 40 82 68 80 49 40 00 90 4c 40 78 80 4c
40 00 90 4b 40 82 68 80 4b 40 00 90 4e 40 78 80 4e 40 00 90 4c 40 84 58 80 4c 40 00 90 4b 40 81 70 80 4b 40 00 90 49 40
81 70 80 49 40 00 90 48 40 3c 80 48 40 00 90 46 40 3c 80 46 40 00 90 48 40 78 80 48 40 00 90 4b 40 78 80 4b 40 00 90 50
40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 51 40 3c 80 51 40 00 90 50 40 3c 80 50 40 00 90 4e
40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e
40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4e
40 3c 80 4e 40 00 90 4d 40 81 70 80 4d 40 00 90 51 40 81 70 80 51 40 00 90 50 40 84 58 80 50 40 00 90 4e 40 3c 80 4e 40
00 90 4c 40 3c 80 4c 40 00 90 4a 40 81 70 80 4a 40 78 90 49 40 78 80 49 40 00 90 4e 40 78 80 4e 40 00 90 4e 40 78 80 4e
40 00 90 4e 40 78 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 4c 40 82 68 80 4c 40 00 90 4a 40 3c 80
4a 40 00 90 49 40 3c 80 49 40 00 90 4a 40 83 60 80 4a 40 00 90 49 40 81 70 80 49 40 00 90 4e 40 81 70 80 4e 40 00 90 4c
40 81 70 80 4c 40 00 90 4c 40 81 34 80 4c 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00
90 49 40 3c 80 49 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4a 40 3c 80 4a 40 00
90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 4a 40 3c 80 4a 40 00
90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80 4c 40 00 90 4b 40 84 58 80 4b 40 00 90 44 40 78
80 44 40 00 90 49 40 78 80 49 40 00 90 49 40 78 80 49 40 00 90 49 40 78 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40 3c
80 45 40 00 90 47 40 83 60 80 47 40 00 90 45 40 81 70 80 45 40 00 90 44 40 81 70 80 44 40 81 70 90 4b 40 83 60 80 4b 40
00 90 4a 40 81 70 80 4a 40 00 90 4e 40 81 70 80 4e 40 00 90 4d 40 81 70 80 4d 40 00 90 4c 40 81 70 80 4c 40 00 90 4b 40
3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40
3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 49 40
3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40
3c 80 49 40 00 90 48 40 81 70 80 48 40 00 90 47 40 81 70 80 47 40 00 90 46 40 81 70 80 46 40 00 90 45 40 81 70 80 45 40
00 90 44 40 81 70 80 44 40 89 30 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80 4c 40 00 90 4b
40 85 50 80 4b 40 00 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 78 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40
00 90 4c 40 78 80 4c 40 00 90 4e 40 78 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40
00 90 51 40 3c 80 51 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 50 40 3c 80 50 40
00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40
00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40
00 90 4c 40 3c 80 4c 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40
00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4a 40 3c 80 4a 40 00 90 4c 40 3c 80 4c 40
00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40
00 90 47 40 3c 80 47 40 00 90 49 40 3c 80 49 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40
00 90 45 40 3c 80 45 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40 3c 80 45 40 00 90 47 40 3c 80 47 40
00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40 3c 80 45 40 00 90 44 40 3c 80 44 40 00 90 47 40 3c 80 47 40
00 90 45 40 81 70 80 45 40 81 70 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80 4c 40 00 90 4b
40 84 58 80 4b 40 00 90 49 40 78 80 49 40 00 90 50 40 78 80 50 40 00 90 50 40 78 80 50 40 00 90 50 40 78 80 50 40 00 90
4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 81 70 80 4e 40 00 90 4c 40 83 60 80 4c 40 00 90 4b 40 81 70 80 4b
40 00 90 4f 40 81 70 80 4f 40 00 90 4e 40 81 70 80 4e 40 00 90 42 40 81 70 80 42 40 00 90 41 40 81 70 80 41 40 00 90 45
40 81 70 80 45 40 00 90 44 40 78 80 44 40 83 60 90 48 40 78 80 48 40 00 90 4e 40 78 80 4e 40 00 90 4e 40 78 80 4e 40 00
90 4e 40 78 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4b 40 3c 80 4b 40 00
90 49 40 3c 80 49 40 00 90 4b 40 78 80 4b 40 00 90 48 40 78 80 48 40 00 90 49 40 85 50 80 49 40 00 90 48 40 81 70 80 48
40 00 90 47 40 81 70 80 47 40 00 90 46 40 81 70 80 46 40 00 90 45 40 81 70 80 45 40 00 90 44 40 83 60 80 44 40 00 90 46
40 81 70 80 46 40 00 90 48 40 81 70 80 48 40 00 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 83 60 80
4c 40 00 90 4b 40 78 80 4b 40 00 90 49 40 78 80 49 40 00 90 48 40 81 70 80 48 40 00 90 49 40 83 60 80 49 40 00 90 48 40
81 70 80 48 40 00 90 49 40 8f 00 80 49 40 77 90 00 00 00 ff 2f 00 4d 54 72 6b 00 00 09 40 ab 10 91 44 40 81 70 81 44 40
00 91 41 40 81 70 81 41 40 00 91 45 40 81 70 81 45 40 00 91 44 40 81 70 81 44 40 00 91 42 40 83 60 81 42 40 00 91 49 40
83 60 81 49 40 00 91 47 40 83 60 81 47 40 00 91 45 40 81 70 81 45 40 00 91 44 40 81 70 81 44 40 00 91 45 40 82 68 81 45
40 00 91 44 40 78 81 44 40 00 91 42 40 78 81 42 40 00 91 40 40 78 81 40 40 00 91 3f 40 81 70 81 3f 40 00 91 44 40 81 70
81 44 40 00 91 44 40 81 70 81 44 40 00 91 43 40 81 70 81 43 40 00 91 44 40 81 70 81 44 40 00 91 3b 40 81 70 81 3b 40 00
91 3d 40 82 68 81 3d 40 00 91 3d 40 78 81 3d 40 00 91 3f 40 78 81 3f 40 00 91 3d 40 78 81 3d 40 00 91 3f 40 78 81 3f 40
00 91 41 40 78 81 41 40 00 91 42 40 81 70 81 42 40 00 91 45 40 81 70 81 45 40 00 91 44 40 81 70 81 44 40 3c 91 47 40 3c
81 47 40 00 91 45 40 3c 81 45 40 00 91 44 40 3c 81 44 40 00 91 42 40 78 81 42 40 00 91 45 40 78 81 45 40 00 91 44 40 78
81 44 40 00 91 42 40 78 81 42 40 00 91 41 40 81 70 81 41 40 00 91 42 40 82 68 81 42 40 00 91 40 40 84 58 81 40 40 00 91
3f 40 81 70 81 3f 40 00 91 40 40 84 58 81 40 40 00 91 3f 40 78 81 3f 40 00 91 40 40 78 81 40 40 00 91 42 40 3c 81 42 40
00 91 44 40 3c 81 44 40 00 91 42 40 81 70 81 42 40 00 91 47 40 82 68 81 47 40 00 91 49 40 78 81 49 40 00 91 47 40 78 81
47 40 00 91 45 40 78 81 45 40 00 91 44 40 81 70 81 44 40 a1 60 91 49 40 81 70 81 49 40 00 91 48 40 81 70 81 48 40 00 91
4c 40 81 70 81 4c 40 00 91 4b 40 85 50 81 4b 40 00 91 49 40 83 60 81 49 40 00 91 48 40 78 81 48 40 00 91 47 40 81 34 81
47 40 00 91 47 40 3c 81 47 40 00 91 49 40 3c 81 49 40 00 91 4a 40 3c 81 4a 40 00 91 49 40 3c 81 49 40 00 91 47 40 3c 81
47 40 00 91 45 40 3c 81 45 40 00 91 49 40 3c 81 49 40 00 91 47 40 3c 81 47 40 00 91 45 40 3c 81 45 40 00 91 47 40 3c 81
47 40 00 91 49 40 3c 81 49 40 00 91 47 40 3c 81 47 40 00 91 45 40 3c 81 45 40 00 91 44 40 3c 81 44 40 00 91 47 40 3c 81
47 40 00 91 45 40 82 2c 81 45 40 00 91 49 40 3c 81 49 40 00 91 47 40 3c 81 47 40 00 91 45 40 3c 81 45 40 00 91 44 40 81
70 81 44 40 87 40 91 45 40 81 70 81 45 40 00 91 44 40 81 70 81 44 40 00 91 49 40 81 70 81 49 40 00 91 47 40 84 58 81 47
40 00 91 40 40 78 81 40 40 00 91 45 40 78 81 45 40 00 91 45 40 78 81 45 40 00 91 45 40 78 81 45 40 00 91 44 40 3c 81 44
40 00 91 42 40 3c 81 42 40 00 91 44 40 82 68 81 44 40 00 91 3d 40 3c 81 3d 40 00 91 3f 40 3c 81 3f 40 00 91 40 40 78 81
40 40 00 91 42 40 78 81 42 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c 81 42 40 00 91 44 40 3c 81 44 40 00 91 45 40 3c 81
45 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c 81
42 40 00 91 40 40 3c 81 40 40 00 91 42 40 3c 81 42 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81
40 40 00 91 3f 40 3c 81 3f 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 3f 40 3c 81 3f 40 00 91 40 40 3c 81
40 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 3f 40 3c 81 3f 40 00 91 3d 40 3c 81 3d 40 00 91 40 40 3c 81
40 40 00 91 3f 40 3c 81 3f 40 00 91 3d 40 3c 81 3d 40 00 91 3f 40 3c 81 3f 40 00 91 40 40 3c 81 40 40 00 91 3e 40 3c 81
3e 40 00 91 3d 40 3c 81 3d 40 00 91 3b 40 3c 81 3b 40 00 91 3e 40 3c 81 3e 40 00 91 3d 40 3c 81 3d 40 00 91 3b 40 3c 81
3b 40 00 91 3d 40 3c 81 3d 40 00 91 3e 40 3c 81 3e 40 00 91 3d 40 3c 81 3d 40 00 91 40 40 3c 81 40 40 00 91 3f 40 3c 81
3f 40 00 91 3d 40 3c 81 3d 40 00 91 48 40 81 70 81 48 40 00 91 3d 40 81 70 81 3d 40 00 91 3f 40 78 81 3f 40 00 91 3f 40
78 81 3f 40 00 91 44 40 3c 81 44 40 00 91 46 40 3c 81 46 40 00 91 47 40 81 70 81 47 40 00 91 46 40 78 81 46 40 00 91 4b
40 78 81 4b 40 00 91 4b 40 78 81 4b 40 00 91 4b 40 78 81 4b 40 00 91 49 40 3c 81 49 40 00 91 48 40 3c 81 48 40 00 91 49
40 83 60 81 49 40 00 91 47 40 81 70 81 47 40 00 91 46 40 81 70 81 46 40 00 91 45 40 82 68 81 45 40 00 91 3f 40 78 81 3f
40 00 91 44 40 78 81 44 40 00 91 44 40 81 70 81 44 40 00 91 42 40 3c 81 42 40 00 91 41 40 3c 81 41 40 00 91 42 40 83 60
81 42 40 00 91 40 40 81 70 81 40 40 00 91 3f 40 81 70 81 3f 40 00 91 3d 40 81 70 81 3d 40 00 91 3f 40 83 60 81 3f 40 84
58 91 44 40 78 81 44 40 00 91 49 40 78 81 49 40 00 91 49 40 78 81 49 40 00 91 49 40 78 81 49 40 00 91 48 40 3c 81 48 40
00 91 46 40 3c 81 46 40 00 91 48 40 3c 81 48 40 00 91 49 40 3c 81 49 40 00 91 4b 40 3c 81 4b 40 00 91 48 40 3c 81 48 40
00 91 44 40 3c 81 44 40 00 91 42 40 3c 81 42 40 00 91 44 40 3c 81 44 40 00 91 45 40 3c 81 45 40 00 91 44 40 3c 81 44 40
00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40
00 91 42 40 3c 81 42 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 3f 40 3c 81 3f 40
00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 44 40 3c 81 44 40 00 91 45 40 3c 81 45 40 00 91 47 40 3c 81 47 40
00 91 49 40 3c 81 49 40 00 91 4b 40 3c 81 4b 40 00 91 48 40 3c 81 48 40 00 91 49 40 3c 81 49 40 00 91 4b 40 78 81 4b 40
8b 20 91 42 40 78 81 42 40 00 91 47 40 78 81 47 40 00 91 47 40 78 81 47 40 00 91 47 40 78 81 47 40 00 91 45 40 3c 81 45
40 00 91 44 40 3c 81 44 40 00 91 45 40 81 70 81 45 40 00 91 44 40 84 1c 81 44 40 00 91 44 40 3c 81 44 40 00 91 42 40 3c
81 42 40 00 91 41 40 3c 81 41 40 00 91 42 40 81 70 81 42 40 00 91 44 40 82 2c 81 44 40 00 91 44 40 3c 81 44 40 00 91 42
40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 3f 40 3c 81 3f 40 00 91 45 40 3c 81 45 40 00 91 44 40 3c 81 44 40 00 91 42
40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 44 40 3c 81 44 40 00 91 49 40 3c 81 49 40 00 91 47 40 3c 81 47 40 00 91 45
40 3c 81 45 40 00 91 44 40 3c 81 44 40 00 91 45 40 3c 81 45 40 00 91 42 40 3c 81 42 40 00 91 44 40 82 68 81 44 40 00 91
49 40 3c 81 49 40 00 91 48 40 3c 81 48 40 00 91 49 40 82 68 81 49 40 00 91 46 40 78 81 46 40 00 91 4b 40 78 81 4b 40 00
91 4b 40 78 81 4b 40 00 91 4b 40 78 81 4b 40 00 91 49 40 3c 81 49 40 00 91 47 40 3c 81 47 40 00 91 49 40 81 70 81 49 40
00 91 47 40 81 70 81 47 40 00 91 47 40 81 70 81 47 40 00 91 46 40 81 70 81 46 40 00 91 4a 40 81 70 81 4a 40 00 91 49 40
83 60 81 49 40 78 91 44 40 78 81 44 40 00 91 49 40 78 81 49 40 00 91 49 40 78 81 49 40 00 91 49 40 78 81 49 40 00 91 48
40 3c 81 48 40 00 91 46 40 3c 81 46 40 00 91 48 40 3c 81 48 40 00 91 49 40 3c 81 49 40 00 91 4b 40 81 70 81 4b 40 00 91
49 40 3c 81 49 40 00 91 48 40 3c 81 48 40 00 91 49 40 81 70 81 49 40 00 91 42 40 81 70 81 42 40 00 91 44 40 83 60 81 44
40 00 91 42 40 82 68 81 42 40 82 68 91 44 40 78 81 44 40 00 91 42 40 3c 81 42 40 00 91 40 40 3c 81 40 40 00 91 42 40 78
81 42 40 00 91 42 40 78 81 42 40 00 91 42 40 78 81 42 40 00 91 40 40 3c 81 40 40 00 91 3f 40 3c 81 3f 40 00 91 40 40 82
68 81 40 40 00 91 42 40 3c 81 42 40 00 91 44 40 3c 81 44 40 00 91 45 40 78 81 45 40 00 91 44 40 81 70 81 44 40 00 91 40
40 78 81 40 40 00 91 45 40 78 81 45 40 00 91 45 40 78 81 45 40 00 91 45 40 78 81 45 40 00 91 44 40 3c 81 44 40 00 91 42
40 3c 81 42 40 00 91 44 40 78 81 44 40 00 91 46 40 3c 81 46 40 00 91 48 40 3c 81 48 40 00 91 49 40 81 70 81 49 40 00 91
46 40 81 70 81 46 40 00 91 44 40 81 70 81 44 40 00 91 44 40 85 50 81 44 40 00 91 44 40 81 70 81 44 40 00 91 42 40 81 70
81 42 40 00 91 41 40 81 70 81 41 40 00 91 45 40 81 70 81 45 40 00 91 44 40 87 40 81 44 40 77 90 00 00 00 ff 2f 00 4d 54
72 6b 00 00 08 ba 98 30 92 3d 40 81 70 82 3d 40 00 92 3c 40 81 70 82 3c 40 00 92 40 40 81 70 82 40 40 00 92 3f 40 83 60
82 3f 40 00 92 3d 40 81 70 82 3d 40 00 92 42 40 82 68 82 42 40 00 92 40 40 78 82 40 40 00 92 3f 40 78 82 3f 40 00 92 3d
40 78 82 3d 40 00 92 3d 40 81 70 82 3d 40 00 92 3b 40 81 70 82 3b 40 00 92 3d 40 81 70 82 3d 40 00 92 42 40 82 68 82 42
40 00 92 40 40 78 82 40 40 00 92 3f 40 78 82 3f 40 00 92 3d 40 78 82 3d 40 00 92 3f 40 81 70 82 3f 40 00 92 44 40 81 70
82 44 40 78 92 45 40 78 82 45 40 00 92 44 40 78 82 44 40 00 92 42 40 78 82 42 40 00 92 41 40 78 82 41 40 00 92 3d 40 78
82 3d 40 00 92 42 40 81 70 82 42 40 00 92 40 40 85 50 82 40 40 00 92 44 40 81 70 82 44 40 00 92 46 40 81 70 82 46 40 92
60 92 3d 40 81 70 82 3d 40 00 92 3c 40 81 70 82 3c 40 00 92 40 40 81 70 82 40 40 00 92 3f 40 83 60 82 3f 40 00 92 3d 40
87 40 82 3d 40 00 92 36 40 78 82 36 40 00 92 38 40 78 82 38 40 00 92 3a 40 78 82 3a 40 00 92 3b 40 78 82 3b 40 00 92 3d
40 83 60 82 3d 40 81 70 92 40 40 81 70 82 40 40 00 92 3f 40 81 70 82 3f 40 00 92 44 40 81 70 82 44 40 00 92 42 40 83 60
82 42 40 00 92 40 40 81 70 82 40 40 8b 20 92 44 40 81 70 82 44 40 00 92 43 40 81 70 82 43 40 00 92 47 40 81 70 82 47 40
00 92 46 40 84 58 82 46 40 00 92 3f 40 78 82 3f 40 00 92 44 40 82 68 82 44 40 00 92 42 40 3c 82 42 40 00 92 40 40 3c 82
40 40 00 92 42 40 82 68 82 42 40 00 92 40 40 3c 82 40 40 00 92 42 40 3c 82 42 40 00 92 44 40 89 30 82 44 40 8c 18 92 3d
40 78 82 3d 40 00 92 42 40 78 82 42 40 00 92 42 40 78 82 42 40 00 92 42 40 78 82 42 40 00 92 41 40 3c 82 41 40 00 92 3f
40 3c 82 3f 40 00 92 41 40 81 70 82 41 40 00 92 42 40 78 82 42 40 00 92 36 40 3c 82 36 40 00 92 38 40 3c 82 38 40 00 92
39 40 78 82 39 40 00 92 3b 40 78 82 3b 40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 3c 82 3b 40 00 92 3d 40 3c 82 3d 40 00 92
3e 40 3c 82 3e 40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 3c 82 3b 40 00 92 39 40 3c 82 39 40 00 92 3d 40 3c 82 3d 40 00 92
3b 40 3c 82 3b 40 00 92 39 40 3c 82 39 40 00 92 3b 40 3c 82 3b 40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 3c 82 3b 40 00 92
39 40 3c 82 39 40 00 92 38 40 3c 82 38 40 00 92 3b 40 3c 82 3b 40 00 92 39 40 3c 82 39 40 00 92 38 40 3c 82 38 40 00 92
39 40 3c 82 39 40 00 92 3b 40 3c 82 3b 40 00 92 39 40 3c 82 39 40 00 92 3b 40 3c 82 3b 40 00 92 3d 40 3c 82 3d 40 00 92
3e 40 3c 82 3e 40 00 92 40 40 3c 82 40 40 00 92 3e 40 3c 82 3e 40 00 92 40 40 3c 82 40 40 00 92 42 40 3c 82 42 40 00 92
40 40 3c 82 40 40 00 92 3e 40 3c 82 3e 40 00 92 3d 40 3c 82 3d 40 00 92 40 40 3c 82 40 40 00 92 3e 40 3c 82 3e 40 00 92
3d 40 3c 82 3d 40 00 92 3e 40 3c 82 3e 40 00 92 40 40 3c 82 40 40 00 92 3e 40 3c 82 3e 40 00 92 3d 40 3c 82 3d 40 00 92
3b 40 3c 82 3b 40 00 92 3e 40 3c 82 3e 40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 3c 82 3b 40 00 92 3d 40 3c 82 3d 40 00 92
3e 40 3c 82 3e 40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 3c 82 3b 40 00 92 39 40 3c 82 39 40 00 92 3d 40 3c 82 3d 40 00 92
3b 40 83 60 82 3b 40 00 92 39 40 3c 82 39 40 00 92 38 40 3c 82 38 40 00 92 36 40 3c 82 36 40 00 92 34 40 3c 82 34 40 00
92 33 40 3c 82 33 40 00 92 31 40 3c 82 31 40 00 92 30 40 3c 82 30 40 00 92 31 40 3c 82 31 40 00 92 33 40 81 70 82 33 40
8e 08 92 31 40 78 82 31 40 00 92 36 40 78 82 36 40 00 92 36 40 78 82 36 40 00 92 36 40 78 82 36 40 00 92 34 40 3c 82 34
40 00 92 33 40 3c 82 33 40 00 92 34 40 81 70 82 34 40 00 92 37 40 81 70 82 37 40 00 92 38 40 81 70 82 38 40 00 92 35 40
78 82 35 40 87 40 92 33 40 78 82 33 40 00 92 38 40 78 82 38 40 00 92 38 40 78 82 38 40 00 92 38 40 78 82 38 40 00 92 36
40 3c 82 36 40 00 92 34 40 3c 82 34 40 00 92 36 40 82 2c 82 36 40 00 92 39 40 3c 82 39 40 00 92 38 40 3c 82 38 40 00 92
36 40 3c 82 36 40 00 92 35 40 3c 82 35 40 00 92 33 40 3c 82 33 40 00 92 35 40 3c 82 35 40 00 92 31 40 3c 82 31 40 00 92
36 40 3c 82 36 40 00 92 35 40 3c 82 35 40 00 92 36 40 3c 82 36 40 00 92 38 40 3c 82 38 40 00 92 39 40 3c 82 39 40 00 92
38 40 3c 82 38 40 00 92 39 40 3c 82 39 40 00 92 3b 40 3c 82 3b 40 00 92 3d 40 3c 82 3d 40 00 92 3c 40 3c 82 3c 40 00 92
3d 40 3c 82 3d 40 00 92 3f 40 3c 82 3f 40 00 92 40 40 3c 82 40 40 00 92 3f 40 3c 82 3f 40 00 92 40 40 3c 82 40 40 00 92
42 40 3c 82 42 40 00 92 44 40 3c 82 44 40 00 92 42 40 3c 82 42 40 00 92 44 40 3c 82 44 40 00 92 45 40 3c 82 45 40 00 92
44 40 3c 82 44 40 00 92 42 40 3c 82 42 40 00 92 40 40 3c 82 40 40 00 92 44 40 3c 82 44 40 00 92 42 40 3c 82 42 40 00 92
40 40 3c 82 40 40 00 92 42 40 3c 82 42 40 00 92 44 40 3c 82 44 40 00 92 42 40 3c 82 42 40 00 92 40 40 3c 82 40 40 00 92
3f 40 3c 82 3f 40 00 92 42 40 3c 82 42 40 00 92 40 40 3c 82 40 40 00 92 3f 40 3c 82 3f 40 00 92 40 40 3c 82 40 40 00 92
42 40 3c 82 42 40 00 92 40 40 3c 82 40 40 00 92 3f 40 3c 82 3f 40 00 92 3d 40 3c 82 3d 40 00 92 40 40 3c 82 40 40 00 92
3f 40 81 70 82 3f 40 91 68 92 38 40 78 82 38 40 00 92 3d 40 78 82 3d 40 00 92 3d 40 78 82 3d 40 00 92 3d 40 78 82 3d 40
00 92 3c 40 3c 82 3c 40 00 92 3a 40 3c 82 3a 40 00 92 3c 40 81 70 82 3c 40 00 92 3d 40 83 60 82 3d 40 00 92 3b 40 82 68
82 3b 40 00 92 42 40 78 82 42 40 00 92 41 40 81 70 82 41 40 00 92 42 40 81 70 82 42 40 00 92 3b 40 81 70 82 3b 40 00 92
3d 40 84 1c 82 3d 40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 3c 82 3b 40 00 92 39 40 3c 82 39 40 00 92 38 40 83 60 82 38 40
93 58 92 3b 40 78 82 3b 40 00 92 40 40 78 82 40 40 00 92 40 40 78 82 40 40 00 92 40 40 78 82 40 40 00 92 3e 40 3c 82 3e
40 00 92 3d 40 3c 82 3d 40 00 92 3b 40 81 70 82 3b 40 78 92 3d 40 78 82 3d 40 00 92 42 40 78 82 42 40 00 92 42 40 78 82
42 40 00 92 42 40 78 82 42 40 00 92 40 40 3c 82 40 40 00 92 3f 40 3c 82 3f 40 00 92 40 40 81 70 82 40 40 00 92 42 40 83
24 82 42 40 00 92 44 40 3c 82 44 40 00 92 45 40 78 82 45 40 00 92 44 40 3c 82 44 40 00 92 42 40 3c 82 42 40 00 92 44 40
78 82 44 40 00 92 42 40 3c 82 42 40 00 92 40 40 3c 82 40 40 00 92 3f 40 81 70 82 3f 40 00 92 40 40 83 60 82 40 40 00 92
3f 40 78 82 3f 40 00 92 3d 40 78 82 3d 40 00 92 3f 40 78 82 3f 40 00 92 41 40 3c 82 41 40 00 92 42 40 3c 82 42 40 00 92
44 40 78 82 44 40 00 92 44 40 78 82 44 40 78 92 3d 40 78 82 3d 40 00 92 3f 40 78 82 3f 40 00 92 3d 40 78 82 3d 40 00 92
3c 40 81 70 82 3c 40 00 92 3d 40 83 60 82 3d 40 00 92 3f 40 81 70 82 3f 40 00 92 3d 40 78 82 3d 40 00 92 3d 40 78 82 3d
40 00 92 42 40 78 82 42 40 00 92 42 40 78 82 42 40 00 92 42 40 78 82 42 40 00 92 40 40 3c 82 40 40 00 92 3f 40 3c 82 3f
40 00 92 40 40 78 82 40 40 00 92 42 40 3c 82 42 40 00 92 44 40 3c 82 44 40 00 92 46 40 81 70 82 46 40 00 92 3f 40 83 60
82 3f 40 00 92 40 40 81 70 82 40 40 00 92 3f 40 82 68 82 3f 40 00 92 40 40 3c 82 40 40 00 92 42 40 3c 82 42 40 00 92 41
40 78 82 41 40 00 92 3d 40 83 60 82 3d 40 00 92 3d 40 78 82 3d 40 00 92 42 40 78 82 42 40 00 92 42 40 78 82 42 40 00 92
42 40 81 70 82 42 40 00 92 41 40 78 82 41 40 00 92 3f 40 78 82 3f 40 00 92 41 40 83 60 82 41 40 77 90 00 00 00 ff 2f 00
4d 54 72 6b 00 00 07 ac 8b 20 93 38 40 83 60 83 38 40 00 93 37 40 81 70 83 37 40 00 93 3b 40 81 70 83 3b 40 00 93 3a 40
83 60 83 3a 40 00 93 38 40 81 70 83 38 40 00 93 39 40 82 68 83 39 40 00 93 38 40 3c 83 38 40 00 93 36 40 3c 83 36 40 00
93 38 40 78 83 38 40 00 93 3d 40 78 83 3d 40 00 93 36 40 78 83 36 40 00 93 38 40 3c 83 38 40 00 93 39 40 3c 83 39 40 00
93 3b 40 82 68 83 3b 40 00 93 39 40 78 83 39 40 00 93 38 40 78 83 38 40 00 93 36 40 78 83 36 40 00 93 38 40 81 70 83 38
40 00 93 36 40 78 83 36 40 00 93 34 40 78 83 34 40 00 93 33 40 82 68 83 33 40 00 93 32 40 78 83 32 40 00 93 31 40 87 40
83 31 40 90 70 93 38 40 81 70 83 38 40 00 93 37 40 81 70 83 37 40 00 93 3b 40 81 70 83 3b 40 00 93 3a 40 83 60 83 3a 40
00 93 38 40 78 83 38 40 00 93 39 40 78 83 39 40 00 93 38 40 78 83 38 40 00 93 36 40 78 83 36 40 00 93 35 40 81 70 83 35
40 00 93 39 40 81 70 83 39 40 00 93 38 40 83 60 83 38 40 00 93 36 40 84 58 83 36 40 00 93 38 40 3c 83 38 40 00 93 36 40
3c 83 36 40 00 93 34 40 78 83 34 40 00 93 36 40 3c 83 36 40 00 93 38 40 3c 83 38 40 00 93 39 40 78 83 39 40 00 93 36 40
78 83 36 40 00 93 38 40 81 70 83 38 40 00 93 31 40 89 30 83 31 40 00 93 36 40 81 70 83 36 40 00 93 34 40 78 83 34 40 00
93 33 40 78 83 33 40 00 93 34 40 78 83 34 40 00 93 36 40 78 83 36 40 00 93 38 40 78 83 38 40 00 93 36 40 78 83 36 40 00
93 38 40 78 83 38 40 00 93 39 40 78 83 39 40 00 93 3b 40 89 30 83 3b 40 00 93 3d 40 81 70 83 3d 40 00 93 3c 40 81 70 83
3c 40 00 93 40 40 81 70 83 40 40 00 93 3f 40 83 60 83 3f 40 00 93 3d 40 84 58 83 3d 40 00 93 3b 40 78 83 3b 40 00 93 3a
40 78 83 3a 40 00 93 38 40 81 70 83 38 40 00 93 37 40 3c 83 37 40 00 93 35 40 3c 83 35 40 00 93 37 40 81 70 83 37 40 00
93 38 40 3c 83 38 40 00 93 3a 40 3c 83 3a 40 00 93 38 40 3c 83 38 40 00 93 37 40 3c 83 37 40 00 93 38 40 3c 83 38 40 00
93 3a 40 3c 83 3a 40 00 93 3b 40 3c 83 3b 40 00 93 38 40 3c 83 38 40 00 93 39 40 3c 83 39 40 00 93 3b 40 3c 83 3b 40 00
93 39 40 3c 83 39 40 00 93 38 40 3c 83 38 40 00 93 3a 40 3c 83 3a 40 00 93 3b 40 3c 83 3b 40 00 93 3d 40 3c 83 3d 40 00
93 3a 40 3c 83 3a 40 00 93 3b 40 3c 83 3b 40 00 93 3d 40 3c 83 3d 40 00 93 3b 40 3c 83 3b 40 00 93 3a 40 3c 83 3a 40 00
93 3c 40 3c 83 3c 40 00 93 3d 40 3c 83 3d 40 00 93 3f 40 3c 83 3f 40 00 93 3c 40 3c 83 3c 40 00 93 3d 40 83 60 83 3d 40
98 30 93 36 40 81 70 83 36 40 00 93 35 40 81 70 83 35 40 00 93 39 40 81 70 83 39 40 00 93 38 40 83 60 83 38 40 00 93 36
40 83 60 83 36 40 93 58 93 38 40 78 83 38 40 00 93 3d 40 78 83 3d 40 00 93 3d 40 78 83 3d 40 00 93 3d 40 78 83 3d 40 00
93 3c 40 3c 83 3c 40 00 93 3a 40 3c 83 3a 40 00 93 3c 40 81 70 83 3c 40 00 93 3d 40 81 70 83 3d 40 00 93 39 40 81 70 83
39 40 00 93 36 40 81 70 83 36 40 00 93 38 40 81 70 83 38 40 00 93 35 40 81 70 83 35 40 00 93 36 40 81 70 83 36 40 00 93
38 40 83 60 83 38 40 00 93 33 40 83 60 83 33 40 9b 18 93 2c 40 78 83 2c 40 00 93 31 40 78 83 31 40 00 93 31 40 78 83 31
40 00 93 31 40 78 83 31 40 00 93 30 40 3c 83 30 40 00 93 2e 40 3c 83 2e 40 00 93 30 40 81 70 83 30 40 00 93 31 40 81 70
83 31 40 90 70 93 31 40 83 60 83 31 40 00 93 30 40 81 70 83 30 40 00 93 34 40 81 70 83 34 40 00 93 33 40 83 60 83 33 40
00 93 31 40 78 83 31 40 00 93 34 40 78 83 34 40 00 93 39 40 78 83 39 40 00 93 39 40 78 83 39 40 00 93 39 40 78 83 39 40
00 93 38 40 3c 83 38 40 00 93 36 40 3c 83 36 40 00 93 38 40 83 60 83 38 40 00 93 36 40 81 70 83 36 40 00 93 38 40 83 60
83 38 40 00 93 39 40 81 70 83 39 40 00 93 36 40 82 2c 83 36 40 00 93 36 40 3c 83 36 40 00 93 34 40 3c 83 34 40 00 93 33
40 3c 83 33 40 00 93 34 40 78 83 34 40 00 93 31 40 78 83 31 40 00 93 38 40 83 60 83 38 40 00 93 36 40 81 70 83 36 40 00
93 33 40 81 70 83 33 40 00 93 34 40 3c 83 34 40 00 93 33 40 3c 83 33 40 00 93 34 40 3c 83 34 40 00 93 36 40 3c 83 36 40
00 93 34 40 3c 83 34 40 00 93 33 40 3c 83 33 40 00 93 31 40 3c 83 31 40 00 93 34 40 3c 83 34 40 00 93 33 40 3c 83 33 40
00 93 31 40 3c 83 31 40 00 93 33 40 3c 83 33 40 00 93 34 40 3c 83 34 40 00 93 33 40 3c 83 33 40 00 93 31 40 3c 83 31 40
00 93 30 40 3c 83 30 40 00 93 33 40 3c 83 33 40 00 93 31 40 78 83 31 40 00 93 34 40 78 83 34 40 00 93 39 40 78 83 39 40
00 93 39 40 78 83 39 40 00 93 39 40 78 83 39 40 00 93 37 40 3c 83 37 40 00 93 36 40 3c 83 36 40 00 93 34 40 81 70 83 34
40 78 93 36 40 78 83 36 40 00 93 3b 40 78 83 3b 40 00 93 3b 40 78 83 3b 40 00 93 3b 40 78 83 3b 40 00 93 39 40 3c 83 39
40 00 93 38 40 3c 83 38 40 00 93 39 40 3c 83 39 40 00 93 38 40 3c 83 38 40 00 93 36 40 3c 83 36 40 00 93 34 40 3c 83 34
40 00 93 33 40 81 70 83 33 40 78 93 38 40 78 83 38 40 00 93 3f 40 78 83 3f 40 00 93 3f 40 78 83 3f 40 00 93 3f 40 78 83
3f 40 00 93 3d 40 3c 83 3d 40 00 93 3c 40 3c 83 3c 40 00 93 3d 40 83 60 83 3d 40 00 93 3c 40 81 70 83 3c 40 00 93 40 40
82 68 83 40 40 00 93 31 40 78 83 31 40 00 93 36 40 78 83 36 40 00 93 36 40 78 83 36 40 00 93 36 40 78 83 36 40 00 93 35
40 3c 83 35 40 00 93 33 40 3c 83 33 40 00 93 31 40 83 60 83 31 40 00 93 33 40 82 68 83 33 40 00 93 33 40 78 83 33 40 00
93 38 40 78 83 38 40 00 93 38 40 78 83 38 40 00 93 38 40 78 83 38 40 00 93 36 40 3c 83 36 40 00 93 34 40 3c 83 34 40 00
93 36 40 78 83 36 40 00 93 36 40 78 83 36 40 00 93 36 40 78 83 36 40 00 93 34 40 3c 83 34 40 00 93 33 40 3c 83 33 40 00
93 34 40 78 83 34 40 00 93 33 40 3c 83 33 40 00 93 31 40 3c 83 31 40 00 93 33 40 78 83 33 40 00 93 2c 40 78 83 2c 40 00
93 31 40 78 83 31 40 00 93 31 40 78 83 31 40 00 93 31 40 78 83 31 40 00 93 2f 40 3c 83 2f 40 00 93 2e 40 3c 83 2e 40 00
93 33 40 82 2c 83 33 40 00 93 34 40 3c 83 34 40 00 93 36 40 81 34 83 36 40 00 93 34 40 3c 83 34 40 00 93 33 40 3c 83 33
40 00 93 31 40 3c 83 31 40 00 93 38 40 83 60 83 38 40 00 93 39 40 82 68 83 39 40 00 93 38 40 3c 83 38 40 00 93 39 40 3c
83 39 40 00 93 3b 40 78 83 3b 40 00 93 39 40 78 83 39 40 00 93 38 40 78 83 38 40 00 93 36 40 78 83 36 40 00 93 3d 40 78
83 3d 40 00 93 3b 40 3c 83 3b 40 00 93 39 40 3c 83 39 40 00 93 38 40 78 83 38 40 00 93 36 40 78 83 36 40 00 93 38 40 83
60 83 38 40 77 90 00 00 00 ff 2f 00 4d 54 72 6b 00 00 07 cd 00 90 31 40 83 60 80 31 40 00 90 30 40 81 70 80 30 40 00 90
34 40 81 70 80 34 40 00 90 33 40 83 60 80 33 40 00 90 31 40 78 80 31 40 00 90 33 40 78 80 33 40 00 90 34 40 82 68 80 34
40 00 90 33 40 3c 80 33 40 00 90 31 40 3c 80 31 40 00 90 33 40 78 80 33 40 00 90 38 40 78 80 38 40 00 90 31 40 78 80 31
40 00 90 33 40 3c 80 33 40 00 90 34 40 3c 80 34 40 00 90 36 40 82 68 80 36 40 00 90 34 40 78 80 34 40 00 90 33 40 78 80
33 40 00 90 31 40 78 80 31 40 00 90 33 40 81 70 80 33 40 00 90 31 40 82 68 80 31 40 00 90 2f 40 78 80 2f 40 00 90 2d 40
78 80 2d 40 00 90 2c 40 78 80 2c 40 00 90 2d 40 81 70 80 2d 40 00 90 2e 40 81 70 80 2e 40 00 90 30 40 81 70 80 30 40 00
90 31 40 81 70 80 31 40 00 90 2c 40 78 80 2c 40 00 90 2d 40 78 80 2d 40 00 90 2f 40 82 68 80 2f 40 00 90 2d 40 78 80 2d
40 00 90 2c 40 78 80 2c 40 00 90 2a 40 78 80 2a 40 00 90 31 40 81 70 80 31 40 00 90 2d 40 82 68 80 2d 40 00 90 2c 40 78
80 2c 40 00 90 2a 40 78 80 2a 40 00 90 28 40 78 80 28 40 00 90 2a 40 81 70 80 2a 40 00 90 2c 40 81 70 80 2c 40 00 90 2d
40 78 80 2d 40 00 90 2c 40 78 80 2c 40 00 90 2d 40 78 80 2d 40 00 90 2f 40 78 80 2f 40 00 90 31 40 78 80 31 40 00 90 2f
40 78 80 2f 40 00 90 31 40 78 80 31 40 00 90 33 40 78 80 33 40 00 90 34 40 81 70 80 34 40 00 90 31 40 82 68 80 31 40 00
90 2f 40 78 80 2f 40 00 90 2e 40 78 80 2e 40 00 90 2c 40 78 80 2c 40 00 90 31 40 81 70 80 31 40 00 90 33 40 81 70 80 33
40 00 90 2c 40 81 70 80 2c 40 9a 20 90 2f 40 81 70 80 2f 40 00 90 2e 40 81 70 80 2e 40 00 90 33 40 81 70 80 33 40 00 90
31 40 83 60 80 31 40 00 90 2f 40 84 58 80 2f 40 00 90 38 40 78 80 38 40 00 90 36 40 78 80 36 40 00 90 34 40 78 80 34 40
00 90 3b 40 81 70 80 3b 40 00 90 2f 40 81 70 80 2f 40 00 90 34 40 81 70 80 34 40 00 90 39 40 81 70 80 39 40 00 90 38 40
81 70 80 38 40 00 90 3d 40 83 60 80 3d 40 00 90 3c 40 81 70 80 3c 40 00 90 3d 40 81 70 80 3d 40 95 48 90 31 40 3c 80 31
40 00 90 33 40 3c 80 33 40 00 90 34 40 78 80 34 40 00 90 36 40 78 80 36 40 00 90 38 40 3c 80 38 40 00 90 36 40 3c 80 36
40 00 90 38 40 3c 80 38 40 00 90 39 40 3c 80 39 40 00 90 38 40 3c 80 38 40 00 90 36 40 3c 80 36 40 00 90 34 40 3c 80 34
40 00 90 38 40 3c 80 38 40 00 90 36 40 3c 80 36 40 00 90 34 40 3c 80 34 40 00 90 36 40 3c 80 36 40 00 90 38 40 3c 80 38
40 00 90 36 40 3c 80 36 40 00 90 34 40 3c 80 34 40 00 90 33 40 3c 80 33 40 00 90 36 40 3c 80 36 40 00 90 34 40 3c 80 34
40 00 90 33 40 3c 80 33 40 00 90 34 40 3c 80 34 40 00 90 36 40 3c 80 36 40 00 90 34 40 3c 80 34 40 00 90 39 40 3c 80 39
40 00 90 38 40 3c 80 38 40 00 90 39 40 3c 80 39 40 00 90 33 40 3c 80 33 40 00 90 31 40 3c 80 31 40 00 90 33 40 3c 80 33
40 00 90 34 40 3c 80 34 40 00 90 33 40 3c 80 33 40 00 90 38 40 3c 80 38 40 00 90 36 40 3c 80 36 40 00 90 38 40 3c 80 38
40 00 90 31 40 81 70 80 31 40 95 48 90 34 40 78 80 34 40 00 90 39 40 78 80 39 40 00 90 39 40 78 80 39 40 00 90 39 40 78
80 39 40 00 90 38 40 3c 80 38 40 00 90 36 40 3c 80 36 40 00 90 38 40 81 70 80 38 40 00 90 39 40 81 70 80 39 40 00 90 36
40 81 70 80 36 40 00 90 2f 40 81 70 80 2f 40 00 90 34 40 81 70 80 34 40 00 90 2d 40 83 60 80 2d 40 00 90 2c 40 81 70 80
2c 40 91 68 90 2c 40 78 80 2c 40 00 90 31 40 78 80 31 40 00 90 31 40 78 80 31 40 00 90 31 40 78 80 31 40 00 90 2f 40 3c
80 2f 40 00 90 2e 40 3c 80 2e 40 00 90 2f 40 3c 80 2f 40 00 90 2e 40 3c 80 2e 40 00 90 2c 40 3c 80 2c 40 00 90 2f 40 3c
80 2f 40 00 90 2e 40 3c 80 2e 40 00 90 2c 40 3c 80 2c 40 00 90 2e 40 3c 80 2e 40 00 90 2f 40 3c 80 2f 40 00 90 2e 40 3c
80 2e 40 00 90 2c 40 3c 80 2c 40 00 90 2a 40 3c 80 2a 40 00 90 2e 40 3c 80 2e 40 00 90 2c 40 3c 80 2c 40 00 90 2a 40 3c
80 2a 40 00 90 2c 40 3c 80 2c 40 00 90 2e 40 3c 80 2e 40 00 90 2c 40 3c 80 2c 40 00 90 2f 40 3c 80 2f 40 00 90 2e 40 3c
80 2e 40 00 90 2c 40 3c 80 2c 40 00 90 2b 40 81 70 80 2b 40 00 90 2c 40 81 70 80 2c 40 00 90 2e 40 81 70 80 2e 40 00 90
33 40 81 70 80 33 40 00 90 2c 40 81 70 80 2c 40 85 50 90 25 40 83 60 80 25 40 00 90 30 40 81 70 80 30 40 00 90 28 40 81
70 80 28 40 00 90 27 40 83 60 80 27 40 00 90 25 40 78 80 25 40 00 90 25 40 3c 80 25 40 00 90 27 40 3c 80 27 40 00 90 28
40 78 80 28 40 00 90 2a 40 78 80 2a 40 00 90 2c 40 3c 80 2c 40 00 90 2a 40 3c 80 2a 40 00 90 2c 40 3c 80 2c 40 00 90 2d
40 3c 80 2d 40 00 90 2c 40 3c 80 2c 40 00 90 2a 40 3c 80 2a 40 00 90 28 40 3c 80 28 40 00 90 2c 40 3c 80 2c 40 00 90 2a
40 3c 80 2a 40 00 90 28 40 3c 80 28 40 00 90 2a 40 3c 80 2a 40 00 90 2c 40 3c 80 2c 40 00 90 2a 40 3c 80 2a 40 00 90 28
40 3c 80 28 40 00 90 27 40 3c 80 27 40 00 90 2a 40 3c 80 2a 40 00 90 28 40 78 80 28 40 00 90 34 40 78 80 34 40 00 90 39
40 78 80 39 40 00 90 39 40 78 80 39 40 00 90 39 40 78 80 39 40 00 90 38 40 3c 80 38 40 00 90 36 40 3c 80 36 40 00 90 38
40 78 80 38 40 00 90 2c 40 78 80 2c 40 00 90 31 40 78 80 31 40 00 90 2f 40 78 80 2f 40 00 90 2d 40 81 70 80 2d 40 00 90
2c 40 78 80 2c 40 8f 00 90 31 40 78 80 31 40 00 90 36 40 78 80 36 40 00 90 36 40 78 80 36 40 00 90 36 40 78 80 36 40 00
90 35 40 3c 80 35 40 00 90 33 40 3c 80 33 40 00 90 35 40 81 70 80 35 40 00 90 36 40 81 70 80 36 40 86 48 90 2c 40 78 80
2c 40 00 90 31 40 78 80 31 40 00 90 31 40 78 80 31 40 00 90 31 40 78 80 31 40 00 90 30 40 3c 80 30 40 00 90 2e 40 3c 80
2e 40 00 90 30 40 3c 80 30 40 00 90 31 40 3c 80 31 40 00 90 33 40 3c 80 33 40 00 90 30 40 3c 80 30 40 00 90 28 40 81 70
80 28 40 78 90 2d 40 78 80 2d 40 00 90 27 40 81 70 80 27 40 78 90 2c 40 78 80 2c 40 00 90 25 40 78 80 25 40 8c 18 90 31
40 81 70 80 31 40 00 90 30 40 81 70 80 30 40 00 90 34 40 81 70 80 34 40 00 90 33 40 83 60 80 33 40 00 90 31 40 78 80 31
40 00 90 34 40 78 80 34 40 00 90 39 40 78 80 39 40 00 90 39 40 78 80 39 40 00 90 39 40 78 80 39 40 00 90 38 40 3c 80 38
40 00 90 36 40 3c 80 36 40 00 90 34 40 3c 80 34 40 00 90 33 40 3c 80 33 40 00 90 31 40 3c 80 31 40 00 90 2f 40 3c 80 2f
40 00 90 2e 40 81 70 80 2e 40 00 90 2d 40 82 68 80 2d 40 00 90 2c 40 3c 80 2c 40 00 90 2a 40 3c 80 2a 40 00 90 29 40 81
70 80 29 40 00 90 2a 40 83 60 80 2a 40 00 90 2c 40 8f 00 80 2c 40 00 90 2b 40 83 60 80 2b 40 00 90 2c 40 87 40 80 2c 40
00 90 31 40 8f 00 80 31 40 77 90 00 00 00 ff 2f 00
Le programme suivant prend un fichier MIDI multi-track avec trois pistes ou plus et divise chaque piste dans un fichier MIDI séparé. La piste d'expression du fichier MIDI d'origine est copiée dans la 0e piste des nouveaux fichiers MIDI, et les pistes individuelles du premier fichier MIDI sont copiées sur la première piste des fichiers MIDI de sortie.
# include " MidiFile.h "
# include < iostream >
# include < vector >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
if (argc != 3 ) {
cerr << " Usage: " << argv[ 0 ] << " input output " << endl;
return 1 ;
}
MidiFile midifile (argv[ 1 ]);
if (!midifile. status ()) {
cerr << " Problem reading input " << endl;
return 1 ;
}
if (midifile. getTrackCount () < 3 ) {
cerr << " Not enough tracks to split " << endl;
return 1 ;
}
string basename = argv[ 2 ];
if (basename. substr (basename. size () - 4 ) == " .mid " )
basename = basename. substr ( 0 , basename. size () - 4 );
int outcount = midifile. getTrackCount () - 1 ;
vector<MidiFile> outputs (outcount);
for ( int i= 0 ; i<outcount; i++) {
outputs[i]. addTrack ();
for ( int j= 0 ; j<midifile[ 0 ]. getEventCount (); j++)
outputs[i]. addEvent (midifile[ 0 ][j]);
for ( int j= 0 ; j<midifile[i+ 1 ]. getEventCount (); j++)
outputs[i]. addEvent ( 1 , midifile[i+ 1 ][j]);
}
for ( int i= 0 ; i<outcount; i++)
outputs[i]. write (basename + " - " + to_string (i+ 1 ) + " .mid " );
return 0 ;
}Voici le premier fichier extrait de l'entrée de fichier MIDI pour l'exemple de tempérament:
4d 54 68 64 00 00 00 06 00 01 00 02 00 78 4d 54 72 6b 00 00 00 13 00 ff 51
03 08 8e 6c 00 ff 58 04 02 01 30 08 00 ff 2f 00 4d 54 72 6b 00 00 09 bd b2
50 90 49 40 81 70 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80
4c 40 00 90 4b 40 83 60 80 4b 40 00 90 49 40 82 68 80 49 40 00 90 4b 40 78
80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4b 40 78 80 4b 40 00 90 49 40 81 70
80 49 40 00 90 47 40 81 70 80 47 40 00 90 49 40 81 70 80 49 40 00 90 4b 40
81 70 80 4b 40 82 68 90 4c 40 78 80 4c 40 00 90 4b 40 78 80 4b 40 00 90 49
40 78 80 49 40 00 90 47 40 78 80 47 40 00 90 4b 40 78 80 4b 40 00 90 50 40
82 68 80 50 40 00 90 4e 40 78 80 4e 40 00 90 50 40 78 80 50 40 00 90 51 40
78 80 51 40 00 90 53 40 84 58 80 53 40 00 90 51 40 78 80 51 40 00 90 50 40
78 80 50 40 00 90 4e 40 78 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c
80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 83 60
80 49 40 00 90 47 40 82 68 80 47 40 00 90 49 40 78 80 49 40 00 90 47 40 78
80 47 40 00 90 45 40 78 80 45 40 00 90 44 40 81 70 80 44 40 00 90 46 40 78
80 46 40 00 90 47 40 78 80 47 40 00 90 49 40 81 70 80 49 40 00 90 47 40 83
60 80 47 40 00 90 46 40 81 70 80 46 40 00 90 47 40 84 58 80 47 40 00 90 49
40 78 80 49 40 00 90 4b 40 78 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4c 40
81 70 80 4c 40 00 90 4b 40 81 70 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4b
40 78 80 4b 40 00 90 4c 40 78 80 4c 40 00 90 4e 40 78 80 4e 40 00 90 50 40
3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 51 40 3c
80 51 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80
4c 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c
40 00 90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40
00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4e 40 3c 80 4e 40 00
90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 3c 80 4c 40 00 90
4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49
40 3c 80 49 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40
3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c
80 4b 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 4b 40 3c 80
4b 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 49 40 3c 80 49
40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40
00 90 46 40 3c 80 46 40 00 90 49 40 3c 80 49 40 00 90 47 40 82 2c 80 47 40
00 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 47 40 3c 80 47 40 00
90 49 40 82 68 80 49 40 00 90 4c 40 78 80 4c 40 00 90 4b 40 82 68 80 4b 40
00 90 4e 40 78 80 4e 40 00 90 4c 40 84 58 80 4c 40 00 90 4b 40 81 70 80 4b
40 00 90 49 40 81 70 80 49 40 00 90 48 40 3c 80 48 40 00 90 46 40 3c 80 46
40 00 90 48 40 78 80 48 40 00 90 4b 40 78 80 4b 40 00 90 50 40 3c 80 50 40
00 90 4e 40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 51 40 3c 80 51 40 00
90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90
50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e
40 3c 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40
3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4e 40 3c 80 4e 40 00 90 4d 40 81
70 80 4d 40 00 90 51 40 81 70 80 51 40 00 90 50 40 84 58 80 50 40 00 90 4e
40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 81 70 80 4a 40 78 90 49
40 78 80 49 40 00 90 4e 40 78 80 4e 40 00 90 4e 40 78 80 4e 40 00 90 4e 40
78 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 4c 40 82
68 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4a 40 83
60 80 4a 40 00 90 49 40 81 70 80 49 40 00 90 4e 40 81 70 80 4e 40 00 90 4c
40 81 70 80 4c 40 00 90 4c 40 81 34 80 4c 40 00 90 4e 40 3c 80 4e 40 00 90
4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4c
40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4a 40
3c 80 4a 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c
80 49 40 00 90 47 40 3c 80 47 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 83 60
80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80 4c 40 00 90 4b 40
84 58 80 4b 40 00 90 44 40 78 80 44 40 00 90 49 40 78 80 49 40 00 90 49 40
78 80 49 40 00 90 49 40 78 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40 3c
80 45 40 00 90 47 40 83 60 80 47 40 00 90 45 40 81 70 80 45 40 00 90 44 40
81 70 80 44 40 81 70 90 4b 40 83 60 80 4b 40 00 90 4a 40 81 70 80 4a 40 00
90 4e 40 81 70 80 4e 40 00 90 4d 40 81 70 80 4d 40 00 90 4c 40 81 70 80 4c
40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40
00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00
90 47 40 3c 80 47 40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90
47 40 3c 80 47 40 00 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 49
40 3c 80 49 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 49 40
3c 80 49 40 00 90 48 40 81 70 80 48 40 00 90 47 40 81 70 80 47 40 00 90 46
40 81 70 80 46 40 00 90 45 40 81 70 80 45 40 00 90 44 40 81 70 80 44 40 89
30 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90 4c 40 81 70 80
4c 40 00 90 4b 40 85 50 80 4b 40 00 90 49 40 83 60 80 49 40 00 90 48 40 81
70 80 48 40 78 90 49 40 3c 80 49 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 78
80 4c 40 00 90 4e 40 78 80 4e 40 00 90 50 40 3c 80 50 40 00 90 4e 40 3c 80
4e 40 00 90 50 40 3c 80 50 40 00 90 51 40 3c 80 51 40 00 90 50 40 3c 80 50
40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 50 40 3c 80 50 40
00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 3c 80 4e 40 00
90 50 40 3c 80 50 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90
4b 40 3c 80 4b 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b
40 3c 80 4b 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 3c 80 4e 40 00 90 4c 40
3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4c 40 3c
80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40 00 90 4a 40 3c 80
4a 40 00 90 4c 40 3c 80 4c 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49
40 00 90 47 40 3c 80 47 40 00 90 4a 40 3c 80 4a 40 00 90 49 40 3c 80 49 40
00 90 47 40 3c 80 47 40 00 90 49 40 3c 80 49 40 00 90 4a 40 3c 80 4a 40 00
90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40 3c 80 45 40 00 90
49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40 3c 80 45 40 00 90 47
40 3c 80 47 40 00 90 49 40 3c 80 49 40 00 90 47 40 3c 80 47 40 00 90 45 40
3c 80 45 40 00 90 44 40 3c 80 44 40 00 90 47 40 3c 80 47 40 00 90 45 40 81
70 80 45 40 81 70 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90
4c 40 81 70 80 4c 40 00 90 4b 40 84 58 80 4b 40 00 90 49 40 78 80 49 40 00
90 50 40 78 80 50 40 00 90 50 40 78 80 50 40 00 90 50 40 78 80 50 40 00 90
4e 40 3c 80 4e 40 00 90 4c 40 3c 80 4c 40 00 90 4e 40 81 70 80 4e 40 00 90
4c 40 83 60 80 4c 40 00 90 4b 40 81 70 80 4b 40 00 90 4f 40 81 70 80 4f 40
00 90 4e 40 81 70 80 4e 40 00 90 42 40 81 70 80 42 40 00 90 41 40 81 70 80
41 40 00 90 45 40 81 70 80 45 40 00 90 44 40 78 80 44 40 83 60 90 48 40 78
80 48 40 00 90 4e 40 78 80 4e 40 00 90 4e 40 78 80 4e 40 00 90 4e 40 78 80
4e 40 00 90 4c 40 3c 80 4c 40 00 90 4b 40 3c 80 4b 40 00 90 4c 40 78 80 4c
40 00 90 4b 40 3c 80 4b 40 00 90 49 40 3c 80 49 40 00 90 4b 40 78 80 4b 40
00 90 48 40 78 80 48 40 00 90 49 40 85 50 80 49 40 00 90 48 40 81 70 80 48
40 00 90 47 40 81 70 80 47 40 00 90 46 40 81 70 80 46 40 00 90 45 40 81 70
80 45 40 00 90 44 40 83 60 80 44 40 00 90 46 40 81 70 80 46 40 00 90 48 40
81 70 80 48 40 00 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40 00 90
4c 40 83 60 80 4c 40 00 90 4b 40 78 80 4b 40 00 90 49 40 78 80 49 40 00 90
48 40 81 70 80 48 40 00 90 49 40 83 60 80 49 40 00 90 48 40 81 70 80 48 40
00 90 49 40 8f 00 80 49 40 77 90 00 00 00 ff 2f 00
Cet exemple démontre la génération d'un vibrato constant pour les notes dans un fichier MIDI (sur un canal particulier). Le programme ajoute une piste supplémentaire à la fin du fichier pour stocker les virages de pitch. Le débit de vibrato est constant quel que soit le réglage du tempo pour le fichier MIDI, car le vibrato est calculé en temps physique plutôt que de tic. La fonction MidiFile::getAbsoluteTickTime() calcule la conversion entre l'heure physique en secondes et le temps de tic dans le fichier MIDI.
# include " MidiFile.h "
# include " Options.h "
# include < iostream >
# include < utility >
# include < cmath >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. define ( " f|frequency=d:4.0 " , " vibrato frequency " );
options. define ( " d|depth=d:20.0 " , " vibrato depth in cents " );
options. define ( " b|bend-max=d:200.0 " , " pitch bend depth " );
options. define ( " s|sample-rate=d:100.0 " , " sample rate " );
options. define ( " o|output-file=s " , " output filename " );
options. define ( " c|channel=i:0 " , " output channel " );
options. process (argc, argv);
MidiFile midifile;
if (options. getArgCount () == 0 ) midifile. read (cin);
else midifile. read (options. getArg ( 1 ));
if (!midifile. status ()) {
cerr << " Problem reading file " << endl;
return 1 ;
}
string filename = options. getString ( " output-file " );
int channel = options. getInteger ( " channel " );
double freq = options. getDouble ( " frequency " );
double depth = options. getDouble ( " depth " );
double bend = options. getDouble ( " bend-max " );
double srate = options. getDouble ( " sample-rate " );
double phase = 0.0 ;
double twopi = 2.0 * M_PI;
double increment = twopi * freq / srate;
double maxtime = midifile. getFileDurationInSeconds ();
midifile. addTrack (); // store vibrato in separate track
pair< int , double > tickbend;
vector<pair< double , double >> storage;
int count = maxtime * srate;
storage. reserve (maxtime * srate + 1000 );
for ( int i= 0 ; i<count; i++) {
tickbend. first = int (midifile. getAbsoluteTickTime (i/srate) + 0.5 );
tickbend. second = depth/bend * sin (phase);
if ((storage. size () > 0 ) && (tickbend. first == 0 )) break ;
storage. push_back (tickbend);
phase += increment;
if (phase > twopi) phase -= twopi;
}
int track = midifile. getTrackCount () - 1 ;
for ( int i= 0 ; i<( int )storage. size (); i++)
midifile. addPitchBend (track, storage[i]. first , channel, storage[i]. second );
if (filename. empty ()) cout << midifile;
else midifile. write (filename);
return 0 ;
}Voici un programme qui génère des modèles de polyrythme. Les options de ligne de commande sont:
| option | valeur par défaut | signification |
|---|---|---|
-a | 2 | Division du premier instrument du cycle |
-b | 3 | Division du premier instrument du cycle |
-c | 10 | nombre de cycles |
-d | 2.0 | durée de chaque cycle |
--key1 | 76 | Numéro de clé de percussion pour le premier instrument |
--key2 | 77 | Numéro de clé de percussion pour le premier instrument |
-o | nom de fichier de sortie |
# include " MidiFile.h "
# include " Options.h "
# include < iostream >
# include < utility >
# include < cmath >
using namespace std ;
using namespace smf ;
int main ( int argc, char ** argv) {
Options options;
options. define ( " a=i:2 " , " cycle division 1 " );
options. define ( " b=i:3 " , " cycle division 2 " );
options. define ( " c|cycle=i:10 " , " cycle count " );
options. define ( " d|dur=d:2.0 " , " duration of cycle in seconds " );
options. define ( " key1=i:76 " , " first percussion key number " );
options. define ( " key2=i:77 " , " second percussion key number " );
options. define ( " o|output-file=s " , " output filename " );
options. process (argc, argv);
int a = options. getInteger ( " a " );
int b = options. getInteger ( " b " );
int c = options. getInteger ( " cycle " );
int key1 = options. getInteger ( " key1 " );
int key2 = options. getInteger ( " key2 " );
double dur = options. getDouble ( " dur " );
double tempo = 60.0 / dur;
MidiFile midifile;
midifile. setTPQ (a*b);
midifile. addTempo ( 0 , 0 , tempo);
midifile. addTracks ( 2 );
for ( int i= 0 ; i<b*c + 1 ; i++) {
midifile. addNoteOn ( 1 , i*a, 9 , key1, 64 );
midifile. addNoteOff ( 1 , (i+ 1 )*a, 9 , key1);
}
for ( int i= 0 ; i<a*c + 1 ; i++) {
midifile. addNoteOn ( 2 , i*b, 9 , key2, 64 );
midifile. addNoteOff ( 2 , (i+ 1 )*b, 9 , key2);
}
string filename = options. getString ( " output-file " );
if (filename. empty ()) cout << midifile;
else midifile. write (filename);
return 0 ;
} Ce programme montre comment définir la valeur des tiques par quart dans l'en-tête MIDI. Dans ce cas, il est défini sur le facteur de a*b qui est la durée d'un cycle (donc chaque cycle a la durée d'un quart de note). Un méta-message tempo est également calculé en fonction de la durée souhaitée d'un cycle.
Par exemple, essayez les options -a 3 -b 4 -c 200 -d 1 -o 3x4.mid , qui jouera un motif 3-Against-4 pour 200 cycles à chaque cycle durant 1 seconde. Ou voici 11-Against-13 pour 100 cycles: -a 11 -b 13 -c 100 -d 5 -o 11x13.mid .