PSPATTERN

A music tracker for the Sony PSP.

version 0.42.3b 8 channels GPLv3 MIDI in and out
The PSPATTERN song screen playing, showing eight channel columns, a live oscilloscope and the DSP meter.
The song screen during playback. Eight channels, the spectrum of the master output, and the note each channel is sounding along the bottom.
00

What it is

You build a song from patterns of notes and the PSP generates the sound. Nothing is streamed from disk and no sample files are required.

PSPATTERN has eight channels. Each one can play a sampler, a five engine synthesiser, or MIDI notes played on other gear through the PSP-MIDI adapter. It has a drum kit that is generated when a project loads, a delay and a reverb shared by all channels, and a small automation sequencer called a table attached to any step.

It's a fork of LittleGPTracker by Marc Nostromo, free software under the GPL, version 3. The layout comes from LSDJ: a song is a grid of chains, a chain is a list of phrases, and a phrase is sixteen steps of notes and effects. Where LSDJ and M8 do something differently I've usually gone with M8, since most people turning up here have played one or the other and I'd rather not make them relearn anything.

What you need

Installing

Copy the PSPATTERN folder to ms0:/PSP/GAME/ on your memory stick, then launch it from the PSP game menu. The folder holds the program and four support files:

FileWhat it is
EBOOT.PBPthe program
usbmidi.prxthe driver for the PSP-MIDI adapter, only needed for MIDI
config.xmlstartup settings
mapping.xmlbutton assignments
custom_font.xmlthe screen font
sampleliba folder for samples you want in reach of every song
01

Features

Everything the program does, listed plainly. Numbers are limits, not targets.

Sequencer

Sampler

Synth

Drum kit

Effects

The machine looks after itself

Mixer

MIDI

Files

Interface

02

Buttons

Buttons are named as they are printed on the PSP. Almost everything is a modifier held with a direction, and the bottom line of every screen lists the moves available from where you are. It does not list all of them: copying, cloning and soloing are in the editing section below.

Order matters. The program reads every button that is already held at the moment you press the last one, so a combination means hold the first and then press the second. Pressing them the other way round runs whatever the first button does on its own.

ButtonWhat it does
OCircle. Select, set, and the edit modifier.
XCross. The secondary modifier.
L, RThe shoulder triggers.
STARTStart and stop playback.
TRIANGLEImport, on the import screen. On the song screen, held with up or down it inserts a row above or below the cursor, every column moving down together; held with X it deletes the row, after a yes. Both undo with R+L. Nothing else, anywhere.
SELECTPreview. On the instrument screen it plays the instrument for as long as it is held, like a key. On the song screen it marks bookmarks.
D-padMove the cursor. On the instrument screen it steps the type and engine instead.
StickUnused, on purpose. Stick drift on aging units made anything mapped to it a lottery, so nothing listens to it and a drifting nub costs you nothing.
Editing
HoldPressResult
Oleft, rightchange the value under the cursor by one
Oup, downchange it by sixteen, or by ten in the velocity column
Rany directionstep to the neighbouring screen on the corner map
XLmute the channel under the cursor
OLsolo the channel under the cursor
XRstart a selection; on the instrument screen, copy the whole patch
ORpaste
03

Your first song

The shortest path from an empty project to a bar of music that loops. Six steps.

  1. Make a project. On the project screen choose load song, then New, and type a name. The program builds its drum kit and drops you on the song screen.
  2. Open a phrase. The cursor starts on channel 1, row 0. Hold R and tap right twice: the first tap opens the chain, the second the phrase.
  3. Write a note. Hold O and press up. A note appears with an instrument number beside it. Hold O with left and right to move it by a semitone, up and down by an octave.
  4. Fill the bar. Move down four rows and add another note. Rows 0, 4, 8 and 12 are the four beats of the bar.
  5. Play it. Press START. The phrase loops on its own while you are looking at it, so you can keep editing while it runs.
  6. Put it in the song. Hold R and tap left twice: chain, then song. Press START there and the whole arrangement plays.
Pressing O on its own fills a blank. On an empty note, instrument or velocity cell it writes the last value you used in that column, which is quicker than dialling one in from nothing.

From there the useful next moves are: give the phrase a second channel so two things play at once, open the instrument screen with R and right to change how it sounds, and put a command in one of the two effect columns.

04

The screens

There are ten, and a map of them sits in the bottom right corner of every screen with the one you are on highlighted. Hold R and each arrow steps to the neighbouring screen exactly as the map is drawn, the moment you press it. The old drills still carry their context -- entering the chain from the song follows the cursor, entering the instrument screen from a phrase lands on the instrument under it.

SONG
The arrangement. One column per channel, one chain number per cell.
CHAIN
Sixteen rows, each naming a phrase and a transpose in semitones.
PHRASE
Sixteen steps: note, instrument, velocity, and two effect columns.
TABLE
Automation that runs under a note at tick rate.
GROOVE
How long each step lasts, in ticks.
INSTRUMENT
Sound design for whichever instrument the step uses.
MIXER
Nine strips with meters, sends, the master EQ and the master fader.
FX
The effect rack: delay, reverb and its behaviours, per channel inserts.
PROJECT
Tempo, master level, file operations, MIDI device.
SETTINGS
config.xml, edited on the device. Theme changes apply as you step them.

Song

Each cell holds a chain number in hexadecimal, or two dashes for an empty slot. Tap O on an empty slot to repeat the last chain you touched; tap it twice, quickly, and the slot gets a new chain instead, born empty. The notice line says which you got, because two slots holding one chain are one chain. Drilling into an empty slot makes a new chain too, because going in is the request. Hold O and press up or down to dial a specific number. The tracker plays down the rows.

Cut clears and paste overwrites, here and on every grid: what you cut or paste happens where the cursor is, and nothing else moves -- the model your hands already know from LSDJ and M8.

Fill every cell you intend to use. A channel whose first row is blank never starts, because the player looks upwards for a chain and finds nothing. If a part should be silent for a while, point it at a chain of empty phrases rather than leaving the cell blank.
The song screen stopped, showing chain numbers across eight channel columns.
The info panel on the right: MIDI, battery, render load, the second processor's load, memory used and underruns. Used, not free, because used is the figure this machine can report honestly -- it moves the moment a sample loads. Above it, a live spectrum of the mix; below, the corner map of the screens.

Chain

Sixteen rows. Each holds a phrase number and a transpose value in semitones, so the same phrase can be reused at a different pitch. Transpose is signed, so FE is two semitones down. The chain plays its rows in order and then returns to the song.

An empty row does not lead anywhere: place a phrase first, and the screen says so if you try -- the LSDJ rule. New phrases are born empty. START plays the chain you are looking at; SELECT+START plays the whole song from here.

The chain screen listing phrase numbers and transpose values.

Phrase

This is where the notes are. Seven columns: note, instrument, velocity, then two pairs of effect and parameter.

START plays the phrase you are looking at, looping, wherever you came from -- not whatever the song grid happens to reference. SELECT+START plays the whole song from here, the LSDJ chord.

The velocity column reads 00 to 99 in decimal, not hexadecimal. Two dashes means nothing is written and the step plays at full level, so a phrase made before the column existed sounds exactly as it did. Hold O and press up or down to move by ten, left or right by one. One step below 00 clears it back to two dashes.

Stand on an effect column and the panel at the bottom explains the command and its parameter. Hold O and press up or down to pick one from the list. Cycling through commands is silent; the row only plays when you touch the note column, because that is the column that is the sound.

O on the instrument column is plain set: an empty cell takes the last instrument you used, a full one becomes the last. It never replaces an established instrument and never auditions the row.

The phrase screen showing a note, an instrument, a velocity of 76, an ARPG command and an ARPS command, with the help panel explaining ARP Speed.
A step with a note, a velocity of 76, a chord command and an arp speed command. The help panel describes whichever command the cursor is on.

Table

A table is sixteen rows of three effect columns that run alongside a note at tick rate, which is faster than the phrase steps. Use one for anything that has to change while a note sounds: a filter sweep, a retrigger, a pitch slide, a volume shape.

Start a table from a phrase step with the TABL command, or set an instrument to run one automatically from its table field. HOP loops a table back on itself, which is how it becomes an envelope rather than a one shot.

The table screen follows what sent you there: jump from an instrument and you land on that instrument's table; jump from a phrase and a TABL command under the cursor wins, then the row's instrument -- resolved the way playback resolves it. From the instrument screen, an instrument with no table yet gets the next free one made and set on its tbl row as you go in, the way an empty song slot makes its chain. From a phrase with nothing to follow -- no table on the row's instrument, no TABL on the row -- the jump is refused where you stand, with the reason on screen, instead of showing whatever table was last open. Deep jumps stop at the deepest screen that still makes sense.

The table screen with sixteen rows and three command columns.

Groove

How many ticks each step lasts. The default is six. Uneven values give swing, and the GROV command switches groove mid song.

The groove screen showing per step tick counts.

Project

Tempo, a whole song transpose, a scale, the master level, whether the song repeats, the master drive and clipper, the MIDI device and sample rate, the file operations, and a samples screen that lists every sound file the project carries.

The project screen with tempo, master level, mix settings, MIDI settings and file operations.

Settings

The config file, editable without a computer: theme, font, alternate row count, audio buffer and prebuffer, the second processor offload, and the FM engine toggle. Stepping the theme repaints the palette immediately so you can shop for one; everything saves when you leave the screen, and the options that only apply at boot are marked with a star. Your comments in config.xml survive every save.

FX

The effect rack, left of the mixer on the map. The reverb can freeze -- feedback goes lossless and the tail hangs forever, so a chord becomes a pad you play over -- and around it sit its behaviours: duck pushes the tail out of the way of what you send, gate only passes it while the send is up, locut stops a frozen hold turning to sludge, width spreads it past the edges of the room. The delay grew a tone inside its feedback loop, so every repeat dies a little darker, like tape. On the wet bus a one-knob comp glues the whole tail and a drive saturates it, in that order -- the drive works an evened signal. The rack also carries each channel's insert effects: a phaser and a chorus per channel, rate and depth each, selected through a channel field. Everything runs while you tweak it, on the PSP's second processor with a bit-identical fallback on the first. START starts and stops the song from here too -- this is the screen you stand on while A/B-ing an effect against the playing mix.

05

Selecting, copying and cloning

Every grid screen, song, chain, phrase and table, shares one editing grammar. It is worth learning early because none of it is on the bottom line of the screen, and a tracker without copy and paste is a tracker you will get tired of.

Hold the modifier first. The program looks at every button that is already down at the moment you press the last one. Hold R and then press X and you get one thing, press X and then reach for R and you get another, because pressing X on its own already did something. Nothing here works if you press the buttons in the wrong order.

Making a selection

Hold X and press L. The cell under the cursor is highlighted. Move with the D-pad and the selection grows to cover everything you pass over.

HoldPressResult
XRstart a selection at the cursor
-Xcopy the selection and end it
ORcut the selection
Oa directionchange every value in the selection at once
RXwiden the selection: first the whole column, again the full width
LXinterpolate the selection

With no selection up, hold O and press R to paste at the cursor. The clipboard keeps whatever you copied last, so the same block can be pasted as many times as you like.

Interpolate

Interpolate draws a straight line between the first and last row of the selection and fills in everything between. It is the fastest way to write a run of notes or a smooth parameter sweep by hand.

It is fussy about what it will accept. The selection has to be one column wide, and that column has to be the note column or one of the two parameter columns. There must be at least two rows, and both ends must already hold a value. On notes, an empty cell at either end gets you No note info and nothing happens.

Put C-3 on row 0 and C-4 on row 8, select the note column between them and interpolate, and you get C-3, C#3, D#3, E-3, F#3, G-3, A-3, A#3, C-4. Twelve semitones over eight steps does not divide evenly, and the leftovers are dropped rather than rounded, which is why the steps are uneven.

On parameter columns the four digits are treated as one number counting up. That is what you want for a volume or a cutoff sweep. It is not what you want for a command whose digits mean separate things, such as an arp shape, where the result is arithmetic rather than music.

