Maker.io main logo

Arcade Synth Controller

45

2022-09-15 | By Adafruit Industries

License: See Original Project

Courtesy of Adafruit

Guide by John Park

Overview

Build your own arpeggiator synthesizer/MIDI controller in the form of ‎a fight stick/piano keyboard mashup! It's perfect for chiptunes. You'll ‎use LED Arcade 1x4 boards, MIDI FeatherWing, Feather M4 Express, ‎and lots of shiny buttons to build this retro-style synth.‎

controller_1

 

Play root notes with the light-up arcade buttons, adjust tempo and ‎octave with the joystick, and use the front-panel function buttons to ‎start/stop the arps, adjust arp range, and to select different patterns.‎

Output square wave synth sounds over stereo headphone jack, ‎and/or send MIDI over USB or classic DIN-5 MIDI cable to your ‎software and hardware synthesizers.‎

This project is inspired directly by the amazing Pianocade.‎

On-board synthesis using Audio Library:‎

 

Arcade Synth Controller controlling Game Boy via MIDI:‎

 

Parts

Optional

You can use two or three sets of aluminum bumper feet for the base ‎if you're feeling highly extra!‎

Enclosure Materials

To build the enclosure you'll need 3mm thick (~1/8") acrylic stock in ‎gray, black, and white:‎

  • ‎2x sheets of matte gray 1/8" x 12"x24"
  • ‎1x sheet of frosted black 1/8" x 12"x24"‎
  • ‎1x sheet of translucent white 1/8" x 12"x24"‎

You'll use M4 screws and nuts to secure the case, as well as the ‎joystick:‎

  • M4 x 0.7mm nuts
  • M4 x 80mm socket head screws
  • M4 x 14mm socket head screws

Code the Arcade Synth

Easy Code Upload

You can get the code onto your Feather M4 Express as easy as drag-‎and-drop! Simply plug in the Feather to your computer with a known ‎good USB data cable (not power only!) and then double-click the ‎reset button.‎

The board will show up on your computer as a USB drive ‎named FEATHERBOOT. Download ‎the Arcade_Synth_Controller.UF2 file linked below and then drag it ‎onto the FEATHERBOOT drive.‎

The board will automatically reset and run the code.‎

Arcade_Synth_Controller.UF2

Source Code Hacking

If you want to dig in deeper, you can download the source code here. ‎This will require some knowledge of the Arduino IDE and how to ‎upload code to your board.‎

‎Download Project Bundle‎

Copy Code
// SPDX-FileCopyrightText: 2022 John Park and Tod Kurt for Adafruit Industries
//
// SPDX-License-Identifier: MIT

// Arcade Synth Controller II: Son of Pianocade -- The Enriffening
// written by John Park and Tod Kurt
// Synthesizer/MIDI arpeggiator for with multiple LED Arcade boards & joystick input

// Arpy library: https://github.com/todbot/mozzi_experiments/blob/main/eighties_arp/Arpy.h
// midi_to_freq and ADT patch: https://github.com/todbot/tal_experiments/tree/main/arpy_test

// - to do: when arp is off it acts as a normal keyboard.

#include <Arduino.h>
#include <Adafruit_TinyUSB.h>
#include <MIDI.h>
#include <Audio.h>
#include <Bounce2.h>
#include "Adafruit_seesaw.h"

#include "ADT.h"
#include "midi_to_freq.h"
#include "Arpy.h"

// ----- LED Arcade 1x4 STEMMA QT board pins-----
// pin definitions on each LED Arcade 1x4
#define SWITCH1 18 // PA01
#define SWITCH2 19 // PA02
#define SWITCH3 20 // PA03
#define SWITCH4 2 // PA04
#define PWM1 12 // PC00
#define PWM2 13 // PC01
#define PWM3 0 // PA04
#define PWM4 1 // PA05

#define I2C_BASE_ADDR 0x3A // boards are in order, 0x3A, 0x3B, 0x3C, 0x3D
#define NUM_BOARDS 4

