Forums: おーぷんMIDIぷろじぇくとフォーラム (Thread #39711)

midiファイルを読み込んで解析したいのですが... (2018-06-26 01:05 by kaeru #81533)

こんにちは。お世話になっております。

おーぷんMIDIぷろじぇくとのライブラリを使用して、
入力されたmidiファイルに対し、"ド"の音がいくつ入っているか?
などをプログラムで解析してみたいのですが、
何か方法はありませんでしょうか?

Reply to #81533×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: midiファイルを読み込んで解析したいのですが... (2018-06-26 20:59 by kuzu #81535)

MIDIDataライブラリを使用すればできます。

使用する関数やマクロは、
MIDIData_LoadFromSMF : スタンダードMIDIファイル(*.mid)からMIDIデータをメモリ上に読み込みます。
forEachTrack : MIDIデータ中のすべてのMIDIトラックにアクセスします。
forEachEvent : MIDIトラック中のすべてのイベントにアクセスします。
MIDIEvent_IsNoteOn : イベントがノートオンイベントであるかどうか調べます。
MIDIEvent_GetKey : ノートオンイベントのキー番号(真ん中のドは60)を取得します。
MIDIData_Delete : メモリ上に読み込んだMIDIデータを解放します。
などとなります。
詳しくはzipファイル内の公式ガイドブックを参照してください。

なお、C言語のポインタや構造体について理解している必要があります。
また、DLLの使い方についても理解している必要があります。
DLLについては、FAQのページに参考事例を載せてあります。
また、MIDIに関する基本的な知識も必要となります。
イベントの種類については、資料のページに参考資料を載せてあります。
あわせてご利用くださいませ。
また何かわからないことがありましたら、ご質問くださいませ。
Reply to #81533

Reply to #81535×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: midiファイルを読み込んで解析したいのですが... (2018-06-27 10:22 by kaeru #81540)

初歩的な質問にもかかわらず、ご丁寧な回答、感謝いたします。

ガイドブックを読みながらやってみたいと思いますmm
Reply to #81535

Reply to #81540×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: midiファイルを読み込んで解析したいのですが... (2018-06-27 11:52 by kaeru #81541)

度々の質問恐れ入ります。

Midiデータの読み込みをしたところ、
下記のエラーコードが出て困っております。

ソースコードはガイドブック「1-5. MIDIDataライブラリでMIDIデータを表示する」のサンプルコードとなります。
また、読み込んでいるchocho.midもガイドブックに倣い、生成いたしました。

なお、コンパイラはVisual Studioを使用しております。

~エラーメッセージ~
ハンドルされない例外が 0x00FB13FD (midi_analysis.exe) で発生しました: スタック Cookie インストルメンテーション コードは、スタックベースのバッファー オーバーランを検出しました。

~コンパイラ~
[MIDIデータ]
フォーマット=0
トラック数=1
タイムモード=0
タイムレゾリューション=120
[MIDIトラック]
小節:拍:ティック 種類 長さ 内容
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0←ここで動作停止

~コード~
int main() {
char szBuf[1024];
MIDIData* pMIDIData;
MIDITrack* pMIDITrack;
MIDIEvent* pMIDIEvent;
/* MIDIデータをスタンダードMIDIファイル(*.mid)から読み込む */
pMIDIData = MIDIData_LoadFromSMF(L"chocho.mid");
if (pMIDIData == NULL) {
printf("MIDIファイルが開けません。\n");
return 0;
}
/* MIDIデータのプロパティを出力する。*/
printf("[MIDIデータ]\n");
printf("フォーマット=%d\n", MIDIData_GetFormat(pMIDIData));
printf("トラック数=%d\n", MIDIData_GetNumTrack(pMIDIData));
printf("タイムモード=%d\n", MIDIData_GetTimeMode(pMIDIData));
printf("タイムレゾリューション=%d\n", MIDIData_GetTimeResolution(pMIDIData));
/* それぞれのトラックについて */
forEachTrack(pMIDIData, pMIDITrack) {
printf("[MIDIトラック]\n");
printf("小節:拍:ティック 種類 長さ 内容\n");
/* それぞれのイベントについて */
forEachEvent(pMIDITrack, pMIDIEvent) {
printf("%s\n", MIDIEvent_ToString(pMIDIEvent, szBuf, sizeof(szBuf)));
}
}
/* MIDIデータをメモリ上から削除する */
MIDIData_Delete(pMIDIData);
return 1;
}
Reply to #81535

Reply to #81541×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: midiファイルを読み込んで解析したいのですが... (2018-06-27 11:55 by kaeru #81543)

追記です:chocho.midは問題なく聴取できます。
Reply to #81541

Reply to #81543×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: midiファイルを読み込んで解析したいのですが... (2018-06-27 21:55 by kuzu #81545)

#include <stdio.h>
#include <tchar.h>
#include "MIDIData.h"
int _tmain () {
TCHAR szBuf[1024];
MIDIData* pMIDIData;
MIDITrack* pMIDITrack;
MIDIEvent* pMIDIEvent;
/* MIDIデータをスタンダードMIDIファイル(*.mid)から読み込む */
pMIDIData = MIDIData_LoadFromSMF (_T("chocho.mid"));
if (pMIDIData == NULL) {
_tprintf (_T("MIDIData open failed.\n"));
return 0;
}
/* MIDIデータのプロパティを出力する。*/
_tprintf (_T("[MIDIData]\n"));
_tprintf (_T("Format=%d\n"), MIDIData_GetFormat (pMIDIData));
_tprintf (_T("NumTrack=%d\n"), MIDIData_GetNumTrack (pMIDIData));
_tprintf (_T("TimeMode=%d\n"), MIDIData_GetTimeMode (pMIDIData));
_tprintf (_T("TimeResolution=%d\n"), MIDIData_GetTimeResolution (pMIDIData));
/* それぞれのトラックについて */
forEachTrack (pMIDIData, pMIDITrack) {
_tprintf (_T("[MIDITrack]\n"));
_tprintf (_T("Meas:Be:Tick Kind Leng Content\n"));
/* それぞれのイベントについて */
forEachEvent (pMIDITrack, pMIDIEvent) {
_tprintf (_T("%s\n"), MIDIEvent_ToString (pMIDIEvent, szBuf, 1024));
}
}
/* MIDIデータをメモリ上から削除する */
MIDIData_Delete (pMIDIData);
return 1;
}

Reply to #81533

Reply to #81545×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login