Cloning

Hold X and press L, then keep holding and press O with L. Whatever is under the cursor is duplicated to the next free number and the cursor is repointed at the copy.

On this screenClones
Songthe chain under the cursor
Chainthe phrase under the cursor
Phrasethe instrument, or the table if the cursor is on a TABL parameter
Instrumentthe instrument

Cloning is what you reach for when a part is used in several places and you want to vary one of them. Editing the original would change all of them. If nothing is free it says so and leaves things alone.

Single steps

HoldPressResult
-Oon an empty note step, repeat the last note and instrument you entered; on an empty instrument cell, the last instrument
-O, Oon the instrument column, a new instrument: a copy of the one there in the next empty slot. The same double tap gives a new phrase on the chain screen and a new chain on the song screen.
XOclear the step, taking the instrument with the note and the parameter with the command
XLmute the channel
OLsolo the channel

Pressing O on a step that already has a note does not overwrite it. It remembers that note and instrument as the pair to repeat next time, which is how you pick up a sound from one row and stamp it down the phrase.

Mute and solo depend on which button you let go of first. Hold L, press X, then release L while X is still down and the mute sticks. Release X first, while L is still down, and the channel comes straight back. One combination gives you both a latch for arranging and a momentary drop for checking what a part is doing.
06

The mixer

Hold R and press down from the song screen. Nine strips: the eight channels and the master on the right, each with a stereo meter above its values.

The mixer screen with nine channel strips, meters, and rows for bus, volume, high pass, low pass, delay send and reverb send.
The header carries three numbers: how much the channels sum to before the master fader, the master setting, and the DSP load.
Per channel rows
RowWhat it sets
buswhich mix bus the channel feeds. Leave it alone unless you want channels grouped.
volthe channel fader, 00 to FF. Straight amplitude: 80 is half.
hpfhigh pass. Mode 1 keeps the bottom, mode 2 rolls off below about 90 Hz. Worth having on everything except the kick and the bass, because a handheld speaker cannot move air down there and only distorts trying.
lpflow pass, for taking the top off a channel.
dlyhow much of the channel is sent to the shared delay.
revhow much is sent to the shared reverb.

The master strip is a fader now, not just a meter: walk the cursor one column past channel 8 and O with a direction moves the master volume right under the master meters, where a mix is actually balanced. X with O resets it.

The line under the strips is the two send effects themselves, shared by every channel. dly is the delay time as a musical division, so it stays in time when the tempo changes. fb is how much the delay feeds back, rev is the room size and dmp is how quickly its top end dies away. They sit side by side on one line, and left and right walk between them. Up from that line goes back into the channel strips.

On the mixer screen
KeysDoes
L + Xmute the channel under the cursor
L + Osolo it
L + upunmute everything
L + downthe CPU meter
Sends are the reason to use them. A delay and a reverb exist once and every channel decides how much of itself to send. That costs one instance of each rather than one per channel, which is what makes them affordable on this hardware at all. Both run on the PSP's second processor, so they cost the main mix almost nothing.

The full rack -- freeze, duck, gate, locut, width, the delay tone, the wet comp and drive, and the per channel phaser and chorus -- lives on the FX screen, one map cell to the left.

What the short names mean

Screens this size label things in four characters or fewer. Here is the whole vocabulary, in one place.

The effect rack, on the FX screen
ReadsIs
ph.rtPhaser rate -- how fast the sweep moves, on the channel the FX screen is pointing at.
ph.dpPhaser depth -- how much of it you get, and the on switch: at 0 the phaser is off and costs nothing.
ch.rtChorus rate, same idea.
ch.dpChorus depth, and its on switch at 0.
distDistortion on that channel: gain into a clipper, so a sample can crunch too. It goes a long way; the top of the range is a fuzz. Off at 0.
edgeThe clipper's knee. At 0 it is the soft curve the synth engines carry; at full it is a wall, which is what a square wave is made of.
toneA low pass after the clipper. A clipper makes harmonics all the way up and the top octave of them is fizz; turn this up to take it off.
gateHow readily the drive lets go of a note that is dying away. At 0 it never does, which is sustain on a guitar and a tail held at full crunch on a sample. Up, a tail decays like a tail; right up, only the loud part of each hit gets the crunch.
sizeHow big the reverb's room is.
dampHow fast that room eats its own highs. Up is darker.
freezeThe tail stops decaying and hangs, so a chord becomes a pad you play over.
duckPushes the tail down while you are sending into it, so the room stays out of the way of the part.
gateOnly lets the tail through while the send is up.
locutLow cut on the reverb, so a frozen hold does not turn to mud.
widthSpreads the tail past the edges of the room.
timeThe delay's time, as a division of the tempo -- so it stays in time when the tempo moves.
fdbkFeedback: how many repeats before the echo dies.
toneDarkens each repeat inside the loop, the way tape does.
amtThe one knob under DRIVE (saturates the wet bus) and under COMP (glues it first, so the drive works an evened signal). Each panel has its own.
chanWhich channel the INSERTS panel is editing. The rest of the rack is shared by every channel; the inserts are not.

Insert, not send. The phaser and chorus sit inline in the channel itself, before the sends -- so their movement carries into the echo and the room rather than being pasted on afterwards. A phased chord arrives at the reverb already swirling. All three are per channel and saved with the project. The distortion is the one that runs before the fader: turn it up and the sound gets dirtier, turn the fader down and it gets quieter rather than cleaner, which is what a mix wants from it.