Adafruit_seesaw ledArcades[ NUM_BOARDS ];

//----- board variables
int boardNum = 0; //used to read each board
int switchNum = 0; //used to read each switch
int boardSwitchNum = 0; //unique button ID accross all boards/buttons
int led_low = 10; //min pwm brightness
int led_med = 60;
int led_high = 220; // max brightness

bool lastButtonState[16] ;
bool currentButtonState[16] ;

//-----joystick pins-----
const int joyDownPin = 11; //down
const int joyUpPin = 12; // up
const int joyLeftPin = 9; // left
const int joyRightPin = 10; //right
const int joyGroundPin = 6; //"fake" ground pin

//-----joystick debouncer
Bounce joyDown = Bounce();
Bounce joyUp = Bounce();
Bounce joyLeft = Bounce();
Bounce joyRight = Bounce();


//-----MIDI instances-----
Adafruit_USBD_MIDI usb_midi;
MIDI_CREATE_INSTANCE(Adafruit_USBD_MIDI, usb_midi, MIDIusb); // USB MIDI
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDIclassic); // classic midi over RX/TX

//-----Audio Library Syth parameters
#define NUM_VOICES 4

AudioSynthWaveform *waves[] = {
&wave0, &wave1, &wave2, &wave3
};

int filterf_max = 6000;
int filterf = filterf_max;

uint32_t lastControlMillis=0;

uint8_t arp_octaves = 1;
uint8_t root_note = 0;

//----- create arpy arpeggiator
Arpy arp = Arpy();

int bpm = 160;
int octave_offset = 3; // initially starts on MIDI note 36 with the offset of 3 octaves from zero
bool arp_on_off_state;

void setup() {
Wire.setClock(400000);
//----- MIDI and Serial setup-----
//
MIDIusb.begin(MIDI_CHANNEL_OMNI);
MIDIclassic.begin(MIDI_CHANNEL_OMNI);
Serial.begin(115200);
MIDIusb.turnThruOff();
delay(2000); // it's hard getting started in the morning
Serial.println("[.::.:::.] Welcome to Arcade Synth Controller II: Son of Pianocade -- The Enriffening [.::.:::.]");
Serial.println("MIDI USB/Classic and Serial have begun");
//----- end MIDI and Serial setup-----

//----- joystick pins setup-----
//
pinMode( joyDownPin, INPUT);
pinMode( joyUpPin, INPUT);
pinMode( joyLeftPin, INPUT);
pinMode( joyRightPin, INPUT);
pinMode( joyGroundPin, OUTPUT);

joyDown.attach( joyDownPin, INPUT_PULLUP);
joyUp.attach( joyUpPin, INPUT_PULLUP);
joyLeft.attach( joyLeftPin, INPUT_PULLUP);
joyRight.attach( joyRightPin, INPUT_PULLUP);
digitalWrite(joyGroundPin, LOW);
//----- end joystick pins setup-----

//----- LED Arcade 1x4 setup-----
//
for ( int i = 0; i < NUM_BOARDS; i++ ) {
if ( !ledArcades[i].begin( I2C_BASE_ADDR + i ) ) {
Serial.println(F("LED Arcade not found!"));
while (1) delay(10);
}
}
Serial.println(F("LED Arcade boards started"));

for ( int i = 0; i < NUM_BOARDS; i++ ) {
ledArcades[i].pinMode(SWITCH1, INPUT_PULLUP);
ledArcades[i].pinMode(SWITCH2, INPUT_PULLUP);
ledArcades[i].pinMode(SWITCH3, INPUT_PULLUP);
ledArcades[i].pinMode(SWITCH4, INPUT_PULLUP);
ledArcades[i].analogWrite(PWM1, led_low);
ledArcades[i].analogWrite(PWM2, led_low);
ledArcades[i].analogWrite(PWM3, led_low);
ledArcades[i].analogWrite(PWM4, led_low);
}
// brighten default root note
ledArcades[0].analogWrite(PWM1, led_high);
// turn down brightness of the function buttons
ledArcades[3].analogWrite(PWM2, 0);
ledArcades[3].analogWrite(PWM3, led_low);
ledArcades[3].analogWrite(PWM4, led_low);
//----- end LED Arcade 1x4 setup-----


//-----Arpy setup-----
//
arp.setNoteOnHandler(noteOn);
arp.setNoteOffHandler(noteOff);
arp.setRootNote( root_note );
arp.setOctaveOffset(octave_offset);
arp.setBPM( bpm );
arp.setGateTime( 0.75 ); // percentage of bpm
arp.off();

//----- Audio Library Synth setup-----
// (patch is saved in ADT.h file)
AudioMemory(120);

filter0.frequency(filterf_max);
filter0.resonance(0.5);

env0.attack(10);
env0.hold(2);
env0.decay(100);
env0.sustain(0.5);
env0.release(100);

// Initialize processor and memory measurements
AudioProcessorUsageMaxReset();
AudioMemoryUsageMaxReset();

Serial.println("Arpy setup done");

} // end setup()


int waveform = WAVEFORM_SQUARE;


void noteOn(uint8_t note) {
waves[0]->begin( 0.9, tune_frequencies2_PGM[note], waveform);
waves[1]->begin( 0.9, tune_frequencies2_PGM[note] * 1.01, waveform); // detune
waves[2]->begin( 0.9, tune_frequencies2_PGM[note] * 1.005, waveform); // detune
waves[3]->begin( 0.9, tune_frequencies2_PGM[note] * 1.025, waveform); // detune
filterf = filterf_max;
filter0.frequency(filterf);
env0.noteOn();
MIDIusb.sendNoteOn(note, 127, 1);
MIDIclassic.sendNoteOn(note, 127, 1);
}


void noteOff(uint8_t note) {
env0.noteOff();
MIDIusb.sendNoteOn(note, 0, 1);
MIDIclassic.sendNoteOn(note, 0, 1);
}

void midiPanic(){
for( uint8_t m = 0; m < 128; m++ ){
MIDIusb.sendNoteOn(m, 0, 1) ;
MIDIclassic.sendNoteOn(m, 0, 1) ;
yield(); // keep usb midi from flooding
}
}

void lightLED(uint8_t buttonLED) {
uint8_t pwms[4] = {PWM1, PWM2, PWM3, PWM4};
boardNum = map(buttonLED, 0, 12, 0, 3);
// first dim all buttons on first three boards
for( int b = 0; b < 3; b++) {
for( int p = 0; p < 4; p ++) {
ledArcades[b].analogWrite(pwms[p], led_low);
}
}
// dim first button on fourth board (the other two are function buttons)
ledArcades[3].analogWrite(PWM1, led_low);
// then brighten the selected one
ledArcades[boardNum].analogWrite(pwms[buttonLED % 4], led_high);
}


#define SWITCHMASK ((1 << SWITCH1) | (1 << SWITCH2) | (1 << SWITCH3) | (1 << SWITCH4))

