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
- Download the ZIP from the MidiSpy download page and unpack it.
- Open
MidiSpy.htmlin Chrome or Edge. Double-click the file, or drag it into a browser window. - 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
- Check the Ports group in the control bar. Every MIDI input your system knows appears there with a checkbox.
- Press a key or turn a knob on your device. A new line appears at the top of the log.
- 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
| Element | Meaning |
|---|---|
| Port tag | Name of the MIDI input the message came from |
| HEX | The message bytes in hexadecimal, color-coded per byte |
| BIN | The same bytes in binary, dimmed |
Color Coding
Colors are applied per byte, not per line.
| Color | Applies to |
|---|---|
| Amber | The status byte of a channel message (first byte) |
| Cyan | The data bytes that follow it |
| Violet | Every 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.
| Status | Message | Data bytes |
|---|---|---|
8n | Note Off | note number, release velocity |
9n | Note On | note number, velocity |
An | Polyphonic Aftertouch | note number, pressure |
Bn | Control Change | controller number, value |
Cn | Program Change | program number |
Dn | Channel Aftertouch | pressure |
En | Pitch Bend | LSB, MSB |
Examples
| HEX | Meaning |
|---|---|
90 3C 64 | Note On, channel 1, note 60 (middle C), velocity 100 |
80 3C 40 | Note Off, channel 1, note 60 |
90 3C 00 | Note On with velocity 0. Many keyboards send this instead of a Note Off. |
B0 01 40 | CC 1 (mod wheel), channel 1, value 64 |
B2 07 64 | CC 7 (volume), channel 3, value 100 |
C0 05 | Program Change, channel 1, program 5 (shown as 6 on devices that count from 1) |
E0 00 40 | Pitch Bend, channel 1, center position |
F0 … F7 | SysEx message, variable length |
F8 | MIDI Clock pulse |
FA / FC | Start / 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.
| Checkbox | Message type | Status byte | Default |
|---|---|---|---|
| Note | Note On / Note Off | 80–9F | on |
| CC | Control Change | B0–BF | on |
| Prog | Program Change | C0–CF | on |
| Pitch | Pitch Bend | E0–EF | on |
| SysEx | System Exclusive | F0 | on |
| Clock | MIDI Clock | F8 | off |
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.
| Control | Function |
|---|---|
| Clear Log | Empty the log. Monitoring continues. |
| Filter checkboxes | Show or discard a message type |
| Ports checkboxes | Listen 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.