VB.NET でMIDIOUTをOPENするには?

解決


ガガ  2003-08-12 21:10:15  No: 108088  IP: [192.*.*.*]

Windows2000にVisualBasic.NET Standardをインストールして3ヶ月の初心者です。MIDIデバイスを直接操作したくて見様見真似でこのようにしましたが、midiOutがオープンできなくてお手上げ状態です。

  Private Declare Function midiOutOpen Lib "winmm.dll" (ByVal _
  lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback _
  As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long

  Dim hMid As Long
  Dim ret As Long
  
  Private Sub Form1_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load
       
  ret = midiOutOpen(hMid, -1, 0, 0, 0)

  End Sub


retには11が戻ります。
MIDIデバイスはソフトシンセとUSB対応のものを使っています。
midiOutGetNumDevs()では正常にデバイスの数を返してきます。
MCIでのMIDIファイル再生も問題なし。
市販のシーケンスソフトもでも問題ありません。
どうしてもretが0になってくれなくてお手上げ状態です。
何か根本的な見落としがあるのでしょうか。
よろしくお願いします。

編集    削除
よねKEN  URL  2003-08-19 22:01:03  No: 108089  IP: [192.*.*.*]

とりあえずAs LongとなっているところをAs Integerにしてみては?
旧VBのLongは32ビット整数で、VB.NETでの32ビット整数はIntegerです。

編集    削除
ガガ  2003-08-20 11:01:53  No: 108090  IP: [192.*.*.*]

よねKENさん、有難うございます。

質問を書いた後すぐにLongをIntegerにするという事を知って、整数は全てIntegerに
してみましたがやはりダメでした。

編集    削除
魔界の仮面弁士  2003-08-20 11:48:44  No: 108091  IP: [192.*.*.*]

第一引数がLPHMIDIOUT型 … と言うことは、ByRefなのでは。

midiOutOpen APIを使った事が無いので、合っているのかどうかはわかりませんが、
とりあえず、以下のようなコードを書いてみたら 0が返されました。参考になれば。


Public Delegate Sub MidiOutProc( _
    ByVal hmo As IntPtr, _
    ByVal hwnd As UInt32, _
    ByVal dwInstance As Int32, _
    ByVal dwParam1 As Int32, _
    ByVal dwParam2 As Int32)

Private Declare Function midiOutOpen Lib "winmm" _
    (ByRef lphMidiOut As IntPtr, _
     ByVal uDeviceID As Int32, _
     ByVal dwCallback As MidiOutProc, _
     ByVal dwInstance As Int32, _
     ByVal dwFlags As Int32) As Int32

Private hMid As IntPtr

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ret As Integer = midiOutOpen(hMid, -1, Nothing, 0, 0)
    MessageBox.Show(ret.ToString())
End Sub

編集    削除
ガガ  2003-08-21 05:54:44  No: 108092  IP: [192.*.*.*]

あっ、そっかぁ!
lphMidiOutは参照渡しだった。
ByRefにしたらすんなり0が返ってきました。
1ヶ月間のモヤモヤが吹っ飛びました。
魔界の仮面弁士さん、有難うございます!

編集    削除