So, this is a simple controller for a Digi Whammy.
The ones with MIDI have reasonable direct PC-message calls for presets, but NOT great increment/decrement controls.. so that is what this does.
The build is straightforward, and cost maybe $20. I built i on a NANO EVERY.. but that board is a little big for this case. I wish I had used a Pro Micro.
| NANO EVERY | $11.00 | ||||
| Enclosure | 1590A | $4.99 | |||
| Switches | 2 | x | $2.09 | is | $4.18 |
| LED | 1 | x | $1.15 | is | $1.15 |
| power jack | $0.75 | ||||
| Midi Jack | $1.50 | ||||
| Total | $23.57 |
The physical housing I already had- it got rejected from a different project. But it is this:
I drilled another hole for the MIDI jack.. and it was a tight fit:
But it fit. You can certainly do this in a 1590A.
Typical wiring. well documented in my other posts:
Now. The trick here was the code. The Whammy only supports this:
As you can see.. no easy up/down. So I had to write it in. Had some help from people, but here is the final code:
note- i haven’t tested this on the Whammy yet. It might be off by one, if they code PC0= PC1. I will update after I test it
https://thenorthwestenterprise.com/wp-content/uploads/2020/07/Whammy/Whammy_Control_Final.ino
// DigiTech Whammy IV - MIDI Controller.
// by Cameron @the.nw.enterprise, https://thenorthwestenterprise.com/
// Adapted from MichaelJGuitar 2013 and help from GrumpyMike, as always
// Switch allows changing of Whammy preset.
// Configured to increment or decrement with a footswich buttonpress
#include <MIDI.h>
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
const int upButton = 8;
const int dnButton = 6; //your input pins- wire to footswitches
int upbuttonstate = 0;
int lastupbuttonstate = 0;
int dnbuttonstate = 0;
int lastdnbuttonstate = 0;
int currentprogram = 1;
void setup() {
//MIDI.begin(MIDI_CHANNEL_OMNI);
Serial1.begin(31250);
delay(100);
setProgram(currentprogram);
pinMode(upButton, INPUT_PULLUP);
pinMode(dnButton, INPUT_PULLUP);
}
void loop() {
// define increment button action
upbuttonstate = digitalRead(upButton);
if(upbuttonstate != lastupbuttonstate)
{if (upbuttonstate == LOW)
{currentprogram++;
delay (175);
if(currentprogram > 17) currentprogram = 1;
setProgram(currentprogram);}
else { }
}
// define decrement button action
dnbuttonstate = digitalRead(dnButton);
if(dnbuttonstate != lastdnbuttonstate)
{if (dnbuttonstate == LOW)
{currentprogram--;
delay (175);
if(currentprogram < 1) currentprogram = 17;
setProgram(currentprogram);}
else { }
}
//set variable
lastupbuttonstate = upbuttonstate;
lastdnbuttonstate = dnbuttonstate;
}
void setProgram(uint8_t p) {
Serial1.write((uint8_t)0xC0);
Serial1.write((uint8_t)p);}



