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

