VB.NetでMIDIを使用して音をならせる

解決


海音  2004-08-13 20:44:04  No: 85124

ひさしぶりにこちらにお世話になります。
今回VB.Netの方に手をだしております
本当に初心者で、これぐらい・・・って感じかもしれませんが
過去ログを読んでも意味がわからない
という状態なので、質問させていただきます

そこで、本題なのですが、
ぉ題の通り「MIDIを使用して音を鳴らせる」
ということをしたいのです。

API関数を使うことはわかりましたが
どこにコードを書けばよいのか???というかんじです
ボタンをつくるのか
それとも、Form_Lordにかくのか・・・

現在知っている情報!?は↓の通りです

'使用できるMIDI音源デバイスの数を取得するAPI関数
'この関数の戻り値が0の場合、
MIDI音源がセットアップされていない事になるので、
MIDIで音を鳴らすことはできない

    Public Declare Function midiOutGetNumDevs Lib "winmm" Alias "midiOutGetNumDevs" () As Integer

'MIDI音源を開くAPI関数
'MIDI再生開始前に実行する。
戻り値にMIDI Outデバイスのハンドルが返される

    Public Declare Function midiOutOpen Lib "winmm.dll" Alias "midiOutOpen" (ByVal lphMidiOut As Integer, ByVal uDeviceID As Integer, ByVal dwCallback As Integer, ByVal dwInstance As Integer, ByVal dwFlags As Integer) As Integer

'MIDI音源から音を鳴らすAPI関数

    Public Declare Function midiOutShortMsg Lib "winmm.dll" Alias "midiOutShortMsg" (ByVal hMidiOut As Integer, ByVal dwMsg As Integer) As Integer

'MIDI音源を閉じるAPI関数
'アプリケーション終了後必ず実行する。
これを実行し忘れると次回からMIDI音源で音が出なくなるので注意!

    Public Declare Function midiOutClose Lib "winmm.dll" Alias "midiOutClose" (ByVal hMidiOut As Integer) As Integer

'MIDI音源の音量をセットするAPI関数(CC7,CC11メッセージとは違い音源そのものの出力音量の設定)

    Public Declare Function midiOutSetVolume Lib "winmm.dll" Alias "midiOutSetVolume" (ByVal uDeviceID As Integer, ByVal dwVolume As Integer) As Integer

これは、宣言?みたいなものなのでそのまま書いたんですが
これだけではやはり鳴らないんですよね。。。
midiStreamというAPIを使う方法
とかいろいろあるようなのですが
初心者なものでこれをどういうふうに使用するのかが
まったくわかりません・・・
もう、ホントに初心者なんです・・・
あと、過去ログを検索していると
ファイル名がどうとかってでてきたのですが、
まず、MIDIの音をどこからか取ってきてファイルに保存しないと
音はならないものですか?

上手く説明できませんでしたが、
ホントに困っています。。。
誰か教えていただきたいです。お願いします


もす  2004-08-14 11:15:38  No: 85125

APIを使った方法でないとダメですか?
ただ鳴らすだけならDirectX9を使った方が簡単ですよ。

「参照の追加」で「Microsoft.DirectX.AudioVideoPlayback」を追加すれば
下記のようなコードで、MIDIファイルを再生できます。
(AudioVideoPlaybackはDirectX9のSDKを
  Microsoftのサイトからダウンロードしてインストールすれば出てきます。
  もちろん動作させるPCでMIDIが再生できることが必要ですが。
  ちなみにWMAやMP3,WAVも同じ方法で再生できます)

Imports Microsoft.DirectX.AudioVideoPlayback

