Web MIDI Keyboard Latency Tester

Dead keys, ghost notes, and USB-to-browser latency — all analysis runs locally. No data transmitted.

ZERO UPLOAD · ALL LOCAL

What the browser test captures

  • Note On / Note Off velocity and channel for every key or pad press
  • Control Change controller number and value for knobs and faders
  • Pitch bend status byte 0xE0 with a 14-bit value
  • Aftertouch channel pressure 0xD0 or polyphonic 0xA0

What a dead key looks like in the log

  • MIDI note 60 — no Note On at any pressure
  • first contact starts the timer, second contact stops it
  • one contact works, so every press logs nearly the same velocity

A key that lights up only under very hard presses has a worn but functional contact strip, not a fully dead one.

Signs of a genuine ghost note

  • Detection window any Note On arriving within 30 ms of the previous Note On for the same pitch
  • Marker flagged with a red ⚠ GHOST tag plus the measured gap in milliseconds
  • Typical bounce gap a few milliseconds — far shorter than a deliberate second press
  • Example note 52 (E3) ghosted twice, 12 ms apart, during light playing

USB vs Bluetooth MIDI timing

  • 1 ms hardware interval
  • 15 ms
  • 1.25 ms steps (Bluetooth Core spec)
  • 2.4 GHz ISM, frequency-hopping

The Lag column measures only browser processing time — it isn't the right metric for comparing total Bluetooth vs USB latency.

Troubleshooting order

  • click the lock icon, allow MIDI devices, reload
  • Device Manager (Windows) / Audio MIDI Setup (macOS) / aconnect -l (Linux)
  • close DAWs and configuration software that may hold the port
  • switch DirectInput/DAW mode controllers to standard MIDI mode

Resolving OS-level detection issues always comes before browser-level troubleshooting.

Ableton MIDI routing checklist

  • Track toggle Preferences > MIDI — must be on for notes/CC to reach instruments
  • Remote toggle separate from Track — controls Ableton's own remote assignments only
  • Track input MIDI From set to the keyboard name and matching channel
  • Arm + Monitor track armed, Monitor set to In or Auto

FL Studio routing checklist

  • Options > MIDI Settings > Enable checkbox checked
  • 0–255, FL's internal routing label (not the USB port)
  • device port must equal the instrument channel's input port
  • detects CC number and channel automatically from a physical move

A port number mismatch, like device on port 0 with the instrument on port 1, routes MIDI to nothing even when the device shows as enabled.

Logic Pro MIDI checklist

  • macOS recognition keyboard must appear connected in Audio MIDI Setup's MIDI Studio
  • Track input Software Instrument track's MIDI Input set to All or the specific device
  • MIDI Activity window Window > MIDI Activity — shows the last received/transmitted message
  • Channel Pressure routing aftertouch must be assigned to a modulation target; it isn't automatic

REAPER MIDI routing checklist

  • Preferences > Audio > MIDI Devices > MIDI Inputs — enable the keyboard
  • record arm button > Input: MIDI > device + channel
  • keyboard should not also appear under Preferences > Control Surfaces
  • detects CC number automatically when you move a control

A keyboard enabled in MIDI Inputs can still be reserved by a control surface entry — remove any duplicate there if CC messages trigger transport functions instead of parameters.

What the API can and can't do

  • Standard messages Note On/Off, CC, pitch bend, aftertouch, program change — read and write
  • SysEx requires a separate sysex: true permission flag
  • Supported browsers Chrome, Edge, Opera; Firefox is add-on gated; Safari unsupported
  • Transport limits reads through the OS MIDI subsystem — no direct access to MIDI DIN ports

Velocity at a glance

  • 0–127, 7-bit integer
  • treated as Note Off by most synthesizers
  • time between two contacts closing, not force
  • expanded to 16-bit (0–65535)

A gentle but fast press can register high velocity, while a slow, hard press can still read low — velocity times a strike, it doesn't weigh it.

Channel facts worth knowing

  • Total channels 16 per MIDI connection, numbered 1–16 (encoded 0–15)
  • Channel 10 reserved for percussion under General MIDI
  • GM drum mapping example note 36 = Electric Bass Drum, note 38 = Acoustic Snare, note 42 = Closed Hi-Hat
  • Omni mode a synth responds to all 16 channels at once, ignoring the channel number

Standard CC number table

  • Modulation wheel
  • Channel volume
  • Pan
  • Expression
  • Damper (sustain) pedal
  • Reverb send / Chorus send

Numbers 0–31 are MSB controllers; 32–63 are their LSB counterparts for 14-bit precision.

MIDI device access is required to run any test. Access is only used for analysis — no MIDI data is transmitted.

Connecting to MIDI…

The Web MIDI API is not available in this browser. Chrome 43+, Edge 79+, Opera 30+, and Firefox 108+ support Web MIDI.

Safari does not support Web MIDI. Switch to Chrome, Edge, Opera, or Firefox 108+ and reload this page.

MIDI access was blocked. To allow it:

  1. Click the lock icon in your browser's address bar.
  2. Find MIDI devices and set it to Allow.
  3. Reload this page.

No MIDI device detected. Plug in your MIDI keyboard and click Retry.

MIDI access granted. Select a device below and click Connect to start testing.

Keyboard

Last note — Velocity — Lag —

Event log

Event Note Velocity Channel Lag Flag
  1. Connect your MIDI keyboard via USB. Chrome, Edge, and Opera are required — Firefox and Safari do not support Web MIDI.
  2. Click "Enable MIDI" and allow MIDI device access in the browser prompt.
  3. Select your keyboard from the "MIDI Input" dropdown if multiple devices are connected.
  4. Press each key across the full range — any key that does not light up on the virtual piano is a dead key.
  5. Check the event log for "⚠ GHOST" markers — these flag duplicate Note On events within 30 ms of each other.
  6. Review the "Lag" column in the event log to see USB-to-browser latency per key press.
  7. Click "Clear Log" to reset the event log before testing a new section of keys.

What are dead keys on a MIDI keyboard

A dead key is a physical key that fails to send a MIDI Note On message when pressed. On a new keyboard this is almost always a hardware fault: a damaged contact strip, debris under the key, or a broken spring. On older keyboards it can develop over time as the conductive rubber contacts oxidise or wear flat.

The virtual piano on this page lights up every key as MIDI messages arrive. Press each key in turn across the full range. Any key that stays dark when pressed is dead. Because the display maps MIDI note numbers, you can identify the exact note number and report it to a repair technician or manufacturer. For a complete check before a first session or a purchase, sweep every key from the lowest note to the highest and write down the note numbers of any that stay dark, because that numbered list is what a repair bench or a seller will ask for.

TIP Some keyboards send velocity-zero Note On messages for very light touches. This tool treats those messages as Note Off events so a lightly pressed key does not stay lit. If a key only lights up when pressed firmly, the contact strip is worn, not truly dead, but in need of cleaning or replacement.

Ghost notes — what they are and how to spot them

