Everything you need to play chords with a joystick — from first note to deep modulation.
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.The interface is divided into functional zones. Understanding the layout makes navigation intuitive.
Arcade Chord Control has three window sizes, accessible from the header bar buttons or via gamepad.
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.
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.
Each position on the pad simultaneously determines the pitch of all four voices. The two axes control independent voice pairs:
| Axis | Voices | What changes | Direction |
|---|---|---|---|
| Y (vertical) | Root (V1) + Third (V2) | Scale degree — which note in the key | Up = higher pitch |
| X (horizontal) | Fifth (V3) + Tension (V4) | Chord colour — interval quality | Right = 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).
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.
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.
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.
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.
The pad background is a living space scene that responds to joystick movement:
Arcade Chord Control outputs four independent MIDI voices. Each has a name, a role in the chord, and its own trigger source:
| Voice | Name | Chord role | Default MIDI Ch |
|---|---|---|---|
| V1 | Root | Tonic — sets the key centre | 1 |
| V2 | Third | Colour — major vs. minor quality | 2 |
| V3 | Fifth | Body — harmonic stability | 3 |
| V4 | Tension | Flavour — extensions and alterations | 4 |
MIDI channels are configurable per voice via voiceCh0–voiceCh3 (1–16). Route each voice to a different instrument, or all four to the same channel for a traditional polyphonic setup.
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 triggerSource0–triggerSource3:
| Source | Behaviour |
|---|---|
| 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. |
When a voice is set to Random mode, its trigger timing is determined by:
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.
The Scale system is the harmonic foundation. It determines which notes the joystick lands on and what chord names are displayed.
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.
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 |
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.
Beyond the scale, each voice has a semitone offset applied on top of the quantised pitch:
| Parameter | Voice | Range | Effect |
|---|---|---|---|
| thirdInterval | V2 Third | 0–11 semitones | Distance from root before Y-axis displacement |
| fifthInterval | V3 Fifth | 0–11 semitones | Distance from root before X-axis displacement |
| tensionInterval | V4 Tension | 0–11 semitones | Distance 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.
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.
The chord name shown below the pad is computed in real time from the active pitches. The algorithm:
The display holds the last chord name during silence — so you always see the last chord you played, even when no notes are sounding.
The built-in looper records your MIDI performance and plays it back in a seamless loop — locked to the DAW transport or free-running.
The Looper panel has four record lanes and transport controls:
| Button | Function |
|---|---|
| REC | Arms recording. On the next bar boundary (DAW sync) or immediately (free), begins capturing all MIDI output. |
| PLAY | Starts looped playback. If nothing is recorded, PLAY arms for the next REC cycle. |
| GATES | Records 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. |
| JOY | Records continuous joystick X/Y position. Replays the movement curve, allowing the looper to "steer" the joystick for you. |
| CLR | Clears the corresponding lane. Press a lit REC/GATES/JOY button again to clear just that lane without stopping others. |
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.
When DAW sync is engaged (SYNC button in the Looper panel), the looper:
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.
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.
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.
| Control | Parameter | Options |
|---|---|---|
| Rate | arpSubdiv | 1/4, 1/8, 1/16, 1/32 |
| Order | arpOrder | Up, Down, Up-Down, Random |
| LEN | arpLength | 1–8 active steps |
| Gate | arpGate | Short / Med / Long |
| RND SYNC | randomSyncMode | FREE · INT · DAW |
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:
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.
Controls how the arpeggiator's timing clock source relates to the DAW:
With a gamepad connected and Option mode set to ARP (mode 1), the D-pad controls arpeggiator parameters:
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.
| Control | Function |
|---|---|
| ON | Enable/disable the LFO output. The oscilloscope continues to animate even when OFF. |
| Shape | Waveform: Sine, Sawtooth, Triangle, Square, Sample & Hold, Random Smooth |
| CC Dest | Target CC number (see Section 10 for full list, or enter Custom CC 0–127) |
| Sister | Cross-modulation target (the other LFO's Freq, Phase, or Level) |
| Rate | Oscillation speed. In SYNC mode, snaps to musical subdivisions. In free mode, Hz. |
| Phase | Start phase offset (0°–360°). Offset the two LFOs for quadrature or polyrhythmic shapes. |
| Level | Output amplitude (0–127 CC range). Scales the CC swing. |
| Dist | Distribution — skews the waveform toward one extreme. At centre (0), symmetric. Positive values push toward max; negative toward min. |
| SYNC | Locks LFO rate to DAW tempo grid (1/1 – 1/32, dotted and triplet options). |
| JOY | Joystick-driven mode. The LFO's output is directly controlled by joystick position rather than the internal oscillator. |
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.
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.
The REC button captures live joystick movement into the LFO:
Press CLR to delete the captured curve and revert to the oscillator waveform.
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.
The OPTION button on the controller cycles through five modes. The current mode is shown in the plugin header bar:
| Mode | Label | Colour | D-pad function |
|---|---|---|---|
| 0 | OPTION (dim) | — | Octave Up/Down (V1), Interval Up/Down (V2) |
| 1 | ARP | Cyan | Arp Order (Up/Down), Arp Rate (Left/Right) |
| 2 | INTRVL | Magenta | Interval step Up/Down, Octave step Left/Right |
| 3 | MINI | Teal | BPM Up/Down (same as mode 0 BPM path) |
| 4 | MAXI | Amber | BPM 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.
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.
All parameters below are saved with DAW presets and project files.
| Parameter | Range | Default | Description |
|---|---|---|---|
| globalTranspose | 0–11 | 0 (C) | Root key — C through B |
| scalePreset | 0–19 | 0 (Major) | Active scale pattern |
| useCustomScale | bool | false | Override preset with custom 12-note mask |
| joystickXAtten | 0–127 | 64 | X-axis pitch range attenuation |
| joystickYAtten | 0–127 | 64 | Y-axis pitch range attenuation |
| triggerSource0–3 | 0–2 | 0 | 0=Pad, 1=Joystick, 2=Random |
| voiceCh0–3 | 1–16 | 1–4 | MIDI channel per voice |
| slewVoice0–3 | 0–127 | 0 | Portamento time per voice (CC5) |
| filterMidiCh | 1–16 | 1 | MIDI channel for filter CC output |
| filterXMode | 0–24 | 16 (CC71) | Left stick X destination |
| filterYMode | 0–24 | 19 (CC74) | Left stick Y destination |
| looperLength | 1–16 | 4 | Loop length in bars |
| looperSubdiv | enum | 4/4 | 3/4, 4/4, 5/4, 7/8, 9/8, 11/8 |
| arpLength | 1–8 | 8 | Number of active steps |
| arpStepState0–7 | 0–2 | 0 (ON) | Step state: 0=ON, 1=TIE, 2=OFF |
| randomDensity | 1–8 | 4 | Random hits per bar |
| randomSyncMode | 0–2 | 0 (FREE) | 0=FREE, 1=INT, 2=DAW |
When filterXMode or filterYMode is set to 7 or above, the value maps to these CC numbers:
| Index | CC | Name |
|---|---|---|
| 7 | CC1 | Modulation |
| 8 | CC2 | Breath |
| 9 | CC5 | Portamento Time |
| 10 | CC7 | Volume |
| 11 | CC10 | Pan |
| 12 | CC11 | Expression |
| 13 | CC12 | Effect 1 |
| 14 | CC16 | GP Controller 1 |
| 15 | CC17 | GP Controller 2 |
| Index | CC | Name |
|---|---|---|
| 16 | CC71 | Resonance |
| 17 | CC72 | Release Time |
| 18 | CC73 | Attack Time |
| 19 | CC74 | Brightness / Cutoff |
| 20 | CC75 | Decay Time |
| 21 | CC76 | Vibrato Rate |
| 22 | CC77 | Vibrato Depth |
| 23 | CC91 | Reverb Send |
| 24 | CC93 | Chorus Send |
Indices 0–6 are internal LFO targets (see Section 08). Custom CC mode allows any value 0–127 outside this table.
| Problem | Solution |
|---|---|
| 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. |
For support, feature requests, or bug reports:
| Version | Highlights |
|---|---|
| v1.9 | Resizable 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.8 | Instrument type conversion (works on instrument tracks in Ableton), LFO rec bugs fixed, chord display improvements, LFO panel bounds fix |
| v1.7 | Sister LFO, filter CC atten knob live update, 6-bug fix session |
| v1.5–1.6 | Initial 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