(改めて)VB2008でMIDIを読み込んで鍵盤表示するには・・・


8:51:22  URL  2010-06-03 06:52:46  No: 146881

誤ってVB2-6専用のところに質問してしまったので改めて。

MIDIファイルを読み取り、鍵盤に色をつけて光らせ、
現在、どの音がなっているのかを表示するソフトを作りたいと思っています。

しかし根本的に何も分かりません!
・MIDIファイルを読み込むには?
・MIDI音源を使用し、音を鳴らすには?
・現在なっている音を取得するには?

どなたか教えてください!
http://www.forest.impress.co.jp/article/2007/12/05/rainbow.htmlのようなものが理想です


ランド  2010-06-03 09:05:55  No: 146882

だからさ、隣の掲示板で、魔界の仮面弁士さんが

> 一度に作ろうとすると無理があるので、
>  ・鍵盤を表示するプログラムを作成
>  ・ファイルを開き、その内容を読み取るプログラムを作成
>  ・読み取ったMIDIファイルの内容を解析するプログラムを作成
>  ・解析した結果を鍵盤として表示するプログラムを作成
> のように順を追って作っていき、その中でどの部分で躓いたのかを
> 具体的に質問した方が、回答が得やすいかと思います。

と指南してくださったでしょ?理解できなかったの?

質問者は、どこまでできて、どこでつまづいているのかを
書き込まないと、いつまでたってもアドバイスもらえませんよ。

> ・MIDIファイルを読み込むには?
> ・MIDI音源を使用し、音を鳴らすには?
> ・現在なっている音を取得するには?

魔界の仮面弁士さんから教えていただいたサイトは
ご覧になりましたか?MIDI について理解しないと
できないと思いますが?

とりあえず、ご自身で書いたコードなりを掲載して
どこでつまづいているのか、具体的にしてください。


魔界の仮面弁士  2010-06-03 17:57:46  No: 146883

> しかし根本的に何も分かりません!
MIDI に関する詳細な説明をしようとすれば、それだけで
本が一冊書けるであろう分量になるでしょうから、それらすべてを
掲示板で解説することには無理があります。

VB プログラミングに関係する部分だけであれば、ここの掲示板でも
良いと思いますが、MIDI に関する突っ込んだ情報が必要なのであれば、
ご自身で MIDI 関連の専門書等を当たってみてください。

> ・MIDIファイルを読み込むには?
ファイルの読み込みには、System.IO.FileStream クラスを使います。
BinaryReader クラスを併用すると、データの読み込みが楽になるでしょう。

データの意味については、先に紹介した URL を参考にしてみてください。
概要程度であれば、ある程度把握できるかと思います。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+201006/10060002.txt

MIDI ファイル解析用のライブラリでもあれば話は簡単なのでしょうが、
標準機能としてそのような物は見当たらないので、ファイルのバイナリを
直接取り扱うことになるかと思います。

> ・MIDI音源を使用し、音を鳴らすには?
MIDI ファイルの再生だけであれば、MIDIファイルの仕様を知らずとも、
Microsoft.DirectX.AudioVideoPlayback.Audio を使って再生したり、
Windows Media Player 経由で再生するのが簡単です。
これらについては、下記が参考になるかと思います。
http://dobon.net/vb/dotnet/programing/playmidifile.html

一方、そういった物に頼らず、より細かな制御を行いたいのであれば、
midiOutOpen 関数などのマルチメディア API を直接呼び出す必要が
ありそうです。実装難易度は相当高くなりますけれども。
http://msdn.microsoft.com/ja-jp/library/cc410558.aspx


れお先生  2010-06-04 04:26:25  No: 146884

ははは、のは。
おい、昔にルキオのやつにおしえてもらったぞ。ソレ(笑)

今は昔、教えてもらいました。
ピアノとかホルンとか自由な音階で遊んだが。

改造すりゃあ、スグに遊べるぞ。
音階と長さのトコはデータ化して。

ま。簡単でしたよ。(過去系)

ちょっとルキオに聞いたらどうだ?

ま。音の長さとかオーバー風呂して、新しいウィルスとか発生させるなよ。
キミは安全VBですら暴走させるおそれがアリンス。

いと、お菓子。


8:51:22 pm  URL  2010-06-04 05:32:48  No: 146885

>ランドさん
その・・・まったく記述していないんです・・・
「なんのこっちゃ」ってなってて。

とりあえずMIDIは理解しました。
しかし、MIDIしか理解していません。

>魔界の仮面弁士さん
なるほど、BinaryReaderでしたか。
ず〜っと、StreamReaderばっかり使っていましたww
道理で何も進まないわけですね・・・

