DRUMLAB

M08 · Performance Mode

8 / 10
Transport
Tempo
120BPM
Swing
50.0%
Play mode
pattern loop
Grid

Step grid

Click once for a hit, twice for an accent · right-click clears · arrow keys move the cursor, Space places a hit · hold or Shift-click a pad to edit that step alone

Performance

Q hands the home row to the pads · W switches the view · U holds note repeat · Shift on a pad is an accent

Pad mode
Pad velocity
100/127
Note repeat
FILL layer
Live record
Quantize
Click
ready
Scenes — mute, solo and sends
Recall
no scene
Mute groups — one button, several channels
Members

MIDI

0x9n note on · 0x8n note off · 0xBn control change · 0xF8 clock, 24 to a quarter · 0xFA/0xFB/0xFC transport

Hardware

Input
Output
Note map
36 38 42 39 46 45 37 56
Clock
Incoming tempo · smoothed
Phase error · us minus them
Pulses sent 0
Virtual device — no hardware needed

Its clock is a setInterval, and that is not a shortcut — every MIDI clock in the world is one. The wobble you are about to smooth is the honest article.

MIDI learn
idle
Bindings — saved with the project

A binding is { ch, cc, dest } and nothing else. Open the console and push one onto DM.State.project.bindings by hand — the object you type and the object LEARN writes are the same object, which is what makes the whole feature nine lines.

Byte monitor

no MIDI yet

Parameter locks

Hold a pad, or Shift-click it, or press Enter on it — then every control here writes to that step and to no other

no step selected

There is no per-step DRIVE or BITS here, and the reason is worth a sentence: a WaveShaper’s control is a curve, a Float32Array. Arrays have no setValueAtTime, so a per-step drive could only be swapped from a timer — at whatever moment the timer happened to fire, which is the M01 clock this course removed.

Kick · LFO
Performance
0 hits/bar
Humanise & generate
Seed
Conditional lab
of 4 bars

Sound lab

Designing the selected track’s sound

Engine
Kick · kick
Touch a knob and its stage lights up. This is the graph js/voices.js actually builds.
Lab kit
One algorithm, eight sounds
This track
Save this kit
Saved kits
Decode lab

Before you press that: decodeAudioData is handed an ArrayBuffer and decodes it. Commit to an answer — what does decoding the same buffer a second time do?

FX rack

Inserts sit in the path · sends tap a copy out to a shared bus · hover any control to light its block

Selected track Kick · RECIPE
In circuit 0 inserts · 0 sends up
Compare
Solid lines carry the signal; dashed lines are send taps — a copy leaving while the original carries on. That difference is the whole milestone.
Reverb topology

Eight tracks want reverb. Commit to two answers before you touch the switch: how many ConvolverNodes does each topology build, and will the two sound different?

Save current settings as

Presets travel; audio does not. A preset is a plain object of numbers, so it rides inside the project JSON and comes back with an Import .json — the same reason a kit can be saved in M05 and a four-second sample buffer cannot.

Patterns

Sixteen slots · click to switch · while the transport runs the change is queued to the bar line

This pattern
Speed
Slot
Pattern change
Copy lab

Before you press that: copying a pattern with slots[b] = slots[a] then editing slot b — what happens to slot a? Commit to an answer, then run it on the two scratch slots B7 and B8.

Song

Each row plays one pattern for a number of bars, then the next row takes over

Loop song
no song playing
Project
not saved yet
File

Mixer

Eight channels into one bus · 18 select, M mute, S solo

Factory kit
Mix
Master bus gain → DC block → EQ → sat → comp → trim → limiter → out
Level
90%
Output
Limiter
0.0 dB
Smooth params
Voices · DSP estimate
0 voices · ~0 %

Timing lab

CLOCK: lookahead (ctx.currentTime)
Clock engine
Drift, last step stopped
Grid error · min / avg / max — / — / —
Dropouts · steps lost since Play 0
Stall the main thread

Press Play, guess how far a one-second stall knocks this clock out of time, then press the 1 s button.