首页 > 解决方案 > 无法使用 NAudio 和 teVirtualMIDI 发送 MIDI 音符

问题描述

我正在尝试使用 NAudio 将 Midi Note On 消息发送到 DAW 软件,并使用由 teVirtualMIDI 创建的虚拟端口。我能够在 Ableton Live 10 中看到由 teVirtualMIDI 创建的“设备”,但在 Live 中未能成功接收任何信息。我的声音被调高了,我从来没有看到 Live 的 Midi 仪表移动。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NAudio.Midi;
using TobiasErichsen.teVirtualMIDI;

namespace BDBConsole_1_0
{
    public class BDBMidiClient
    {
        public static ConsoleKeyInfo cKi;
        public static TeVirtualMIDI port;
        static MidiOut midiOut;
        int midiOutIndex;
        //public static List<MidiEvent> noteEvent;

        static void Main(string[] args) 
        {
            CreateMidiPort();
        }


        public static void CreateMidiPort()
        {
            TeVirtualMIDI.logging(TeVirtualMIDI.TE_VM_LOGGING_MISC | TeVirtualMIDI.TE_VM_LOGGING_RX | TeVirtualMIDI.TE_VM_LOGGING_TX);

            string portName = "BDB Client";
            //port = new TeVirtualMIDI(portName, 65535, TeVirtualMIDI.TE_VM_FLAGS_INSTANTIATE_BOTH);
            port = new TeVirtualMIDI(portName);

            Console.WriteLine("New Midi Port Opened...");
            Console.ReadKey();

            EnumerateMidiOutDevices();

            Thread thread = new Thread(new ThreadStart(SendNextMidiOutMessage)); 
            thread.Start();

            //SendNextMidiOutMessage();
        }


        public static void EnumerateMidiOutDevices() 
        {

            int noOutDevices = MidiOut.NumberOfDevices;
            Console.WriteLine("No. of Midi Out Devices..." + noOutDevices);
            Console.ReadKey();

            string deviceOutOne = MidiOut.DeviceInfo(1).ProductName;
            Console.WriteLine("Device One..." + deviceOutOne);
            Console.ReadKey();
        }


        public static void SendNextMidiOutMessage()
        {
            midiOut = new MidiOut(deviceNo: 0);
            //events = new List<MidiEvent>();
            int channel = 1;
            int note = 64;
            var noteOnEvent = new NoteOnEvent(0, channel, note, 127, 1000);

            try
            {
                //while (true) loop here before
                do
                {
                    Console.WriteLine("Send Midi Note...");
                    cKi = Console.ReadKey();

                    midiOut.Send(noteOnEvent.GetAsShortMessage());
                    Console.WriteLine("Note Sent...");
                    cKi = Console.ReadKey();
                } while (cKi.Key != ConsoleKey.Escape);

                port.shutdown();
                Console.WriteLine("Midi Port Closed...");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine("thread aborting: " + ex.Message);
            }
        }
    }
}

对此的任何帮助将不胜感激!

标签: c#naudio

解决方案


推荐阅读