A ghost note is the MIDI equivalent of a keyboard's double-tap: a single key press produces two Note On messages for the same pitch in rapid succession. In a DAW this shows up as a stacked double-trigger on a single beat, or a sequencer that records two events where you only intended one. The tester flags any duplicate Note On arriving within 30 ms of the previous one so you can decide whether the behaviour is a hardware fault or just an aggressive playing technique.

What a ghost note is

A ghost note is an unintended duplicate Note On event triggered by a single key press. It appears as a second message for the same note arriving within milliseconds of the first. The symptom in a DAW is an unexpected double-trigger: a note plays twice, or a sequencer records two events stacked on the same beat.

This tester flags any Note On message that arrives within 30 ms of a previous Note On for the same pitch with a red ⚠ GHOST marker in the event log. The 30 ms threshold is a tool setting intended to catch rapid duplicate triggers while avoiding most intentional trills and repeated notes in normal playing.

Why contacts bounce and how to fix it

A bouncing contact strip produces multiple electrical pulses per physical press, which the keyboard reports as repeated Note On messages for the same pitch. Firmware on some keyboards includes a double-trigger prevention setting that filters these rapid duplicates before they reach the MIDI output. For keyboards without that firmware option, a MIDI filter plugin in your DAW can suppress events arriving within a configurable time window. Persistent ghosting on a new keyboard that lacks a firmware fix qualifies as a warranty defect worth reporting to the manufacturer.

USB-to-browser input latency

The lag figure shown in the stats bar and event log is the time between the browser receiving the MIDI message and the moment the key was physically pressed. The figure updates with every Note Off event so you can watch the reading change as you play. More precisely, it is performance.now() − event.timeStamp, where event.timeStamp is the timestamp the browser attaches when the USB MIDI packet arrives at the Web MIDI layer.1 This tool shows the difference in milliseconds on every row of the event log. Each new key press refreshes the stats bar while the event log keeps every value so you can compare readings across a run.

This measures processing overhead inside the browser. It captures the time spent queuing and dispatching the event on the JavaScript thread but leaves out the full round-trip to audio output. The number can vary by machine, browser, and current workload. Spikes can indicate main-thread contention such as other tabs, heavy page scripts, or a slow garbage-collection pause.2 For latency-critical work, close background tabs and use a dedicated browser profile. A DAW's reported latency includes exactly that excluded round trip out to the speakers, so the two numbers differ by the parts of the chain this browser reading cannot see, and comparing them shows where the extra delay lives.

NOTE USB full-speed links run at 12 Mbit/s, and full-speed interrupt endpoints with a bInterval of 1 use 1 ms polling frames.34 The hardware latency of the keyboard itself is therefore small compared with the software stack this tool measures: OS driver, browser MIDI subsystem, and JavaScript dispatch. Each of those three pieces adds a small delay, and together they produce the number shown in the stats bar.

A worked reading shows how the pieces add up. Suppose the stats bar reports a lag of 4.2 ms for a key press: that figure is performance.now() minus the event.timeStamp the browser attached when the USB packet arrived, so it reflects OS, driver, and JavaScript dispatch overhead rather than the keyboard's own response. A steady reading in the low single digits on an idle machine is normal. If the same key press later reports 25 ms with several other tabs open, the spike points to main-thread contention rather than a hardware fault, and closing background tabs before retesting usually brings the number back down.

Browser compatibility

The Web MIDI API is supported in Chrome 43+, Edge 79+, Opera 30+, and Firefox 108+; Safari does not implement it.5 The same Chromium-based engine also brings support to Chrome for Android and Samsung Internet 4+, and other Android browsers such as the legacy Android browser and UC Browser for Android now support the API as well. Safari has no current support, and you can follow the WebKit tracking bug listed in the compatibility tables to watch for changes. A Web MIDI API polyfill exists for projects that need to target unsupported browsers, though it requires a separate dependency and does not cover every method.

On first use, Chrome will show a permission prompt asking to allow MIDI device access. This prompt is per-origin and persists until you reset it via the lock icon in the address bar.6 If you dismissed the prompt accidentally, click the lock icon, find MIDI devices, set it to Allow, and reload the page.

Hot-plugging is fully supported. Connect or disconnect your keyboard at any time and the tool will detect the change automatically without needing a page reload.7 Browsers make this possible by firing a statechange event on the MIDIAccess object whenever a port appears or disappears, so the page can react the moment a keyboard is plugged in or unplugged. The Web MIDI specification defines this notification as a MIDIConnectionEvent, which means supported browsers handle live device changes through events rather than by polling the port list over and over.

MIDI velocity, note data, and what the event log shows

Every MIDI Note On message carries three values packed into a status byte and two data bytes, and understanding what each one represents is the key to reading the event log with confidence. The channel selects which instrument or track receives the event, the note number maps to pitch, and the velocity encodes how hard the key was pressed. Together they describe everything the DAW needs to reproduce the performance.

MIDI tester before access is granted, with the Enable MIDI button above the device selector, piano keyboard and event log
The tester asks for MIDI access first. The device list, piano keyboard and event log (event, note, velocity, channel, lag and flag columns) stay disabled until you grant it.

The three values in a Note On message

Every MIDI Note On message carries three values: the channel (1 to 16), the note number (0 to 127), and the velocity (0 to 127). The MIDI Association describes Note On as a channel message with a status byte identifying one of sixteen channels, followed by key number and velocity data.8 Channel identifies which instrument or track receives the event. Note number maps to pitch, with middle C being note 60 by the most common convention, though some manufacturers label that pitch C3 while others call it C4.9 Velocity encodes how hard the key was pressed; most synthesisers and DAWs translate it to volume, timbre brightness, or both depending on how the patch is programmed.

Velocity response and curves

Velocity response is where significant quality differences between keyboards surface. A cheap controller may quantise velocity into just a few coarse bands rather than distributing responses smoothly across the 1 to 127 range. Pressing the same key repeatedly at different intensities and watching the velocity values in the event log reveals whether the response is linear, stepped, or inconsistent across the range. Some keyboards ship with configurable velocity curves that adjust the relationship between physical press force and the transmitted value. Checking the raw velocity output here gives you a baseline before any curve is applied, so you can judge whether uneven dynamics come from the hardware itself or from a curve setting that needs adjustment in the keyboard software.

Aftertouch

Aftertouch, if your keyboard supports it, is a second pressure value sent after the initial keystroke. Channel aftertouch sends a single value for all held notes simultaneously. Polyphonic aftertouch sends per-note values independently, which requires more sophisticated hardware and rarely appears on entry-level controllers.8 Both message types appear in the event log alongside Note On and Note Off entries, letting you confirm that aftertouch hardware responds correctly before you assign it to a modulation target in your DAW or synthesiser patch. Seeing aftertouch messages appear consistently at moderate pressure confirms the mechanism is working; seeing them only at maximum force suggests the sensor threshold needs adjustment in the keyboard's own settings menu.

Testing any USB MIDI device in the browser

For any USB MIDI device Chrome recognizes, this tester shows every message it sends in real time once you select it from the input dropdown. The event log captures Note On and Note Off with velocity and channel, Control Change with number and value, pitch bend with its 14-bit value, and channel aftertouch, and class-compliant devices usually appear without a manufacturer driver package. Because the browser sits in front of any DAW, the log shows the raw hardware output before a plugin or input filter can remap it, which is the fastest way to separate a hardware fault from a routing problem.

