Skip to main content

Creative techniques

These recipes turn a few tracker commands into larger musical gestures. They are adapted from ideas shared by the LGPT and PicoTracker communities, then rewritten against NullPerator 0.1 behavior. Parameters are hexadecimal unless the text says otherwise; keep the command reference nearby.

Start with one lane

Build and audition one command lane before adding another. A Table has three independent lane positions, so a misplaced HOP can make a patch sound much more complicated than the data on screen.

Delay, repeats, and decaying echoes

NullPerator has a real Phrase-note delay command. DLY 0002 delays the note on that row by three ticks: DLY uses only its last nibble and waits b + 1 ticks. There is no need to hide a note with volume automation and restart it with a playhead offset, as older PicoTracker recipes suggested.

For repeats, put these two commands beside a Sample note:

RTG 0003 repeat from the same point every 3 ticks
VOL 4000 fade volume toward 00 at speed 40

This produces a simple decaying echo from one note. RTG is voice retriggering rather than an audio delay line, so filters and other commands continue to shape the same instrument state. A short one-shot sample may end before the next repeat; use a suitable loop mode or a longer source when that happens.

Turn samples into oscillators

Set a Sample instrument to OSCILLATOR, then place LOOP START and LOOP END around one repeating cycle. NullPerator derives the base pitch from that loop length and tunes it from C3, so the source does not need to have been recorded at a known note.

Interesting source material is not limited to clean waveforms. A tiny window inside a voice, field recording, or drum loop becomes a pitched texture. Keep the loop short enough to read as a tone; increase it when you want the underlying rhythm or grain to emerge.

Wavetable scanning with LOF

Concatenate several equal-length cycles into one WAV and make the oscillator loop exactly one cycle long. If every cycle is 0100 frames, this command moves the whole loop window to the next cycle:

LOF 0100 move LOOP START and LOOP END forward by 0x100 frames

LOF is cumulative and boundary-checked. LOF FF00 moves the window back by 0100 frames. It does not move the playback head and it does not address 256 normalized chunks; that is POF.

For an automatically moving two-position wavetable, use one Table lane:

00 LOF 0100
01 LOF FF00
02 HOP 0000

The HOP loops that lane to row 00. Use a GRV command in another lane if the Table should move more slowly than its default fast clock.

Coarse PWM

Make a 256-frame square wave, but use a 128-frame oscillator loop. Moving that half-width window across the high and low halves changes the duty content:

LOF 0010 move the 128-frame window forward 16 frames
LOF FFF0 move it backward 16 frames

Alternate the two offsets in a Table for coarse pulse-width modulation. The window must remain inside the WAV; once either end reaches a boundary, further movement in that direction is ignored.

Evolving drones

Put a short oscillator window inside a long, harmonically varied recording, then advance it slowly:

00 LOF 0001
01 HOP 0000

Slow the Table with GRV, or insert empty rows, until the scan becomes gradual. Play the instrument on several tracks at different notes for a chord whose timbre evolves while every voice stays pitched.

Chop a loop with POF

POF addresses the entire sample as 256 equal chunks. The high byte is an absolute position when it is nonzero; the low byte is then added as a signed relative offset. The result wraps at the sample ends.

Start one sustained drum-loop voice and place these commands on later Phrase rows without entering new notes:

POF 4000 jump to 1/4 of the WAV
POF 8000 jump to 1/2
POF C000 jump to 3/4
POF 01FF jump to 1/256, then back 1/256: the beginning

Reorder the rows to rearrange the beat. POF 0040 is different: with no absolute high byte, it moves forward by a relative quarter from the current playhead. Keep the voice alive with FORWARD, PING PONG, or an appropriate loop window; POF cannot revive a voice that has already ended.

Calculate a Groove's effective BPM

At the project tempo, one Groove tick is 1/24 of a quarter note. A straight 16-row Phrase therefore uses 16 × 6 = 96 ticks. If you still hear the Phrase as four beats, its effective BPM is:

effective BPM = project BPM × 96 / ticks across 16 Phrase rows

For an active Groove pattern of n entries, repeat those entries until you have 16 row durations and add them. When n divides 16, the shortcut is:

ticks across 16 rows = (16 / n) × sum of the n Groove values

Examples at project tempo 100:

GrooveTicks over 16 rowsEffective BPM
06 / 0696100
07 / 0596100
04 / 0464150
06 / 0480120

The formula describes tempo only when you continue to interpret 16 rows as four beats. An asymmetric or odd-length Groove can instead imply a different meter or phase pattern. See Groove for editing and interpolation.

Compose with three independent Table lanes

A Table is more useful when each lane has one job:

  • Lane 1 can articulate the voice with IRT, RTG, or POF.
  • Lane 2 can move timbre with LOF, FCT, FRS, or VOL.
  • Lane 3 can control structure with GRV, HOP, and STP.

The three lanes keep separate row positions. A HOP only redirects the lane that contains it, so one modulation can loop every two rows while another continues across all 16. GRV changes their shared Table timing.

This Table turns one held note into a three-note cycle at Groove 00 speed:

00 IRT 0000 GRV 0000 --- 0000
01 IRT 0007 --- 0000 --- 0000
02 IRT 000C --- 0000 --- 0000
03 HOP 0000 --- 0000 --- 0000

IRT is a Table-local instrument retrigger. Its low byte is a signed semitone offset: 000C is one octave up and 00FF is one semitone down. Keep IRT in one lane; if several lanes issue it on the same Table step, only one resulting retrigger can be applied.

Compact command recipes

GoalContextExampleResult
Loop an effect laneTableHOP 0000Jump to row 0 indefinitely. Put it after the rows to repeat.
Loop part of a PhrasePhrasePut HOP 0004 on row 08When playback would enter row 08, redirect to row 04; the HOP row itself is skipped.
Retrigger at a transposed pitchTableIRT 000CRestart the current instrument one octave higher.
Linear Sample slidePhrase or TablePSL 080CMove toward +12 semitones with speed 08.
Curved Sample slidePhrase or TableLEG 0807Curve toward +7 semitones with speed 08.
Move an oscillator windowSampleLOF 0100Shift both loop endpoints forward by 256 frames.
Jump within a WAVSamplePOF 8000Move the playback head to the midpoint of the whole WAV.
Tick repeatSample or MIDIRTG 0003Repeat the current voice every three ticks. MIDI ignores aa.
Scale-aware MIDI triadMIDIMCH 0240Add scale offsets 2 and 4 to the base note; zero nibbles omit voices.

For LEG and PSL, a speed byte of 00 snaps to the target. On Sample instruments, the low byte is a signed semitone target. On MIDI instruments it is a pitch-bend target, with 7F as center; the connected synth's pitch-bend range decides the audible interval.

MIDI pitch bend survives note changes

Pitch bend is channel state. Starting a new MIDI note does not send a center message, so the receiver keeps the last bend value across Note On events. A new note stops any unfinished NullPerator bend motion at its most recently sent position, but it still does not recenter the channel.

Use an explicit command when the next note should be unbent:

PSL 007F snap the MIDI channel back to pitch-bend center

Place it on the new note row or the row before it. This is especially important when several NullPerator MIDI instruments share one external MIDI channel, because they also share that channel's bend state.