Es necesario para envolver todas las funciones necesarias que figuran en http://msdn.microsoft.com/en-us/library/dd757277(VS.85).aspx
no es demasiado difícil si sólo está utilizando mensajes cortos, las cosas se ponen un poco más complicado si usted quiere hacer SysEx o transmisión de salida.
Todo lo que necesita para una entrada básica El puerto es para obtener las ID de entrada válidas (InputCount -1), pasar una ID válida para abrir, iniciar la entrada, recibir los mensajes a través de un delegado ... Detener la entrada y luego finalmente ciérralo. Este es un ejemplo muy aproximado de cómo se podría lograr esto: tendrá que hacer algunas comprobaciones y tener cuidado de que el puerto no se recoja antes de que se cierre y de que se haya producido la devolución de llamada cerrada o de que se congele el sistema.
¡Buena suerte!
namespace MIDI
{
public class InputPort
{
private NativeMethods.MidiInProc midiInProc;
private IntPtr handle;
public InputPort()
{
midiInProc = new NativeMethods.MidiInProc(MidiProc);
handle = IntPtr.Zero;
}
public static int InputCount
{
get { return NativeMethods.midiInGetNumDevs(); }
}
public bool Close()
{
bool result = NativeMethods.midiInClose(handle)
== NativeMethods.MMSYSERR_NOERROR;
handle = IntPtr.Zero;
return result;
}
public bool Open(int id)
{
return NativeMethods.midiInOpen(
out handle,
id,
midiInProc,
IntPtr.Zero,
NativeMethods.CALLBACK_FUNCTION)
== NativeMethods.MMSYSERR_NOERROR;
}
public bool Start()
{
return NativeMethods.midiInStart(handle)
== NativeMethods.MMSYSERR_NOERROR;
}
public bool Stop()
{
return NativeMethods.midiInStop(handle)
== NativeMethods.MMSYSERR_NOERROR;
}
private void MidiProc(IntPtr hMidiIn,
int wMsg,
IntPtr dwInstance,
int dwParam1,
int dwParam2)
{
// Receive messages here
}
}
internal static class NativeMethods
{
internal const int MMSYSERR_NOERROR = 0;
internal const int CALLBACK_FUNCTION = 0x00030000;
internal delegate void MidiInProc(
IntPtr hMidiIn,
int wMsg,
IntPtr dwInstance,
int dwParam1,
int dwParam2);
[DllImport("winmm.dll")]
internal static extern int midiInGetNumDevs();
[DllImport("winmm.dll")]
internal static extern int midiInClose(
IntPtr hMidiIn);
[DllImport("winmm.dll")]
internal static extern int midiInOpen(
out IntPtr lphMidiIn,
int uDeviceID,
MidiInProc dwCallback,
IntPtr dwCallbackInstance,
int dwFlags);
[DllImport("winmm.dll")]
internal static extern int midiInStart(
IntPtr hMidiIn);
[DllImport("winmm.dll")]
internal static extern int midiInStop(
IntPtr hMidiIn);
}
}
Gracias Marcar, y por favor vea mi comentario a Josh. Le preguntaré a Carl después de converger su proyecto a WPF. Claro que tendré muchas preguntas entonces. – gideonrv