MIDIファイルを開いて。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
すのう

MIDIファイルを開いて。

#1

投稿記事 by すのう » 15年前

こんばんわ、質問させていただきます。
MIDIファイルを開いて中身を解析したいのですが、どのようにしたらいいのでしょうか??
DXライブラリを使い、VC++で作っています。
今のところ、ファイルを開いて、中身を読み出し、画面に表示するところまでは作ることが出来たのですが、当たり前ですがMIDIをそのまま表示させても意味のわからない言語の羅列になります。
MIDIに関しては本やネットで結構調べたりしたのですが、自分の理解能力が追いつかず、プログラムに反映できてません。
SMFを読み込んで、メタイベント、特に調性とテンポとを取り出したいのですが、(SMFに書かれているという前提で)フォーマット0の場合とかだけでもいいのでどなたか教えていただけないでしょうか?
大分丸投げ感があるのですが、期限の近い学校の課題関連ですので、どうかお願いします。

mnkr

Re:MIDIファイルを開いて。

#2

投稿記事 by mnkr » 15年前

検索しました
グーグル先生で一発目で下記サイトが2つ見つかりました。

あるサイトでMIDI解析を行おうとしていて
ここがSMFについてとてもわかりやすく書かれているとありました。
実際わたしも読んでみましたがすのうさんが悩んでいる、
「MIDIをそのまま表示させても意味のわからない言語の羅列になります。」
を解決できるのではと思いました。
http://www.geocities.jp/stdmidi/

PerlでMIDI解析のソースをまるまる掲載しています。
言語は違いますが参考になるかと。
http://yokai-tp.com/cgi-bin/midi/plugin/mid2txt.pl0
上記の関連サイト
Midi Playlength calculator-II
http://zentara.net/perlplay/some_snippe ... lator.html

ちなみにわたしはやり方を知らないのでorz
こういう手助けしかできません。

すのう

Re:MIDIファイルを開いて。

#3

投稿記事 by すのう » 15年前

遅くなってスミマセン。
ありがとうございます。


あれから結構勉強して、自分で解析するのは無理だということがわかりましたwww(能力とか時間の問題で)
ので、MIDI解析のオープンソースを発見してきて使おうとしたのですが、それがコンソールアプリケーションでないと動作しないのです。
それをなんとかDXライブラリ使用で作ったアプリケーションに使いたいのですが、どうすればいいのでしょうか?

文章おかしかったらごめんなさいorz

softya

Re:MIDIファイルを開いて。

#4

投稿記事 by softya » 15年前

野暮な方法は、systemでそのツールを起動する。
system("midi解析ツール.exe midiファイル名 >解析結果.txt");
としといて、リダイレクトされた解析結果.txtを読み込むと解析結果が文字列として得られます。

ベストな方法は、オープンソースの詳細が無いと分かりません。
あとライセンス上オープンソースのコードを使用しても良いかは確認して下さい。
組み込んだ場合は、GPLなら自分もGPLとして公開する必要があります。
画像

softya

Re:MIDIファイルを開いて。

#5

投稿記事 by softya » 15年前

ちょっと探してみましたが、ココのヤツのほうが楽なのでは?
http://openmidiproject.sourceforge.jp/
DLLとして使う分にはソース公開の義務も生じません。

すのう

Re:MIDIファイルを開いて。

#6

投稿記事 by すのう » 15年前

返答ありがとうございます。

システムでツールを起動というのは、MIDIファイルが毎回違っても使えるものなんでしょうか?
MIDIファイルは毎回使用者が選択する感じなんですが・・・。

あ、そこのソースを使用したいんです。
それで、そのMIDIDataライブラリっていうのを使用しようとしたらコンソールアプリケーションでないと動作しないって言われまして・・・。
DLLとして使うってどういうことなんですか?
初心者ですみません・・・><

softya

Re:MIDIファイルを開いて。

#7

投稿記事 by softya » 15年前