Test one device at a time and clear the log before switching the dropdown to a new input, because events from a previous device persist until you clear them and a mixed log is harder to interpret. Note the device name shown in the dropdown before each sweep, so a screenshot identifies which hardware produced the events. For a controller with many simultaneous controls, test knobs and faders in short bursts rather than all at once, and if a device appears in the dropdown but sends nothing, check whether it is in a mode that routes output through proprietary software instead of standard MIDI.

For any USB MIDI device Chrome recognizes, a browser MIDI device tester shows every message it sends in real time. Connect your MIDI controller, click "Enable MIDI", select the device from the dropdown, and watch the event log capture notes, CC values, pitch bend, and aftertouch. No DAW installation or virtual MIDI bus is needed, and class-compliant devices usually use the operating system's MIDI driver without a manufacturer driver package.12 The Web MIDI API gives Chrome direct access to the raw MIDI stream.

Browser-based testing differs from DAW testing in one important way: the browser sees the raw hardware output before any DAW plugin processes it. A controller that appears to work in a DAW but behaves unexpectedly may have its CC output remapped by a DAW input filter. Testing here isolates the hardware itself. Consequently, comparing what appears in the browser event log against what your DAW receives is the fastest way to determine whether an issue lives in the hardware or the software.

What the MIDI device tester checks

The tester captures common MIDI message types the device sends: Note On and Note Off with velocity and channel, Control Change (CC) with number and value, pitch bend (0xE0) with 14-bit value, and channel aftertouch (0xD0). SysEx messages appear if the device sends them, though their content depends on manufacturer-specific encoding.3 Each message arrives in the event log with a timestamp and a Lag value showing browser processing overhead.

Reading the message type column

Start with the message type before judging the value. Note On and Note Off confirm key and pad routing, CC confirms knobs and faders, and 0xE0 confirms pitch bend output. That sequence keeps the first diagnosis focused on what the device actually transmits.

Because the tester captures all MIDI channels simultaneously, multi-channel devices, such as drum pads that route kick and snare to different channels, show all channels in a single log without requiring any per-channel filter setup.3

How to select and test a device

After granting MIDI access, the MIDI input dropdown lists every device the operating system recognizes. Select your device and it immediately starts receiving.14 For keyboards, press every key across the full range and watch the virtual piano for dark keys. For controllers with knobs or faders, rotate and slide each one and verify that the correct CC number appears in the log.

Testing one device at a time

You can connect and test multiple devices in the same session by switching the dropdown selection. If you expect a device to appear but it does not, disconnect and reconnect it, then refresh the dropdown. The event log persists between device switches, so you can compare the output of two keyboards side by side without losing the first device's data. Click "Clear Log" before switching to start a fresh session for the new device.

Interpreting results compared to a DAW

When a controller works in the browser tester but not in your DAW, the issue is almost always DAW configuration rather than hardware. Check that the MIDI input is enabled in the DAW's device preferences, that the MIDI channel matches what the controller sends, and that no input filter is blocking the CC number the controller uses. In Live, for example, every MIDI port carries a Track toggle that has to be enabled before note and CC messages can reach a MIDI track at all, and each track's Input Type chooser has to point at that specific port or at All Ins.5

Conversely, if the tester shows no events at all from the device, the problem is at the OS or browser layer rather than the DAW. Verify the OS recognizes the device (Windows Game Controllers / Device Manager, macOS Audio MIDI Setup, Linux /dev/input or /dev/snd), then troubleshoot from the OS level upward before returning to the browser.

Managing multi-device sessions and log clarity

Testing multiple devices in one session requires a disciplined event log workflow so you can compare two MIDI controllers at once without confusing events from different devices. Click "Clear Log" before switching the MIDI input dropdown to a new device. Events from the previous device persist until you clear them, and a log containing events from two different devices is harder to interpret than a clean log for each one. Note the device name visible in the dropdown at test time before clearing, so your screenshot identifies which hardware produced those events.

For controllers with many simultaneous CC outputs, such as a keyboard with 16 encoders and 9 faders all transmitting on different CC numbers, test one section of controls at a time and clear the log between sections. Testing all controls simultaneously produces a dense log where events overlap in timestamp order, making it difficult to identify which CC number belongs to which physical control.

Using the dropdown refresh during hot-plug testing

Some devices require a refresh of the MIDI input dropdown after reconnecting. Click the refresh icon to update the device list without reloading the page. The browser already tracks connection changes on its own, since the Web MIDI API delivers a MIDIConnectionEvent whenever a port becomes available or unavailable.6 The event log persists during a refresh. Leave the log running through a reconnection to capture any initialization CC messages the keyboard sends on connect; these appear immediately as the device registers and reveal factory default CC states.

Run this test when you need to verify a new controller before setting up a DAW, when a DAW session reports missing MIDI events, or when you want to confirm a device is transmitting the correct MIDI messages and channels before building a new project around it.

Controller knob not responding in DAW but works in browser tester

The event log shows CC 74 at the correct value when the knob is turned. The DAW is ignoring it because its MIDI input is filtered to only accept notes. Reconfigure the DAW MIDI input to accept CC messages.

Device appears in OS MIDI devices but not in the browser dropdown

Close all other applications using the MIDI port. DAWs and device configuration software often claim exclusive access. Disconnect and reconnect the device, then refresh the dropdown. If it still does not appear, the device may be in DirectInput mode; switch to class-compliant or XInput mode.

Sources for this section
  1. 1.

    W3C, "Web MIDI API," w3.org, January 2025. https://www.w3.org/TR/webmidi/

  2. 2.

    Microsoft Learn, "USB Device Class Drivers Included in Windows," learn.microsoft.com, June 2025. https://learn.microsoft.com/en-us/windows-hardware/drivers/usbcon/supported-usb-classes

  3. 3.

    MIDI Association, "Summary of MIDI 1.0 Messages," midi.org, accessed June 2026. https://midi.org/summary-of-midi-1-0-messages

  4. 4.

    MDN, "Navigator: requestMIDIAccess() method," developer.mozilla.org, November 2025. https://developer.mozilla.org/en-US/docs/Web/API/Navigator/requestMIDIAccess

  5. 5.

    Ableton, "Routing and I/O," Ableton Reference Manual Version 12, ableton.com, accessed October 2026. https://www.ableton.com/en/live-manual/12/routing-and-i-o/

  6. 6.

    MDN, "MIDIConnectionEvent," developer.mozilla.org, accessed October 2026. https://developer.mozilla.org/en-US/docs/Web/API/MIDIConnectionEvent

FAQ

Yes. A hardware synth connected via a USB-MIDI interface appears as a MIDI input in the browser just like a keyboard. Select the interface entry in the dropdown. The event log shows every MIDI message the synth sends through the interface.

Yes on Chrome for Android and Chrome Desktop (Windows/macOS/Linux) if your OS supports Bluetooth MIDI. The device must be paired and connected at the OS level before it appears in the browser MIDI input dropdown.

