Ultimate NORD Stage MIDI Pedal Board
Posted: 03 Nov 2017, 00:28
I finally got my Nord Stage 3 (compact 73)
So, it's time for another ultimate MIDI pedal board
MIDI based, it's compatible to any equipment - although of course adapted to the Stage 3.
It's connected by (almost) one single cable only, instead of 4.
The velocity dependent piano pedal is a Nord Stage 3 special feature - until now only possible with the original Nord Triple Pedal)
But the original Nord Triple Pedal is simply too big, too heavy and too expensive to consider buying
Finally, after two days of heavy experimental engineering, I found out how to reproduce the effect with MIDI-CC.
Thanks to DrNeurus and maxpiano for their initial work!
What the board actually does:
But I think it's technically safe and I the board is always powered alongside with the Keyboard without another cable, battery or power plug.
- - - - - -
An Arduino Micro (Pro Micro) translates pedal positions into MIDI messages.
Here's the source code:
And here's the
- - - - - -
Ready to rock
Hope you enjoy and maybe discover some new information




It's connected by (almost) one single cable only, instead of 4.

The velocity dependent piano pedal is a Nord Stage 3 special feature - until now only possible with the original Nord Triple Pedal)

But the original Nord Triple Pedal is simply too big, too heavy and too expensive to consider buying

Finally, after two days of heavy experimental engineering, I found out how to reproduce the effect with MIDI-CC.
Thanks to DrNeurus and maxpiano for their initial work!
What the board actually does:
- Velocity- and half-press-dependent Damper control
- Leslie rotor changer (slow / fast)
- Expression
- Swell
- The Nord Stage 3 does NOT support the program up/down functionality via MIDI. A separate (TRS) cable is needed.
-> can only be solved by Clavia (come on guys!) - The pedal board needs power for the micro-controller to operate.
-> I took the power from the Nord's internal power supply through the MIDI-cable
But I think it's technically safe and I the board is always powered alongside with the Keyboard without another cable, battery or power plug.
- - - - - -

Here's the source code:
Code: Select all
// Arduino Micro program code to operate the pedal-board
#define MIDI_Channel 0
// PCB pin numbers
#define damper_ A0
#define rotary_ 3
#define expression_ A1
#define swell_ A2
//#define up_ 4 // Don't forget to remove comment in 'loop'
//#define down_ 5 // Don't forget to remove comment in 'loop'
// the variables
uint8_t i = 0;
int damper = 1; // Roland DP-10
int damper_last = 1;
int damper_dist[7] = {0, 0, 0, 0, 0, 0, 0}; // may contain negative numbers
int damper_speed = 0;
uint8_t rotary = 1; // Yamaha FC-5
uint8_t rotary_last = 1;
int expression = 1; // Yamaha FC-7
int expression_last = 1;
uint8_t swell = 1; // Korg EXP-2
uint8_t swell_last = 1;
uint8_t up = 1; // Iron foot button on the right
uint8_t up_last = 1;
uint8_t down = 1; // Iron foot button on the left
uint8_t down_last = 1;
uint8_t cmdByte;
uint8_t Byte1;
uint8_t Byte2;
void send_MIDI_message (byte cmd, byte byte1, byte byte2)
{
Serial1.write(cmd + MIDI_Channel);
Serial1.write(byte1);
Serial1.write(byte2);
}
void setup()
{
pinMode(rotary_, INPUT);
pinMode(rotary_, INPUT_PULLUP);
/*
pinMode(up_, INPUT);
pinMode(up_, INPUT_PULLUP);
pinMode(down_, INPUT);
pinMode(down_, INPUT_PULLUP);
*/
Serial1.begin(31250); // UART-Serial for MIDI
// Serial.begin(9600); // USB Serial for memory monitoring
}
void loop()
{
// CATCH SYSTEM STATE
// ADCs have 10 Bit (0 ... 1023)
damper = analogRead(damper_); // first readout
rotary = digitalRead(rotary_);
expression = analogRead(expression_); // ! dead centre: 655 ... 690 !
if (expression < 690) // hyteresis for dead centre
{ expression = constrain (expression, 0, 655); }
else
{ expression = map (expression, 690, 1023, 656, 1023); }
swell = map ( constrain( (analogRead(swell_)) , 48, 1018), 48, 1018, 127, 0 ) ;
// up = digitalRead(up_);
// down = digitalRead(down_);
i++;
if (i >= 7) { i = 0; }
damper_dist[i] = damper - analogRead(damper_); // second readout
damper = map ( damper, 0, 1030, 0, 2 ) ;
// CHECK FOR MOVEMENTS, AND IN CASE: REACT
if (damper != damper_last)
{
damper_speed = 0;
for (uint8_t j = 0; j < 7; j++)
{
damper_speed += damper_dist[j];
}
damper_speed /= 7;
damper_speed = map (constrain (damper_speed, -15, 15), -16, 16, -5, 5 );
if (damper == 1)
{ // pedal noise when pressing the pedal
damper_speed = 27 + (damper_speed*(-3) ); // values: 27 ... 42
send_MIDI_message(0xB0, 64, damper_speed);
send_MIDI_message(0xB0, 64, 127);
} else { // pedal noise when releasing the pedal
damper_speed = 10 + (damper_speed*2) ; // values: 10 ... 18
send_MIDI_message(0xB0, 64, damper_speed);
send_MIDI_message(0xB0, 64, 0);
}
damper_last = damper;
}
if (rotary != rotary_last)
{
send_MIDI_message(0xB0, 108, (127 - (rotary * 84))); // 0=stop , 43=slow , 127=fast
rotary_last = rotary;
}
if (expression != expression_last)
{
send_MIDI_message(0xB0, 11, map ( expression, 0, 1023, 0, 127 ) );
expression_last = expression;
}
if (swell != swell_last)
{
send_MIDI_message(0xB0, 4, swell);
swell_last = swell;
}
/*
if (up != up_last)
{
send_MIDI_message(0xB0, 31, (127 * up));
up_last = up;
}
if (down != down_last)
{
send_MIDI_message(0xB0, 32, (127 * down));
down_last = down;
}
*/
}
Ready to rock

Hope you enjoy and maybe discover some new information

