MIDIで音を出したいのですが、MIDIファイルを再生するわけではなく、VB上で音階などを指定し、リアルタイムでMIDIのメッセージを送りたいのです。
最終的にはPCのスピーカーで聞こえればOKです。
環境:VisualBasic 2008 Express Edition (2005も可)
MIDIに関するAPIの情報として下記の様なものがありました。(MIDIファイルを再生する)
http://homepage1.nifty.com/MADIA/vb/vb_bbs/20040 …
MIDIをリアルタイム出力
http://tokyo.cool.ne.jp/kanain/APIHTM/midiOut.html
"リアルタイム"にMIDI出力したいということでお願いいます。
簡単にボタンを押したときに音が流れるソースですとありがたいです。
No.2ベストアンサー
- 回答日時:
VB2005のコードです。
Public Class Form4
#Region "MIDI出力系WinAPI関数および定数"
Declare Function midiOutOpen Lib "winmm.dll" ( _
ByRef lphMidiOut As Integer, ByVal uDeviceID As Integer, ByVal dwCallback As Integer, _
ByVal dwInstance As Integer, ByVal dwFlags As Integer) As Integer
Declare Function midiOutShortMsg Lib "winmm.dll" ( _
ByVal hMidiOut As Integer, ByVal dwMsg As Integer) As Integer
Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Integer) As Integer
Const MIDI_MAPPER As Integer = -1
Const MMSYSERR_NOERROR As Integer = 0
Const CALLBACK_NULL As Integer = &H0
#End Region
' MIDIデバイスID
Private hDevice As Integer
Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' MIDIマッパーを使用してMIDIデバイスを開く
If midiOutOpen(hDevice, MIDI_MAPPER, 0, 0, CALLBACK_NULL) <> MMSYSERR_NOERROR Then
MessageBox.Show("MIDIデバイスを開けませんでした。")
hDevice = 0
Return
End If
End Sub
Private Sub Form4_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
' MIDIデバイスを閉じる
If hDevice <> 0 Then midiOutClose(hDevice)
End Sub
' マウスダウンで音を出す
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
' C3の音をベロシティ127でノートオン
Dim msg As Byte() = New Byte() {&H90, 60, &H7F, 0}
midiOutShortMsg(hDevice, BitConverter.ToInt32(msg, 0))
End Sub
' マウスアップで音を消す
Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
' C3の音をノートオフ
Dim msg As Byte() = New Byte() {&H80, 60, 0, 0}
midiOutShortMsg(hDevice, BitConverter.ToInt32(msg, 0))
End Sub
End Class
デバイスのオープン・クローズに関しては音源選択や16CHを超えるインストゥルメントを使用しなければこのまま使っていて問題ないかと。要点はショートメッセージの組み立て方です。
ショートメッセージは3byteで指定します。ただ、APIでは4byteのIntegerで引き渡す必要があるので、
Dim msg As Byte() = New Byte() {&H90, 60, &H7F, 0}
このように4byte分のバイト配列を生成し、BitConverterでIntegerに変換して送ります。メッセージの詳細はMIDI規格のサイトを参照してください。とりあえず音を出すなら&h9xでノートオン、&h8xでノートオフだけ覚えればなんとかなるかと。
Dim msg As Byte() = New Byte() {&H9x, 音階, &H7F, 0} ' ノートオン
Dim msg As Byte() = New Byte() {&H8x, 音階, 0, 0} ' ノートオフ
xにはMIDIチャンネルが入ります。0[ch01]~F[ch16]。9[ch10]はドラムセットです。
音階は60がC3に相当。(YAMAHAだとC4になるんでしたっけ…?)
第3バイトはノートオンのときはベロシティで&h00[0]~&h7f[127]を指定できます。ノートオフのときは常に0です。
MIDI音源のイニシャライズは行っていないので、直前の再生曲でVolが0とかになっていると音が出ないと思います。MIDIの初期化はロングメッセージの送信が必要になるので割愛します。
ありがとうございます!
無事MIDIで音を出すことが出来ました。
MIDIの音量は最初0で聞こえなかったようですが、自分であげればなんら問題はありませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ドナドナの楽譜の音階を教えて...
-
「こいのぼり」の音(ドレミ~...
-
クラリネットで、シ♭のトリルの...
-
7-8700とi7-9700では、ドの程度...
-
mid1E~hiDとは?
-
音が半音高く聞こえる 改善方法
-
チャイコフスキーの『くるみ割...
-
4度と5度が完全である理由を教...
-
ハーモニカ
-
これって絶対音感なんですか・...
-
携帯の16和音とか32和音って...
-
iOS版GarageBandのトランスポー...
-
【音】hihiAってどういう意味?
-
歌詞の意味を教えてください。
-
ウクレレコード表におけるルー...
-
曲を1.5倍速にすると音程は?
-
手をグーにして弾くピアノ曲!?
-
下降形パッシングディミニッシ...
-
ド#ミラのコード
-
ドレミファソラシドのこと何て...
おすすめ情報