>システムでツールを起動というのは、MIDIファイルが毎回違っても使えるものなんでしょうか?
>MIDIファイルは毎回使用者が選択する感じなんですが・・・。

system()の引数は文字列なので、sprintfで文字列を組み立てればOK。
ただし、野暮な方法なのでオススメではありませんね。

>それで、そのMIDIDataライブラリっていうのを使用しようとしたらコンソールアプリケーションでないと動作しないって言われまして・・・。

該当の掲示板を見ましたが、サンプルコードがコンソールアプリだと言っているだけですね。
Windowsアプリ(DXライブラリを使ったものを含む)でのDLL使い方もその掲示板で丁寧に解説されてますよ。
http://sourceforge.jp/forum/forum.php?t ... m_id=13724

ところで、Visual Studio 2008のpro版(評価版)って90日しか使えませんが大丈夫ですか?

すのう

Re:MIDIファイルを開いて。

#8

投稿記事 by すのう » 15年前

すみません、DLLの置き場所はわかったのですが、そもそもDLLってなんなのかよくわかってない状態です。
理解能力が低いのでしょうかorz
何度か読み直したりDLLで調べたりしたんですけど。。。

卒研なので提出まで90日もありませんし、評価版でも、実行ファイル作ってしまえばいいかなーと思っていたのですが・・・もしかして、実行ファイルも90日たったら使えなくなってしまうんですか!?

softya

Re:MIDIファイルを開いて。

#9

投稿記事 by softya » 15年前

>すみません、DLLの置き場所はわかったのですが、そもそもDLLってなんなのかよくわかってない状態です。
>理解能力が低いのでしょうかorz
>何度か読み直したりDLLで調べたりしたんですけど。。。

DLLはダイナミック・リンク・ライブラリと言って実行時にリンクされます。
なので、exeファイルと同じ場所に置く必要があります。
※ 他の方法もありますが、今回はexeと一緒に置くのがベストだと思います。あちら方はsystem32を推薦しているみたいですが。
リンク時に指定するMIDIData.libはガワだけで実体ではありません。

その前にもしかしてライブラリってのが分からないんでしょうか?

>卒研なので提出まで90日もありませんし、評価版でも、実行ファイル作ってしまえばいいかなーと思っていたのですが・・・もしかして、実行ファイルも90日たったら使えなくなってしまうんですか!?

動きますよ。
VisualStuidoは使えなくなりますけど。

すのう

Re:MIDIファイルを開いて。

#10

投稿記事 by すのう » 15年前

> DLLはダイナミック・リンク・ライブラリと言って実行時にリンクされます。
> なので、exeファイルと同じ場所に置く必要があります。
> ※ 他の方法もありますが、今回はexeと一緒に置くのがベストだと思います。あちら方はsystem32を推薦しているみたいですが。
> リンク時に指定するMIDIData.libはガワだけで実体ではありません。

ありがとうございます、色々なとこで調べたりもしてDLLについては(多分)理解しました!

> その前にもしかしてライブラリってのが分からないんでしょうか?

わかってるつもりなのですが・・・^^;
ですが、DLLに関しても理解したはずなのにやっぱりプログラムが動きません。
関数の使い方が悪いのかなぁと思うのですが、具体例があるとありがたいので、申し訳ないのですが、MIDIData.libをDXライブラリを使ったWindowsアプリのコードの例を示して何か示していただけないでしょうか・・・?
ファイル開いて閉じるだけとかでもいいんで、お願いします><
本当は自力でやるべき部分なんでしょうけど、卒論提出まで実は1週間きってまして・・・。
このままだと本当に卒業できなくなってしまうんです。
お力添えをおねがいしますっ。

softya

Re:MIDIファイルを開いて。

#11

投稿記事 by softya » 15年前

10分位で作ったプロジェクトなので適当ですが。

