以前、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 件のコメント:
コメントを投稿