Maker.io main logo

Arcade Synth Controller

177

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
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.