
This is a quick and small program in C# to get started with MIDI programming using NAudio. There are other libraries for .NET which can be used for MIDI programming but NAudio has the reputation of being a very stable and updated library, so I have gone along with it.
This program only does two things:
- Enumerate MIDI devices
- Track MIDI IN messages from a MIDI keyboard.
Given below is the output when no MIDI keyboard is attached. The Microsoft GS WaveTable Synth is a default MIDI output device which comes as part of Windows 10. We are looking for an MIDI input device which can be queried for MIDI messages. In this case , there is none:

Next we attach a MIDI keyboard and we assume that the first device found in the list of MIDI IN devices is our target device. Here I have attached an Impact ix61 MIDI Controller keyboard and it shows its MIDI device names in the list.

Now we create a MIDI Input device object in NAudio and start tracking its events. As each event is received, it is dumped on the Console. Here I am pressing keys on the MIDI keyboard.

The source code is given below. Create a Windows .NET Console project and use Nuget to add a reference to NAudio.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NAudio.Midi; namespace MidiTest { class Program { static int mInDeviceIndex = -1; static int mOutDeviceIndex = -1; static MidiIn mMidiIn = null; static Boolean mReady = false; static void Main(string[] args) { listDevices(); if (mReady) { handleMidiMessages(); Console.ReadLine(); mMidiIn.Stop(); mMidiIn.Dispose(); } } public static void listDevices() { Console.WriteLine("MIDI In Devices"); Console.WriteLine("==============="); for (int device = 0; device < MidiIn.NumberOfDevices; device++) { mReady = true; // some midi in device exists Console.WriteLine(MidiIn.DeviceInfo(device).ProductName); } mInDeviceIndex = 0; Console.WriteLine("\n\n\nMIDI Out Devices"); Console.WriteLine("====================="); for (int device = 0; device < MidiOut.NumberOfDevices; device++) { Console.WriteLine(MidiOut.DeviceInfo(device).ProductName); } mOutDeviceIndex = 1; } public static void handleMidiMessages() { mMidiIn = new MidiIn(mInDeviceIndex); mMidiIn.MessageReceived += midiIn_MessageReceived; mMidiIn.ErrorReceived += midiIn_ErrorReceived; mMidiIn.Start(); } static void midiIn_ErrorReceived(object sender, MidiInMessageEventArgs e) { Console.WriteLine(String.Format("Time {0} Message 0x{1:X8} Event {2}", e.Timestamp, e.RawMessage, e.MidiEvent)); } static void midiIn_MessageReceived(object sender, MidiInMessageEventArgs e) { Console.WriteLine(String.Format("Time {0} Message 0x{1:X8} Event {2}", e.Timestamp, e.RawMessage, e.MidiEvent)); } } }
Leave a Reply