コード自体は、下記サイトの「使用例:4分音符の「ド」1音だけのMIDIデータを作成」です。
http://openmidiproject.sourceforge.jp/M ... brary.html
DXライブラリのプロジェクトの構成は、
「DXライブラリプロジェクト生成ツール Justy様」を利用しています。
http://dixq.net/sm/t1.html

どのような物を作られるか分かりませんが、あと一週間はムチャクチャ厳しいと思います。

すのう

Re:MIDIファイルを開いて。

#12

投稿記事 by すのう » 15年前

DLL使うことできました、本当にありがとうございます。

それで、まだ質問があるのですが・・・。
コンソール関数ベースだと
printf ("フォーマット = %d\n", MIDIData_GetFormat (pMIDIData));
となっているものを、DXライブラリではどう書けばいいのでしょうか?
DrawStringFormat(0,0,GetColor(255,255,255),"%d", MIDIData_GetFormat);
は違いますよね?

softya

Re:MIDIファイルを開いて。

#13

投稿記事 by softya » 15年前

>DrawStringFormat(0,0,GetColor(255,255,255),"%d", MIDIData_GetFormat);
ただ文字で表示されるので良ければこれで問題ないと思いますが、すのうさんの求めているイメージが分からないので返答に困りますね。
とりあえずこのまま試して頂いて、実際やりたい事と違えば具体的にどうしたいのか書いていただけますか。

すのう

Re:MIDIファイルを開いて。

#14

投稿記事 by すのう » 15年前

あ、はい、ごめんなさい><
文字で表示してほしいのですが、これで実行すると、

error C3861: 'DrawStringFormat': 識別子が見つかりませんでした

となってしまうのです。
・・・・と書こうと思ったのですが、今気付きました。
DrawFormatStringが正解ですね・・・。
ごめんなさい、単なるボケでしたorz


ですが、直して実行したところ、5641149、などと表示されました。
MIDIData_GetFormatはMIDIのフォーマットを取得しているので、0か1か2で表示されるものだとばかり思ってたのですが・・・。
これはどこか間違ってるのでしょうか?
専門外でしたらごめんなさい。

softya

Re:MIDIファイルを開いて。

#15

投稿記事 by softya » 15年前

その値は変ですね。
とりあえずサンプルのコンソールアプリで同じmidiデータを開いてちゃんと表示出来るか試してみて下さい。
結果が違えば、なにか使い方が間違っています。

そういえば、
>DrawStringFormat(0,0,GetColor(255,255,255),"%d", MIDIData_GetFormat);
の部分ですが、
MIDIData_GetFormat(pMIDIData)
って書かずに
MIDIData_GetFormat
と書いていますが大丈夫ですか?

>専門外でしたらごめんなさい。
確かにmidiは未経験ですが、色んなライブラリを使ったことがあるので少しはお役に立てるでしょう。

すのう

Re:MIDIファイルを開いて。

#16

投稿記事 by すのう » 15年前

> その値は変ですね。
> とりあえずサンプルのコンソールアプリで同じmidiデータを開いてちゃんと表示出来るか試してみて下さい。
> 結果が違えば、なにか使い方が間違っています。
>
> そういえば、
> >DrawStringFormat(0,0,GetColor(255,255,255),"%d", MIDIData_GetFormat);
> の部分ですが、
> MIDIData_GetFormat(pMIDIData)
> って書かずに
> MIDIData_GetFormat
> と書いていますが大丈夫ですか?

MIDIData_GetFormat(pMIDIData)になおしたらちゃんと1と表示されました!!!
いつの間にか消しちゃってたんですね^^;


> 確かにmidiは未経験ですが、色んなライブラリを使ったことがあるので少しはお役に立てるでしょう。

生意気な言い方してすみませんでした><
本当に助かってます^^

なんとかやりたいことができそうな気がしますっ。
また質問あったら聞くと思いますが・・・お願いしますm__m

閉鎖

“C言語何でも質問掲示板” へ戻る