フォーラム: おーぷんMIDIぷろじぇくとフォーラム (スレッド #39711)

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

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

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

メッセージ #81533 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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に関する基本的な知識も必要となります。
イベントの種類については、資料のページに参考資料を載せてあります。
あわせてご利用くださいませ。
また何かわからないことがありましたら、ご質問くださいませ。
#81533 への返信

メッセージ #81535 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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

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

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

メッセージ #81540 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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;
}
#81535 への返信

メッセージ #81541 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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

追記です:chocho.midは問題なく聴取できます。
#81541 への返信

メッセージ #81543 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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;
}

#81533 への返信

メッセージ #81545 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする