gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:08:59 25 4
gpt4 key购买 nike

我为生日买了一个 MIDI 键盘。我找到了一个程序 (MidiPiano),它从 MIDI 输入获取信号并将其转化为音乐,但我更想自己编写一个。

在哪里可以找到执行此类任务的文档? MIDI 协议(protocol)有详细记录,但 MIDI 端口没有。

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

对项目的引用是可以的,但请仅使用 C#。

最佳答案

您需要包装在 http://msdn.microsoft.com/en-us/library/dd757277(VS.85).aspx 中列出的所有需要​​的函数

如果你只是使用短消息,这并不太难,如果你想做 SysEx 或输出流,事情会变得有点复杂。

基本输入端口所需要做的就是获取有效的输入 ID (InputCount -1),将有效的 ID 传递给 Open,开始输入,通过委托(delegate)接收消息...停止输入,然后最后关闭它。这是如何实现这一点的一个非常粗略的示例 - 您将需要进行一些检查,并注意在端口关闭和关闭回调发生之前不会收集端口,否则您将卡住您的系统!

祝你好运!

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

关于c# - 从 C# 中的 MIDI 端口获取信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com