midiOutOpenって見たとたん試そうとは思ったのですが、
構文を見た感じ、C言語ではないですか・・・?

>れお先生さん
・・・音の長さオーバーフローしたら、フリーズしますか・・・?
少々怖くなってきました・・・
ルキオさんという方に尋ねるといいのですか?

ただ、どうやって尋ねればいいか・・・


8:51:22 pm  URL  2010-06-04 05:35:30  No: 146886

っていうか、
SMF=MIDI

なのですか?


8:51:22 pm  URL  2010-06-04 05:37:41  No: 146887

・鍵盤を表示するプログラムを作成
・ファイルを開き、その内容を読み取るプログラムを作成
・読み取ったMIDIファイルの内容を解析するプログラムを作成
・解析した結果を鍵盤として表示するプログラムを作成

このうち鍵盤を表示するプログラムしか分からないので、
全部・・・は無理かもしれないけど教えていただきたく候。


れお先生  2010-06-04 05:56:10  No: 146888

中級者でしょ?

ホントに簡単だから、ルキオに聞きなよ。
VB2010で楽勝。

ただ、配列レベルで苦戦するなら、やめといたほうがいいね。

では。親切レオより。


8:51:22 pm  2010-06-04 06:15:35  No: 146889

BinaryReaderですが。

MIDIファイルでは、どれを使ったらいいのでしょうか?
ReadstringとかReadInt32とか、いっぱいありすぎて分かりません・・・


YuO  2010-06-04 12:52:37  No: 146890

> SMF=MIDI
> なのですか?
に関しては,元スレッド側に書きました。

> MIDIファイルでは、どれを使ったらいいのでしょうか?
使い勝手のよい物を使ってください。
現実的には,
・ReadByte
・Read (Byte(), Int32, Int32)
・Read7BitEncodedInt
くらいしか使い物わないと思いますが……。
ビッグエンディアンなので,ReadInt32などを使う場合はエンディアンの変換をしてください。

> midiOutOpenって見たとたん試そうとは思ったのですが、
> 構文を見た感じ、C言語ではないですか・・・?

Windows APIなので,Cです。
P/Invokeを使って呼び出すことになります。

単純にmidiOut系使うだけならあまり難しくは無かったと思います。
もちろん,MIDIまわりの知識は必要ですが……。
マルチメディアタイマに手を出すと,完全にCが必要になります。
# コールバックで呼び出せるAPIに制限があるので,.NET Frameworkは怖くて呼び出せない

最後に。
> 音の長さとかオーバー風呂して
オーバーフローするような「音の長さ」とは何を指していますか。
MIDIの制御上,
・音を鳴らすにはVelocityが1以上のノート・オンメッセージ (9x) を送出する
・音を止めるにはノート・オフメッセージ (8x) を送出するか,Velocityが0のノート・オンメッセージを送出する
  ※9x HH 00でノート・オフになるのはランニング・ステータスで9xを省略することで,1octet通信量が有利になるため (元々33kbps程度の通信速度の規格)