void arcadeButtonCheck() {
for ( boardNum = 0; boardNum < NUM_BOARDS; boardNum++) { // check all boards, all switches
int pos = boardNum*4;
uint32_t switches = ledArcades[boardNum].digitalReadBulk(SWITCHMASK);
currentButtonState[pos+0] = ! (switches & (1<<SWITCH1));
currentButtonState[pos+1] = ! (switches & (1<<SWITCH2));
currentButtonState[pos+2] = ! (switches & (1<<SWITCH3));
currentButtonState[pos+3] = ! (switches & (1<<SWITCH4));
}
for( int i = 0; i < 4*NUM_BOARDS; i++ ) {
bool state = currentButtonState[i];
if(state != lastButtonState[i]) {

if( state == HIGH ) { //pressed
// ---button functions---
// --root notes--
if (i < 13){ // these are the piano keys for picking root notes
root_note = 0 + i ; // MIDI note
lightLED(i);
}


//-- start/stop toggle button--
if (i == 13) { // arp pattern button on front panel
if( !arp_on_off_state) {
arp.on();
ledArcades[3].analogWrite(PWM2, led_med);
arp_on_off_state = true;
}
else {
arp.off();
midiPanic(); // just to be on the safe side...
ledArcades[3].analogWrite(PWM2, 0);
arp_on_off_state = false;
}
}
//-- arp octave range button--
if (i == 14) { // arp range button on front panel
ledArcades[3].analogWrite(PWM3, led_high);
arp_octaves = arp_octaves + 1; if( arp_octaves==4) { arp_octaves=1; }
arp.setTransposeSteps( arp_octaves );
//Serial.printf("arp steps:%d\n",arp_octaves);
ledArcades[3].analogWrite(PWM3, led_low);
}
//-- pattern button--
if (i == 15) { // arp pattern button on front panel
ledArcades[3].analogWrite(PWM4, led_high);
arp.nextArpId();
ledArcades[3].analogWrite(PWM4, led_low);
}
}
}
}
for( int i=0; i<4*NUM_BOARDS; i++ ) {
lastButtonState[i] = currentButtonState[i];
}
}
//----- end arcade button check


void loop(){
arcadeButtonCheck(); // see if any buttons are pressed, send notes or adjust parameters

joyDown.update();
joyUp.update();
joyLeft.update();
joyRight.update();

if ( joyUp.fell() ) { // read a joystick single tap
ledArcades[3].analogWrite(PWM3, led_high); // feedback on front panel button
octave_offset = octave_offset + 1; if( octave_offset>7) { octave_offset=7; }
arp.setOctaveOffset(octave_offset);
ledArcades[3].analogWrite(PWM3, led_low);
}

if ( joyDown.fell() ) {
ledArcades[3].analogWrite(PWM3, led_high); // feedback on front panel button
octave_offset = octave_offset - 1; if( octave_offset<0) { octave_offset=0; }
arp.setOctaveOffset(octave_offset);
ledArcades[3].analogWrite(PWM3, led_low);
}

int joyLeftVal = joyLeft.read(); // read a held joystick (autorepeat) instead of single tap
if( joyLeftVal == LOW ) {
bpm = bpm - 1; if(bpm < 100) { bpm = 100; }
ledArcades[3].analogWrite(PWM4, led_high);
arp.setBPM( bpm );
ledArcades[3].analogWrite(PWM4, led_low);
}

int joyRightVal = joyRight.read(); // for a held joystick instead of single tap
if( joyRightVal == LOW ) {
bpm = bpm + 1; if(bpm > 3000) { bpm = 3000; }
ledArcades[3].analogWrite(PWM4, led_high);
arp.setBPM( bpm );
ledArcades[3].analogWrite(PWM4, led_low);
}

arp.update(root_note); //

if( millis() - lastControlMillis > 20 ) {
lastControlMillis = millis();
}
}
//end loop()

View on GitHub

MIDI

The Arcade_Synth_Controller.ino code plays notes via the Audio ‎Library synthesizer, as well as sending out MIDI via USB and Classic ‎DIN-5 connection. To adjust which channels are used, change ‎the MIDIusb.sendNoteOn or Off lines here from channel 1 to whichever you ‎need.‎

‎Download File‎

Copy Code
void noteOn(uint8_t note) {
waves[0]->begin( 0.9, tune_frequencies2_PGM[note], waveform);
waves[1]->begin( 0.9, tune_frequencies2_PGM[note] * 1.01, waveform); // detune
waves[2]->begin( 0.9, tune_frequencies2_PGM[note] * 1.005, waveform); // detune
waves[3]->begin( 0.9, tune_frequencies2_PGM[note] * 1.025, waveform); // detune
filterf = filterf_max;
filter0.frequency(filterf);
env0.noteOn();
MIDIusb.sendNoteOn(note, 127, 1);
MIDIclassic.sendNoteOn(note, 127, 1);
}