The device may be set to a mode that sends no MIDI output in normal use, such as a controller in DAW mode that routes output through proprietary software. Switch the device to standard MIDI mode. Also confirm you selected the correct entry if the device appears with multiple ports in the dropdown.

Click "Clear Log" to wipe the current log before testing a new section of controls. For devices that send continuous CC messages (like expression pedals), the log can fill quickly. Test knobs and sliders in short bursts and clear the log between sections rather than testing all controls simultaneously.

SysEx messages appear in the event log if the device sends them and the browser grants SysEx access. Chrome prompts for SysEx permission separately from standard MIDI access. You must grant this permission at the system level using the requestMIDIAccess call with sysex: true, which this tool enables when you click "Enable MIDI".

Testing a MIDI keyboard

Connect the keyboard by USB, grant MIDI access, and press every key across the full range from lowest to highest, then repeat in the other direction. A repeatable dark key in both passes is much stronger evidence than a single missed note, because a key can look dead once and then respond after the contact settles. Beyond dead keys, the same log exposes ghost notes as duplicate Note On events for one physical press, and velocity inconsistency as a key that logs a much lower value than its neighbours at the same playing pressure.

A browser MIDI keyboard test works best before you open a DAW, because it removes software routing from the first diagnosis. Connect your keyboard via USB, click "Enable MIDI", and every key you press lights up on a virtual piano. Any key that stays dark on a firm press is not transmitting MIDI. The Web MIDI API in Chrome, Edge, and Opera gives you direct access to the raw MIDI stream from your keyboard without installing a DAW or any device software.1

Beyond dead keys, browser-based testing catches two other common issues before they disrupt a recording session. Ghost notes appear as duplicate Note On events in the event log shortly after the first, a sign of contact bounce or a sensor that fires twice per press. USB-to-browser latency shows in the Lag column for every event, with typical values of 0.5–3 ms on an idle machine and consistent spikes pointing to main-thread contention rather than hardware problems.

What the browser MIDI test diagnoses

Dead keys, ghost notes, and velocity inconsistency are the three most common hardware issues visible in browser-based MIDI testing. A dead key sends no Note On at any pressure. The virtual piano stays dark and the event log shows no entry. A ghost note sends two Note On events for a single physical press in quick succession, flagged as ⚠ GHOST in the log. Velocity inconsistency shows as a key logging significantly lower velocity than adjacent keys at the same physical pressure, indicating early contact strip wear before full failure.2

Reading the raw signal before DAW processing

Because testing happens in the browser without a DAW in the signal path, every event the log captures is raw hardware output. Consequently, you see exactly what the keyboard sends, not what a DAW plugin or virtual instrument receives after its own processing. This distinction matters because a DAW can apply velocity curves, arpeggiation, or channel remapping that alter the signal before it reaches the virtual instrument.

How to run the test step by step

Connect your keyboard via USB before opening this page. After granting MIDI access in Chrome's permission dialogue, your keyboard appears in the MIDI input dropdown. Select it and press every key across the full range from the lowest note to the highest. Watch the virtual piano for dark keys and the event log for ⚠ GHOST markers.

Running a controlled key sweep

Press one key at a time from lowest to highest, then repeat from highest to lowest. A repeatable dark key in both directions is more useful evidence than a single missed soft press.

For velocity testing, press each key at three different intensities (soft, medium, and hard) and note the velocity values in the event log. A healthy key should produce values across the full 1–127 range proportional to your playing force.3 Building on this, use the "Clear Log" button between key sections so the log does not overflow during a full 88-key sweep.4

Next steps after identifying issues

A dead key on a keyboard still under warranty is grounds for a manufacturer repair or replacement. Screenshot the event log showing no Note On for the specific note number and include it with your warranty claim. For keyboards out of warranty, a repair shop can replace the contact strip section covering the dead key for a modest cost in most cases.

Ghost notes that appear on specific keys often resolve with firmware updates. Check the manufacturer website for recent firmware before sending the keyboard for repair. Furthermore, ghost notes on multiple adjacent keys simultaneously suggest a contact strip section issue rather than an individual key fault. Persistent USB latency spikes above 10 ms point to a driver or USB bandwidth issue, not a keyboard hardware fault. Ableton's MIDI fact sheet explains the mechanism: interface drivers attach a timestamp to each incoming MIDI event, and a DAW adds extra delay derived from the audio hardware buffer size, so the delays a DAW reports are partly software bookkeeping rather than a measure of the keyboard itself.5

Documenting test results for warranty claims

Documenting the test before closing the browser takes less than one minute and creates a record you can reference for warranty claims, repair conversations, or future comparisons. Take a screenshot with the event log visible and the MIDI device name showing in the dropdown above the log. Include any ghost note markers or the absence of Note On entries for specific note numbers. Every timestamp in that log comes from the browser's MIDIMessageEvent, which the Web MIDI API delivers only in a secure context and only after you grant explicit permission, so a logged event proves the whole chain from key contact to page script is working.6 This gives a repair technician or customer support team the note number, the channel, and a timestamp without requiring them to reproduce the issue themselves.

For warranty purposes, a screenshot of an empty event log entry for a specific note is more persuasive than a verbal description. Most manufacturers accept screenshots directly through their support portal. Point to MIDI note 60 (middle C) showing no events across ten presses with the keyboard connected and the MIDI permission granted. The note number identifies which physical key is affected without requiring the manufacturer to reproduce the issue.

Comparing test results over time

Running the test periodically on the same keyboard creates a longitudinal record. A key that produced velocity values between 20 and 120 in January and narrows to 40 to 110 in June is showing early contact strip wear. Catching this compression early means you can plan a repair before the key fails mid-session. Save screenshots with the date in the filename to make comparisons easy.

Run this test when you suspect a key is not responding, when you hear unexpected double-triggers in your DAW, or sweep a MIDI keyboard before returning a recently purchased unit to confirm it is fully functional.

Dead key found at C4 during a full-range sweep

The event log shows no Note On for MIDI note 60 (middle C) at any pressure. The virtual piano key stays dark. Screenshot the empty log entry for that note and contact the manufacturer with the note number and firmware version.

Ghost note flagged on E3 during light playing

The log shows ⚠ GHOST on note 52. Two Note On events arrived 12 ms apart on a single press. This is a bouncing contact strip. Check for a firmware update first; if none exists, a MIDI filter plugin in your DAW can suppress events arriving within a configurable window.

Sources for this section
  1. 1.

    W3C, "Web MIDI API," w3.org, January 2025. https://www.w3.org/TR/webmidi/

  2. 2.

    MIDI Association, "EXPANDED MIDI 1.0 MESSAGES LIST," midi.org, accessed June 2026. https://midi.org/expanded-midi-1-0-messages-list

  3. 3.

    MIDI Association, "how do controllers calculate velocity?," midi.org, accessed June 2026. https://midi.org/community/midi-specifications/how-do-controllers-calculate-velocity

  4. 4.

    QMK Firmware, "Contact bounce / contact chatter," qmk.fm, accessed June 2026. https://docs.qmk.fm/feature_debounce_type

  5. 5.

    Ableton, "MIDI Fact Sheet," Ableton Reference Manual Version 12, ableton.com, accessed October 2026. https://www.ableton.com/en/live-manual/12/midi-fact-sheet/

  6. 6.

    Mozilla Developer Network, "Web MIDI API," developer.mozilla.org, accessed October 2026. https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API

