我为我的生日买了一个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);
}
}
我也找不到太多东西,但就像 Josh 说的那样,Carl 在 MIDI 方面确实做了很多工作,所以也许给他发一封电子邮件...他甚至可能会回复,但他通常是一个 VB.Net 人员,所以除非有人把他的东西移植到 C# 了吗?
对于其他一些看起来很有希望的参考......
如果您正在寻找纯 C# 解决方案...请查看Alvas.Audio。对于您所要求的内容来说,它看起来确实有点高端,但可能会有所帮助。
也可能是MIDI项目
| 归档时间: |
|
| 查看次数: |
22068 次 |
| 最近记录: |