0

最近,我在制作的不同应用程序中遇到了一些问题。所有这些应用程序都使用 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)但它也发生在其他控制器上。

因此,非常感谢任何帮助。

最好的问候,肯尼斯

4

0 回答 0