A browser-based sampler for Novation Launchpad controllers. Load up to 64 audio samples, trim and shape them, and play them live from the Launchpad grid with LED feedback. Everything runs locally in the browser: no installation, no server-side processing, and no audio leaves your computer.
▶ Live demo: bmpydev.github.io/universal-launchpad-sampler. It is served over HTTPS, so Web MIDI works there without a local server.
- Quick Start
- Supported Hardware
- Screen Layout
- Pad Controls
- Playing from the Launchpad
- Master Section
- Saving, Loading & Relinking
- LED Feedback
- Requirements & Running a Local Server
- Troubleshooting
- Connect the Launchpad before opening the page.
- Open the live demo, or run it locally: start a web server in the folder containing
index.html(see section 9):python3 -m http.server 8000 - If running locally, open http://localhost:8000 in your browser.
- Select your Launchpad model and click INITIALIZE.
- Allow MIDI access when the browser asks. Newer models also need SysEx permission.
- MK1 / S / Mini only: press the lit SESSION button once. The log shows
Pads active.(see section 10 for why). - Drag audio files onto the pads, or click a pad's file name to open a file dialog.
At startup, choose the group that matches your device:
| Setup option | Devices | Grid notes | Right-hand arrow buttons |
|---|---|---|---|
| MK1 / S / Mini (MK1, MK2) | Launchpad (original), Launchpad S, Launchpad Mini MK1/MK2 | row × 16 + column (0–119) |
Notes 8, 24, 40 … 120 |
| MK2 / Pro / X / Mini MK3 / Pro MK3 | Launchpad MK2, Pro, X, Mini MK3, Pro MK3 | 11–88 (bottom row 11–18, top row 81–88) | Notes (MK2) or CCs (programmer mode) 19–89 |
- MK1 group: on connect, the device is reset and set to the X-Y layout. No special permissions are needed.
- MK2 / Pro / X / MK3 group: on connect, the app sends SysEx messages that switch the device into Session layout (MK2) or Programmer mode (Pro, X, MK3). This requires SysEx permission in the browser. If you deny it, the app still runs, but you must switch the device into the correct mode by hand.
- You can plug in or reconnect the Launchpad after initialization. It is detected automatically.
- Pad numbers on screen (1–64) run left to right, top to bottom, matching the physical grid.
From top to bottom:
- Toolbar: SAVE CONFIG, LOAD CONFIG, RELINK, STOP ALL.
- Log line: the green line starting with
>. It always shows the latest status message, such as connection state, errors, incoming MIDI, or which row was launched. - Master bar: master volume, level meter, and limiter (section 6).
- Pad grid: 8 × 8 pads, one per Launchpad button.
Each pad is an independent sampler.
- Pad number and the MIDI note it listens to, for example
Pad 1 (#0). - [L] / [R] light up when Loop or Reverse is active.
- ⏏ Eject: stops the pad, removes the sample, and resets all pad settings. It is greyed out when the pad is empty.
- Trim handles: drag the green (start) and red (end) lines to set the playback region. Times are shown below the waveform.
- Seek: click anywhere inside the region to set the playback position. This also works while the sample is playing.
- Changing trim, loop, or reverse during playback keeps the current position.
- Click it to load a file, or drag and drop an audio file anywhere on the pad. Supported formats depend on the browser. WAV, MP3, OGG, and FLAC usually work.
- An orange file name means the config knows this sample but the audio is not loaded yet. Use RELINK.
| Control | Function |
|---|---|
| VOL | Pad volume, 0.00–1.50 |
| PIT | Playback speed / pitch, 0.20×–3.00×. Changes apply live while playing. |
| LOOP | Repeats the trimmed region endlessly |
| REV | Plays the sample backwards |
| Mode (TRIG / GATE / TGL) | How the pad reacts to Launchpad presses, see below |
| ▶ / ❚❚ | Play / pause with the mouse. Pause keeps the position. |
| STOP | Stops the pad and returns to the start point |
The mode button cycles through three modes. They apply to presses on the Launchpad; the on-screen buttons always work as play/pause and stop.
| Mode | Colour | Behaviour |
|---|---|---|
| TRIG | violet | Every press restarts the sample from the start point (finger drumming) |
| GATE | yellow | Plays only while the button is held, and stops on release |
| TGL | green | The first press starts the sample, the second press stops it |
- Loaded pad: plays according to its mode (TRIG / GATE / TGL).
- Empty pad: stops all pads in its column, like a clip-stop slot in Ableton Live.
- Right-hand arrow buttons (row launch): start a whole row, like launching a scene in Ableton Live.
- Every loaded pad in that row restarts.
- An empty slot in the row stops its column.
- GATE pads play only while the arrow is held.
- STOP ALL (on screen) stops every pad immediately.
Volume tip for row launches: eight pads at VOL 1.0 add up to far more than full scale. The limiter catches this but has to reduce the level heavily, which can sound like "pumping". For rows with many pads, lower the pad volumes (around 0.5–0.7) or the master volume.
The bar between the log line and the pads controls the summed output of all pads.
- VOL: master volume, 0.00–1.50.
- Meter: output level. Green is normal, yellow is loud (from about 70 %), red is close to clipping.
- LIMITER: on by default. It prevents distortion when many pads play at once. Click to switch it off.
- GR (gain reduction): lights red while the limiter is actively reducing the level. Short flashes are fine. If it stays lit constantly, turn the volumes down.
The limiter catches most overloads but is not a perfect brickwall limiter. Extreme peaks can still distort slightly.
For security reasons, browsers cannot store file paths or read files from your disk on their own. A config therefore stores the settings only, never the audio itself.
- 💾 SAVE CONFIG: downloads a
.jsonfile (sampler_config_YYYY-MM-DD_HH-MM.json) with all pad settings (file name, volume, pitch, trim, loop, reverse, mode) plus master volume and limiter state. - 📂 LOAD CONFIG: restores all pads from a config file.
- Pads that are not in the config are cleared.
- Pads whose sample is already loaded under the same file name keep their audio.
- The log tells you how many pads still need audio.
- 🔗 RELINK: opens a file dialog. Select all files in your sample folder at once (Ctrl+A / Cmd+A). Each file is assigned to every pad that uses that file name. The log reports how many files were connected and how many pads are still missing audio.
Notes:
- Files are matched by file name only. Two different files with the same name (for example
kick.wavfrom two folders) are treated as the same sample. Rename one of them before saving the config. - Configs are pad-position based (1–64). A config saved with one Launchpad model also works with another.
- Configs from V1.0.0 still load and are converted automatically.
- Config files are validated on load. Invalid or manipulated values are replaced with safe defaults.
- Because the audio is not stored, the browser asks for confirmation before you close or reload the page while samples are loaded.
| State | MK1 / S / Mini | MK2 / Pro / X / MK3 |
|---|---|---|
| Empty | off | off |
| Loaded | amber | red |
| Playing | green | green |
| Paused | yellow | yellow |
- Right-hand arrow buttons show the state of their row: off when the row is empty, the "loaded" colour when something is loaded, and the "playing" colour when at least one pad in the row is playing.
- SESSION button (MK1 group only): lights amber after connecting until it is pressed once (see section 10).
- When the page is closed, the Launchpad LEDs are switched off.
- Chrome, Edge, Opera, or Firefox with Web MIDI and Web Audio support.
- Safari does not support Web MIDI. The sampler works there with the mouse only.
- Firefox asks for MIDI permission the first time.
Browsers only enable Web MIDI on secure pages. Depending on the browser and system, especially Firefox on Linux, opening index.html by double-click (file://…) is not enough. The log then shows Web MIDI unavailable: ….
The live demo on GitHub Pages runs over HTTPS and does not need any of this. A local server is only needed when you run your own copy.
Start a local server in the folder containing index.html:
python3 -m http.server 8000
On Windows, the command may be py -m http.server 8000 or python -m http.server 8000.
Then open http://localhost:8000.
Use
localhostor127.0.0.1, not your network IP such ashttp://192.168.x.x:8000. Pages opened via a network IP are not considered secure, and Web MIDI is disabled.
Audio starts only after a user action (the INITIALIZE click). This is a browser rule.
Pads do nothing until a top button is pressed (MK1 / S / Mini) This is expected and comes from the hardware. The MK1 sends the "this is a note" status byte only once and omits it for following notes ("MIDI running status"). After the page connects, the browser or operating system has not seen that status byte and discards the incoming notes. A message of a different type, such as pressing any top-row button, makes the Launchpad send a full message again, and from then on everything works. The app lights the SESSION button as a reminder. Press it once after every initialization.
Log shows Web MIDI unavailable
The page was opened as a file or via a network IP, or the browser has no Web MIDI. Use a local server and http://localhost:8000 (section 9).
Log shows No Launchpad found
- Check the USB connection. You can plug the Launchpad in while the page is open.
- Close other software that may be using the device, such as a DAW or another browser tab.
- Make sure you allowed MIDI access in the browser.
Pressing a pad shows no pad mapped to this note
The wrong device group was selected at startup, or the device is in a different layout. Reload the page and choose the other option. For the newer models, allow SysEx so the app can set the correct mode.
SysEx was denied (newer models) The log mentions it. Either reload the page and allow SysEx, or switch the device into Session (MK2) or Programmer mode (Pro / X / MK3) manually.
No sound
- Check that the browser tab is not muted and that INITIALIZE was clicked.
- Check that the master volume is not at 0.
Distortion when many pads play Make sure LIMITER is on, and lower the pad or master volumes until GR only flashes occasionally.
Relink did not find a file The file name on disk must match the name stored in the config exactly, including upper/lower case and extension. Select all files of the sample folder in one go.
A file could not be loaded
The log shows … is not a readable audio file. The format is not supported by your browser. Convert it to WAV or MP3.
See CHANGELOG.md for the version history.