Midifileは、標準的なMIDIファイルを読み書きするためのC ++クラスのライブラリです。ライブラリは6つのクラスで構成されています。
| ミディフィル | MIDIファイルを扱うためのメインインターフェイス。 Midifileクラスは、Midiebentsの2次元配列として表示されます。最初の次元はトラックのリストであり、2番目の次元はMidieventsのリストです。 |
| MidieVentlist | MIDIファイルトラックの中学者のリストを管理するデータ構造。 |
| Midievent | ミディフィールの中値間の主要な保管ユニット。クラスは、ティックタイムスタンプ(デルタまたは絶対)とMIDIメッセージバイト(または標準のMIDIファイルメタメッセージ)のベクトルで構成されています。 |
| 中世 | 中学者向けの基本クラス。これは、MIDI(またはメタ)メッセージを表す符号なしバイトのSTLベクトルです。 |
| ビナック | Binary標準MIDIファイルのバイトを説明するASCII形式でMIDIファイルを読み取り/ライティングできるMIDIFILEのヘルパークラス。 |
| オプション | 例プログラムでコマンドラインオプションを解析するために使用されるオプションのコンビニエンスクラス。このクラスは、Midifileクラスを使用するために必要ではないため、ライブラリから削除できます。 |
クラスが一緒に使用される方法の概略図は次のとおりです。

MidiFileクラスにはMidiEventListオブジェクトに保存されているトラックのベクトルが含まれています。 MidiEventListそれ自体がMidiEvent Sのベクトルであり、トラックに各MIDIイベントを保存します。 MidiEvent Sには、タイムスタンプと、署名されていないchar値のベクトルであるMidiMessageが含まれており、MIDIメッセージ(またはメタメッセージ)の生バイトを保存します。
ドキュメントはhttp://midifile.sapp.orgで建設中です。 MIDIファイルを読み書きするための重要な例を以下に示します。
Midifile LibraryのGitHubページからzipファイルとしてダウンロードするか、gitを使用する場合は、次のコマンドでダウンロードしてください。
git clone https://github.com/craigsapp/midifileこれにより、ライブラリのソースコードを使用してmidifileディレクトリが作成されます。
ライブラリはコマンドでコンパイルできます。
make libraryこれにより、ライブラリを使用するプログラムへのリンクに使用できるファイルlib/libmidifile.aが作成されます。プログラムの例は、コマンドでコンパイルできます。
make programsこれにより、ツールディレクトリ内のすべての例プログラムがコンパイルされます。コンパイルされたサンプルプログラムは、 binディレクトリに保存されます。ライブラリとサンプルプログラムの両方をすべて1つのステップでコンパイルするには、次を入力します。
make createmidifileなどの単一のプログラムのみをコンパイルするには、タイプ:
make createmidifileまた、 myprogram.cppなどのtoolsに独自のプログラムを配置し、タイプをコンパイルすることもできます。
make myprogramコンパイルされたプログラムは、 bin/myprogramになります。
独自のプロジェクトでMidifileライブラリを使用する最も簡単な方法は、 src includeのDirectoryとSource-Codeファイルのヘッダーファイルを独自のプロジェクトにコピーすることです。 MidiFileクラスはそれらに依存していないため、 Options.hまたはOptions.cppをコピーする必要はありません。 GithubのVelovioおよびMidirollプロジェクトはどちらもこの方法を使用してMidifile Libraryを使用しています。または、Midifile Repositoryをフォークして、Source Codeのincludeされたライブラリファイルを作成することができます。ソースコードは、Directoryコンテンツをプロジェクトにコピーできることです。
次のプログラムには、MIDIファイルのすべての中学者がリストされています。プログラムは各トラックを反復し、トラック内のすべてのMIDIイベントのリストを印刷します。各イベントについて、MIDIメッセージのパフォーマンス時間の絶対ティックタイムスタンプが与えられ、その後、ヘックスバイトのリストとしてメッセージ自体が続きます。
MidiFile::doTimeAnalysis()関数を実行して、ファイル内のテンポメタメスに従って、絶対ティックタイムスタンプを数秒に変換できます(テンポメタメスがない場合は、1分あたり120四半期のデフォルトテンポを使用)。イベントの絶対開始時間は、プログラムの出力の2番目の列に表示されます。
MidiFile::linkNotePairs()関数を使用して、ノートオンとノートオフを一致させることができます。これが完了したら、 MidiEvent::getDurationInSeconds()を使用してメモの期間にアクセスできます。メモ期間は、プログラムの出力の3列に表示されます。
Midifile Libraryクラスは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ファイルとMIDIファイルのASCII表現の両方をプログラムに入力できます。たとえば、次のテキストをtwinkle.txtというファイルに保存して、入力データとして使用します。このコンテンツは、標準のMIDIファイルの16進バイトを表します。これは、 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ファイルには、最初のトラック(エクスプレッショントラック、ヘックスバイトのff 2f 00以外のコンテンツがありません。2番目のトラックは、MIDI Note 72(Cの上で1オクターブ以上)をプレイし始めるMIDIノートオンメッセージ90 48 40 (hex)で始まります(decimal notation)を備えています(decimal notation)。
TPQ:120 トラック:3 トラック0 秒メッセージをチェックします 0 0 FF 2F 0 トラック1 秒メッセージをチェックします 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 秒メッセージをチェックします 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クラスのデフォルトの動作は、 MidiEvent::tickで利用可能なMidiイベントの絶対ティックタイムを保存することです。これは、ファイルの開始から現在のイベントまでのティック時間です。標準のMIDIファイルでは、ダニはデルタ値として保存され、ティックはトラック内の前のメッセージ以降に待機する期間を示します。デルタのティック値にアクセスするには、(1)リストの前のティックタイムから現在のティック時間をサブトラックするか、 MidiFile::makeDeltaTime()を呼び出して、絶対ティック値をデルタティック値に変換します。
MidiFile::joinTracks()関数を使用して、マルチトラックデータを1回のタイムシーケンスに変換できます。 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 ;
}以下は、新しいシングルトラック出力です。最初の列は、メッセージの絶対的なティックタイムスタンプです。 2番目の列はデルタティック値です。 3番目の列は元のトラック値です。最後の列にはMIDIメッセージ(16進バイト)が含まれています。
TPQ:120 トラック:3 Deltaトラック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オブジェクトには単一のトラックが含まれており、さらにトラックが追加されない限り、Type-0 MIDIファイルとして記述されます。トラックにメモを追加した後、ファイルに書き込まれる前に、時間シーケンスにソートする必要があります。
# 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
これは、サンプルプログラムMID2SVGで視覚化されたMIDIデータです。

