ドラムのmidiファイルを読み込ませ、それを楽譜に表示させようとしています。
現段階で表示自体はできているのですが、ハイハットとバスドラムの音が同時に鳴っている場合、ハイハットしか表示されない。ハイハットとスネアドラムの音が同時に鳴っている場合、ハイハットしか表示されない状態になっています。(下記の図のようになります。)
![![
元々のコードが単音のみしか表示させるようになっていないので、二つ同時に表示させるように変更したいのですが、どうしたらいいですか?アドバイスお願いします!
c++
1/***** 楽譜の描画 *****/ 2 forEachTrack(pMIDIData, pMIDITrack) { 3 forEachEvent(pMIDITrack, pMIDIEvent) { 4 5 int lLen = pMIDIEvent->m_lLen; 6 7 if (note_x < SHEET_W - SHEET_GAP * 2 && MIDIEvent_IsNoteOn(pMIDIEvent)/*&& counttest < 30*/) { 8 std::cerr << "Event Size: " << lLen << "(Bytes)" << std::endl; 9 unsigned char status = pMIDIEvent->m_pData[0]; 10 unsigned char data1 = pMIDIEvent->m_pData[1]; 11 unsigned char data2 = pMIDIEvent->m_pData[2]; 12 long duration = MIDIEvent_GetDuration(pMIDIEvent); 13 14 fprintf(stderr, "status, data1, data2 = 0x%02x, 0x%02x, 0x%02x\n", status, data1, data2); 15 16 PutNoteData(0, sheet_base, status, data1, data2, duration, cv::Scalar(0, 0, 0), note_x); 17 18 if (duration == 120) { 19 note_x += NOTE_GAP; 20 } 21 else if (duration == 240) { 22 note_x += NOTE_GAP * 2; 23 } 24 else { 25 //Error 26 } 27 } 28 } 29 } 30 31 note_x = SHEET_GAP + NOTE_GAP / 2; // 初期化 32 note_x_by_midi = SHEET_GAP + NOTE_GAP / 2; // 初期化 33 cv::imshow(winname, sheet_base); 34 cv::moveWindow(winname, 0, 0); 35 int key = cv::waitKey(1); 36 37 /* */ 38 long lRet;
MIDIデータ自体は、プログラムで作りました。フリーなどでダウンロードできるものではありません。TIMEが同じ時にその音が二つ鳴ります。チャンネルの42はハイハット。36はバスドラム。38はスネアドラムです。
#include <stdio.h> #include <MIDIData.h> int main() { MIDIData* pMIDIData; MIDITrack* pMIDITrack; /* MIDIデータの生成(フォーマット0,トラック数1,TPQNベース,120) */ pMIDIData = MIDIData_Create(MIDIDATA_FORMAT0, 1, MIDIDATA_TPQNBASE, 120); if (pMIDIData == NULL) { printf("MIDIデータの生成に失敗しました。\n"); return 0; } /* 最初のトラックへのポインタを取得 */ pMIDITrack = MIDIData_GetFirstTrack(pMIDIData); /* イベントを挿入 */ MIDITrack_InsertTrackName(pMIDITrack, 0, "ちょうちょ"); /* タイトル */ MIDITrack_InsertTempo(pMIDITrack, 0, 60000000 / 120); /* 120BPM */ MIDITrack_InsertProgramChange(pMIDITrack, 0, 9, 0); /* Piano1 */ /* ノートイベントを挿入 Time ch key vel dur */ MIDITrack_InsertNote(pMIDITrack, 0, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 0, 9, 36, 100, 120); MIDITrack_InsertNote(pMIDITrack, 120, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 240, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 240, 9, 38, 100, 120); MIDITrack_InsertNote(pMIDITrack, 360, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 480, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 480, 9, 36, 100, 120); MIDITrack_InsertNote(pMIDITrack, 600, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 600, 9, 36, 100, 120); MIDITrack_InsertNote(pMIDITrack, 720, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 720, 9, 38, 100, 120); MIDITrack_InsertNote(pMIDITrack, 840, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 960, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 960, 9, 36, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1080, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1200, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1200, 9, 38, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1320, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1440, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1440, 9, 36, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1560, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1560, 9, 36, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1680, 9, 42, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1680, 9, 38, 100, 120); MIDITrack_InsertNote(pMIDITrack, 1800, 9, 42, 100, 120); /* エンドオブトラックイベントを挿入 */ MIDITrack_InsertEndofTrack(pMIDITrack, 1920); /* MIDIデータを保存 */ MIDIData_SaveAsSMF(pMIDIData, "eightbeat.mid"); /* MIDIデータをメモリ上から削除 */ MIDIData_Delete(pMIDIData); pMIDIData = NULL; return 1; }
回答2件
あなたの回答
tips
プレビュー