Dimea Arcade · VST3 · Windows
ARCADE
CHORD CONTROL
Spatial Harmony Controller
VST3 MIDI Instrument 4 Voices v1.9
ROOT · THIRD ↕
FIFTH · TENSION ↔
Version 1.9  ·  User Manual  ·  2026
dimea.io  ·  contact@dimea.io

Table of Contents

Everything you need to play chords with a joystick — from first note to deep modulation.

01Quick Start3
Installation3
Loading in your DAW3
Your first chord3
02Interface Overview4
Panel map4
Window modes — Full · Mini · Maxi4
03Joystick Pad5
Axes & voice mapping5
Pitch axis crosshair5
Sample & hold5
04Voices & MIDI Routing6
TouchPlates & trigger sources6
Per-voice MIDI channels6
05Scale & Key7
Scale presets7
Custom scale builder7
Interval & octave offsets7
06Chord Looper8
Recording & playback8
DAW sync & subdivisions8
07Arpeggiator9
8-step pattern grid9
ON · TIE · OFF states9
08LFO Engine10
Shapes, rate, sync10
CC destinations & custom routing10
Sister cross-modulation10
REC — joystick capture11
09Gamepad Control11
Button map11
Option mode cycle11
10Reference12
All APVTS parameters12
CC reference & filter routing12
Troubleshooting13

Quick Start

Installation

1
Run the installer. Double-click DimeaArcade-ChordControl-Setup.exe. Accept the defaults. The VST3 is installed to C:\Program Files\Common Files\VST3\ — the standard location picked up automatically by all major DAWs.
2
Rescan plugins in your DAW. In Ableton, go to Preferences → Plugins and click Rescan. In Reaper, go to Options → Preferences → Plug-ins → VST and click Re-scan. The plugin appears as Arcade Chord Control under manufacturer Dimea Arcade.
3
Load on a MIDI track. Arcade Chord Control is a MIDI instrument — place it on a MIDI track, then route that track's MIDI output to a software instrument (synth, sampler, piano) on a separate track. It outputs up to four simultaneous MIDI notes, one per voice.
Ableton
Place Arcade Chord Control in a MIDI track's instrument slot. Set the track's MIDI "To" destination to the instrument track you want to play. Because Arcade Chord Control is declared as an instrument (not a MIDI effect), it appears in the instrument browser — not the MIDI effects rack.
Reaper
Insert Arcade Chord Control as a VST instrument on a track. Enable the track's "MIDI output" routing to send the generated MIDI to a second track with your synth. Reaper will discover it under the manufacturer name set in the Windows version resource.

Your First Chord

1
Open the plugin UI. You'll see a large joystick pad in the centre.
2
Choose a key and scale from the Scale panel on the right. Try C Major to start.
3
Click and hold anywhere on the joystick pad. This simultaneously sets the pitch and triggers all four voices. Move the mouse while holding to hear the chord change in real time.
4
Release the mouse to send note-off to all voices. The chord display at the bottom of the pad shows the chord name (e.g. Cmaj7).
Pro Tip
Move slowly along the Y-axis (up/down) to walk through scale degrees — the root and third change. Sweep the X-axis (left/right) to vary the colour of the chord — the fifth and tension interval shift. Together they give you the full harmonic landscape of the key.

Interface Overview

Panel Map

The interface is divided into functional zones. Understanding the layout makes navigation intuitive.

JOYSTICK PAD ROOT / THIRD FIFTH / TENSION ROOT THIRD FIFTH TENSION TOUCHPLATES SCALE / KEY 20 presets + custom Global transpose VOICE CONFIG CH1–CH4 · Atten Interval / Octave offsets CHORD LOOPER REC · PLAY · GATES · JOY DAW sync · subdivisions ARPEGGIATOR 8-step grid · Rate · Order RND SYNC · LEN RANDOM TRIGGER Density · Subdiv · BPM LFO ENGINE X + Y LFOs Shape · Rate · Phase Level · Dist CC Dest · Sister SYNC · JOY · REC OSCILLOSCOPE FILTER / CC L-Stick X/Y → 18 CCs Custom CC 0–127 Cmaj7
Arcade Chord Control — full interface overview
Full interface at default size — all panels visible

Window Modes

Arcade Chord Control has three window sizes, accessible from the header bar buttons or via gamepad.

◱ Full
Default view. All panels visible. Resizable between 0.75× and 1.0× by dragging the window edge.
◱ Mini
Pad-only view at current scale. Ideal for a second monitor or small screen. All controls hidden.
⛶ Maxi
Pad fills the entire display. Maximum joystick precision — every pixel of your screen maps to a pitch.

In Mini or Maxi mode, a small return button appears in the top-right corner of the pad. Click it to return to Full view. Window mode is never saved between sessions — the plugin always opens in Full.

Joystick Pad

The joystick pad is the core performance surface. Mouse position maps directly to pitch — move it like a physical joystick to play chords in real time.

Axes & Voice Mapping

Each position on the pad simultaneously determines the pitch of all four voices. The two axes control independent voice pairs:

AxisVoicesWhat changesDirection
Y (vertical)Root (V1) + Third (V2)Scale degree — which note in the keyUp = higher pitch
X (horizontal)Fifth (V3) + Tension (V4)Chord colour — interval qualityRight = wider interval

All four pitches are scale-quantised — they always land on a note in the active scale. The quantiser searches downward when a position falls between notes (ties go down).

Attenuation

The joystickXAtten and joystickYAtten knobs (0–127) scale how much pitch range the full axis sweep covers. At 127 the pad spans the full two-octave quantiser window. At lower values the pitch range compresses toward centre — useful for fine melodic movement.

Interval & Octave Offsets

Each voice has independent thirdInterval, fifthInterval, tensionInterval (0–11 semitones) and octave controls (0–11). Use these to set the harmonic voicing at rest position before the joystick displaces it.

Pitch Axis Crosshair

Two subtle lines extend from the cursor to the pad edges, showing the exact quantised pitch for each axis in real time:

Right-click the joystick pad to toggle the crosshair on/off. The setting is saved in your DAW preset.

Joystick pad with pitch axis crosshair and real-time note names
Pitch axis crosshair — horizontal and vertical lines show quantised note names in real time

Sample & Hold

Pitch is locked at the moment of trigger. Moving the joystick after triggering a note does not bend the pitch — the position is sampled once on note-on. This allows stable chords while you reposition for the next one.

Performance technique
Keep the joystick held at the desired position before clicking a TouchPlate. Release the TouchPlate to end the note, reposition to the next chord, then retrigger. This mirrors how a physical joystick controller works in a live set.

Visual Environment

The pad background is a living space scene that responds to joystick movement:

INV mode
The INV button (header bar) inverts the joystick X axis and co-rotates the background photo and starfield together as a single unit. Useful if your physical gamepad right stick is inverted relative to your expectation.

Voices & MIDI Routing

The Four Voices

Arcade Chord Control outputs four independent MIDI voices. Each has a name, a role in the chord, and its own trigger source:

VoiceNameChord roleDefault MIDI Ch
V1RootTonic — sets the key centre1
V2ThirdColour — major vs. minor quality2
V3FifthBody — harmonic stability3
V4TensionFlavour — extensions and alterations4

MIDI channels are configurable per voice via voiceCh0voiceCh3 (1–16). Route each voice to a different instrument, or all four to the same channel for a traditional polyphonic setup.

TouchPlates & Trigger Sources

Each voice has its own TouchPlate button below the pad. You can trigger any combination of voices independently. The trigger source per voice is set via triggerSource0triggerSource3:

SourceBehaviour
Pad (0)Note fires on mouse-down anywhere on the joystick pad. The corresponding TouchPlate lights up.
Joystick (1)Note fires continuously while the pad is held — re-triggers on any position change exceeding threshold.
Random (2)Notes fire at random intervals driven by the Random Trigger engine. Gate length and timing are independent per voice.
Trigger Selection and Random Params panels
Trigger Selection (left) sets the source per voice; Random Params (right) controls density, probability, and BPM
Creative use
Set Voice 1 and 2 to Pad (controlled manually) and Voice 3 and 4 to Random. You play the root and third intentionally while the fifth and tension shimmer in as random ornaments — a powerful approach for ambient and generative music.

Random Trigger Engine

When a voice is set to Random mode, its trigger timing is determined by:

Filter / CC Output

A dedicated filter CC channel sends continuous controller messages on a configurable MIDI channel (filterMidiCh, default 1). The left joystick axes (gamepad) or the X/Y attenuation knobs send to up to 18 named CC destinations or any custom CC (0–127). See Section 10 for the full CC list.

Modulation section showing CC routing and attenuation knobs
Modulation panel — CC destination dropdowns, attenuation knobs, MOD FIX, and SEMITONE range per axis

Scale & Key

The Scale system is the harmonic foundation. It determines which notes the joystick lands on and what chord names are displayed.

Global Transpose

The globalTranspose parameter (0–11) sets the key. It displays as a note name (C, C#, D … B). All voices and the scale quantiser shift together — you never have to retune individual voices to change key.

Scale Presets

Twenty built-in scale patterns cover most harmonic contexts:

Scale
Major (Ionian)
Minor (Natural)
Harmonic Minor
Melodic Minor
Dorian
Phrygian
Lydian
Mixolydian
Locrian
Pentatonic Major
Scale
Pentatonic Minor
Blues
Whole Tone
Diminished (HW)
Diminished (WH)
Augmented
Hungarian Minor
Double Harmonic
Chromatic
Custom
Quantizer panel showing scale keyboard, interval and octave knobs
Quantizer — active scale notes lit green on the keyboard, with Interval and Octave offset knobs per voice below

Custom Scale Builder

Enable useCustomScale to build your own scale from scratch. Twelve toggle buttons (scaleNote0–11) represent the twelve semitones of the octave. Enable any combination — Arcade Chord Control quantises all voices to only the active notes.

Idea
Use the custom builder to enter a chord's notes only (e.g. C, E, G, B for Cmaj7). The joystick then only lands on those four pitches — every position produces an inversion of the same chord. Great for voice-leading within a single harmony.

Interval Offsets

Beyond the scale, each voice has a semitone offset applied on top of the quantised pitch:

ParameterVoiceRangeEffect
thirdIntervalV2 Third0–11 semitonesDistance from root before Y-axis displacement
fifthIntervalV3 Fifth0–11 semitonesDistance from root before X-axis displacement
tensionIntervalV4 Tension0–11 semitonesDistance from root before X-axis displacement

Use these to set the default voicing. For a standard major 7th, set: Third = 4, Fifth = 7, Tension = 11. For a dominant 7th, set Tension = 10.

Octave Offsets

Each voice also has an independent octave shift (rootOctave, thirdOctave, fifthOctave, tensionOctave, range 0–11 mapped to octave shifts). Use these to spread voices across registers — e.g. Root in octave 3, Tension in octave 5 — for open voicings that breathe.

Smart Chord Display

The chord name shown below the pad is computed in real time from the active pitches. The algorithm:

  1. Identifies the root from the lowest active voice
  2. Stacks intervals root-up to determine chord quality
  3. Infers the third from the active scale when Voice 2 is not triggered
  4. Recognises: major, minor, dominant 7th, major 7th, minor 7th, diminished, augmented, sus2, sus4, add9, 6, major 6, and common extensions

The display holds the last chord name during silence — so you always see the last chord you played, even when no notes are sounding.

Chord Looper

The built-in looper records your MIDI performance and plays it back in a seamless loop — locked to the DAW transport or free-running.

Recording & Playback

The Looper panel has four record lanes and transport controls:

ButtonFunction
RECArms recording. On the next bar boundary (DAW sync) or immediately (free), begins capturing all MIDI output.
PLAYStarts looped playback. If nothing is recorded, PLAY arms for the next REC cycle.
GATESRecords only note-on/off events (no pitch). Replays rhythmic triggers using current joystick position as pitch — the loop plays different chords as you move the joystick.
JOYRecords continuous joystick X/Y position. Replays the movement curve, allowing the looper to "steer" the joystick for you.
CLRClears the corresponding lane. Press a lit REC/GATES/JOY button again to clear just that lane without stopping others.
Looper panel with transport controls and time signature settings
Looper panel — PLAY, REC, RST, DEL transport buttons; REC GATES and REC JOY lane toggles; Time Sig and Bars sliders
Lane undo
If you make a mistake on one lane, press its lit button again to clear only that lane. The other lanes keep playing. This non-destructive workflow lets you build loops layer by layer.

Loop Length & Subdivisions

Loop length is defined by two parameters working together:

A 4-bar loop in 4/4 is 16 beats. A 2-bar loop in 7/8 is 14 eighth-note beats. The looper quantises its length to the nearest bar boundary when DAW sync is active.

DAW Sync

When DAW sync is engaged (SYNC button in the Looper panel), the looper:

Stuck notes
If you stop the DAW mid-note, Arcade Chord Control sends all-notes-off on all voice channels to prevent hanging notes. If a note does hang in your instrument, use the MIDI Panic function in your DAW (typically under the MIDI menu or transport bar).

LFO + Looper Interaction

The LFO REC function (see Section 08) can capture a joystick movement curve and hand it to the looper's JOY lane. The two systems share timing: an LFO captured at "one loop cycle" length will loop perfectly in sync with the GATES or note lane.

Arpeggiator

The arpeggiator steps through the four chord voices in sequence, turning the held chord into a melodic pattern. The 8-step grid gives you rhythmic control over every beat of the pattern.

Enable & Basic Controls

Press ARP ON to enable the arpeggiator. While ARP is active, holding a chord (by clicking the pad or holding a TouchPlate) causes the four voices to fire in sequence rather than simultaneously.

ControlParameterOptions
RatearpSubdiv1/4, 1/8, 1/16, 1/32
OrderarpOrderUp, Down, Up-Down, Random
LENarpLength1–8 active steps
GatearpGateShort / Med / Long
RND SYNCrandomSyncModeFREE · INT · DAW

8-Step Pattern Grid

The grid shows 8 cells arranged in 2 rows × 4 columns. Each cell represents one step. Click a cell to cycle through its three states:

ON
Bright filled square.
The step fires normally — note-on at step start, note-off at step end.
TIE
Dim fill + horizontal bar.
The previous note is sustained through this step. No re-trigger, no gap.
OFF
Empty with border.
The step is silent. Any active note stops immediately.

Steps beyond the active LEN value are shown at 40% alpha — they are skipped during playback but retain their state for when LEN is increased again.

Arpeggiator panel with 8-step grid
Arpeggiator — 8-step grid (all ON here), with Rate, Order, and Length controls below

RND SYNC

Controls how the arpeggiator's timing clock source relates to the DAW:

Pattern ideas
Syncopation: Set step 1=ON, 2=TIE, 3=ON, 4=OFF, 5=ON, 6=TIE, 7=ON, 8=ON — the 3-beat tie creates a strong syncopation.

Ratchet: Set LEN=2 with both steps ON for a rapid two-note burst at 1/16, useful as a fill before a longer phrase.

Gamepad Arpeggiator Control

With a gamepad connected and Option mode set to ARP (mode 1), the D-pad controls arpeggiator parameters:

LFO Engine

Two independent LFOs (X and Y) modulate any CC destination at audio-rate precision. Each LFO has its own shape, rate, phase, level, and distribution — plus cross-modulation between them via the Sister system.

LFO Controls

ControlFunction
ONEnable/disable the LFO output. The oscilloscope continues to animate even when OFF.
ShapeWaveform: Sine, Sawtooth, Triangle, Square, Sample & Hold, Random Smooth
CC DestTarget CC number (see Section 10 for full list, or enter Custom CC 0–127)
SisterCross-modulation target (the other LFO's Freq, Phase, or Level)
RateOscillation speed. In SYNC mode, snaps to musical subdivisions. In free mode, Hz.
PhaseStart phase offset (0°–360°). Offset the two LFOs for quadrature or polyrhythmic shapes.
LevelOutput amplitude (0–127 CC range). Scales the CC swing.
DistDistribution — skews the waveform toward one extreme. At centre (0), symmetric. Positive values push toward max; negative toward min.
SYNCLocks LFO rate to DAW tempo grid (1/1 – 1/32, dotted and triplet options).
JOYJoystick-driven mode. The LFO's output is directly controlled by joystick position rather than the internal oscillator.
LFO X and LFO Y panels showing all controls
LFO X (left) with SYNC active, LFO Y (right) with ARM engaged — shape, CC dest, sister, rate, phase, level, dist sliders, and oscilloscope at bottom

CC Destinations

Both LFOs share the same destination list. The first 7 options are modulation targets within Arcade Chord Control itself. Options 8–25 are standard MIDI CCs sent directly to the filter MIDI channel.

Internal targets (0–6)

  • 0 — LFO-X Frequency
  • 1 — LFO-X Phase
  • 2 — LFO-X Level
  • 3 — Gate (velocity modulation)
  • 4 — LFO-Y Frequency (cross)
  • 5 — LFO-Y Phase (cross)
  • 6 — LFO-Y Level (cross)

MIDI CC targets (7–24)

  • CC1 Modulation, CC2, CC5 Portamento Time
  • CC7 Volume, CC10 Pan, CC11 Expression
  • CC12, CC16, CC17
  • CC71 Resonance, CC72 Release
  • CC73 Attack, CC74 Cutoff
  • CC75, CC76, CC77
  • CC91 Reverb, CC93 Chorus
  • + Custom CC (any 0–127)

Sister Cross-Modulation

Each LFO has a Sister target that routes its output to modulate a parameter of the other LFO:

An inline Sister attenuation slider (bipolar, −1 to +1) scales the cross-mod depth. Negative values invert the modulation direction. When Sister is set to "None", the slider is hidden and the combo expands to full width.

FM-style textures
Route LFO-Y Sister to LFO-X Freq at a high rate for frequency modulation between the two oscillators. The result is evolving, inharmonic CC movement that sounds organic and non-repeating.

REC — Joystick Capture

The REC button captures live joystick movement into the LFO:

  1. With the looper running and LFO armed, press REC
  2. Arcade Chord Control records exactly one full loop cycle from the press point
  3. The captured movement curve becomes the LFO waveform and loops in sync
  4. If the DAW transport stops mid-capture, the partial capture is kept

Press CLR to delete the captured curve and revert to the oscillator waveform.

Gamepad Control

Arcade Chord Control has native support for PlayStation-style controllers via SDL2. Connect your controller before opening the plugin — it is detected automatically at 60 Hz.

Button Map

L1 Trigger Root (Voice 1)
L2 Trigger Third (Voice 2)
R1 Trigger Fifth (Voice 3)
R2 Trigger Tension (Voice 4)
L3 Trigger all four voices simultaneously
Right Stick Joystick pad X/Y (pitch control)
Left Stick X Filter CC (CC74 cutoff by default)
Left Stick Y Filter CC (CC71 resonance by default)
OPTION Cycle mode (5 states, see below)
X Looper: start / stop playback
□ Square Looper: reset / stop + rewind
△ Triangle Looper: arm record
○ Circle Looper: delete / clear all lanes
D-pad Context-sensitive (see Option modes)
R3 MIDI Panic — all notes off

Option Mode Cycle

The OPTION button on the controller cycles through five modes. The current mode is shown in the plugin header bar:

ModeLabelColourD-pad function
0OPTION (dim)Octave Up/Down (V1), Interval Up/Down (V2)
1ARPCyanArp Order (Up/Down), Arp Rate (Left/Right)
2INTRVLMagentaInterval step Up/Down, Octave step Left/Right
3MINITealBPM Up/Down (same as mode 0 BPM path)
4MAXIAmberBPM Up/Down

Entering mode 3 shrinks the window to Mini (pad-only, current scale). Entering mode 4 expands to Maxi (pad fills display). Cycling back to mode 0 returns to Full view.

Left Stick Deadzone

The left stick has a configurable deadzone to prevent drift when the stick is at rest. The default deadzone is suitable for DualShock 4 and DualSense controllers. If your controller drifts at rest, this is a hardware issue — the deadzone absorbs small offsets up to ~8% of the axis range.

Live performance workflow
Use R2 (Tension) and L1 (Root) simultaneously to hold an open fifth, then slide the right stick Y axis slowly to walk up the scale degree by degree. The third and tension voices follow proportionally, creating smooth voice-led progressions. Add L2 (Third) at key moments for full four-voice chords.

Reference

Key APVTS Parameters

All parameters below are saved with DAW presets and project files.

ParameterRangeDefaultDescription
globalTranspose0–110 (C)Root key — C through B
scalePreset0–190 (Major)Active scale pattern
useCustomScaleboolfalseOverride preset with custom 12-note mask
joystickXAtten0–12764X-axis pitch range attenuation
joystickYAtten0–12764Y-axis pitch range attenuation
triggerSource0–30–200=Pad, 1=Joystick, 2=Random
voiceCh0–31–161–4MIDI channel per voice
slewVoice0–30–1270Portamento time per voice (CC5)
filterMidiCh1–161MIDI channel for filter CC output
filterXMode0–2416 (CC71)Left stick X destination
filterYMode0–2419 (CC74)Left stick Y destination
looperLength1–164Loop length in bars
looperSubdivenum4/43/4, 4/4, 5/4, 7/8, 9/8, 11/8
arpLength1–88Number of active steps
arpStepState0–70–20 (ON)Step state: 0=ON, 1=TIE, 2=OFF
randomDensity1–84Random hits per bar
randomSyncMode0–20 (FREE)0=FREE, 1=INT, 2=DAW

Filter CC Routing Index

When filterXMode or filterYMode is set to 7 or above, the value maps to these CC numbers:

IndexCCName
7CC1Modulation
8CC2Breath
9CC5Portamento Time
10CC7Volume
11CC10Pan
12CC11Expression
13CC12Effect 1
14CC16GP Controller 1
15CC17GP Controller 2
IndexCCName
16CC71Resonance
17CC72Release Time
18CC73Attack Time
19CC74Brightness / Cutoff
20CC75Decay Time
21CC76Vibrato Rate
22CC77Vibrato Depth
23CC91Reverb Send
24CC93Chorus Send

Indices 0–6 are internal LFO targets (see Section 08). Custom CC mode allows any value 0–127 outside this table.

Troubleshooting

ProblemSolution
Plugin not appearing in DAW Confirm the VST3 was installed to C:\Program Files\Common Files\VST3\. Trigger a full rescan in your DAW's plugin preferences. In Reaper, delete %APPDATA%\REAPER\reaper-vstplugins64.ini with Reaper closed, then restart.
No MIDI output / no sound Arcade Chord Control outputs MIDI only — it does not produce audio. Route its MIDI output to a synth or sampler track. In Ableton, set the MIDI track's "MIDI To" destination. In Reaper, enable MIDI track routing from this plugin to the instrument track.
Hanging notes / stuck notes Use MIDI Panic (R3 on gamepad, or your DAW's All Notes Off function). Known edge case: Single-Channel mode with multi-pad and rapid pitch changes. Workaround: use separate MIDI channels per voice (default config avoids this).
Gamepad not detected Connect the controller before launching the DAW. SDL2 initialises on plugin load. If hotplug fails, close the DAW, connect the controller, reopen. Confirm your controller is seen in Windows Game Controller settings (joy.cpl).
Left stick drifts / CC noise This is normal hardware behaviour — all analog sticks have a small offset at rest. The built-in deadzone absorbs typical drift. If drift is excessive, calibrate the controller in Windows settings, or increase the filter atten knobs to reduce CC output range.
Looper not syncing to DAW tempo Enable the SYNC button in the Looper panel. Confirm your DAW is sending transport/tempo information to plugins (check "Sync to external/plugin clock" in DAW settings). The looper starts recording on the next bar 1 after SYNC + REC are armed.
Chord name shows wrong root The smart chord display infers the root as the lowest active voice. If only the tension voice is triggered, the display may show an unexpected inversion. Trigger multiple voices (L1 + R1 minimum) for reliable chord name inference.
Window won't resize past 1.0× The maximum scale is capped at 1.0× (100%). Dragging beyond this is intentionally blocked — upscaling the JUCE UI produces blurring. Use Maxi mode (⛶ button) for a full-screen pad view instead.
Installer requires admin rights Installation to C:\Program Files\Common Files\VST3\ requires administrator privileges. Right-click the installer and choose "Run as administrator". This is normal for all system-wide VST3 installs.

Support

For support, feature requests, or bug reports:


Version History

VersionHighlights
v1.9Resizable UI, Mini/Maxi modes, Living Space starfield, Smart Chord Display, Pitch Axis Crosshair, 8-step arpeggiator grid, Sister LFO cross-modulation, 18-CC routing, custom CC, velocity-sensitive knobs
v1.8Instrument type conversion (works on instrument tracks in Ableton), LFO rec bugs fixed, chord display improvements, LFO panel bounds fix
v1.7Sister LFO, filter CC atten knob live update, 6-bug fix session
v1.5–1.6Initial public releases, MIDI effect architecture, looper engine, gamepad support

Arcade Chord Control is developed by Dimea Arcade.
JUCE framework © Raw Material Software. SDL2 © Sam Lantinga. All rights reserved.
Manual v1.9 · 2026