2017年5月4日木曜日

C#でMIDI その1

 今回はC#でMIDIの音を鳴らそうと思います。

 以下がソースコードです。細かい内容については、インターネットで調べてください。

 本来はソースコードにはコメントを書くべきですが、簡単なプログラムなので省略します。趣味のプログラミングなのでご勘弁。

------------------------------
2017/5/4
APIの宣言に間違いを発見したため修正。
ハンドル(hmo)をuint(4byte)で宣言してました。64bit OSだとハンドルは8byteです。今までのソースコードだと、4byteの領域に8byteのデータを書いてました。
一応、64bit OS向けに修正しました。

------------------------------

using System;
using System.Runtime.InteropServices;

public static class Program
{
/*--------------------------------------------------*/
[DllImport( "Winmm.dll")]
extern static uint midiOutGetNumDevs();

[DllImport( "Winmm.dll")]
extern static uint midiOutOpen( ref long lphmo, uint uDeviceID, uint dwCallback, uint dwCallbackInstance, uint dwFlags);

[DllImport( "Winmm.dll")]
extern static uint midiOutClose( long hmo);

[DllImport( "Winmm.dll")]
extern static uint midiOutShortMsg( long hmo, uint dwMsg);

[DllImport( "Winmm.dll")]
extern static uint midiOutReset( long hmo);

[DllImport( "Kernel32.dll")]
extern static void Sleep( uint dwMilliseconds);

private const uint MMSYSERR_NOERROR = 0;

private const uint MMSYSERR_BADDEVICEID = 2;
private const uint MMSYSERR_ALLOCATED = 4;
private const uint MMSYSERR_NOMEM = 7;
private const uint MMSYSERR_INVALPARAM = 11;
private const uint MMSYSERR_NODEVICE = 68;

private const uint MMSYSERR_INVALHANDLE = 5;
private const uint MIDIERR_STILLPLAYING = 65;

private const uint MIDI_MAPPER = 0xffffffff;

/*--------------------------------------------------*/
public static void Main()
{
uint ret;
long hMidi = 0;

Console.WriteLine( "----- Midi -----");

/*--------------------------------------------------*/
ret = midiOutGetNumDevs();
Console.WriteLine( "Number of MIDI Device : " + ret);

/*--------------------------------------------------*/
ret = midiOutOpen( ref hMidi, MIDI_MAPPER, 0, 0, 0);
Console.WriteLine( "HMIDIOUT : " + hMidi);

ret = midiOutShortMsg( hMidi, 0x007f3c90);
Console.WriteLine( ret);

Sleep( 1000);

ret = midiOutShortMsg( hMidi, 0x007f3c80);
Console.WriteLine( ret);

ret = midiOutClose( hMidi);

/*--------------------------------------------------*/

Console.ReadLine();
}
}

0 件のコメント:

コメントを投稿