最近我在不同的应用程序中遇到了一些问题。所有这些应用程序都使用Midi控制器将midi-notes发送到照明台。所有这些应用程序的问题都是一样的。
在运行时,当我正在处理应用程序时,有时会发生我的完整应用程序冻结。我没有得到任何警告消息,也没有调试器弹出来告诉我什么是错的。它总是发生在我想演奏midi-note时。我唯一可以做的就是重启整个机器,这不是那么有趣。
因为应用程序挂起并且我没有得到任何调试信息,我确定它与我用来发送Midi-notes的DLL有关,并且那里存在问题或者我实现了dll的方式
我已经发布了下面的代码,我很感激,如果有人能告诉我我做错了什么?
这是初始化Midi的主窗体中的代码
MidiTools midi;
private void initMidi()
{
midi = new MidiTools();
midi.Enabled = true;
}
从Form_Load函数内部调用initMidi()。
播放Midi-note的代码是:
midi.playNote(22,0)
以下是MidiTools类文件中的代码
using Midi;
namespace MidiTest
{
class MidiTools
{
public bool Enabled { get; set; }
OutputDevice outputDevice = OutputDevice.InstalledDevices[1];
Channel selectedChannel = Channel.Channel16;
int velocity = 127;
private void playNote(int noteNumber, int delay)
{
// CONVERT THE NOTE
Note selectedNote = (Note)noteNumber;
if (Enabled)
{
Thread.Sleep(delay);
Console.WriteLine(DateTime.Now.ToString("hh:mm:ss NOTE: ") + selectedNote.ToString());
outputDevice.Open();
outputDevice.SendNoteOn(selectedChannel, selectedNote, velocity);
outputDevice.Close();
}
}
}
}
Midi-library本身是从以下链接下载的: https://midi-dot-net.googlecode.com/files/midi-dot-net_src_1.0.5.zip
过去我尝试过多种方法来解决这个问题。我已经尝试插入一个更大的延迟,我已经尝试提示列表中的消息并逐个处理它们以防止midinote被要求播放另一个音符仍然被发送,但这些都没有帮助。
在98%的案例中它起作用,偶尔它会冻结在我身上。 我正在使用M-Audio Midisport控制器。 (http://www.m-audio.com/products/view/midisport-4x4-anniversary-edition)但它也发生在其他控制器上。
所以非常感谢任何帮助。
祝你好运, 肯尼斯