-xオプションを使用して、データを16進バイトコードとして出力でき、 -nオプションはノートの数を制御し、 -i #使用する機器番号を指定します。
myprogram -n 100 -x -i 24HEXバイトコード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 :

上記の16進バイトコードを標準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ファイル、16進バイトコード表現、または一般化された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()関数は、メッセージがテキストメタメッジである場合にtrueを返します。次のプログラムは、すべてのトラックを単一のリストにマージし、テキストメタメッジを1つのループチェックし、見つかったときに印刷します。 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()を使用することで同じように機能し、トラック名メタメスは.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オブジェクトが書かれているときにトラックが1つしかない場合、Type-0(シングルトラック)MIDIファイルとして記述されます。
一般的にMIDIファイルでは、ドラムトラックは整数9で表される10番目のチャンネルにあります。次の例は、チャンネル9にメモを見つけるまで、各トラックの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 ;
}
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 Libraryでそれがどのように行われるかの例を次に示します。
# 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ファイルでメモを転置する方法を示しています。これはドラムトラック用に予約されているため、一般的なMIDIのチャネル10の転置を避けるように注意する必要があります(そして、ほとんどの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を避けるために注意が払われます。MIDIチャンネル10は、一般的な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には、チャンネル10(一般的なMIDIパーカッションチャネル)をスキップするMIDIチャンネル1〜12の特定のピッチクラスのノートが含まれます。パーカッションノートはトラック13に配置されますが、チャンネル10に残ります。
MidiEvent::seqの使用は、プログラムで1と2に設定されています。Midifile MidiFile::sortTracks()替えの並べ替えの場合、より高い数のイベントが配置されます)。とにかくピッチベンドメッセージはメモの前に並べ替えられるでしょうが、 seqを使用すると、最初のメモの前に配置されることを保証する必要があります。
このプログラムをバッハのよく調子を整えたクラビエル、ブックI、フーガ第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
次のプログラムは、3つ以上のトラックを備えたマルチトラックMIDIファイルを採用し、各トラックを別のMIDIファイルに分割します。元のMIDIファイルの式トラックは、新しいMIDIファイルの0番目のトラックにコピーされ、最初の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ヘッダーに4分の1のティック値を設定する方法を示しています。この場合、それは1つのサイクルの持続時間であるa*bの係数に設定されます(したがって、各サイクルにはクォーターノートの持続時間があります)。テンポのメタメスは、サイクルの目的の持続時間に基づいて計算されます。
たとえば、オプション-a 3 -b 4 -c 200 -d 1 -o 3x4.midを試してください。これは、各サイクルが1秒続く200サイクルで3 -Against -4パターンを再生します。または、100サイクルで11 -Against -13です: -a 11 -b 13 -c 100 -d 5 -o 11x13.mid 。