Elsewhere on the screens
ReadsIs
dspHow much of the audio budget the render is using. Over 100 and you get underruns.
meThe load on the PSP's second processor, which carries the reverb, the delay and the spectrum.
vfpuTime spent in the vector unit -- the formant engine and the master EQ.
usedMemory the program has handed out. It moves the moment a sample loads.
undUnderruns: times the audio ran dry. Zero is the only good number.
hpf / lpfThe channel's high pass and low pass filters, on the mixer.
dly / revHow much of the channel goes to the delay and the reverb.
syncoSync offset: trims how early PSPATTERN plays when following an external clock.
sendoSend offset: shifts the clock PSPATTERN sends when it is the leader.
asaveAutosave. NO stops the machine touching the memory stick on its own -- for live sets.
followFollow. The song screen pages along with the playhead while the song plays. NO holds the window still, for anyone who uses the screen as a map.
restIdle rest. Minutes without a button before the machine rests on its own: screen dark, clock down, the project auto-saved, any button wakes it. OFF never. Never while a song plays or a render is open. The system's own screen timeout is held off while the tracker runs.
vol / busThe channel's level, and which mix bus it feeds.
On the instrument screen
ReadsIs
atk dec susThe amplitude envelope: attack, decay, sustain, with release beside them.
intpInterpolation on a sample, how it reads between its points when played away from its root note. herm, the default, is a four-point curve that keeps the top end; lin is the straight line, the old piggy sound. None is the crunchier, older sound.
fbk / fbmix / fbtuneThe sampler's feedback stage: how much comes back, how much of it you hear, and at what tuning.
crushBit crush, with drive beside it.
resoResonance on the filter, with cutoff beside it.
detDetune, in cents, and on the analogue engine how far the unison stack is spread.
pwmPulse width modulation: moves the shape of a pulse wave over time.
env / lfo / ratAn envelope amount, a low frequency oscillator, and its rate.
algoThe FM algorithm: which operators modulate which, drawn as a diagram beside it.
feedbackFM feedback: operator four modulating itself. Silent while operator four's level is zero; little below half, a saw around the middle, noise at the top.
vow a / vow bThe two vowels the formant engine morphs between.
voicesHow many of the hive's five voices sound. Every voice is one oscillator, so this is the cost knob.
chordThe hive's chord shape, from a triad to a ninth, or off for a single note. Fewer notes than voices doubles them; more drops the top.
spreadHow far the hive's voices are detuned against each other, a chorus at the bottom and a swarm at the top.
widthHow far the hive's voices are placed across the stereo field.
glottal / breathVoice engine character: the rasp of the source, and the air over it.
autoWhether this instrument's table runs on every note, or waits to be fired by a TABL command.
07

Playing live

The song screen has two modes. In song mode it plays the arrangement from the top. In live mode each channel is launched by hand and keeps looping until you tell it otherwise, which is closer to a groovebox than a tape.

Hold SELECT and press left or right on the song screen to switch between them, which is the chord LSDJ and M8 both use. X with left or right does the same thing, the way LGPT had it. The panel on the right shows two rows: cue for what each channel is waiting to do, and mut for what is muted.

START queues the cursor's column, or the columns of a selection if one is up. Hold L and press START to queue the whole row, which is what you want when the eight channels of a row belong together: a column at a time is eight presses inside the same chain. Hold R and press START to stop a column, and add left to that to stop the row.

In live mode, pressing O on a cell queues that chain to start on the next boundary rather than immediately, so parts come in together instead of wherever your thumb landed. A channel can be queued to start or to stop, at the end of the current phrase or the end of the current chain.

The cue row counts the wait down. A queued channel shows how many steps are left before it switches (8, 7, 6) in the play colour to start and the mute colour to stop, or + when the switch is more than sixteen steps out. Queue a chain a bar early and you can see it coming instead of guessing.

Pressing O twice on the same cell brings it in sooner: the first press queues it for the end of the chain, the second for the end of the current phrase. Watch the countdown drop when you do it.

Bookmarks

A song is 256 rows and the screen shows sixteen, so getting from the intro to the last chorus is a lot of holding down. Mark the rows you keep coming back to and jump between them. A marked row is drawn in the value colour instead of the row colour, and marks are saved with the song.

HoldPressResult
SELECTOmark the row under the cursor
SELECTXclear the mark
SELECTdowngo to the next marked row
SELECTupgo to the previous one

Muting is the other half of it. Hold X and press L to mute the channel under the cursor, from the song screen or the mixer, so an arrangement can be performed by muting and unmuting rather than by rewriting it. Hold O and press L to solo instead.

Which button you release first decides what you get. Let go of L while X is still down and the mute stays on, which is what you want when you are building an arrangement. Let go of X while L is still down and the channel comes straight back, which is what you want when you are only checking what a part is doing. The editing section has the rest of it.

08

Instruments

An instrument is one of three types, chosen on the top row of the instrument screen. The screen is built for trying sounds fast, and each control owns one job:

On the instrument screen
ControlDoes
left, righton the selector rows -- type, engine or preset, import -- step the focused row's value
up, downmove between rows in whichever zone you are in: the selectors at the top, or the parameter grid
X + up, downcross between the two zones
O + d-padedit the focused parameter, one step at a time
L + d-padswitch instrument: left and right by one, up and down by sixteen
SELECTpreview, held like a key: press for note on, release for note off. Tap it between preset steps to browse the bank by ear

Changing type loses nothing: the settings of the type you leave are kept and restored when you come back, so flipping a sampler to a synth and back is free experimentation, not a decision.

Synth presets

The third rung of the ladder is the preset row. Stepping it loads: land on a name and that sound is in the slot, engine and all. Browsing is silent -- SELECT demos the one you are on. The -- entry is where you started: the sound is snapshotted the moment browsing leaves it and restored when you step back, so surfing the bank can always be backed out of.

Tap O on the preset row to save your own sound under a name; X backs out of the dialog. A preset is a plain text file of name=value lines in the presets folder beside the EBOOT -- readable, editable, small enough to share -- and one never drags a table along. A hundred and nine factory sounds ship in the folder: drum kits and chip voices on TONE, CZ brass and an 808 on PDX, a reese and rave stabs on VAX, slap bass and tubular bells on FM, choirs and a modem on VOX. Your saves land beside them.

Sample

Plays one of the built in drums, a wav file, or a preset from a soundfont. It has volume, pan, root note, fine tune, interpolation, loop mode and points, a slice count, a drive and bit crush stage, a filter with cutoff, resonance and type, a feedback stage, an attenuator and an amplitude envelope. The samples section below covers where the files live.