・音の長さとはノート・オンメッセージの送出からノート・オフメッセージの送出までであり,それは単なる時間の経過でしかない
となっています。
減衰のない音を使い (GM/PC#81:Lead1(square)等),ノート・オフメッセージを送らなければ鳴り続けますが,
MIDI音源をソフトウェア的にまたはハードウェア的にリセットすれば止まります。
つまり,オーバーフローの発生する余地は高々経過時間の計算にしか存在しません。
計算のオーバーフローによってウィルスが発生するなどという余地がどこにあるのか,書く前に考えて欲しい物です。


れお  2010-06-05 04:12:01  No: 146891

バグは常に発生してるじゃん。

だから

UpDateだろ?(笑)

ま。ハッキングはなおりませんけど。


8:51:22 pm  2010-06-05 04:41:14  No: 146892

>YuOさん
ありがとうございます!
BinaryReaderは
>・ReadByte
>・Read (Byte(), Int32, Int32)
>・Read7BitEncodedInt
のいずれか、ということらしいので、やってみます!

>れおさん
ww


8:51:22 pm  2010-06-05 04:49:22  No: 146893

すいません。
僕のVB2008で、Microsoft.DirectX空間がないのですが、どうしたら使用可能になりますか?


れお  2010-06-05 06:56:15  No: 146894

DirectSoundとか必要ないだろ。
VB2010でスイスイとMIDI音源を使えるぞ。

ま、キミには教えないけどね。


YuO  2010-06-05 07:35:13  No: 146895

>>・Read7BitEncodedInt

書いておいてなんですが……。
過去にSMF読んだ時のコードを見直すと,Read7BitEncodedIntを使わず,自力で解析していました。
このメソッドの問題だったのか,別の箇所の問題だったのかは覚えていないのですが……。

> 僕のVB2008で、Microsoft.DirectX空間がないのですが、どうしたら使用可能になりますか?

Managed DirectXは開発中止になり,.NET FrameworkではXNA Frameworkを使用するのがMSの方針っぽいですが……。

DirectX SDKをインストールすれば入ったはずです。
少なくとも,DirectX 9対応のSDKであれば入ります。

代替案としては,SlimDX http://slimdx.mdxinfo.com/ というものがあるようです。


Yesレオ  2010-06-07 02:42:51  No: 146896

ほら、難しいよ^^

1級
採点は、MIDI データを評価する一次審査と、表現力を評価する二次審査の二段階方式で行われる。
課題曲をGeneral MIDI Level 2 準拠のスタンダードMIDIファイル(Format1)で作成したもの、ならびに作成したMIDI データをもとに任意の音源でオーディオ化し、CD-DAフォーマットで記録したCD を提出。
あわせて、提出ファイル名、制作環境などを記載した作業レポートも同時に提出する。
課題曲スコア(楽譜)、および制作規定書を参照し、自宅など任意の環境で作品を制作して成果物を提出
(MIDI チャンネル16チャンネル以内で表現可能な、2分程度の作品。)

●2級
 ◇1次(筆記)
1.設定・・・・機材接続と環境設定、インターフェース、ソフトウェア、セットアップ
規格・・・・ハードウェア規格、SMF(Format0.1)、GM(Leve12)、SMFL
音色・・・・シンセサイザー概論、音色知識、音源知識
表現・・・・楽譜情報、ノート情報、コントロール情報、演奏表
効果・・・・音響効果とエフェクター、リバーブ、ディレイ、コーラス
同期・・・・シーケンサー外部同期、MTC、SMPTE、MMC
応用・・・・ソフトシンセ、インターネット、Audioファイルの活用、応用

◇2次(実技)
①MIDIデータ入力及び編集技能の実技試験  ②機材設定から課題項目制作

●3級
1.MIDIの基礎・・・・音楽情報の伝達、バイトとビット、MIDIケーブルの接続
2.MIDIメッセージ・・・・MIDIチャンネル、ステータスとデータ、メッセージの種類
3.ノートデータ・・・・ノートオンオフ、ベロシティ、ゲートタイム、タイミング
4.コントロールデータ・・・・音色の切替え、ピッチベンド、コントロールチェンジ
5.システムメッセージ・・・・システム&メーカー、エクスクルーシブ
6.MIDIの知識・・・・MIDIの歴史、アナログシンセの基礎、GM&SMF

●4級・・・・AMEI認定の指導者による4級講座(2日間)を受講後に受験します。
1.デジタルとアナログの違い
2.パソコンでの音楽データの扱い
3.CD-R/RWに関する知識
4.ディスクメディアや保存方法、OS基礎知識
5.システム&メーカー・エクスクルーシブ
6.MIDI応用と音楽基礎知識 

ふむふむ。なるほど。なにが?^^;


Yesレオ  2010-06-07 02:45:48  No: 146897

4級講座はどう?
値段も手ごろだしさ。


8:51:22 pm  2010-06-07 04:25:07  No: 146898

>YuOさん
なるほど。分かりました。
これを含めて、いろいろやってみます。

>Yesレオさん
僕、一応MIDIで曲は作れます。
一応・・・


れお  2010-06-07 04:57:35  No: 146899

コードを書いてみたら?

例外をシステムが捕らえることが出来ない場合は、部分暴走がおきます。

例1  音楽系⇒音が鳴りやまない、あるいは音質が悪くなる。音が鳴らない。
例2  描画系⇒線や円がシステムオーバー風呂に関係して、ドット欠落の危険性は否定できない

いろいろ、パソはデリゲートですよ。


レオ  2010-06-07 05:10:27  No: 146900

ま、やめといたほうがいいぞ。

なぜ?入門本を書いてる連中がグラフィックスや音系のことを、あまり詳しく書かないか?

教えてやろう。

責任だよ。ま、前書きとかに責任はとりません。と書いてるが、例えば千人のパソが異状をきたして集団訴訟されたらどうなる?
outだと思うが。

車だと、スグにリコールだが。
不具合なもんは、けっこう怖いよなぁ。


れお先生  2010-06-07 05:23:46  No: 146901

あ、追加。
中島の本は、よくオーバー風呂するから買わないほうがいいよ。
パソがこわれる。^^;


8:51:22 pm  2010-06-07 06:22:40  No: 146902

なるほど。参考にしときますね。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加