midi-spy · v1.0

MidiSpy Manual

Browser-based MIDI monitor: every incoming MIDI message as HEX and binary, with filters per message type and a mute switch per port. Runs locally in Chrome or Edge.

Getting Started

MidiSpy is a MIDI monitor that runs in your browser. It shows every message your MIDI devices send, byte by byte, as HEX and binary. The whole tool is a single HTML file: nothing to install, no server, no internet connection.

Requirements

  • Google Chrome, Microsoft Edge or Opera on a desktop computer. MidiSpy uses the Web MIDI API, which Safari and Firefox do not offer.
  • At least one MIDI input your operating system can see: a USB-MIDI device, a MIDI interface, or a virtual port (IAC Driver on macOS, loopMIDI on Windows).

Installation

  1. Download the ZIP from the MidiSpy download page and unpack it.
  2. Open MidiSpy.html in Chrome or Edge. Double-click the file, or drag it into a browser window.
  3. The browser asks for permission to use your MIDI devices. Click Allow.

Why does Chrome say “control and reprogram”? MidiSpy requests MIDI access with SysEx enabled, because otherwise the browser hides all SysEx messages. Chrome words that permission broadly. MidiSpy only listens and never sends a byte to your devices.

First Use

  1. Check the Ports group in the control bar. Every MIDI input your system knows appears there with a checkbox.
  2. Press a key or turn a knob on your device. A new line appears at the top of the log.
  3. Read the line from left to right: port name, the message as HEX, the same message as binary.

Reading the Log

Each MIDI message is one line. The newest message is always at the top.

Sub 37   HEX: 90 3C 64 | BIN: 10010000 00111100 01100100
ElementMeaning
Port tagName of the MIDI input the message came from
HEXThe message bytes in hexadecimal, color-coded per byte
BINThe same bytes in binary, dimmed

Color Coding

Colors are applied per byte, not per line.

ColorApplies to
AmberThe status byte of a channel message (first byte)
CyanThe data bytes that follow it
VioletEvery byte of a system message: SysEx, Clock, Start, Stop, Active Sensing

In the example above, 90 is amber and 3C 64 is cyan.

Decoding the Status Byte

The first HEX digit of the status byte is the message type, the second digit is the channel. The channel digit counts from zero: 0 is channel 1, F is channel 16.

StatusMessageData bytes
8nNote Offnote number, release velocity
9nNote Onnote number, velocity
AnPolyphonic Aftertouchnote number, pressure
BnControl Changecontroller number, value
CnProgram Changeprogram number
DnChannel Aftertouchpressure
EnPitch BendLSB, MSB

Examples

HEXMeaning
90 3C 64Note On, channel 1, note 60 (middle C), velocity 100
80 3C 40Note Off, channel 1, note 60
90 3C 00Note On with velocity 0. Many keyboards send this instead of a Note Off.
B0 01 40CC 1 (mod wheel), channel 1, value 64
B2 07 64CC 7 (volume), channel 3, value 100
C0 05Program Change, channel 1, program 5 (shown as 6 on devices that count from 1)
E0 00 40Pitch Bend, channel 1, center position
F0 … F7SysEx message, variable length
F8MIDI Clock pulse
FA / FCStart / Stop

For the background on bits and status bytes, see Understanding MIDI Messages: From Bits and Bytes to Music.


Filters

The checkboxes in the Filter group decide which message types reach the log.

CheckboxMessage typeStatus byteDefault
NoteNote On / Note Off80–9Fon
CCControl ChangeB0–BFon
ProgProgram ChangeC0–CFon
PitchPitch BendE0–EFon
SysExSystem ExclusiveF0on
ClockMIDI ClockF8off

A filter acts at the moment a message arrives. Filtered messages are discarded, not hidden, so switching a filter back on does not bring them back.

Clock is off by default for a reason. MIDI Clock sends 24 pulses per quarter note. At 120 BPM that is 48 lines per second, which pushes everything else out of the 150-line log in about three seconds.

Aftertouch (An, Dn) and the system messages besides SysEx and Clock (Start, Stop, Continue, Song Position, MTC, Active Sensing) have no checkbox in version 1.0. They are always shown.


Ports

The Ports group lists every MIDI input with a checkbox.

  • Checked: messages from this port are logged.
  • Unchecked: the port is muted and its messages are ignored.

Plug a device in or out while MidiSpy is open and the list updates on its own. Filter and port settings are not saved: reloading the page resets everything to the defaults.

Clear Log empties the log. The MIDI connection stays open and monitoring continues.


Limits of Version 1.0

  • The log keeps the 150 newest lines. Older lines are dropped so the browser stays fast under heavy MIDI traffic.
  • MidiSpy monitors MIDI input only. It has no MIDI output and no thru.
  • Log lines carry no timestamp.
  • Bytes are shown raw. MidiSpy does not translate them into note names or controller names, and it does not interpret manufacturer SysEx.
  • The log cannot be exported. Select the lines and copy them if you need to keep them.

Privacy

MidiSpy makes no network requests. All MIDI data is processed inside your browser tab and is gone when you close or reload it. Nothing is stored and nothing is transmitted.


Hotkeys

MidiSpy has no keyboard shortcuts. All controls are in the control bar.

ControlFunction
Clear LogEmpty the log. Monitoring continues.
Filter checkboxesShow or discard a message type
Ports checkboxesListen to or mute a single MIDI input

Glossary

Status byte The first byte of a MIDI message, always 80 or higher. It names the message type and, for channel messages, the channel.

Data byte The bytes after the status byte, always between 00 and 7F (0–127). Their meaning depends on the message type: note number and velocity, controller number and value, and so on.

Channel MIDI addresses 16 channels per port. The second HEX digit of the status byte holds the channel, counted from zero.

Control Change (CC) The message type for knobs, faders, pedals and wheels. The first data byte is the controller number, the second is its value.

SysEx System Exclusive: manufacturer-specific data of any length, framed by F0 and F7. Used for patch dumps and device settings.

MIDI Clock A timing pulse (F8) sent 24 times per quarter note by a DAW or a device acting as tempo master.

Active Sensing A keep-alive byte (FE) that some devices send about three times per second while idle.

Web MIDI API The browser interface that gives a web page access to the MIDI devices of your operating system. Available in Chrome, Edge and Opera.

Virtual port A software MIDI port that connects two applications on the same computer, for example the IAC Driver on macOS.


Troubleshooting

The log shows “Error: MIDI access denied.” The browser blocked MIDI access for the page. Click the icon at the left end of the address bar, open the site settings, set MIDI to Allow and reload the page.

The page stays empty: no ports, no error. Your browser has no Web MIDI API. That is the case in Safari and Firefox, and MidiSpy cannot show a message there. Open MidiSpy.html in Chrome or Edge.

My device is not listed under Ports. MidiSpy sees exactly what your operating system sees. Check whether the device shows up in Audio MIDI Setup (macOS) or the Device Manager (Windows). If it does not, the cause is the cable, the driver or the power supply.

The port is listed, but nothing arrives. Check that the port’s checkbox and the filter for the message type are both on. On Windows, many MIDI drivers allow only one application per port. If your DAW already holds the port, close the DAW or release the port there.

The log keeps filling with FE. That is Active Sensing. Version 1.0 has no filter for it. Mute the port of that device, or switch Active Sensing off on the device if it has that option.

I want to see what my DAW sends. MidiSpy reads MIDI inputs, so the DAW needs a port to send to. On macOS, open Audio MIDI Setup → MIDI Studio → IAC Driver and enable Device is online. On Windows, install loopMIDI. Set that port as the MIDI output of a track in your DAW and it appears under Ports in MidiSpy.


Credits

MidiSpy v1.0 Developed by Palmetshofer Audio — palmetshofer-audio.com

MidiSpy is free and provided “as is”, without warranty. Use at your own risk.