The sampler instrument screen with sample, volume, pan, loop, DSP and amplitude sections.
Values read as percentages, decibels and L, CTR, R where a raw number would mean nothing. Sample start, loop and end stay in hexadecimal because they are byte offsets.

MIDI

Plays notes on something else instead of on the PSP. Channel, volume, note length, pitch bend range and four CC slots that the MCCA command can address. Select the PSPMIDI device on the project screen first. See the MIDI section below for what the adapter carries.

Synth

Generates sound on the PSP. Pick one of six engines on the second row.

EngineWhat it is
toneA single oscillator. Saw, square, triangle or sine, with pulse width, a sub oscillator an octave down, and noise. The cheapest of the four.
pdxPhase distortion. Saw, square, resonant saw and resonant triangle. The mod envelope sweeps the distortion, which gives a resonant sweep without a filter.
vaxThe analogue style engine. Up to seven detuned oscillators, saw or pulse, with pulse width modulation, a sub oscillator, noise, hard sync and ring modulation.
fmFour operator frequency modulation with eight algorithms. Each operator has a ratio, level, detune and its own envelope. It is the hungriest engine -- the info panel's dsp figure shows the cost as you play -- and the settings screen can hide it from the picker as a guard rail. Instruments saved as FM always load and play.
voxThe formant engine. A glottal source and a breath of noise through parallel bandpass filters tuned to vowels; one knob morphs between two vowels you pick, and the FCUT command sweeps it for talkbox lines. Runs on the VFPU, so it is one of the cheapest voices.

The FM algorithm names describe the routing directly. A greater than sign means the operator on the left modulates the one on the right, a space separates independent branches, and any operator not followed by a greater than sign reaches the output. So 4>3>2>1 is one chain and 4 3 2 1 is four sines added together.

The LFO, two ways

Every engine has an LFO with a destination, a rate and a depth on the instrument page, and it restarts with every note. For one that does not, use the LFO_ command: it belongs to the channel rather than the note, so it can be armed on a step with nothing on it, it runs through rests, and whichever synth plays on that channel next carries it through its own LFO destination. Two channels started on the same step at the same rate stay in step. Rates F0 to FF are tempo divisions, and a channel LFO on a division takes its phase from the song's grid, so a bar-long sweep peaks on the downbeat wherever you switched it on. LFO_ 0000 stops it; another LFO_ changes its rate or depth without a hiccup; stopping the song ends it.

Hard sync and ring modulation

Both are on the vax engine and both are off at zero, so patches made before they existed are unaffected.

sync runs a silent master oscillator at the note frequency. The oscillators you hear are lifted to between one and four times that frequency and reset every time the master completes a cycle. The pitch stays on the note while the timbre climbs. Sweeping it from a table is the classic hard sync lead.

ring multiplies the oscillator by a sine running one octave below the note. At zero the oscillator passes through untouched. It adds tones halfway between the normal harmonics, which is what makes it sound metallic. It is applied before the sub oscillator and the noise, so a ring modulated lead keeps a solid bottom end.

The vax synth engine screen showing wave, unison, detune, pulse width, sub, noise, sync and ring controls.
The vax engine with sync at 37 per cent and ring at 25 per cent.

The drum kit

The drum instruments are generated when a project loads rather than read from sample files. That is what the progress line on the loading screen is doing. They take no space on the memory stick and they can be redistributed freely. Each drum has a soft and a hard variant.

09

Samples and soundfonts

Any normal wav loads: 8, 16 or 24 bit, 32-bit float, mono or stereo, whatever header dialect the exporter wrote. Everything becomes 16-bit in memory.

A sample instrument plays one of the built in drums, a wav file, or a preset from a soundfont. Every project carries its own set of files.

Where files go

Each project is a folder named lgpt_NAME under ms0:/PSP/GAME/PSPATTERN/, and inside it is a samples folder:

ms0:/PSP/GAME/PSPATTERN/lgpt_MYSONG/samples/

Everything in there is read when the project opens. Copying a wav into that folder from a computer is all that is needed. There is no import step and nothing else to update. Making a project on the PSP creates both the project folder and its samples folder for you.

The sample library

Beside the projects is a folder called samplelib. Nothing in it is loaded or playable on its own. It is the folder the import browser opens in, so it is where to keep the files you want within reach of every song. You can fill it before you have made a single project, and it may hold subfolders.

If importing says it cannot access the library, the samplelib folder could not be made. The browser creates it when it is missing; if the card refused, make an empty folder with that name beside the projects and importing works again.

Importing

On the instrument screen set the type to Sample and press O on the import sample row under it. The import screen is two pages. The first is the file list, with a FILE panel beside it that says what the file under the cursor is: channels, rate, word size, length, its size on the card and what it costs in memory. Up and down walk the list, left and right jump a page, O enters a folder, X steps out of it and closes at the library root, and holding SELECT plays the file under the cursor as it will be stored. TRIANGLE chooses the file and opens its settings page.

The settings page is about that one file. STORE has two rows: stereo as it is or folded to mono, and the rate as it is, halved or quartered. Up and down move between the rows, left and right change the value, with or without O held. The in ram line follows the choices and the IMPORT panel spells out what TRIANGLE will do, in the accent colour when a conversion is involved. TRIANGLE imports; X goes back to the list with nothing taken. Nothing else imports: O never does, so a slip from the O-and-arrow editing habit changes a setting instead of taking a file. The choices are remembered until you quit, so a batch at the same settings is TRIANGLE, TRIANGLE per file.

Hearing is the check: SELECT plays the file through the same fold and average the import writes, resampled to pitch, so a quarter-rate preview sounds exactly as the sample will. Change a setting while it plays and the sound follows.

Mono halves the memory a stereo file takes and halving the rate halves it again. The sampler plays any rate at the right pitch, so a file stored at 22050Hz sounds the same note it did at 44100, with less top end. The reduction is a plain average of two or four frames, not a filtered resample: bright material can alias. There is no word size choice, because memory is always 16-bit and the crush row on the instrument screen already does bit reduction at play time.

