Midifile هي مكتبة من فئات C ++ لقراءة/كتابة ملفات MIDI القياسية. تتكون المكتبة من 6 فصول:
| midifile | الواجهة الرئيسية للتعامل مع ملفات MIDI. تظهر فئة Midifile كصفيف ثنائي الأبعاد من الوسيطة: البعد الأول هو قائمة بالمسارات ، والبعد الثاني هو قائمة من الوسيطة. |
| MidieventList | بنية البيانات التي تدير قائمة الوسيطة لمسار ملف MIDI. |
| الوسطى | وحدة التخزين الأولية ل midimessages في midifile. يتكون الفصل من طابع زمني للعلامة (دلتا أو مطلقة) ومتجه من بايتات رسالة MIDI (أو رسائل MIDI META القياسية). |
| midimessage | الفئة الأساسية للوسط. هذا هو ناقل STL من البايتات غير الموقعة التي تمثل رسالة MIDI (أو التعريف). |
| binasc | فصل مساعد لـ Midifile يسمح بقراءة/كتابة ملفات MIDI بتنسيق ASCII يصف بايت ملفات MIDI الثنائية. |
| خيارات | فئة الراحة الاختيارية المستخدمة في تحليل خيارات سطر الأوامر في البرامج المثال. يمكن إزالة هذه الفئة من المكتبة لأنه غير ضروري لاستخدام فئة Midifile. |
فيما يلي تخطيطية لكيفية استخدام الطبقات معًا:

تحتوي فئة MidiFile على متجه من المسارات المخزنة في كائنات MidiEventList . تعد MidiEventList نفسها متجهًا لـ MidiEvent S ، الذي يخزن كل حدث MIDI في المسار. يحتوي MidiEvent S على طابع زمني و MidiMessage وهو متجه من قيم char غير موقعة ، وتخزين البايتات الخام لرسالة midi (أو message message).
الوثائق قيد الإنشاء في http://midifile.sapp.org. فيما يلي أمثلة أساسية لقراءة وكتابة ملفات MIDI.
يمكنك التنزيل كملف مضغوط من صفحة GitHub لمكتبة Midifile ، أو إذا كنت تستخدم GIT ، ثم قم بتنزيلها باستخدام هذا الأمر:
git clone https://github.com/craigsapp/midifile سيؤدي ذلك إلى إنشاء دليل midifile مع الرمز المصدر للمكتبة.
يمكن تجميع المكتبة مع الأمر:
make library سيؤدي ذلك إلى إنشاء ملف lib/libmidifile.a الذي يمكن استخدامه لربط البرامج التي تستخدم المكتبة. يمكن تجميع البرامج على سبيل المثال مع الأمر:
make programs سيؤدي ذلك إلى تجميع جميع البرامج المثال في دليل الأدوات. سيتم تخزين برامج مثال المترجمة في دليل bin . لتجميع كل من المكتبة والمثال على البرامج في خطوة واحدة ، اكتب:
make لتجميع برنامج واحد فقط ، مثل createmidifile ، اكتب:
make createmidifile يمكنك أيضًا وضع برامجك الخاصة في tools ، مثل myprogram.cpp ولجمع النوع:
make myprogram سيكون البرنامج المترجم bin/myprogram .
أسهل طريقة لاستخدام مكتبة Midifile في مشروعك هي نسخ ملفات الرأس في الدليل include وملفات الرمز المصدر في دليل src في مشروعك الخاص. لا تحتاج MidiFile Options.cpp Options.h تستخدم مشاريع Verovio و Midiroll على Github هذه الطريقة لاستخدام مكتبة Midifile. بدلاً من ذلك ، يمكنك توتر مستودع Midifile وإنشاء ملف مكتبة مُجمع من الكود المصدري الذي يمكن نسخه باستخدام محتويات include في مشروعك.
يسرد البرنامج التالي جميع الوسيطة في ملف MIDI. يتكرر البرنامج على كل مسار ، وطباعة قائمة بجميع أحداث MIDI في المسار. لكل حدث ، يتم تقديم الطابع الزمني المطلق لوقت أداء رسالة MIDI ، تليها الرسالة نفسها كقائمة ببايت السداسي.
يمكنك تشغيل وظيفة MidiFile::doTimeAnalysis() لتحويل الطابع الزمني المطلق إلى ثوان ، وفقًا لأي موسى ميتا من Tempo في الملف (باستخدام وتيرة افتراضية تبلغ 120 ربعًا في الدقيقة إذا لم يكن هناك موساب استفاوية للإيقاع). يتم عرض وقت البدء المطلق للحدث في العمود الثاني من إخراج البرنامج.
يمكن استخدام وظيفة MidiFile::linkNotePairs() لمطابقة الملاحظات والملاحظات. عند الانتهاء من ذلك ، يمكنك الوصول إلى مدة الملاحظة باستخدام MidiEvent::getDurationInSeconds() للحصول على رسائل ملاحظة. يتم عرض فترات الملاحظة في العمود الثالث من إخراج البرنامج.
لاحظ أن فئات مكتبة Midifile موجودة في مساحة اسم smf ، لذلك using namespace smf; أو smf:: هناك حاجة إلى البادئات للوصول إلى الفصول.
# 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 ;
} سيقوم برنامج المثال أعلاه بقراءة اسم الملف الأول الذي يجده على سطر الأوامر ، أو سيقرأ من الإدخال القياسي إذا لم يتم العثور على وسيط. يمكن إدخال كل من ملفات MIDI القياسية الثنائية وتمثيل ASCII لملفات MIDI في البرنامج. على سبيل المثال ، احفظ النص التالي في ملف يسمى twinkle.txt لاستخدامه كبيانات إدخال. يمثل هذا المحتوى بايت Hex لملف MIDI القياسي ، والذي سيتم تحليله تلقائيًا بواسطة فئة 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
فيما يلي الإخراج من برنامج المثال بالنظر إلى بيانات الإدخال أعلاه. قيمة TPQ هي قيمة القراد لكل ربع من رأس MIDI. في هذا المثال ، تتمتع كل ربع ملاحظة بمدة 120 ملفات ملف MIDI. يحتوي ملف MIDI أعلاه على ثلاثة مسارات ، مع المسار الأول (مسار التعبير ، ليس له محتوى آخر غير رسالة META نهاية المسار ، ff 2f 00 في بايت HEX. يبدأ المسار الثاني برسالة MIDI NOTE-ON 90 48 40 (في HEX) والتي ستبدأ في تشغيل MIDI NOTE 72 (C Partave One Onsave One Middle C) مع صاخبة متوسطة (40).
TPQ: 120 المسارات: 3 المسار 0 علامة Seconds Dur Message 0 0 ff 2f 0 المسار 1 علامة 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 المسار 2 علامة 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
يتمثل السلوك الافتراضي لفئة MidiFile في تخزين أوقات العلامات المطلقة لأحداث MIDI ، المتوفرة في MidiEvent::tick ، وهو وقت الوصف من بداية الملف إلى الحدث الحالي. في ملفات MIDI القياسية ، يتم تخزين TITCH كقيم دلتا ، حيث يشير علامة الإشارة إلى المدة للانتظار منذ الرسالة السابقة في المسار. للوصول إلى قيم علامة دلتا ، يمكنك إما (1) تقوية وقت الوصفة الحالي من وقت الوصفة السابق في القائمة ، أو استدعاء MidiFile::makeDeltaTime() لتحويل قيم علامة المطلقة إلى قيم علامة دلتا.
يمكن استخدام وظيفة MidiFile::joinTracks() لتحويل البيانات المتعددة إلى تسلسل زمني واحد. يمكن عكس عملية joinTrack() عن طريق استدعاء وظيفة MidiFile::splitTracks() . فيما يلي عينة من البرنامج الذي ينضم إلى MidiEvents في مسار واحد بحيث يمكن معالجة البيانات في حلقة واحدة:
# 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 ;
}فيما يلي إخراج مسار واحد جديد. العمود الأول هو الطابع الزمني المطلق للرسالة ؛ العمود الثاني هو قيمة علامة دلتا ؛ العمود الثالث هو قيمة المسار الأصلي ؛ ويحتوي العمود الأخير على رسالة MIDI (في بايت السداسي).
TPQ: 120 المسارات: 3 علامة دلتا تتبع رسالة midi ________________________________________ 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
فيما يلي برنامج مثال لإنشاء ملف MIDI. سيقوم هذا البرنامج بإنشاء تسلسل عشوائي من الملاحظات وإلحاقها إلى نهاية المسار. بشكل افتراضي ، يحتوي كائن MidiFile على مسار واحد وسيتم كتابته كملف MIDI من النوع 0 ما لم تتم إضافة المزيد من المسارات. بعد إضافة ملاحظات إلى المسار ، يجب فرزها في تسلسل الوقت قبل كتابتها إلى ملف.
# 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 ;
}إذا لم يتم تحديد ملف إخراج ، فسيتم طباعة محتويات ملف MIDI بتنسيق binasc إلى الإخراج القياسي ، والذي يمكن قراءته مرة أخرى في كائن midifile وتحويله إلى ملف MIDI قياسي (انظر مثال القراءة/الكتابة بشكل أكبر لأسفل عن كيفية القيام بذلك):
"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
فيما يلي بيانات MIDI التي تم تصورها مع برنامج مثال MID2SVG:

يمكن استخدام خيار -x لإخراج البيانات كأرفف بايت Hex ، والخيار -n يتحكم في عدد الملاحظات ، و -i # يحدد رقم الأداة المراد استخدامه:
myprogram -n 100 -x -i 24ينتج ملف MIDI بايت بايت هيكس:
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
التصور مع bin/mid2svg -s 6 -a 12 -v :

فيما يلي مثال على الحد الأدنى من برنامج يحول الرموز السداسية أعلاه إلى ملف MIDI قياسي:
# 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;
} ستحدد وظيفة MidiFile::read() تلقائيًا ما إذا كانت الإدخال عبارة عن ملف MIDI القياسي الثنائي ، أو تمثيل رمز بايت سداسي ، أو ملف بناء جملة binasc معمم (والذي يتضمن مواد البايت). يمكن فحص وظيفة MidiFile::status() بعد قراءة ملف MIDI لتحديد ما إذا كانت الملف قد تمت قراءة دون مشاكل.
يستخدم هذا المثال MidiFile::getFileDurationInSeconds() لحساب مدة ملف MIDI. أيضًا ، يوضح هذا المثال كيفية معالجة ملفات إدخال متعددة عند استخدام فئة الخيارات.
# 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 ;
} ستعود وظيفة MidiMessage::isText() بشكل صحيح إذا كانت الرسالة عبارة عن رسالة نصفية نصية. يدمج البرنامج التالي جميع المسارات في قائمة واحدة ويقوم بتسجيل حلقة واحدة لتحقيق الرسائل النصية النصية ، وطباعتها عند العثور عليها. تعمل الدالة MidiMessage::getMetaContent() على سلسلة النص من الرسالة من بايت ملف RAW MIDI.
# 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 ;
} ستعمل كلمات استخراج الشيء نفسه باستخدام .isLyricText() بدلاً من .isText() ، ويتم تحديد message اسم المسار بواسطة .isTrackName() .
فيما يلي عرض توضيحي لتحويل ملف MIDI متعدد الأطوار إلى ملف 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 ();
midifile. write (argv[ 2 ]);
return 0 ;
}
تدمج وظيفة .joinTracks() جميع المسارات في مسار واحد. وإذا كان كائن MidiFile يحتوي على مسار واحد فقط عند كتابته ، فسيتم كتابته كملف MIDI من النوع -0 (المسار الواحد).
بشكل عام ، ملفات MIDI ، يوجد مسار الأسطوانة على القناة العاشرة ، والتي يمثلها عدد صحيح 9. يبحث المثال التالي من خلال أحداث MIDI في كل مسار حتى يجد ملاحظة على القناة 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 ;
}بالنسبة لبعض تطبيقات تحليل الموسيقى ، من المفيد إزالة ملاحظات الإيقاع من ملف MIDI. فيما يلي مثال على كيفية القيام بذلك مع مكتبة Midifile.
# 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 ;
} لحذف رسالة MIDI ، امسح فئة قاعدة المتجهات. سيترك هذا MidiEvent فارغًا في المسار ، لكن وظيفة MidiFile::write() ستتجاهل أي MidiMessage فارغة. يمكن استدعاء وظيفة MidiFile::removeEmpties() لإزالة أي MidiEvents فارغ من المسار بشكل صريح.
يوضح هذا المثال كيفية تحويل الملاحظات في ملف MIDI. يجب توخي الحذر لتجنب نقل القناة 10 بشكل عام MIDI ، نظرًا لأن هذا مخصص لمسار الأسطوانة (ومعظم ملفات MIDI تستخدم اتفاقية MIDI العامة).
# 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 ;
}يسرد المثال التالي جميع أرقام الأدوات المستخدمة في ملف MIDI. لا يحلل مسار الأسطوانة.
# 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 ;
}إذا كنت ترغب في محاكاة المزاج في ملف MIDI قياسي بدون مزج يعرف على وجه التحديد عن المزاجات ، فإن هذا المثال مفيد. يتم وضع كل فئة الملعب في مسار منفصل وقناة MIDI. ثم تتم إضافة رسالة نزع الملعب إلى بداية كل مسار في كل قناة للتحكم في المزاج. يتم توخي الحذر لتجنب قناة MIDI 10 ، والتي يتم تخصيصها ل timbres الإيقاع بشكل عام 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 ;
} ستنشئ وظيفة MidiFile::splitTracks() 13 أو 14 وظيفة. سيحتوي المسار 0 على جميع رسائل MIDI غير الملائمة من الملف الأصلي ، في حين أن المسارات من 1 إلى 12 ستحتوي على ملاحظات لفئة درجة محددة على قنوات MIDI 1-12 ، تخطي القناة 10 (قناة الإيقاع العامة MIDI). سيتم وضع ملاحظات الإيقاع في المسار 13 ، ولكن تبقى على القناة 10.
يتم استخدام استخدام MidiEvent::seq على 1 و 2 في البرنامج لإجبار الملاحظات الأولى في وقت الوصفة 0 ليتم وضعه بعد إدراج رسائل منحنى الملعب في نفس الطابع الزمني عند تسمى MidiFile::sortTracks() (سيتم وضع أحداث مع رقم تسلسل أقل قبل أولئك الذين لديهم عدد أعلى إذا حدثت في الوقت المناسب في المسار عند فرز الأحداث في المسار). من المحتمل أن يتم فرز رسائل الانتعاش قبل الملاحظات على أي حال ، ولكن يجب أن يضمن استخدام seq وضعها قبل الملاحظات الأولى.
جرب هذا البرنامج على Clavier المليء بالمزاج ، الكتاب الأول ، Fugue رقم 4 في C-Sharp Minor:
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
يأخذ البرنامج التالي ملف MIDI متعدد الأطراف مع ثلاثة مسارات أو أكثر ، ويقسم كل مسار إلى ملف MIDI منفصل. يتم نسخ مسار التعبير لملف MIDI الأصلي إلى المسار 0 لملفات MIDI الجديدة ، ويتم نسخ المسارات الفردية لملف MIDI الأول إلى المسار الأول لملفات MIDI الإخراج.
# 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 ;
}فيما يلي الملف الأول المستخرج من إدخال ملف MIDI لمثال المزاج:
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
يوضح هذا المثال توليد اهتزاز ثابت للملاحظات في ملف MIDI (على قناة معينة). يضيف البرنامج مسارًا إضافيًا في نهاية الملف لتخزين الانحناءات. يكون معدل الاهتزاز ثابتًا بغض النظر عن إعداد الإيقاع لملف MIDI ، حيث يتم حساب الاهتزاز في الوقت الفعلي بدلاً من وقت العلامة. تعمل وظيفة MidiFile::getAbsoluteTickTime() على حساب التحويل بين الوقت الفعلي في ثوانٍ ووقت علامة في ملف 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 ;
}فيما يلي برنامج يولد أنماط شاذ. خيارات سطر الأوامر هي:
| خيار | القيمة الافتراضية | معنى |
|---|---|---|
-a | 2 | قسم الصك الأول في الدورة |
-b | 3 | قسم الصك الأول في الدورة |
-c | 10 | عدد الدورات |
-d | 2.0 | مدة كل دورة |
--key1 | 76 | رقم مفتاح الإيقاع للأداة الأولى |
--key2 | 77 | رقم مفتاح الإيقاع للأداة الأولى |
-o | اسم ملف الإخراج |
# 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 ;
} يوضح هذا البرنامج كيفية تعيين قيمة القراد لكل ربع في رأس MIDI. في هذه الحالة ، يتم تعيينه على عامل a*b وهو مدة دورة واحدة (لذلك كل دورة لها مدة الربع). يتم حساب message الإيقاعي أيضًا بناءً على المدة المطلوبة للدورة.
على سبيل المثال ، جرب الخيارات -a 3 -b 4 -c 200 -d 1 -o 3x4.mid أو هنا 11 -AGAINST -13 لـ 100 دورة: -a 11 -b 13 -c 100 -d 5 -o 11x13.mid .