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で質問しましょう!
似たような質問が見つかりました
- 作詞・作曲 DTM DAWとmidiキーボードについて 1 2022/10/20 16:41
- 作詞・作曲 iMacでMIDIデータを良い音で再生するための音源をインストールする方法を教えて下さい 4 2022/07/09 17:51
- 楽器・演奏 dtm初心者です。 MIDIは入力機器に録音機械が ないと midiは打ち込み出来ないんですか? 1 2022/04/18 21:30
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- 作詞・作曲 MIDIキーボード内蔵オーディオインターフェイス 1 2022/06/04 08:35
- 楽器・演奏 Korg cx-3 new(2001~のモデル)を中古で購入しました。 しかし、音が出ません。症状と 2 2022/10/24 09:26
- 作詞・作曲 Cubaseでダウンロードしたmidi音源を聴く方法を教えてください。 今日Cubaseインストール 1 2022/05/14 17:13
- 楽器・演奏 cake walk でヤマハのキーボードをmidiとして設定したのですが、midiトラックを変えて録 1 2022/10/30 12:59
- 画像編集・動画編集・音楽編集 ひらがなの歌詞が付与された音符データをクラシック音楽のソプラノで歌うアプリはありますか? 1 2022/04/26 10:26
- 作詞・作曲 MIDIファイルを編集できる?アプリってありますか 1 2022/11/22 18:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「こいのぼり」の音(ドレミ~...
-
身の周りの音が音楽に聞こえる現象
-
宮沢賢治の「猫の事務所」
-
ハモニカはクロマチックと複音...
-
クラリネットで、シ♭のトリルの...
-
mid1E~hiDとは?
-
4度と5度が完全である理由を教...
-
7-8700とi7-9700では、ドの程度...
-
チャイコフスキーの『くるみ割...
-
でこぼこフレンズの最初の和音
-
亡くなった父が時々口ずさんで...
-
Auto-Tuneに頼り歌うことは恥ず...
-
4.4バランス5極 × RCA(オス赤...
-
声楽と特定のコントラバスのみ...
-
半音ずつ下がるコード進行
-
人生のメリーゴーランドをピア...
-
絶対音感持ちです。宇多田ヒカ...
-
音が半音高く聞こえる 改善方法
-
筝の調弦。。。
-
Premiereに声入れようとしたら ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報