2017-11-12 15 views
2

私は、.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

MIDIエディタがファイルをどのように作成しているかは、非常に問題です。多くのMIDIエディタは、実際に音符をオフにしません。速度を0に設定するだけで、解析するのに苦労することがあります。

ファイルに含まれる未加工のMIDIメッセージを見てください。多くの速度メッセージが表示されます。

+0

私はすでに0速度の音符を次のようにチェックしています。 if(c!= 0){ notearray [notecount] = b; notenext = 0; notecount ++; }ピッチ後のバイトが速度 –

2

チャネルメッセージステータスバイトは、最後のものと同一の場合は省略できます。これを実行状態といいます。

また、1001nnnnバイトがデルタ時間値内で発生する可能性があります。

メモを検出できるようにするには、すべてのメッセージを正しく解析する必要があります。

+0

であるので、私はデルタタイムを読み、それを回避しようとします。 midiイベントの大部分はノートの価値とは無関係であるため、私の実装に行きました。あなたが言った後は、選択したバイトのswitch()に変更して、関連するステータスバイトごとに大文字と小文字を区別することもできます。ありがとう –

関連する問題