Note: this document is subject to change over time.
2.1 MIDI Messages
3.1 Audio Drivers
5.1 On-Board Sound
The purpose of this document is to give examples of ways to configure commonly used MIDI setups on Windows and to clarify a number of misconceptions about the process that are common in the computer-related music community. Reasons for landing on a document like this include:
- Wanting to make MIDI aspects of legacy software work on later versions of Windows.
- Needing a better-performing MIDI synthesizer than the one Windows comes with.
- Trying to get two MIDI programs to talk when they can’t see each other.
- Confusion about the whole MIDI/audio thing (i.e. “what is this ASIO thing?”).
This document includes both general remarks and explanations about MIDI and audio devices as well as various MIDI-related software recommendations. Details on how to set up equipment and software for specific tasks can be found at the end under “Configuring MIDI Setups.”
Those using Digital Audio Workstation (DAW) software may or may not find this document useful. Programs like Cakewalk Sonar and Steinberg Cubase are examples of DAWs for Windows. DAWs handle many aspects of the MIDI setup for synthesizers internally, both presenting a different interface and eliminating some of the difficulties faced when using stand-alone software synthesizers. The main applicable part of this document to DAWs would be the sections on audio devices and drivers.
If you have landed on this document after being stuck with no sound coming from your DAW, which is the most common problem I hear about, you likely have some settings related to your audio devices to work through. Unfortunately, those are often quite specific to the individual devices and programs. Make sure sound is being sent to the right places and being listened for in the right places, and check both hardware settings, driver settings for any devices, and settings within the DAW. Similarly, if devices aren’t being recognized, you probably have some driver issues to resolve – or your device simply might not work on the particular version of Windows you have (a common issue for older hardware on Windows 8/8.1). DAW-specific tutorials will probably offer you more help than I can in this document.
MIDI stands for Musical Instrument Digital Interface. It is a protocol for communicating information between various devices and it has been around for over 30 years. For various reasons, many people new to MIDI stuggle with what exactly it is and, therefore, often misunderstand what it and programs using it can and cannot do. Here are some quick facts that are often stumbling points for people that are new to working with MIDI and audio, each of which will be addressed in more detail later:
- MIDI is a way of communicating between devices with certain message formats. For example, a MIDI controller can communicate to another device, perhaps a synthesizer, when a pitch should start and when it should end—much like the information communicated by a note on a paper score. In fact, a MIDI file is actually pretty close to a paper score in terms of the types of information it captures.
- MIDI is not sound! You cannot “hear” MIDI any more than you can “hear” a paper score
by itself. MIDI controllers do not create sound by themselves. Things that make sound from MIDI must interpret what they are told via the MIDI protocol. These devices are synthesizers, and they interact with audio devices to create sound.
- Generally, your on-board sound chip and many external soundcards know nothing special
about MIDI and they are not MIDI synthesizers.
- Windows actually does know something about MIDI, but as of Windows 8/8.1, the operating system doesn’t let you have a say about what it does in that regard. It leaves all managing of MIDI settings to individual applications (such as a DAW).
Note that a “MIDI device” does not have to be a piece of hardware. There are plenty of software “MIDI devices” that can be called as such simply because they show up in the device manager when running.
MIDI information is broken into messages, which are sent over some communication medium. Messages can refer to “programs” or patches (think of it as an instrument name), channels, pitches, and so on. Channels can be thought of like staffs on a digital music score. Some examples of MIDI messages include:
- Note on: start playing a particular pitch on a particular channel at a particular volume.
- Note off: stop playing a particular pitch on a particular channel.
- Program change: assign a new instrument to a channel.
Once again, these messages must be interpreted by a synthesizer in order to create sound. Sometimes MIDI messages are also called MIDI events.
MIDI-related programs that do not show up in the device manager when running are not MIDI
The difference between a MIDI controller and synthesizer is quite simple:
- A MIDI Controller is a device that allows a human to push some buttons or keys and generate MIDI messages or events. In: human ineraction. Out: MIDI messages. There is no sound involved.
- A MIDI synthesizer is a device that receives MIDI messages and produces sound. In: MIDI messages. Out: sound via an audio device or audio jack.
In a hardware-only setup, a MIDI controller (like a keyboard) would be physically connected to a MIDI synthesizer, to which speakers or headphones would then be connected. Perhaps some of the sound vs. MIDI confusion that the music community experiences is due to the fact that may keyboards actually include both of these elements: they are all-in-one MIDI controllers and synthesizers. However, any such device that features both “MIDI in” and “MIDI out” ports can usually be used as one or the other independently.
There is also a third category of devices that simply re-rout and/or re-interpret MIDI messages. As hardware, these devices are usually peripherals used to do specialized tasks like duplicating a stream of MIDI messages, merging MIDI message streams, or allowing a foot pedal to send messages down a regular MIDI cable (foot pedals meant for use with MIDI equipment typically have 1/4-inch TS or TRS plugs and send control voltage that has to be interpreted by something as a series of MIDI messages). Software also exists to re-rout, merge, and split MIDI messages.
Windows comes with a MIDI synthesizer build into it: the Microsoft GS Wavetable synth. It is what allows you to double-click on a MIDI file, open it in some MIDI player, and hear the file interpreted as sound. Although this default Windows synthesizer has the redeeming point that it allows you to have a MIDI synthesizer with absolutely no setup required, it is the source of many complaints from the Windows-based music community.
- It sounds terrible. Is that an oboe, bassoon, or kazoo? It’s hard to tell sometimes.
- It lags like nobody’s business. In technical terms, the lag is referred to as latency. If you hook up a MIDI keyboard to talk to this synthesizer (although this in itself is an issue), you will experience high latency: there is a noticeable delay between the key going down and sound actually starting. The delay is big enough that it is completely intolerable for anyone trying to use MIDI input in a serious way. 100ms or more is not unusual.
- There is no easy MIDI-in setup. Even if you aren’t put off by the latency, there is no way to configure this synthesizer to directly take input from a MIDI controller unless the controller already has software that allows you to redirect its output. Often 3rd party software is needed to be able to play the default synthesizer from a keyboard or some similar device.
- It is more difficult on recent Windows versions to get away from this laggy kazoo synth and
use a better one. On Windows XP this was relatively easy and you could just point the operating system to that other synthesizer manually. Windows Vista and 7 started to hide that functionality; on Windows 7, you could still do it, but it meant diving into the registry or using 3rd party software. On Windows 8/8.1, it is actually impossible to change the default synthesizer in a simple and generalized way.
While it’s nice that Windows just goes and does the MIDI-to-synthesizer thing for you when you want to play a MIDI file with minimal effort, these points are quite a nuisance to many music people. Some solutions and workarounds are explained in later sections. However, due to the progressive lack of support for easily using other synthesizers, some extremely old MIDI editors will end up being chained to the default synthesizer on Windows 8. However, this does NOT mean you can’t set a different output device within other music software on Windows 8/8.1, and any reasonably modern piece of MIDI-related software will let you do so. The only programs I have ever personally seen that did not allow setting the output device actually predated Windows XP.
A virtual MIDI port is a piece of software that runs in the background to send/receive MIDI messages from other programs or hardware devices. When running, virtual ports will show up in the Windows device manager under “sound, video, and game controllers. Virtual MIDI ports allow communication between MIDI-related programs that are not perceived by Windows as MIDI devices (which is to say that they do not show up in device manager). In other words, these programs might be able to send and receive MIDI messages, but they can’t “see” each other directly—but they will both be able to see a virtual MIDI port and can, therefore, use it to communicate. Hardware ports can be used similarly, although it often requires using a MIDI cable to create an ungainly self-loop (connecting a device’s output to its own input).
Typically the term “soundcard” is used to refer to audio hardware that sits inside the computer (on the motherboard or a PCI card), while the term “audio interface” is used for external devices connected by USB/firewire/etc. However, external devices are sometimes referred to as “external soundcards” and some internal devices are referred to as “audio interfaces.”
Soundcards or audio interfaces and on-board sound chips are responsible for producing the signals that go into your headphones/speakers and/or for taking audio input from a microphone or other audio device.
These devices do not necessarily have anything to do with MIDI. Some older sound cards have
hardware-level support for MIDI (in other words, they had their own synthesizers), and a few
modern cards do as well, but it is rare (see the PCI cards section later on). Most modern
ones do not. In other words, with a recent PC and sound card, you are likely to hear the
exact same default Windows synthesizer with your on-board sound and when you plug in
an expensive external or PCI sound card. Both will lag terribly even if the latency on the
expensive card is a little less terrible. The fact that a sound card doesn’t act directly as a MIDI
synthesizer doesn’t mean that the particular card used is unimportant. In fact, it is quite
important, and the drivers that the device has are one of the most important parts for getting low latency.
As with any device, sound cards require drivers to be usable. Not all of these drivers are equal in their performance. Several types of audio drivers are commonly seen for Windows sound devices, each representing a different protocol for communicating with the audio device.
- Windows DirectSound
- Windows Driver Model (WDM)
- MultiMedia Extensions (MME)
- Audio Stream Input/Output (ASIO)
Many devices will come with drivers in the first three categories listed above. Device-specific ASIO drivers, however, are typically only supplied with higher-end sound cards and those specifically intended for musical applications. Although some cards can yield perfectly reasonable performance with WDM and MME drivers, most require ASIO drivers to achieve their lowest latency performance with real-time MIDI and synthesizers.
ASIO drivers are also strictly required by some software synthesizers, which is problematic if the only sound devices available do not have their own ASIO drivers. “Universal ASIO drivers” exist to wrap other types of drivers as ASIO drivers, which will allow ASIO-less devices to be seen by software that will only
use ASIO drivers. However, just because the non-ASIO drivers “look” like ASIO, it does not mean that they will perform well. The latency achieved this way will always be greater than what can be achieved with device-specific ASIO drivers.
This section contains a list of programs that I have used extensively myself, frequently recommended to people who asked me for help, and advised students to use when setting up their laptops for MIDI-related coursework.
The following virtual MIDI ports have worked for me on Windows Vista, 7, 8, and 8.1.
This program is freeware for 1 virutal port. There is also a paid version that offers 30 ports.
This is a freeware program that offers a custom number of virtual ports. Setup is a little bit more complicated than for loopbe1, since you need to create the ports yourself from LoopMIDI’s control panel.
The following software synthesizers all use a virtual instrument format called sound fonts, or sf2 files. This format was defined by Creative Labs. To use the synthesizer, you need to load at least one sf2 file. If you don’t already have sound fonts, you can find some here:
Note that instrument selection settings within the synthesizers can potentially be overridden by program
SyfonOne and SynthFont
SyFonOne is a freeware, sound font-based synthesizer. Synthfont is a low-cost program that can be used to record MIDI files using sound fonts. These programs work with or without ASIO drivers, although performance is greatly improved with ASIO.
CoolSoft’S Virtual MIDI Synth
This is a very easy-to-use sound font-based synthesizer and, if you do not have ASIO drivers, I highly recommend t as a lowest-possible-latency option. Setup is simple and the program’s performance is quite good. Unfortunately though, it can cause problems with some device-specific software, so your mileage may vary. For example, on Windows 8, the Korg Kontrol Editor would not work for me while I had this program installed. On Windows 10 those problems disappeared. This synthesizer is my go-to option when I need something with good performance when I only have my on-board sound chip to work.
Like the two programs above, Sforzando does not require special drivers to produce sound. It will load soundfonts, but requires that they be converted to another format before being used. This conversion only needs to happen once per soundfont file used.
SFZ and SFZ+
(July 2017) Update: dead links have been removed. Unfortunately it seems that these are no longer available for download from Cakewalk’s site.
SFZ uses only one file and allows you to configure the instruments per channel. SFZ+ allows for one sf2 and instrument selection per channel. These programs require ASIO drivers.
Windows XP allowed changing the default MIDI output device under the regular audio settings. That part of the audio settings panel was removed in Windows Vista and later versions, although it was still possible to change the default output device through the registry up through Windows 7. The following programs wrap that functionality, providing a nice user interface instead of forcing the user to dig around in the registry. You may need to run the programs as an administrator to get them to work and/or reboot before changes will take effect.
On Windows 8, there is still a registry entry for default MIDI output, but it only seems to affect Windows Media Player and no other programs. Because of this, old software that relies on the default output device setting to know where to send MIDI messages will be tied to the default synthesizer in Windows 8.
PLW MIDI Mapper
This is a control panel item that needs to be added manually. Placement of the file on 64-bit systems can be a bit tricky; sometimes it works right away when put in the right place, sometimes it doesn’t.
This is a stand-alone program for setting the default MIDI output device on Windows Vista that can also be used with Windows 7.
The following programs are useful for rounting MIDI messages from one device to another. Note that you do not need a virtual MIDI port to use these, although they are may certainly be used in conjunction with virutal MIDI ports.
This is a great tool both for MIDI message routing and debugging device installation and connectivity issues, since not only lets you rout messages between devices but also shows you the messages it relays in a console.
HaskellOx is a little program written by me using Haskell and Euterpea that was inspired by Midi-Ox. Although it isn’t nearly as powerful as MIDI-Ox, it can still connect MIDI devices together and can also be run without installation (so you can do things like run it from a flash drive). However, I haven’t done extensive testing with it to determine whether there are any latency issues when under a heavy message load. It’s a useful tool for casual applications.
Universal ASIO drivers allow other types of drivers (WDM, MME, etc.) to be perceived by
programs as having the ASIO interface. However, it will not give true ASIO performance.
Latency will still be higher with one of these drivers than when using device-specific ASIO drivers.
This is the most widely-used and easy to set up universal ASIO driver out there. It is also
well-documented. However, it causes the driver it wraps to be usable by only one program at a time. So, if you are using as synthesizer that needs ASIO, you can only get sound from that one program and no others. ASIO4All will also sometimes get invoked by programs that search through drivers upon startup (common with DAWs), which can cause problems with in-program changes to the audio setup.
Asio Multiclient Wrapper
This program gets around the one-device limit of ASIO4All to some extent. However, it is trickier to set
up and can cause conflicts with some DAW software (for example, Cakewalk Sonar X1 and X2 crashed
immediately on startup when I had it installed).
JACK is my driver-wrapping tool of choice these days for times when I can’t use device-specific ASIO drivers. Unlike ASIO4All, it doesn’t get invoked automatically by programs searching through drivers. Unfortunately, starting the ASIO wrapper isn’t always easy and can take a few tries before it can successfully get access to the intended driver. Sometimes it even requires logging off and on again so that JACK can be loaded as the first audio program. So, make sure you set it up in advance of when you need it. If you wait until the last minute, you risk getting in front of the audience and then having a dreaded technical difficulty delay.
You can set up JACK as follows:
- Install JACK and reboot. Then, open the Jack Control executable.
- Under the Setup window’s options, you want the server prefix to be “jackd -S”, the driver to
be “portaudio”, and the interface to be your driver of choice. Save the settings and close the
setup window but don’t close the main window.
- Start the audio server with the “Start” button. You will need to keep this running while you
use your soft-synth. Your synth may crash if JACK is closed before the synth is. If JACK
crashes or gives an error when you try to start the server, check that there are no other
programs trying to use the same audio device.
- Open your soft-synth and you should now see JACK (by the name JackRouter) as an ASIO
This section contains general information about different types of audio and MIDI hardware I have both used myself and commonly been asked about. With on exception discussed in this section, there are really too many options in this area with too many new ones coming out each year to compare pros and cons of specific makes and models in a document like this. Prices vary widely from fairly cheap (<$50) to mid-range ($200-300) to incredibly expensive ($1000+). If you are looking to build a music PC, determine your budget and connectivity needs (both PC-to-device connectivity and things like TRS/XLR/etc. connections) and then research your options extensively before buying.
Note that old hardware will not necessarily work on later versions of Windows just because it worked on XP. Make sure the manufacturer says that your version of Windows is supported. Some pieces of old audio hardware can be coerced into working with later Windows versions, but others cannot or will be unstable at best.
Nearly every moern motherboard comes with a built-in sound device. While suitable for casual audio, they are generally not suitable for serious audio and MIDI development, particularly for systems where real-time audio and MIDI I/O is involved. On-board sound devices also usually do not have their own ASIO drivers, which are required by many synthesizers. Tools like ASIO4All can allow on-board sound devices to be used by synthesizers that require ASIO, and this will sometimes yield a bit better latency than if the same synthesizer is set up to use another type of driver. However, the latency will most likely still be noticeable.
PCI-based sound cards usually offer an improvement in sound quality and connectivity over on-board sound. However, once again, many do not come with ASIO drivers. Cards with ASIO drivers are often at least partially intended for music development. Cards intended mainly for entertainment (home theater, gaming, etc.) will not necessarily offer much better performance for real-time MIDI I/O than on-board sound devices.
Many older Creative Labs sound cards intended for audio development had the added benefit
of hardware-level sound font support, meaning that the cards had a very easy-to-customize
MIDI synthesizer. Unfortunately, this type of feature is increasingly hard to find as DAWs
and PCs have become more powerful. A list of sound-font compatibile devices can be found
Although obviously not a possibility in a completely freeware-based setup, there are some cheap USB audio interfaces that come with their own ASIO drivers and can give good latency with synthesizers. However, be warned that you get what you pay for in many ways. Although there are some cheap options, they have lesser audio quality and usually can’t achieve as low latency performance as certain, more expensive alternatives.
The cheapest such option I have explored is the Behringer UCA 202, which is the only specific interface I will discuss here. The UCA 202 is a lightweight, highly portable audio interface that comes with its own ASIO drivers. The device also allows usage of multiple driver types simultaneously (although only one program can be using the ASIO driver at any given time). This means that, for example, you can listen to videos or mp3s online or in Windows Media Player while working with SFZ/SFZ+ in the background. However, don’t expect totally blinding performance from the UCA 202. The sound quality is marginal and, when the device is under rather a lot of strain, it is prone to glitches in the audio: clicks, pauses, etc. As a result, I’ve found it somewhat unreliable for trying to record anything live, since it can take many tries to get a glitch-free result. Nevertheless, it is a great portable and incredibly cheap solution.
There are many other devices for many budgets and connectivity needs. Although not a perfect
correlation, you do get what you pay for to some extent with audio interfaces. Cheap audio interfaces often have sound quality caveats and do not necessarily come with ASIO drivers (i.e. you must make sure it is explicitly stated somewhere that ASIO drivers exist). On the other hand, mid to high-end USB audio interfaces intended for DAW users will almost certainly have ASIO. More expensive boxes also usually offer more diverse connections, better mic preamps, and so on. Some are portable, others are intended to stay put. Some offer MIDI in/out ports, while others do not. Bear in mind that you don’t necessarily need to have audio and MIDI connectivity rolled together in one box. Although convenient and usually with good performance when in one box, it is still quite common to have separate audio and MIDI interfaces, particularly for mobile setups where size needs to be minimized.
USB MIDI interfaces provide hardware MIDI ports for a PC. Some are simply cables (USB on one end and MIDI in/out on the other), while others are hubs or boxes that require MIDI cables to connect to external MIDI devices.
Generic USB-MIDI cables can be found online for just a few dollars. However, they are not guaranteed to work. The cheap cables are often sufficient for casual music purposes (what I would consider “weak real-time” applications), but, if they are listed as simply “class compliant” and do not have their own drivers supplied by the manufacturer, they may not work on all versions of Windows. It has been my experience that class-compliant USB-MIDI interfaces that work on XP up through Windows 7 will often behave strangely on Windows 8/8.1, if they even work at all. Examples of strange behavior include showing up in device manager but refusing to
send messages through (or sending bad data) even though the throughput lights blink as
they should. If you have Windows 8 or 8.1, make sure the manufacturer supplies compatible
This section provides examples of specific setup problems and how to solve them with the tools described so far.
Sometimes there are times when it’s useful to have a MIDI input device, but when a physical keyboard or other MIDI controller isn’t available. This is common when developing interactive MIDI applications on the go with a laptop. Although another good solution is to carry a small keyboard like a Korg nanoKey2 or a QuNexus, they are not the only option. From the list of software earlier in this document, you will need the following:
- A virtual MIDI port of your choosing
- Proxima Controller
Set Proxima Controller to use the virtual MIDI port as its output. Then, take input from the same virtual port in the application requiring MIDI input.
One may wonder who would want to do this given how laggy and awful the default synth is on Windows, but here is an example situation: suppose you have a small USB keyboard and need to use it to play some notes in a very relaxed way during a presentation with a laptop and don’t have room for a bulky external card. I have been in this position many times. Aside from your MIDI controller being installed and ready, you need one thing: a program for re-routing MIDI messages (MIDI-Ox or my Haskell Ox). Set the re-routing program to take input from the controller (which should show up as a device; if it doesn’t something is likely wrong with the controller’s installation) and have it send those messages to the Microsoft GS Wavetable Synth. And then, off you go with laggy kazoo fun.
You will need two things:
- A virtual MIDI port of your choosing
- A software synthesizer of your choosing
Many MIDI players and some simple score editors (particularly old ones) do not have their own audio engine/synthesizer and are designed to just sent out MIDI messages to “something.” By default, that “something” will end up being the Windows synthesizer unless the software is configured to do otherwise.
Not all old software can be configured to do otherwise unfortunately. However, those programs that can usually have an option somewhere for setting the MIDI output device. Use the virtual MIDI port as the output for the score editor or MIDI player. Set the synthesizer to take input from the same MIDI port.
If two programs can send/receive MIDI messages but cannot “see” each other (they don’t show up as devices), you can allow them to talk through a virtual MIDI port like so:
Program 1 → Port → Program 2
NOTE: the port should have messages flowing through it in one direction only. In other words, one program should talk while the other listens. If the programs need to have a back-and-forth conversation over MIDI, you will need two virtual MIDI ports to avoid feedback problems:
Program 1 → Port 1 → Program 2
Program 1 ← Port 2 ← Program 2
MIDI interfaces with paired MIDI in/out ports can also be used this way: just connect the output to the input and then connect the programs appropriately. Again, bi-directional communication between the programs would require twice as many ports to avoid feedback.
First, if you are attempting to minimize the latency of the Windows default synth, it is a lost
cause. Your best bet is to use a different synthesizer and follow the instructions in the previous
CoolSoft’s VirtualMIDISynth allows you to have some control over the output latency without needing special drivers. To minimize the latency, go into Configuration > Options > Advanced Options and set the additional output buffer lower than the default (which is 250ms by default – really high!). I usually recommend starting with a value of 10 and testing playback with at least some chords in it to hear some MIDI polyphony. Some systems can go as low as 0-2ms latency with this synth, although this is somewhat rare and requires a pretty beefy machine (often a desktop tower and good audio hardware). Many lesser machines, however, will still work with 5-7ms. Depending on the particular machine and its settings higher latencies may be required to avoid distortion, clicks, and/or audio dropouts. On laptops in particular, the degree to which you can reel in the latency can be affected by power settings. High performance modes can typically function with lower latencies without audio glitching than battery saving modes are capable of.
If you are using ASIO drivers, you may need to adjust the buffer size to optimize the performance of the device on your system. The larger the buffer, the worse the latency will be, but the less likely you will be to have audio quality problems (clicks, audio dropouts, etc.). High-end audio devices meant for serious music development usually can have the buffer size set quite small. How powerful a PC the audio device is on also impacts this process. For a detailed explanation of the variables involved in minimizing latency, I recommend the following article: