Interactive demo · no upload · no API

Hear the chart.
Edit the groove.

DrumAI turns audio into playable notation. This public demo lets you inspect the output safely while the CPU transcription pipeline stays private.

Original 4-bar fixture

Notation player

Runs entirely in this tab

Ready — edit a step or press play

Private pipeline, public evidence

Seven stages from waveform to a chart you can practice.

  1. 01Preprocess
  2. 02Separate
  3. 03Detect
  4. 04Quantize
  5. 05Arrange
  6. 06Notate
  7. 07Export
CPU only

No GPU or paid inference API in the working local product.

7-stage contract

Each stage owns a typed input, observable output, and failure boundary.

Safe by design

This demo contains synthesized sound and no commercial recording.

The browser experience is a deterministic demonstration of the output layer, not a claim that the transcription model runs on this page.

Input / output contract

One artifact enters. Three practice-ready artifacts leave.

INPUT

Local audio path

A user-owned file plus tempo and quantization options. The private CLI keeps audio on the machine.

OUTPUT 01

Immutable score

Measures, subdivisions, instruments, hits, confidence, and provenance form a versionable notation model.

OUTPUT 02

Practice player

The score drives a Web Audio scheduler, cursor, loop boundaries, metronome, and tempo-independent playback.

OUTPUT 03

Portable exports

The working product produces notation and MIDI; this public demo exports only its edited JSON fixture.

Pipeline walkthrough

Seven stages, seven places to observe or recover.

  1. 01 · Preprocess

    Decode to a stable sample rate, normalize channels, and preserve source metadata.

  2. 02 · Separate

    Isolate the percussion signal locally so harmonic content does not dominate detection.

  3. 03 · Detect

    Infer kick, snare, and cymbal events with timestamps and confidence values.

  4. 04 · Quantize

    Map continuous events to musical subdivisions while retaining timing evidence.

  5. 05 · Arrange

    Group hits into measures and resolve conflicts without mutating previous stages.

  6. 06 · Notate

    Translate the score model into an editable visual grid and player timeline.

  7. 07 · Export

    Serialize practice artifacts and diagnostics with source/version provenance.

Logic and code

The private boundary is visible without publishing private source.

PRIVATE PIPELINE · PSEUDOCODE
audio = preprocess(user_owned_file)
drums = separate(audio, local_cpu_model)
events = detect(drums)
score = quantize(events, tempo_grid)
return export(arrange(score))

This describes the contract only. It is not copied from the private implementation.

PUBLIC DEMO · REAL CODEapp.js ↗
const stepMs = (60_000 / state.tempo) / 4;
instruments.forEach((instrument) => {
  if (state.pattern[instrument][step]) hit(instrument, now);
});

The browser scheduler derives sixteenth-note time from tempo and synthesizes only enabled fixture hits.

IMMUTABLE SCORE · REAL CODEmodel.mjs ↗
return {
  ...pattern,
  [instrument]: pattern[instrument].map(
    (value, i) => i === step ? !value : value
  )
};

An edit returns a new instrument row; the original fixture remains a stable reset and test oracle.

Design decisions

Playback is a view over the score, not a second source of truth.

Audio clock over animation clock

Sounds are scheduled against `AudioContext.currentTime`; visual state follows the same step index.

Gesture-gated audio

The audio context is created only after Play, respecting browser policy and avoiding surprise sound.

Immutable editing

Arrangement presets and individual edits create new arrays, keeping reset and export deterministic.

Privacy boundary

No upload input, network request, model download, commercial recording, lyrics, or analytics exists here.

Quality and limitations

Tests prove the demo contract, not transcription accuracy.

0external runtime requests
16editable subdivisions
3arrangement modes
1original synthetic fixture
npm install
npm run serve
npm run test:all