FAQ

Chrome, Edge, and Opera support the Web MIDI API. Firefox and Safari do not implement it. Firefox declined the API on privacy grounds and Safari has an open request with no committed timeline. Use Chrome or Edge for this test.

Intermittent disconnection usually points to a loose USB cable, an underpowered USB hub, or a cable with a damaged connector. Try a different cable first, then connect directly to a USB port on the computer rather than through a hub. If the issue persists, the USB interface on the keyboard itself may need service.

Only if you have a USB-to-MIDI adapter between the DIN port and your computer. The Web MIDI API receives MIDI from any device that the operating system registers as a MIDI input, including devices connected through USB-MIDI adapters. Select the adapter entry in the MIDI input dropdown.

High latency in the event log reflects browser processing overhead, not keyboard hardware speed. Close other tabs, disable browser extensions, and retest on an otherwise idle machine. If values stay above 10 ms on an idle machine, a browser extension may be injecting JavaScript into the page. Such extensions can delay event processing.

No. Open the browser network tab (F12, then Network) while using the tool and observe that no requests are sent during MIDI events. The tool processes all MIDI data locally in the browser using the Web MIDI API. No server connection is required or used after the page loads.

Testing knobs, faders and CC messages

Knobs, faders, encoders and pedals send Control Change messages with status bytes 0xB0 through 0xBF, where the low nibble is the MIDI channel, and the log shows the controller number, value and channel for each one.10 Move one control slowly from minimum to maximum and watch for a smooth sequence of values. A gap in the sequence indicates a dead spot on the resistive track, and a controller number that matches neither the label nor the companion-software assignment means the control was remapped. Many of the common assignments are fixed, including CC 1 for modulation, CC 7 for channel volume and CC 64 for the sustain pedal, so a mismatch is easy to spot. High-resolution controls can pair a most-significant controller with its least-significant partner to extend the usual 7-bit resolution.

A MIDI CC test confirms that knobs, faders, encoders, and pedals send the control data your DAW expects. MIDI Control Change messages use status bytes 0xB0 through 0xBF, with the low nibble indicating the MIDI channel, and carry controller values between 0 and 127.1 Knobs, faders, encoders, and sustain pedals all generate CC messages.2 Testing CC output directly in Chrome confirms that each control element sends the correct CC number on the correct MIDI channel without remapping or dropout, which is critical verification before assigning those controls in a DAW or synthesizer.

The event log shows every CC message as it arrives: the CC number, the value, and the MIDI channel. Rotate a knob slowly from minimum to maximum and the log should show a mostly increasing sequence of CC values for the assigned CC number, allowing for small direction changes or bounce from the physical control. Any gap in the sequence indicates a dead spot on the control's resistive track. Any wrong CC number indicates the control was remapped from its expected default, either in firmware or in companion software.

What MIDI CC messages are

MIDI defines 128 CC numbers (0–127), each assigned to a controller function or channel mode message.3 Common CC assignments include CC 1 for modulation, CC 7 for channel volume, CC 10 for pan, CC 11 for expression, and CC 64 for damper pedal or sustain.4 Controllers 70 and above include sound controllers, general-purpose controllers, portamento control, undefined positions, and channel mode messages, so hardware manufacturers often use the upper range for device-specific knob and slider assignments.1

Matching the CC number to the control

The CC number identifies which control moved, while the value identifies where that control is positioned. A knob can be healthy even when its CC number differs from your DAW preset, because remapping can change the number without changing the physical control.

CC messages differ from Note On messages in that they carry a controller value rather than key velocity.2 They represent the position or state of a physical control rather than the timing of a strike. Consequently, holding a knob in position does not generate ongoing CC messages; Control Change messages are sent when a controller value changes.3 Sustain pedals are expected to cross the CC 64 threshold on press and return below it on release; many pedals send 127 on press and 0 on release, but the MIDI threshold is the compatibility requirement.4

How to test each CC control

For rotary knobs and faders, move each control slowly from its minimum position to its maximum position and watch the event log. A healthy control sends a smooth sequence of CC values from 0 to 127 (or 127 to 0, depending on direction) with no gaps. Identify the CC number assigned to each control by reading the number column in the log. If the displayed CC number differs from the expected assignment, the control has been remapped.

Recording a clean CC sweep

Move one control at a time and clear the log between sections when the controller has many knobs or faders. A clean sweep makes dead spots, jumps, and wrong CC numbers easier to see than a dense log containing every control at once.

For sustain pedals and latching buttons, press and hold, then release. The log should cross the CC 64 threshold on press and return below it on release; many pedals and buttons send 127 when pressed and 0 when released, but the exact values depend on the controller.5 Confirm each button's on/off behavior by pressing and releasing while watching the log.

Common CC issues and what they indicate

A fader or knob that produces gaps in the CC value sequence has a dead spot on its resistive track, the physical wear point where debris or carbon track erosion prevents the wiper from reading certain positions. Move the control slowly through the dead spot range to characterize its extent. A narrow jump is often cleanable; a wide jump typically requires element replacement.

An encoder that sends burst CC events, rapid bursts of the same CC number within milliseconds of a single rotation, has a mechanical debounce issue. Rotate more slowly to confirm whether clean single events appear at lower rotation speeds. An encoder that consistently sends the wrong CC number has been remapped either in keyboard firmware settings or in companion software.

14-bit CC and NRPN for high-resolution controllers

Standard 7-bit CC provides 128 steps across a control's range, which can produce audible stepping on high-resolution parameters like filter cutoff or pitch fine-tune.5 Some keyboard controllers support 14-bit CC to extend this by pairing most-significant byte controllers 0 to 31 with least-significant byte controllers 32 to 63.6 A mod wheel on a keyboard that supports 14-bit CC sends CC 1 (MSB) and CC 33 (LSB) as paired events; together they encode a higher-resolution value than ordinary 7-bit CC.

The event log shows both CC messages when they arrive. A 14-bit mod wheel produces two consecutive entries: CC 1 with a coarse value and CC 33 with a fine value. Not all synthesizers process both bytes; many treat only the MSB and ignore the LSB, effectively degrading the resolution back to 7 bits. Confirm your synthesizer supports 14-bit CC before relying on the extended resolution in a mix.

NRPN messages for synthesizer parameter control

Non-Registered Parameter Number (NRPN) messages encode synthesizer-specific parameters beyond the standard 128 CC numbers. The official CC table identifies CC 98 and CC 99 as NRPN LSB and MSB, and CC 6 and CC 38 as data entry MSB and LSB.6 If your controller sends NRPN for certain controls, confirm the message sequence appears in the correct order whenever you move those controls.

Run this test when a knob or fader does not respond correctly in your DAW, when you want to read every knob CC number before building a DAW mapping, or when troubleshooting why a sustain pedal or expression pedal behaves unexpectedly.