void noteOff(uint8_t note) {
env0.noteOff();
MIDIusb.sendNoteOn(note, 0, 1);
MIDIclassic.sendNoteOn(note, 0, 1);
}

void midiPanic(){
for( uint8_t m = 0; m < 128; m++ ){
MIDIusb.sendNoteOn(m, 0, 1) ;
MIDIclassic.sendNoteOn(m, 0, 1) ;
yield(); // keep usb midi from flooding
}
}

Arpeggios

The Arpy.h class, design by awesome guy Tod Kurt, handles the playing ‎of arpeggio patterns based on the root note played on the keyboard.‎

You may want to edit the existing patterns or create your own. This is ‎where to make those changes in the Arpy.h code:‎

Download File‎

Copy Code
int8_t arps[arp_count][arp_len] = {
{0, 4, 7, 12}, // major
{0, 3, 7, 10}, // minor 7th
{0, 3, 6, 3}, // Diminished
{0, 5, 7, 12}, // Suspended 4th
{0, 12, 0, -12}, // octaves
{0, 12, 24, -12}, // octaves 2
{0, -12, -12, 0}, // octaves 3 (bass)
{0, 0, 0, 0}, // root
};

Synthesizer Design

The Audio System Design Tool can be used to design your synth ‎modules and patch connections. In the example used here, the ‎patch is contained in the ADT.h file.‎

‎Download File‎

Copy Code
AudioSynthWaveform       wave0;          //xy=502.74795150756836,82.7552137374878
AudioSynthWaveform wave1; //xy=504.28649139404297,117.86524295806885
AudioSynthWaveform wave2; //xy=503.2865982055664,153.0081024169922
AudioSynthWaveform wave3; //xy=502.8580284118653,188.86524295806885
AudioMixer4 mixer0; //xy=633.7151184082031,100.00811004638672
AudioEffectEnvelope env0; //xy=758.612813949585,54.04482841491699
AudioFilterStateVariable filter0; //xy=888.6010780334473,60.850419998168945
AudioMixer4 mixerA; //xy=1010.7359161376953,171.30673599243164
AudioMixer4 mixerL; //xy=1196.8192749023438,210.86235809326172
AudioMixer4 mixerR; //xy=1198.2637329101562,277.8345947265625
AudioOutputAnalogStereo audioOut; //xy=1360.3193969726562,250.61236572265625
AudioConnection patchCord1(wave0, 0, mixer0, 0);
AudioConnection patchCord2(wave3, 0, mixer0, 3);
AudioConnection patchCord3(wave2, 0, mixer0, 2);
AudioConnection patchCord4(wave1, 0, mixer0, 1);
AudioConnection patchCord5(mixer0, env0);
AudioConnection patchCord6(env0, 0, filter0, 0);
AudioConnection patchCord7(filter0, 0, mixerA, 0);
AudioConnection patchCord8(mixerA, 0, mixerL, 0);
AudioConnection patchCord9(mixerA, 0, mixerR, 0);
AudioConnection patchCord10(mixerL, 0, audioOut, 0);
AudioConnection patchCord11(mixerR, 0, audioOut, 1);

design_2

Build the Arcade Synth Circuit

circuit_3

The Circuit

The Proto Board

The FeatherWing Proto board is great for adding on a small audio ‎output circuit, as well as connections for the STEMMA QT ports over ‎I2C, joystick wiring, and the reset and enable switches.‎

The schematic below shows these connections as they relate to the ‎Feather board, but you'll make them on the Proto board and rely on ‎the FeatherWing Tripler to connect those points to the Feather.‎

connections_4

schematic_5

The Proto Board

Following the schematic above, as well as these photos, solder the ‎parts in place for the:‎

  • audio output RC circuit (resistor capacitor circuit for removing ‎noise from the audio)
  • joystick wiring (note the use of pin D6 as common joystick ‎switch ground)
  • headers for the enable and reset switches
  • STEMMA QT/Qwiic connector to SDA, SCL, 3v3, and GND.‎

