最近、作成したさまざまなアプリケーションでいくつかの問題が発生しています。これらのアプリケーションはすべて、Midi コントローラーを使用して MIDI ノートを照明デスクに送信します。この問題は、これらすべてのアプリケーションで同じです。
実行時にアプリケーションで作業しているときに、アプリケーション全体がフリーズすることがあります。警告メッセージは表示されず、デバッガーがポップアップして何が問題なのかを教えてくれません。MIDIノートを演奏したいときはいつも発生します。その時点で私にできる唯一のことは、マシン全体を再起動することですが、これはそれほど面白くありません。
アプリケーションがハングアップし、デバッグ情報が得られないため、Midi ノートの送信に使用する DLL に問題があること、または DLL の実装方法に問題があることは確かです。
以下のコードを投稿しました。誰かが私が間違っていることを教えていただければ幸いです。
これは、Midi を初期化するメインフォームのコードです。
MidiTools midi;
private void initMidi()
{
midi = new MidiTools();
midi.Enabled = true;
}
initMidi() は Form_Load 関数内から呼び出されます。
Midi ノートを再生するコードは次のとおりです。
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 ライブラリ自体は、次のリンクからダウンロードされました: https://midi-dot-net.googlecode.com/files/midi-dot-net_src_1.0.5.zip
過去に、この問題を解決するために複数の方法を試しました。より大きな遅延を挿入しようとしましたが、リスト内のメッセージをキューに入れ、それらを1つずつ処理して、別のノートがまだ送信されている間にミディノートが再生するように求められないようにしましたが、どれも役に立ちませんでした.
98% のケースで動作しますが、たまにフリーズすることがあります。M-Audio Midisport コントローラーを使用しています。(http://www.m-audio.com/products/view/midisport-4x4-anniversary-edition)が、他のコントローラーでも発生しています。
したがって、どんな助けも大歓迎です。
よろしく、ケネス