Fader 3 jumps across many CC values with no intermediate values

Dead spot on the fader resistive track. Clean the fader channel with a cotton swab dampened in isopropyl alcohol. If the dead spot persists after cleaning, the fader element needs replacement.

Sustain pedal sends CC 64 value 127 on press but no event on release

The release (value 0) event is missing. This may be a polarity mismatch; some sustain pedals default to inverted polarity, sending 0 on press and 127 on release. Check the keyboard's sustain pedal polarity setting and toggle it, or look for a polarity switch on the pedal itself.

Sources for this section
  1. 1.

    SparkFun, "MIDI Tutorial - Advanced Messages," sparkfun.com, accessed June 2026. https://learn.sparkfun.com/tutorials/midi-tutorial/advanced-messages

  2. 2.

    "MIDI," Wikipedia, accessed June 2026. https://en.wikipedia.org/wiki/MIDI

  3. 3.

    MIDI Association, "Summary of MIDI 1.0 Messages," midi.org, accessed June 2026. https://midi.org/summary-of-midi-1-0-messages

  4. 4.

    MIDI Association, "MIDI 1.0 Control Change Messages (Data Bytes)," midi.org, accessed June 2026. https://midi.org/midi-1-0-control-change-messages

  5. 5.

    Ableton, "Using MIDI CC in Live," help.ableton.com, accessed June 2026. https://help.ableton.com/hc/en-us/articles/360010389480-Using-MIDI-CC-in-Live

  6. 6.

    Roland, "MIDI Control Change Chart," roland.com, accessed June 2026. http://cdn.roland.com/assets/media/pdf/Control_Change_Chart.pdf

FAQ

The knob has been remapped either in the keyboard's internal memory (using companion software) or in a DAW preset that loaded a new CC assignment. Check the keyboard's companion software for the current CC mapping and reset it to factory defaults if needed.

Not necessarily. Some expression pedals have a narrow effective range on their potentiometer, jumping quickly from 0 to a high value. Move the pedal extremely slowly from heel to toe and watch for intermediate values. If the value jumps from one end of the range to the other with nothing between, the pedal potentiometer has failed or the resistive range is severely compressed.

CC 123 is a "All Notes Off" message that some keyboards send during mode changes, on power-up, or when switching presets. It is a legitimate MIDI message but should not appear during normal key or knob operation. If it appears unexpectedly during a key press, the keyboard firmware may be sending it erroneously.

Yes. Program change messages appear in the event log when the keyboard sends them, typically when you press a preset button. The log shows "Program Change" with the program number. This confirms which program number the keyboard sends without needing a connected synthesizer.

Yes. Bluetooth MIDI carries CC messages identically to USB MIDI, with the same CC numbers, values, and channels. Select your Bluetooth MIDI device in the dropdown and test CC controls the same way as a USB device. CapyToolkit records the same CC number, value, and channel columns for both connection types.

Measuring USB-to-browser latency

The Lag column estimates USB-to-browser latency, the delay between a MIDI packet reaching the Web MIDI layer and the browser dispatching it, and the tool derives it from the high-resolution timestamp attached to each event. On an idle machine with a good cable, expect low single-digit milliseconds; values from 3 to 10 ms suggest moderate main-thread contention, and values that stay above 10 ms point to background tabs or extensions rather than to the keyboard. This figure measures browser processing overhead only, so it is not the full round trip from key press to audio output, which also includes the audio buffer and driver.

The Lag column in this tester estimates USB-to-browser MIDI latency, the time between a MIDI packet arriving at the Web MIDI layer and the current browser timestamp.1 It is calculated as performance.now() − event.timeStamp.2 On an idle machine with a quality USB cable, expect low single-digit millisecond values; consistently high values usually point to browser main-thread contention rather than keyboard hardware problems.

This measurement is not the same as the full round-trip latency from key press to audio output. It captures only the browser processing overhead above the USB hardware layer, specifically the time spent queuing and dispatching the MIDI event on the JavaScript thread. What the Lag column shows is whether the browser's main thread is free to process incoming events promptly.

What USB-to-browser latency measures

USB full-speed MIDI polling occurs at the hardware level every 1 ms, meaning the USB subsystem checks for new MIDI data from the keyboard at a minimum 1 ms interval.3 The kernel MIDI driver picks up the packet and passes it to the Web MIDI API. The API timestamps the event using a high-resolution clock (event.timeStamp) at the moment the packet enters the browser MIDI subsystem.1

Separating MIDI lag from audio latency

The Lag value does not include audio driver buffering or software instrument processing. It only shows how quickly the browser dispatches the MIDI event after the packet arrives. That makes it useful for finding browser contention before you blame the keyboard.

From that timestamp to the moment your JavaScript handler runs is the Lag. A browser tab with heavy background work, such as other scripts running, garbage collection pauses, or rendering pipelines flushing, delays the dispatch and increases the Lag value. Consequently, this measurement reflects browser health rather than keyboard hardware quality.

How to get accurate latency readings

For the most meaningful results, test on an otherwise idle machine. Close unnecessary tabs, pause any media playback, disable browser extensions (especially those that inject JavaScript into pages), and disconnect other USB devices that generate frequent interrupts. Run the test for at least 30 seconds before evaluating the Lag statistics.

Creating a stable latency baseline

Press keys at regular intervals, roughly one per second, rather than holding chords. Each key press generates a single Note On event with its own Lag measurement. Building on this, compare Lag values before and after closing other tabs to isolate whether tab contention or extension scripts are responsible for elevated readings. A consistent lag reading across 30 or more events gives you a reliable baseline to compare against after making system changes.

Interpreting the latency values

Values of 0.5–3 ms indicate a healthy browser processing environment. Values of 3–10 ms suggest moderate main-thread contention. This is not necessarily a problem for most MIDI applications but is worth investigating if you notice audio artifacts. Values consistently above 10 ms indicate significant contention: close other tabs, disable extensions, or switch to a less-loaded browser profile.

For latency-critical work such as live performance with software instruments or real-time synthesis, the browser-to-audio-output latency is the relevant number, not the USB-to-browser lag shown here. Use your DAW's audio latency measurement instead for performance optimization. This test is most useful for ruling out USB connectivity issues before assuming an audio driver is the bottleneck.

Interpreting latency baselines by connection type

Latency baselines differ significantly depending on connection type, machine load, and browser configuration, which is why you should measure USB against Bluetooth MIDI lag on the same machine for a fair comparison. On a direct USB 2.0 or USB 3.0 connection with Chrome as the only active tab and no browser extensions, the typical Lag range is low single-digit milliseconds. On a USB hub with other active USB devices, the range can expand because the bus has to arbitrate between devices. On Bluetooth MIDI, the Lag column value itself may stay low because it measures only browser processing overhead, but the total latency from key press to browser dispatch includes the negotiated Bluetooth connection interval, which starts at 7.5 ms and can be higher depending on the connection.4

Recording these baselines on your specific machine gives you a reference point for troubleshooting future sessions. A session where Lag values climb well above the normal baseline on a direct USB connection indicates browser main-thread contention. Close background tabs, disable extensions, and check Activity Monitor or Task Manager for processes consuming CPU.

