从C#中的MIDI端口获取信号

gid*_*nrv 7 c# midi

我为我的生日买了一个MIDI键盘.我发现了一个程序(MidiPiano)从MIDI输入中获取信号并将其转换为音乐,但我更愿意自己写一个.

我在哪里可以找到执行此类任务的文档?MIDI协议有很好的文档,但不是MIDI端口.

我从CodeProject(Project MIDI和C#MIDI Toolkit)检查了两个项目,但花了很多时间没有接近我的目标.

对项目的引用会很好,但是请只有C#.

小智 6

您需要包含http://msdn.microsoft.com/en-us/library/dd757277(VS.85).aspx中列出的所有必需功能.

如果您只是使用短消息并不太难,如果您想要进行SysEx或输出流,事情会变得复杂一些.

基本输入端口所需要的只是获取有效的输入ID(InputCount -1),将有效ID传递给Open,启动输入,通过委托接收消息...停止输入然后最后关闭它.这是一个非常粗略的示例,说明如何实现这一点 - 您需要进行一些检查并注意在关闭之前未收集端口并且已关闭回调,否则您将冻结系统!

祝好运!

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);
    }
}


Mar*_*arl 2

我也找不到太多东西,但就像 Josh 说的那样,Carl 在 MIDI 方面确实做了很多工作,所以也许给他发一封电子邮件...他甚至可能会回复,但他通常是一个 VB.Net 人员,所以除非有人把他的东西移植到 C# 了吗?

对于其他一些看起来很有希望的参考......

如果您正在寻找纯 C# 解决方案...请查看Alvas.Audio。对于您所要求的内容来说,它看起来确实有点高端,但可能会有所帮助。

也可能是MIDI项目