2020年9月6日日曜日

C#で、もう1回、MIDI その1

 以前、C#でMIDIを使って遊びました。その内容をまとめ直しておこうと思います。理由は暇だったから。

 では、まずは、基本から。

 最近のWindowsにはC#のコンパイラが標準でインストールされているので、今回のプログラムは簡単に試せます。C#のコンパイル方法は、Google先生に聞いてください。 "csc.exe"で検索すれば、すぐ見つかります。

 ちなみに、私の場合は、以下のようなバッチファイルを作って、使いまわしてます。(.Netのバージョンがバレているのはご愛敬。)

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

@echo off

cd %~p0


rem ----- パス -----

set csc_path="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"

set src_file="Midi.cs"


rem ----- 通常のコンパイル -----

%csc_path% %src_file%


rem ----- Windowsのアプリケーションでコマンドプロンプトを表示したくない場合のコンパイル -----

rem %csc_path% /target:winexe %src_file%


pause

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


 以下が今回のC#のソースコードです。ただ音を出すだけのコンソールアプリケーションです。

 ソースコードはご自由にご利用ください。ただし、趣味のプログラムなので保証はありません。コメントとかも適当です。プログラミングを勉強する方のご参考にでもなれば。


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

using System;

using System.Runtime.InteropServices;


public static class Program

{

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

/* 使用するAPIの宣言 */

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

[DllImport( "Winmm.dll")]

extern static uint midiOutGetNumDevs();


[DllImport( "Winmm.dll")]

extern static uint midiOutOpen( ref IntPtr lphmo, uint uDeviceID, uint dwCallback, uint dwCallbackInstance, uint dwFlags);


[DllImport( "Winmm.dll")]

extern static uint midiOutClose( IntPtr hmo);


[DllImport( "Winmm.dll")]

extern static uint midiOutShortMsg( IntPtr hmo, uint dwMsg);


[DllImport( "Winmm.dll")]

extern static uint midiOutReset( IntPtr 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;

IntPtr hMidi = IntPtr.Zero;


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.WriteLine( "Press Enter Key.");

Console.ReadLine();

}

}

0 件のコメント:

コメントを投稿