Whatever the original was -- 8, 16, 24 bit or float -- the copy in the project is written as 16-bit PCM, the form the sampler keeps in memory. Importing a name the project already holds replaces that sample, after a yes/no that defaults to no: every instrument on it picks up the new version, and their start, loop and end points reset to the new length. Soundfonts have no settings and are copied as they are.

The FILE panel at the bottom of the sample page describes the sample the slot is on: its whole name, then channels, rate, length in seconds, length in frames -- in hex, because start, loop and end count in hex frames -- and what it costs in memory.

It is a copy, not a move. The original stays in the library and the project gets its own version. That is what makes a project folder complete on its own: move it to another memory stick and it still plays. It also means a file used in four projects is stored four times, which matters more for a soundfont than for a single drum hit.

Saving a song moves no audio at all. The copy already happened when you imported.

The sample list

The list is sorted alphabetically, and the drums, your wav files and any soundfont presets sit in it together. A file named Bassline lands between ANTOMLO and HDCLAP rather than at the end of the list. Sorting is by character code, so capitals come before lower case.

A project stores the name of the sample an instrument uses, not its position in the list. Adding or removing other files will not repoint an instrument at the wrong sample, and a name that cannot be found gives no sample and silence rather than something else.

Removing samples

The project screen has a samples row under the compaction tools. It opens a list of every sound file the project carries, with what each costs in memory and which instruments are on it, by slot number. Files on the card that could not be loaded are listed too, marked as such. Hold SELECT to hear one, press O to remove it after a yes/no that names who is on it, X to go back. Removal is immediate on the card; an instrument that was on the file is set to no sample, and a soundfont goes as a whole. Stop the song first.

Soundfonts

Put an .sf2 file in a project samples folder and it is read when the project opens. Every preset in it appears in the sample list under its own name. Note ranges, root keys and loop points come from the file, so a preset with several samples mapped across the keyboard plays the right one for each note.

LimitWhat it means
Three per projectA fourth sf2 in the folder is not loaded.
128 slotsPresets share the sample list with the drums and your wav files.
MonoA stereo preset plays its left sample.
No velocity layersThe loudest layer plays at every velocity. The velocity column still sets the volume.
Held in memoryThe whole bank stays in memory while the project is open. A large soundfont may not fit, and what does not fit is silent.

The start, loop and end fields on the instrument screen read zero for a preset. Those values are per note for a soundfont and the screen has one set of fields to show them in.

0A

MIDI

MIDI runs through the PSP-MIDI adapter, which carries USB MIDI for a computer and TRS MIDI for hardware, in both directions. The tracker is fully usable without it. Samples and synths need no extra hardware at all.

Out

A MIDI instrument sends note on and note off, continuous controllers, pitch bend, program change and channel pressure. The commands beginning with MD and MC address those directly from a phrase or a table, so a controller sweep can be sequenced the same way a filter sweep is.

The tracker also sends MIDI clock, twenty four times a quarter note as the standard asks, along with start and stop when the transport moves. Gear downstream follows the tracker without any setting to change. If you would rather it kept quiet, set mode in the config screen's SYNC panel to OFF.

As a leader it keeps honest time. Clock bytes are not fired when a tick is decided -- they are scheduled by a dedicated high-priority sender for the moment that tick is HEARD, using the same measured latency the follow mode compensates. So what reaches the wire is the clock of the audio coming out of the headphone jack, sub-millisecond, at any tempo and any buffer setting -- gear downstream sits on the beat you hear, not the beat the software imagined a moment earlier. If your downstream gear itself is slow to sound, sendo on the config screen shifts the outgoing stream: milliseconds, signed, positive sends later.

In

Incoming notes, controllers, pitch bend and program change are routed through mapping.xml, so an external controller can drive the program. Set the device to PSPMIDI on the project screen.

Who owns the clock is set once for the rig, on the config screen's SYNC panel: mode is LEADER (send clock, the default), FOLLOW (obey one) or OFF. On FOLLOW the tracker takes its clock from outside instead of running its own, which is how you put it in time with something else. Following is deliberately opt in: a stray clock byte from a device you happened to leave plugged in should not take the transport away from you.

On Follow the leader owns the transport, so START does not start the song, it arms it. The bottom row reads waiting for midi start until the leader starts, which is how you come in with it rather than free running beside it. Pressing START again gives up the wait. Stopping stays immediate and stays yours.

Following locks to the leader's position, not just its tempo. One MIDI clock is exactly one tracker tick, so the two are counted against each other and the difference is corrected continuously. The tempo figure on the song screen turns the play colour once it has locked and the mute colour while it is still catching up.

Give the lock a fair start: set the song's saved tempo close to the leader's before you begin. The loop measures the real tempo inside the first beat and pulls the rest in, but a song saved at 90 under a leader at 170 begins that first beat far off the mark, and the latch takes audibly longer to settle -- or hunts, if the gap is extreme. Close enough is enough; exact is not required.

Locking the clocks is not the same as being heard together: what gets aligned is when the tracker decides a tick, and what you hear is that tick leaving the audio buffer a little later. The tracker measures its own share -- the audio pipe, the slice in flight -- and runs early by exactly that, at any tempo and any buffer setting. The driver even stamps each clock byte with its arrival time at the USB wire, upstream of anything the software is busy doing, so what the loop measures is when the byte actually landed.

Dialling it in

What no device can measure is the rest of your rig: how long your computer or sequencer takes to get a clock byte out of its port. That is one constant, and synco on the config screen is its knob: milliseconds, signed, positive plays earlier, applied at the next play start.

  1. Put the same kick pattern on the leader and on PSPATTERN.
  2. Start the leader; PSPATTERN comes in with it on Follow.
  3. Flams? Raise synco if PSPATTERN is late, lower it if early. Move in fives, then ones.

Around 50 suits a typical computer DAW over a USB interface; a hardware sequencer wants nearer zero. Because the measured share tracks your settings, the number you dial describes only your gear: it survives tempo changes, buffer changes and firmware updates. Dial once, play forever.

0B

Tables

A table is sixteen rows of three effect columns that run underneath a note. This is the part of a tracker that has no equivalent on a step sequencer, and most of what makes a small number of channels sound like more.

