私は、.midファイル内のノートの数を数え、各ノート(A〜G#)の数を出力してファイルに出力するプログラムをC++で書いています。それは十分な音符を見つけることはできませんが、私は理由を理解できません。私はmidi.orgのMIDIファイルのドキュメントに基づいて構築しました。MIDIノートプログラムが不正確な結果を生成する
ファイルを読み取っている間は、メモのステータスバイト(1001nnnn)を探して、次のバイトをメモとして読み取ります。私はAnvil Studioを使用して1つの音だけでMIDIファイルを作成し、それを分析するためにプログラムを使用しましたが、正確に1つの音符しかないことがわかりましたが、それはもっと大きなファイル(2000 +音符)それらのほとんどすべてを見つけることはできません。時には、ノートの90%+が1つまたは2つのピッチであることがわかります。
これは、ノートを検索するプログラムのセグメントです。このファイルは、ios :: binaryでバイトモードで開いています。
//Loop through every byte of the file
for (int i = 0; i <= size; i++) {
//Read next byte of file to tempblock
myfile.read(tempblock, 1);
//Put int value of byte in b
int b = tempblock[0];
//x = first 4 binary digits of b, appended with 0000
unsigned int x = b & 0xF0;
//If note is next, set the next empty space of notearray to the notes value, and then set notenext to 0
if (notenext) {
myfile.read(tempblock, 1);
int c = tempblock[0];
i++;
//Add the note to notearray if the velocity data byte is not set to 0
if (c != 0) {
notearray[notecount] = b;
notenext = 0;
notecount++;
}
}
//If note is not next, and x is 144 (int of 10010000, status byte for MIDI "Note on" message), set note next to true
else if (x == 144) {
notenext = 1;
}
}
何が起こっているのですか?ファイルタイプのコンポーネントが欠落していますか、または使用しているファイルに問題がありますか?私は主に、MIDIレポジトリからダウンロードされた古典的なピアノの部分を見ています
私はすでに0速度の音符を次のようにチェックしています。 if(c!= 0){ notearray [notecount] = b; notenext = 0; notecount ++; }ピッチ後のバイトが速度 –