proto_6

proto_7

The Feather Tripler

Add headers and M2.5 nylon standoffs to the Feather Tripler as ‎shown here.‎

Insert the MIDI FeatherWing (with either DIN-5 or TRS plugs on it, ‎your choice) to the Tripler, followed by the Proto FeatherWing and ‎the Feather M4 Express.‎

Fasten the boards to the Tripler standoffs so they don't wiggle ‎around when inserting cables later.‎

fasten_8

fasten_9

fasten_10

fasten_11

fasten_12

fasten_13

fasten_14

fasten_15

LED Arcade Button STEMMA QT Boards

To use the four LED Arcade Button boards on I2C they must each ‎have a unique address.‎

You will cut the traces on three of the boards to set them.‎

Set them to:

  • ‎0x3A (default, don't cut any traces)
  • ‎0x3B -- cut trace A0
  • ‎0x3C -- cut trace A1
  • ‎0x3D -- cut traces A0 and A1‎

Then, wire them to each other in order from left to right using ‎‎100mm STEMMA QT cables.‎

board_16

board_17

Arcade Button Wiring

Plug two sets of quick connect cables into each arcade button -- one ‎for the switch, the other pair for the LED.‎

The polarity doesn't matter for the switch tabs (these are the ones ‎protruding from the gray plastic switch base); however, you must ‎connect the - and + properly for the LED to work. These are marked ‎both on the Arcade Button board LED ports and on the molding of ‎the switch base.‎

To avoid confusion, I marked these wires in advance using heat ‎shrink tubing. I also used heat shrink to order each set of four ‎buttons yellow, red, green, blue, as shown here. This type of ‎organization helps immensely with wiring things properly and later ‎troubleshooting!‎

wire_18

wire_19

wire_20

wire_21

Reset and Enable Button Wiring

I decided not to wire the LEDs of these switches, instead wiring only ‎the switches. Polarity doesn't matter.‎

Remember, the yellow momentary switch will be plugged into the ‎Feather's Reset pin, and the green toggle switch into Enable.‎

reset_22

reset_23

Build the Arcade Enclosure

enclose_24

The Enclosure

The Arcade Synth Controller enclosure is designed to be laser cut ‎from 3mm thick acrylic. The .svg file below can be used on a laser ‎cutter or sent to a service provider for cutting.‎

Arcade_Synth_case.svg

case_25

Enclosure Parts

Cut the parts from 3mm (~1/8") acrylic as shown. Finished surface ‎side of material is place facing upwards for cutting.‎

parts_26

parts_27

parts_28

parts_29

Affix the Arcade Boards

Use M2.5 nylon standoffs, screws, and nuts to affix the Arcade Button ‎boards to the base plate. The first board (address 0x3A) is on the left.‎

Note the orientation of the board so that everything else lines up ‎later.‎

affix_31

affix_30

affix_32

affix_33

affix_34

Affix the Tripler

Use the standoffs and nuts to attach the Tripler as shown. Connect ‎the STEMMA QT cable port to the Arcade Button Boards.‎

attach_35

attach_36

attach_37

attach_38

attach_39

Rear Panel Buttons

Making sure the finish side of the back panel is facing out (so the ‎MIDI out ports align with the holes properly) feed the reset and ‎enable buttons into their holes, then thread on their retaining rings.‎

Plug the switches into their respective ports on the Feather Proto ‎board.‎

Place the back panel notches into the base.‎

rear_40

rear_41

rear_42

rear_43

rear_44

rear_45

rear_46

Side Panels

Place the side panel notches into the base.‎

side_47

side_48

Front Panel Buttons   

With the finish side facing out, feed the three front panel arcade ‎buttons into their holes as shown.‎

Thread on their retaining rings, then plug them into the fourth LED ‎Arcade Button breakout board. Double-check that you've plugged in ‎the LED cables and switch cables into their proper respective ports.‎

buttons_50

buttons_49

buttons_51

buttons_52

buttons_53

Top Layers Buttons

Sandwich the top panels together (NOTE: only the lower of the two ‎has finger joint notches), then feed in the buttons, minding ‎their yellow, red, green, blue ordering.‎

Thread on their retaining rings.‎

top_54

top_55

top_56

top_57

top_58

 

Joystick Attach

Unscrew the joystick topper and set it aside. It looks like an ‎everlasting gobstopper, but don't eat it. It will last forever. And taste ‎pretty bland.‎

With the interface pins facing inward toward the center of the ‎controller (it won't fit otherwise!) feed the joystick stem up through ‎the top panels, then screw them into place with the four M4 x 40mm ‎screws and nuts.‎

Plug in the joystick wiring harness.‎

joy_59

joy_60

joy_61

joy_62

Plug in the Buttons‎

‎It's a plugging party!‎

Plug all of the remaining arcade buttons, following left-to-right order, ‎into the LED Arcade Button breakout boards.‎

plug_63

plug_64

plug_65

plug_66

TEST: This is an excellent time to test that everything is working ‎before you close things up!‎

test_67

Close the Case

Carefully close the case top, aligning the finger joint tabs and slots.‎

Fasten the six M4 x 80mm screws through the holes, using nuts to ‎secure them at the bottom.‎

close_68

close_69

close_70

close_71

Joystick Washer and Ball

Replace the joystick's disk and ball topper.‎

stick_72

stick_73

Feet

You can use large rubber bumper feet to prevent the exposed ‎screws from marring your desk or get extra fancy and use four or ‎even six M4 threaded keyboard feet as shown here.‎

feet_74

feet_75

Play the Arcade Synth Controller

play_76

Plug in a micro-USB cable to the Feather and plug the other end into ‎your computer (particularly for USB MIDI usage) or a USB power ‎supply.‎

For audio out, plug in a stereo 3.5mm TRS cable into the jack on the ‎Protoboard -- plug the other end into your amplifier, powered ‎speakers, or audio interface.‎

Optionally, if you're sending out classic MIDI signals, plug a MIDI ‎cable into the MIDI out, which is the MIDI port closest to the reset ‎button.‎

Power on the Arcade Synth Controller by pressing the green switch ‎after a moment the buttons will light up and you're ready to play.‎

 

Start the arpeggiator by pressing the white button on the left on the ‎front of the controller -- this button is unlit when the arps are ‎stopped and lit up when they're playing.‎

You will hear the synth playing a C major arpeggio, as the first ‎keyboard button on the controller is lit by default. Success!‎

Here are the other controls to try:‎

  • pick a different root note by pressing any red keyboard button. ‎The root note will light up brighter than the others
  • speed up or slow down the tempo with the joystick right/left
  • increase or decrease the octave offset with the joystick ‎up/down
  • expand the arpeggio range from one, two, or three octaves of ‎the pattern with the white middle button on the front panel
  • cycle among eight different built-in arp patterns with the white ‎right button on the front panel
Mfr Part # 3857
FEATHER M4 EXPRESS ATSAMD51J19
Adafruit Industries LLC
$188.92
View More Details
Mfr Part # 5296
STEMMA QT LED ARCADE BUTTON 1X4
Adafruit Industries LLC
Mfr Part # 4740
ADAFRUIT MIDI FEATHERWING KIT
Adafruit Industries LLC
Mfr Part # 3489
SWITCH PUSH SPST-NO RED 10MA 5V
Adafruit Industries LLC
Mfr Part # 3491
SWITCH PUSH SPST-NO WHT 10MA 5V
Adafruit Industries LLC
Mfr Part # 3417
FEATHERWING TRIPLER PROTO BOARD
Adafruit Industries LLC
Mfr Part # 2884
FEATHERWING PROTO - PROTOTYPING
Adafruit Industries LLC
Mfr Part # 4210
JST SH 4-PIN CABLE - QWIIC COMPA
Adafruit Industries LLC
Add all DigiKey Parts to Cart
Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.