最近,我在制作的不同应用程序中遇到了一些问题。所有这些应用程序都使用 Midi 控制器将 midi 音符发送到照明台。所有这些应用程序的问题都是相同的。
在运行时,当我处理应用程序时,有时会发生我的整个应用程序冻结。我没有收到任何警告消息,也没有弹出调试器告诉我出了什么问题。当我想演奏一个中音时,它总是会发生。那时我唯一能做的就是重新启动整个机器,这并不好笑。
因为应用程序挂起并且我没有得到任何调试信息,我确信它与我用来发送 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-class 文件中的代码
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 库本身是从这个链接下载的: https ://midi-dot-net.googlecode.com/files/midi-dot-net_src_1.0.5.zip
在过去,我尝试过多种方法来解决这个问题。我尝试插入更大的延迟,尝试在列表中提示消息并逐个处理它们,以防止在另一个音符仍在发送时要求播放中音,但这些都没有帮助。
在 98% 的情况下,它都有效,只是偶尔会冻结我。我正在使用 M-Audio Midisport 控制器。(http://www.m-audio.com/products/view/midisport-4x4-anniversary-edition)但它也发生在其他控制器上。
因此,非常感谢任何帮助。
最好的问候,肯尼斯