GPU rendering and browser Lag spikes

Chrome's GPU compositing pipeline can produce Lag spikes that correlate with screen rendering rather than MIDI processing. If you see isolated spikes on an otherwise idle machine, move the browser tab to a position where no other application window overlaps it. Browser rendering work competes for the same main thread that dispatches JavaScript MIDI events, so reducing visual work can reduce event dispatch jitter.5

Run this test when your browser MIDI processing feels sluggish, when you want to verify USB connectivity before a recording session, or when troubleshooting why your DAW reports higher MIDI input latency than expected on a machine that otherwise performs well.

Lag spikes above 50 ms intermittently during a test session

Isolated spikes usually point to a browser main-thread pause such as garbage collection, rendering work, or another background task. Close other tabs and disable extensions. If spikes persist on an idle browser, check for background OS processes consuming CPU during the test.

Consistent Lag of 1.2 ms across all events

A stable low value confirms the browser is processing MIDI events promptly. This is normal behavior on an idle machine with a direct USB connection. No action needed.

Sources for this section
  1. 1.

    W3C, "Web MIDI API," w3.org, January 2025. https://www.w3.org/TR/webmidi/

  2. 2.

    Mozilla Developer Network, "Performance: now() method," developer.mozilla.org, August 2025. https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

  3. 3.

    Microsoft Learn, "How to Transfer Data to USB Isochronous Endpoints," learn.microsoft.com, accessed June 2026. https://learn.microsoft.com/en-us/windows-hardware/drivers/usbcon/transfer-data-to-isochronous-endpoints

  4. 4.

    Bluetooth SIG, "Part B: Link Layer Specification," bluetooth.com, accessed June 2026. https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Core-60/out/en/low-energy-controller/link-layer-specification.html

  5. 5.

    Mozilla Developer Network, "Populating the page: how browsers work," developer.mozilla.org, accessed June 2026. https://developer.mozilla.org/en-US/docs/Web/Performance/Guides/How_browsers_work

FAQ

Sub-millisecond values are possible because this tool uses high-resolution timestamps, but they should be read as very low processing delay rather than an exact hardware measurement. Compare repeated readings and test on an idle machine for a more useful baseline.

They measure different things. This test measures browser MIDI processing overhead only. DAW audio output latency also includes the audio buffer size and the audio driver roundtrip. The total latency from key press to speaker sound is the sum of those stages.

Possibly. An underpowered or high-traffic USB hub adds contention at the hardware level before the MIDI packet even reaches the browser. A direct connection to a USB port on the computer bypasses hub-related delays. If your Lag values are elevated and you are using a hub, test with a direct connection as a baseline.

The delay you hear is the full audio pipeline latency: MIDI input processing plus audio output buffer plus DAW rendering time. The Lag value in this tool covers only the MIDI input stage. Use your DAW's audio latency settings to reduce the audio output buffer size for lower total round-trip latency.

Yes for browser-dispatch comparison. performance.now() provides high-resolution, monotonic timestamps, and the Web MIDI API uses DOMHighResTimeStamp for MIDI message timestamps. The difference between the two is useful for comparing dispatch delay between events.

Checking velocity sensitivity per key

Velocity is the time between two contacts closing under the key rather than a direct force reading, which is why a worn contact strip compresses the range toward a fixed value. Press each key at three intensities and confirm the logged values span a wide range rather than clustering. A key that always sends the same moderate value may be in fixed-velocity mode, while a key that tops out well below its neighbours has early-stage contact wear worth tracking over several sessions, because the maximum value usually keeps dropping before the key fails completely.

A MIDI velocity test shows whether each key still produces a useful dynamic range. For sounding notes, MIDI velocity is commonly displayed from 1 to 127; Note On velocity 0 is commonly treated as a Note Off event.1 Connect your keyboard, press keys at different intensities, and compare the velocity values in the event log. A healthy key produces a wide range proportional to your playing force, while a worn key produces consistently compressed or fixed values regardless of how hard you press.

Most keyboards use a two-contact system to measure velocity. The time between the first contact (key begins traveling) and the second contact (key reaches the bottom) determines the velocity value.2 A shorter interval means a faster press, which maps to a higher velocity. When the contact strip wears, either contact can register late, early, or not at all. The timing measurement becomes unreliable and velocity output compresses toward a fixed range.

How velocity works at the hardware level

Under each key is a rubber dome with two conductive strips at different heights. When you press the key, the first strip contacts the PCB and starts a timer. When the key reaches full travel, the second strip contacts and stops the timer. The keyboard firmware converts this timing into a 7-bit MIDI velocity value.1

Reading velocity as timing, not force

Velocity is the time between two contacts, not a direct force sensor reading. A key can feel physically strong but still send low velocity if the second contact closes late. That distinction matters when you compare one key against its neighbors.

This two-contact design means velocity is a time measurement, not a pressure measurement.2 Pressing gently means the key travels slowly, producing a long time between the two contacts, which maps to a low velocity. Pressing hard means fast travel, a short time, and high velocity. Consequently, any hardware failure that disrupts either contact point produces incorrect velocity output.

How to test velocity sensitivity

Press each key at three distinct intensities: as gently as possible, at medium force, and at maximum force. For each key, the logged velocity values should span a wide range from soft to loud. Any key where the values cluster in a narrow range regardless of press intensity has a velocity problem.

Comparing velocity ranges instead of single hits

For a systematic sweep, play a scale from the lowest note to the highest, pressing at consistent medium pressure across all keys. Keys that produce significantly lower velocity than adjacent keys at the same force have worn contact strips that are failing to register the second contact correctly. Building on this, compare the minimum and maximum velocity achievable on each key. A key where you cannot get below the same moderate velocity even with a feather touch is sending compressed velocity output.

What compressed or fixed velocity indicates

A key that sends maximum velocity for almost every press often has contact strips where the two contacts are close together, so the timing interval is always nearly zero. This can indicate advanced wear, and the strip may fail completely soon. An iFixit teardown of a Korg MicroKORG shows why: the rubber contact strips come out as three removable sections, and their guide notes that strips in bad shape need replacing rather than cleaning.3 A key that always sends the same moderate velocity can also come from fixed-velocity mode or a sensor/configuration issue, so check the keyboard settings before replacing hardware.

Early-stage wear shows as a compressed range: a key that can produce some dynamic variation but not the full soft-to-loud span. This is catchable before the key goes dead. Screenshot the velocity distribution and monitor it over time. A range that continues to compress across weeks of use confirms the contact strip is degrading rather than just showing manufacturing variation.

Disabling keyboard velocity curves before testing

Before drawing conclusions from velocity readings, confirm that the keyboard's internal velocity curve is set to neutral or linear. Many controllers apply a default velocity curve that shifts how hard a press must be to reach low or high values. When the curve is soft, high velocities become harder to reach; when hard, low velocities become harder to reach. Either curve shifts what the event log shows away from the raw hardware timing measurement, so disable a velocity curve before testing in the keyboard settings to see the unprocessed output. Live's Velocity MIDI effect shows how that remapping works in practice: its curve grid maps incoming velocity values from 1 to 127 onto an outgoing range, its Gate mode removes values outside the range you set, and its Fixed mode sends one identical value regardless of the incoming velocity.4

Check the keyboard companion software or OSD menu for velocity curve settings. Novation documents Low, Normal, High, and Fixed velocity options, and its Fixed mode outputs the same MIDI velocity regardless of how hard or soft a key is pressed.5 Set the curve to Linear, Default, or the equivalent neutral setting, confirm the change was saved to the keyboard firmware, and retest. Compare the velocity range to your pre-change reading.

Identifying curve-induced compression versus hardware wear

A key that produces a compressed range with a soft curve but a wider range when set to Linear is responding correctly; the curve was masking its full range. A key that produces the same compressed range with both a soft curve and a linear curve applied is showing genuine hardware compression. Monitor that key over time. Hardware compression that persists with a linear curve confirms contact strip degradation rather than a curve misconfiguration.

Run this test when your playing dynamics feel unresponsive in a DAW, when soft passages sound too loud or loud passages feel compressed, or when you want to catch early contact strip wear before a key stops responding entirely.

F3 always logs velocity 127 regardless of press force

The contact strip under this key has worn to the point where the two contacts are nearly touching. Any press closes the circuit almost instantly, producing a near-zero timing interval that maps to maximum velocity. Replace the contact strip section covering F3.

Velocity range on G4 is compressed instead of spanning soft to loud values

Early-stage contact strip compression. The key still works but cannot produce soft or very loud values. Monitor this key over the next few weeks. If the range continues to compress, the strip will fail completely.

Sources for this section
  1. 1.

    MIDI Association, "EXPANDED MIDI 1.0 MESSAGES LIST," midi.org, accessed June 2026. https://midi.org/expanded-midi-1-0-messages-list

  2. 2.

    Thorsten Klose, "MIOS32 Tutorial #029: Fast Scan Matrix for velocity sensitive Keyboard," github.com, 2012. https://github.com/midibox/mios32/blob/master/apps/tutorials/029_keyboard_velocity/README.txt

  3. 3.

    iFixit, "Korg MicroKORG Key Contact Strip Repair," ifixit.com, July 2018. https://www.ifixit.com/Guide/Korg+MicroKORG+Key+Contact+Strip+Repair/77141

  4. 4.

    Ableton, "Live MIDI Effect Reference: Velocity," Ableton Reference Manual Version 12, ableton.com, accessed October 2026. https://www.ableton.com/en/live-manual/12/live-midi-effect-reference/

  5. 5.

    Novation, "SL MkIII Global settings menu," novationmusic.com, accessed June 2026. https://userguides.novationmusic.com/hc/en-gb/articles/25626782085266-SL-MkIII-Global-settings-menu

FAQ

Yes. A velocity curve set in the keyboard firmware or companion software remaps the raw timing measurement to a different output value before the MIDI message is transmitted. If your keyboard has a soft or compressed velocity curve enabled, the event log shows the post-curve value. Disable the velocity curve in the keyboard settings before testing to see the raw hardware output.

A fixed velocity across all keys usually means the keyboard is in "fixed velocity" mode, a setting that disables velocity sensitivity and sends a constant value on every key press. Check the keyboard settings and disable fixed velocity mode. If the mode is already off and values are still fixed, the velocity sensing hardware may have failed.

Possibly. Some manufacturing variation in key mechanisms is normal. Adjacent keys can have slightly different maximum velocity due to spring weight differences. A maximum of 90 versus 127 is meaningful. Compare the same key across multiple sessions over time. If the maximum continues to drop, the contact strip under that key is wearing.

A velocity ramp in your DAW stretches or compresses the range of values the keyboard sends, but it cannot restore values the keyboard never sends in the first place. If a worn key cannot produce soft dynamics, a ramp cannot generate soft dynamics on that key. It can only redistribute the available range across the full output range, which still produces harder-sounding dynamics than a healthy key.

The event log displays the raw velocity value exactly as transmitted by the keyboard in the MIDI Note On message. No processing, scaling, or remapping is applied. If you see a value of 64, the keyboard sent exactly 64 in the MIDI message.

Web MIDI Keyboard Latency Tester Reference

  • Duplicate Note On within 30 ms
  • 1 ms

Press keys above and compare your own event log's Lag column and any ⚠ GHOST markers against these figures.

Sources
  1. 1.

    MDN Contributors, "Performance: now() method," developer.mozilla.org, August 2025. https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

  2. 2.

    Jeremy Wagner, "Optimize input delay," web.dev, May 2023. https://web.dev/articles/optimize-input-delay

  3. 3.

    Microsoft Learn, "USB in Windows - FAQ," learn.microsoft.com, accessed June 2026. https://learn.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-faq--introductory-level

  4. 4.

    Microsoft Learn, "_USB_ENDPOINT_DESCRIPTOR (usbspec.h)," learn.microsoft.com, April 2021. https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/usbspec/ns-usbspec-_usb_endpoint_descriptor

  5. 5.

    Can I use, "Web MIDI API," caniuse.com, accessed June 2026. https://caniuse.com/midi

  6. 6.

    MDN Contributors, "Navigator: requestMIDIAccess() method," developer.mozilla.org, November 2025. https://developer.mozilla.org/en-US/docs/Web/API/Navigator/requestMIDIAccess

  7. 7.

    W3C, "Web MIDI API," w3.org, January 2025. https://www.w3.org/TR/webmidi/Overview.html

  8. 8.

    The MIDI Association, "About MIDI-Part 3:MIDI Messages," midi.org, accessed June 2026. https://midi.org/about-midi-part-3midi-messages

  9. 9.

    "MIDI tuning standard," Wikipedia, accessed June 2026. https://en.wikipedia.org/wiki/MIDI_tuning_standard

  10. 10.

    The MIDI Association, "MIDI 1.0 Control Change Messages (Data Bytes)," midi.org, accessed June 2026. https://midi.org/midi-1-0-control-change-messages

FAQ

Chrome, Edge, Opera, and Firefox 108+ support Web MIDI. Safari does not implement the Web MIDI API. This is a browser platform limitation unrelated to this tool specifically.

An unintended second Note On message for the same pitch arriving within 30 ms of the first. The event log marks it with a red warning. In a DAW this shows up as a double-trigger: one key press producing two stacked notes on the same beat.

Not always. Worn keyboards sometimes send a velocity-zero Note On for very light touches, which the browser treats as Note Off. Try pressing the key firmly. If it lights up with a hard press but not a gentle one, the contact strip is worn rather than fully dead.

Yes. Load the tool in any Chromium-based browser, connect the keyboard via USB, and press every key across the full range. You can identify dead keys, ghost notes, and velocity response all before leaving the shop.

Occasional spikes usually mean the browser's main thread was busy rather than a hardware problem. Close other tabs, reduce background processes, and re-run the test. Consistent high readings on an otherwise idle machine could point to a USB driver or bandwidth issue.

Yes. Hot-plugging is supported. The tool detects MIDI device changes automatically without needing a page reload.

Additional resources

References