Where a phrase step happens once, a table row runs at tick rate. A step at 150 beats per minute lasts 100 milliseconds and contains six ticks, so a table gets six chances to change something inside a single step. That is fast enough to be heard as timbre rather than as a sequence of events.

The table screen: sixteen rows and three command columns.

Starting one

Two ways. Put TABL on a phrase step and give it a table number, which starts that table for that note. Or set the table field on an instrument, which runs it automatically for every note that instrument plays.

Making it loop

A table runs down its rows once and stops. HOP sends it back to a row, and the first two digits say how many times. Zero means forever, which is how a table becomes an envelope rather than a one shot. HOP 0000 on the last row loops the whole table for as long as the note sounds.

Four things worth building

A filter sweep

FCUT on rows 0, 4, 8 and 12 with rising values opens the filter across the note. Add resonance with FRES on the first row and it becomes a sweep rather than a fade.

A drum roll

IRTG retriggers the note from inside the table. Decreasing values across the rows tighten the roll into the bar line. This is how one hat instrument covers everything from a straight eighth to a stutter.

A gate

VOLM alternating between a high and a low value chops the note at tick rate. On a held chord it is the stuttering pad sound; on a bass it is a tremolo.

A pitch drop

PTCH with a falling parameter under a kick gives it weight, which is how you get a usable kick out of a synthesised drum on a small speaker.

Three columns run at once. A table row can sweep a filter, change the volume and retrigger the note in the same tick. That is the thing a phrase step cannot do, because it only has two effect columns and only fires once.
0C

Arpeggios

ARPG takes four hexadecimal digits, each one a number of semitones above the written note, and cycles through them under a held note. Trailing zeros shorten the cycle, so 0370 is a three note figure and 037A is a four note one. A note starting cancels the previous arp, so the command goes on every step that has a note.

Common shapes
ValueSemitonesChord
03700 3 7minor triad
04700 4 7major triad
037A0 3 7 10minor seventh
047B0 4 7 11major seventh
0C000 12octave

Vibrato

VIBR takes a speed in the first pair and a depth in the second, the depth measured in sixteenths of a semitone: 10 is one semitone either way, 02 is the smallest wobble worth having and 80 is the widest. 0000 turns it off and puts the pitch back where the note left it.

It is centred on the note rather than added to it, so a part with vibrato sits at the same average pitch as one without. It also bends whatever pitch the step is already playing instead of replacing it, which means it rides on top of an arpeggio: the arp moves the note, the vibrato wobbles around wherever the arp has put it.

All three instrument types have it, but they reach it differently. The sampler and the synth retune directly. A MIDI instrument sends it as pitch bend, so the depth you hear is bounded by the bend range the receiving device is set to rather than by the number you wrote.

Arp speed

The arp advances one position per tick, and a tick is short. At 150 beats per minute with six ticks to a step a tick is under 17 milliseconds, which gives a 220 Hz note fewer than four cycles before the pitch changes again. That is below what the ear needs to hear a pitch at all, so a fast figure stops sounding like notes and starts sounding like roughness.

ARPS sets how many ticks each arp position holds. The default is 1, the classic every tick trill. Raising it to 2 or 3 keeps the shimmer while giving each note in the figure enough cycles to register as a pitch. It is a channel setting and it survives note starts, so once per part is enough.

ARPS works in tables too. Putting it on a table row sweeps the arp rate across a single note, which moves the figure from a trill to a melody while it plays.
0D

Commands

Every command takes four hexadecimal digits. What the digits mean depends on the command, and the panel at the bottom of the phrase and table screens tells you which form the one under the cursor uses.

The four forms
FormMeaning
--bbonly the last two digits are read. The first two are ignored.
aabbtwo separate values. Usually a rate or amount in the first pair and a target in the second.
aaaaall four digits are one number.
abcdfour separate digits, one per nibble.

Probability

MAYB makes a step happen only sometimes. The first pair is the odds out of FF: 00 never, FF always, 80 about half. A step with no MAYB on it always happens, so it is opt in and nothing written before it existed sounds any different.

In a phrase it decides whether the note plays. A step it skips is left alone rather than cut off, so whatever was already ringing keeps ringing, exactly as an empty step would. That distinction is the whole point: a maybe that silenced the previous note would be a gate.

In a table it is a hop that only sometimes hops, and the last digit is the row to land on. It takes the same shape HOP already uses, with the repeat count replaced by odds. Because the three command columns in a table each walk their own position, one column can wander off on a roll while the other two hold their place.

A rate of 00 means jump. The commands that slide, PTCH and VOLM, read the first pair as how fast to approach the target. Set it to 00 and the value changes instantly instead of gliding, which is usually what you want for a one off change. BEND is the exception: it has no target at all, only a speed.

Notes and pitch

CmdFormWhat it does
ARPGabcdArpeggio. Four semitone offsets above the note, cycled at arp rate. Trailing zeros shorten the cycle.
ARPS--bbArp speed: how many ticks each arp position holds. 1 is every tick and is the default.
PTCHaabbSlide the pitch. aa is the rate, bb is signed semitones.
BEND--bbBend at a speed with no target, LSDJ's P: bb is signed sixteenths of a semitone per tick, 81 to FF down. Runs until the next note; 00 holds the pitch where it got to. A kick is a note with BEND E0 under it.
PFINaabbFine tune, for detuning a part against another.
LEGA--Slide from the previous note to this one rather than restarting.
VIBRaabbVibrato. aa is the speed, bb the depth in sixteenths of a semitone, so 10 is one semitone and 02 the smallest wobble worth having. 0000 turns it off and puts the pitch back. It is centred on the note, so a part with vibrato sits at the same average pitch as one without, and it rides on top of an arpeggio rather than fighting it.
IRTGaabbRetrigger the note and transpose it. Values above 50 read as negative.
RANDaabbScatter the note it sits beside: aa semitones of pitch either way, bb of level. Level only ever goes down, because a command that could make a step louder than the one you set is a command that clips a mix you had balanced. Synth only.
RTGRaabbThe shape of a retrigger: aa is how much the volume changes each repeat and bb how much the pitch does in semitones, both signed, so 80 to FF fall. Put it in the other command column on the same step as RTRG. Synth only.
RTRGaabbRetrigger every bb ticks. On a sampler, aa shifts the sample position at each repeat; on a synth the shape comes from RTGR.
KILL--bbStop the note after bb ticks. This is how a part ends rather than sustaining.
MAYBaa-bA step that only sometimes happens. aa is the odds out of FF, so 80 is about half, FF always and 00 never. In a phrase it decides whether the note plays; in a table, where each command column walks its own position, it is a hop to row b that only sometimes hops. A step it skips is left alone rather than cut, so whatever was ringing keeps ringing.