Public Class Form1
    略
    Private mAudio As Audio

    Private Sub Form1_Load(ByVal sender ...略
        mAudio = New Audio("D:\WINDOWS\Media\town.mid")
        mAudio.Play()
    End Sub
End Class


海音  2004-08-18 21:45:18  No: 85126

ありがとうございます
とりあえずやってみます。


海音  2004-10-04 21:49:57  No: 85127

あれから、いろいろとやってみたのですが
全然ピッともなりません。。。

一応、

****************************

    Public DX9 As New Microsoft.DirectX.AudioVideoPlayback
    Public Perf As DirectMusicPerformance
    Public Seg As DirectMusicSegment
    Public SegState As DirectMusicSegmentState
    Public Loader As DirectMusicLoader

    Public Sub OpenDirectMusic()
        Loader = DX9.DirectMusicLoaderCreate()
        Perf = DX9.DirectMusicPerformanceCreate()
        Call Perf.Init(Nothing, 0) '初期化する
        Perf.SetPort(-1, 1) 'MicrosoftSynthesizerを使う
        Call Perf.SetMasterAutoDownload(True) 
'SoundFontを自動読み込みにする
    End Sub

    '【 MIDIファイルの再生 】
    Public Sub PlayDirectMusic(ByVal FileName As String)
        If Perf Is Nothing Then
            OpenDirectMusic()
        End If
        '停止する。
        Call Perf.Stop(Seg, SegState, 0, 0)
        Call Perf.Reset(0) 'GMリセット
        Loader = Nothing
        Loader = DX9.DirectMusicLoaderCreate
        Seg = Loader.LoadSegment(FileName)     'ファイルを読み込む
        Seg.SetStandardMidiFile() 'MIDI
        '再生開始位置を先頭にする
        Seg.SetStartPoint(0)
        '再生
        SegState = Perf.PlaySegment(Seg, 0, 0)
    End Sub

    '【 DirectMusicの破棄 】
    Public Sub CloseDirectMusic()
        If Not (Perf Is Nothing) Then Perf.CloseDown()
    End Sub
    Private Sub Form_Load()
        OpenDirectMusic()
        PlayDirectMusic("C:\sotsuron\mid_001.mid")
    End Sub

    Private Sub Form_Unload(ByVal Cancel As Integer)
        CloseDirectMusic()
    End Sub

**************************************
と、もすさんが教えてくれたャッを試したのですが、
もすさんが教えてくれたャツでは、
'Imports'スタートメントは宣言の前に記述しなければなりません。
と出て、
もう一つのャツは、
Public  〜  As  …
の…の部分を宣言しないといけないとでるんです。
DirectX9はきちんとダウンロードして
もすさんに教わったように、
参照の追加もきちんとしました。
ホントに初心者で、エラーがでると
なにをいっているのかわからないんです。
だれか、ご教授おねがいします


もす  2004-10-05 09:01:05  No: 85128

> もすさんが教えてくれたャツでは、
> 'Imports'スタートメントは宣言の前に記述しなければなりません。
と出て、

??
エラー文そのまんまで、
Importsの前になにか宣言文を書いてらっしゃるいるんじゃないんですか?
(それ以外は想像つかないですけど・・・^^;)

(1) Windowsアプリケーションでプロジェクトを作成
(2) メニュー「プロジェクト」−「参照の追加」でダイアログを開き、
    「Microsoft.DirectX.AudioVideoPlayback」をダブルクリックし
     OKボタンを押下。
(3) フォームモジュール「Form1.vb」を開く。
(4) 下記のように入力。(先頭が * の行を追加)

* Imports Microsoft.DirectX.AudioVideoPlayback
  Public Class Form1
      Inherits System.Windows.Forms.Form

  #Region " Windows フォーム デザイナで生成されたコード "
  略
  #End Region

*    Private mAudio As Audio

*     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
*         mAudio = New Audio("D:\WINDOWS\Media\town.mid") 'ココは存在するMIDファイルにしてね
*         mAudio.Play()
*     End Sub
End Class

(5) コンパイル&ゴー

これで鳴りませんか?


海音  2004-10-05 19:46:37  No: 85129

エラーコメントはでたのですが、
音を鳴らすことはできました!
ホントに、何もわからない  +  意味不明な文なのに
辛抱強く、ご教授してくださって
ありがとうございます。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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