Unfortunately I don't have another kbd to try.
I've tried the schematic from here as well:
http://arduino.cc/forum/index.php/topic,22447.0.html(but using 4N25...well, actually an NTE3040... instead of 4N28) and got the same results.
In the original circuit, my pull up on pin 6 is 5.6k, the resistor on the input loop (pin 4 of the MIDI to pin 2 of the 6N136) was 270.
I tried adding the 100k and various others up to 1M to the base (pin 7) but didn't get any improvement.
I also tried tweaking that resistor in the other version of the circuit.
I have found that I'm getting a lot of Active Sensing messages (0xFE), and that seems to pause if I start playing at any speed. But I don't see anything in the manual for the kbd or online about turning that off. The MIDI Implementation Chart in the manual doesn't imply anything there either, just notes that it recognizes active sensing on input and sends it on output.
I'm starting to think I really need to get a scope if I'm going to get anywhere with this, or else buy a different input device to try.
In case anyone's interested, here's the code I'm using, it's also based on that thread above, but I tried a few tricks to see if it could run faster, and there are some dead subroutines that I was using when i was identifying the Active Sensing stuff.
Hm.... having reviewed this again I think I need to verify whether or not I'm getting multiple bytes each loop and ignoring part of the buffer.... The other possibility that occurs to me is maybe the Active Sensing stuff is burning up my buffer and I'm having overruns. But it's nearly 1am so work for another day.

I'm using a Mintduino for this (uses ATMega328), and I'm also wondering if maybe I could do better using the Arduino Mega I got more recently...haven't checked whether the serial buffer is bigger, or clock is faster.
//variables setup
int incoming; // number of incoming bytes
byte incomingByte;
byte note;
byte vel;
int led;
byte note2pins[] = {
2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8
};
int vel2val[] = {
LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH
};
int toggles[] = {
LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW
};
int statusLed = 13; // select the pin for the LED
int action=2; //0 =note off ; 1=note on ; 2= nada
//setup: declaring iputs and outputs and begin serial
void setup() {
pinMode(statusLed,OUTPUT); // declare the LED's pin as output
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
//start serial with midi baudrate 31250 or 38400 for debugging
Serial.begin(31250);
// digitalWrite(statusLed,HIGH);
}
//loop: wait for serial data, and interpret the message
void loop () {
while ((incoming = Serial.available()) > 0) {
digitalWrite(statusLed, HIGH);
// read the incoming byte:
incomingByte = Serial.read();
// wait for as status-byte, channel 1, note on or off
if (incomingByte == 0x90){ // note on message starting starting
//showByte(0);
while ((note = Serial.read()) == 0xFF) {
// just wait until next byte is available; -1 shows up as FF in a byte
}
// showByte(note);
while ((vel = Serial.read()) == 0xFF) {
// just wait until the next byte is available; -1 shows up as FF in a byte
}
digitalWrite(note2pins[(note - 36) % 12], vel2val[int(vel/10)]);
}
digitalWrite(statusLed, LOW);
}
}
void showByte(byte incomingByte) {
for (int i=0; i<8; i++) {
if (incomingByte & (1 << i)) {
digitalWrite(i+2, HIGH);
} else {
digitalWrite(i+2, LOW);
}
}
}
// probably should check for a valid place and led value
void toggle(int place, int led) {
if (toggles[place] == LOW) {
digitalWrite(led, HIGH);
toggles[place] = HIGH;
} else {
digitalWrite(led, LOW);
toggles[place] = LOW;
}
}
void trackBytes(int incoming) {
// track number of bytes coming in
led = (incoming - 1) % 8;
if (toggles[led] == LOW) {
digitalWrite(led+2, HIGH);
toggles[led] = HIGH;
} else {
digitalWrite(led+2, LOW);
toggles[led] = LOW;
}
}