Level and position

CmdFormWhat it does
VOLMaabbApproach a volume. aa is the rate, bb the target.
PANaabbPan toward a value. 7F is centre.

Filter and tone

CmdFormWhat it does
FCUTaabbSet the filter cutoff.
FRESaabbSet the resonance.
FLTRaabbBoth at once: cutoff in aa, resonance in bb.
CHRDabcdA chord. The same four semitone offsets ARPG takes, always cycled at tick rate, so you do not have to set ARPS as well. The channels are monophonic, so this is what a chord can be -- except on the hive engine, where the same nibbles play as a real chord, every note at once.
CRSHaa-bDrive in aa, bit crush in the last digit.
DRIV--bbPost filter drive. VAX engine.
FBMXaabbFeedback mix on the sampler's feedback stage.
FBTNaabbFeedback tune.

Synth

CmdFormWhat it does
UNIS--bbUnison voices in the stack, 1 to 7. VAX engine.
DTUN--bbHow far the unison stack is spread. VAX engine.
LFOR--bbLFO rate.
LFOD--bbLFO depth.
LFO_aabbA free-running LFO on the channel: aa the rate, bb the depth, on the instrument's LFO destination. It runs through rests and across notes and instruments until 0000 stops it, another LFO_ re-tunes it, or the song stops. Rates F0 to FF are tempo divisions -- 8 bars down to a 32nd, with dotted and triplet values -- exact at any tempo and phase-locked to the song's grid.
FML1--bbOperator output level. On a modulator this is brightness. FM engine.
FMFB--bbOperator four modulating itself. FM engine.

Sampler

CmdFormWhat it does
PLOFaabbPlay offset. Jump to position aa, or move bb chunks from where you are. This is how a sample gets chopped.
LPOFaaaaShift the loop start and end together, which slides the loop through the sample.

Structure and timing

CmdFormWhat it does
HOPaabbJump to step bb, aa times. Zero means forever. In a table this is what makes it loop.
TABL--bbStart table bb under this note.
GROV--bbSwitch to groove bb, which changes the feel from this point.
DLAY--bbHold this step back by bb ticks. Small values push a note off the grid.
TRSP--bbShift the note by bb semitones, signed, and hold it there until something changes it. An offset rather than a new note, so an arpeggio running underneath arpeggiates around the transposed pitch. This is what a table transpose column emits, and it is useful typed into a step on its own.
TMPO--bbSet the tempo.
STOP--Stop the song immediately.

MIDI

CmdFormWhat it does
MDCCaabbSend controller aa with value bb.
MCCA--bbSend bb on one of the instrument's four CC slots, so the controller number lives on the patch.
MDPBaaaaPitch bend, raw 14 bit. 2000 is centre.
MDAT--bbChannel pressure.
MDPG--bbProgram change on the instrument's channel.
MVEL--bbSet the MIDI velocity for this step.
0E

Saving and rendering

Projects live in ms0:/PSP/GAME/PSPATTERN/lgpt_NAME/. Save song writes to the current project, save song as makes a new one, and the browser on load song lists every project it finds.

The project browser listing four songs with Load, New and Exit at the bottom.

The tracker also keeps an automatic backup. If it was interrupted, it offers to recover the unsaved changes the next time you open that project.

Set render to Stereo on the project screen and press START to write a mixdown into the project folder while the song plays. Each take is its own file, named after the song and the clock as month, day, year, hour, minute, second -- PIXELFALL-09042026-153012.wav -- so renders never overwrite one another. When the song ends, or you stop it, the file stays open while the releases and the delay and reverb ring out, then closes on its own and the screen names it. Playing a note or starting the song again ends the tail at once. Set render back to Off when you are finished, or every play writes a new file.

On levels. Instrument volume runs from 0 to 255 and is shown as a percentage of that range, so 50 per cent is unity gain and not half volume. Above 50 per cent the instrument is amplified, up to about six decibels at the top. The master fader is steeper still: it applies the fourth power of its setting, so 68 is more than thirteen decibels down rather than a gentle trim. If a mix sounds quiet, those two are the first things to check.
0F

Known issues

Version 0.24.0a. These are the things that are wrong and known about.

10

License and source

PSPATTERN is free software under the GNU General Public License version 3. You can use it, study it, change it and pass it on, and anything you pass on has to carry the same freedoms and the source that goes with it.

The PSP-MIDI adapter, and the other PSP instruments it works alongside, are at hobbychop.com. PSPATTERN itself is free and stays that way.

The complete source lives at github.com/HobbyChop/PSPATTERN. Built releases are on the releases page.

It is derived from LittleGPTracker by Marc Nostromo and contributors, with feature work from the djdiskmachine fork. The original authors are not responsible for this version.

A lot of how this behaves comes from two trackers it shares no code with. Little Sound Dj by Johan Kotlinski is where the chain and phrase layout comes from, by way of LittleGPTracker, along with the pitch bend, the play-from-here shortcut and a lot of the key habits. The Dirtywave M8 by Timothy Lamb settled a few things directly: cut and paste splice instead of clearing in place, a selection grows down the column before it grows across, and the mode switch is on SELECT. Neither project is involved with this one or responsible for it, and none of their code is in it. What I borrowed is the way they work, so if you already know either of them you don't have to learn this from scratch.

usbmidi.prx is a separate work, the kernel driver for the PSP-MIDI adapter. It is not part of this program and talks to it only through the system call interface. It ships alongside for convenience.

The drum kit and the demo songs are original work and may be redistributed.