MIDI input NoteOff not detected

Hi Everyone.
I’ve been working on trying to get a usbMIDI based sketch to run with the regular MIDI library so that I can use a hardware 5 pin MIDI connector with my M-Audio Keystation MIDI controller.
I have been trying to adapt a sketch by Randolph Voorhies called MIDImotor which controls the speed of a stepper motor with MIDI data. The original sketch can be found here:

I can get my modified sketch to receive noteOn messages from my hardware MIDI keyboard but not noteOff messages. Not sure whats wrong with the sketch. Any feedback is greatly appreciated. Here is the sketch:

#include "MIDI.h"
float notes[] = {
  8.1757989156,   // 0
  8.6619572180,   // 1
  9.1770239974,   // 2
  10.3008611535,  // 3
  10.3008611535,  // 4
  10.9133822323,  // 5
  11.5623257097,  // 6
  12.2498573744,  // 7
  12.9782717994,  // 8
  13.7500000000,  // 9
  14.5676175474,  // 10
  15.4338531643,  // 11
  16.3515978313,  // 12
  17.3239144361,  // 13
  18.3540479948,  // 14
  19.4454364826,  // 15
  20.6017223071,  // 16
  21.8267644646,  // 17
  23.1246514195,  // 18
  24.4997147489,  // 19
  25.9565435987,  // 20
  27.5000000000,  // 21
  29.1352350949,  // 22
  30.8677063285,  // 23
  32.7031956626,  // 24
  34.6478288721,  // 25
  36.7080959897,  // 26
  38.8908729653,  // 27
  41.2034446141,  // 28
  43.6535289291,  // 29
  46.2493028390,  // 30
  48.9994294977,  // 31
  51.9130871975,  // 32
  55.0000000000,  // 33
  58.2704701898,  // 34
  61.7354126570,  // 35
  65.4063913251,  // 36
  69.2956577442,  // 37
  73.4161919794,  // 38
  77.7817459305,  // 39
  82.4068892282,  // 40
  87.3070578583,  // 41
  92.4986056779,  // 42
  97.9988589954,  // 43
  103.8261743950,  // 44
  110.0000000000,  // 45
  116.5409403795,  // 46
  123.4708253140,  // 47
  130.8127826503,  // 48
  138.5913154884,  // 49
  146.8323839587,  // 50
  155.5634918610,  // 51
  164.8137784564,  // 52
  174.6141157165,  // 53
  184.9972113558,  // 54
  195.9977179909,  // 55
  207.6523487900,  // 56
  220.0000000000,  // 57
  233.0818807590,  // 58
  246.9416506281,  // 59
  261.6255653006,  // 60
  277.1826309769,  // 61
  293.6647679174,  // 62
  311.1269837221,  // 63
  329.6275569129,  // 64
  349.2282314330,  // 65
  369.9944227116,  // 66
  391.9954359817,  // 67
  415.3046975799,  // 68
  440.0000000000,  // 69
  466.1637615181,  // 70
  493.8833012561,  // 71
  523.2511306012,  // 72
  554.3652619537,  // 73
  587.3295358348,  // 74
  622.2539674442,  // 75
  659.2551138257,  // 76
  698.4564628660,  // 77
  739.9888454233,  // 78
  783.9908719635,  // 79
  830.6093951599,  // 80
  880.0000000000,  // 81
  932.3275230362,  // 82
  987.7666025122,  // 83
  1046.5022612024, // 84
  1108.7305239075, // 85
  1174.6590716696, // 86
  1244.5079348883, // 87
  1318.5102276515, // 88
  1396.9129257320, // 89
  1479.9776908465, // 90
  1567.9817439270, // 91
  1661.2187903198, // 92
  1760.0000000000, // 93
  1864.6550460724, // 94
  1975.5332050245, // 95
  2093.0045224048, // 96
  2217.4610478150, // 97
  2349.3181433393, // 98
  2489.0158697766, // 99
  2637.0204553030, // 100
  2793.8258514640, // 101
  2959.9553816931, // 102
  3135.9634878540, // 103
  3322.4375806396, // 104
  3520.0000000000, // 105
  3729.3100921447, // 106
  3951.0664100490, // 107
  4186.0090448096, // 108
  4434.9220956300, // 109
  4698.6362866785, // 110
  4978.0317395533, // 111
  5274.0409106059, // 112
  5587.6517029281, // 113
  5919.9107633862, // 114
  5919.9107633862, // 115
  6644.8751612791, // 116
  7040.0000000000, // 117
  7458.6201842894, // 118
  7902.1328200980, // 119
  8372.0180896192, // 120
  8869.8441912599, // 121
  9397.2725733570, // 122
  9956.0634791066, // 123
  10548.0818212118, // 124
  11175.3034058561, // 125
  11839.8215267723, // 126
  12543.8539514160 // 127
};


int ledPin = 13;
int stpPin = 12;
int dirPin = 14;


bool playing = false;

float desired_delay = 0.0;
float curr_delay = 0.0;
byte last_note = 0;
int const glide = 10;
float note2microseconds(byte note)
{
  return 1.0 / notes[note] * 1000000.0;
}

void noteOn(byte channel, byte note, byte velocity)
{
  last_note = note;

  // Set the desired delay by converting the MIDI note
  desired_delay = note2microseconds(note);

  // If we're not currently playing, then we should try to accelerate
  // into the requested note
  if(!playing)
    curr_delay = desired_delay + 600;

  playing = true;
  digitalWrite(ledPin, HIGH);
}


void noteOff(byte channel, byte note, byte velocity)
{
if(note == last_note)
  {
    playing = false;
    digitalWrite(ledPin, LOW);
  }
}


void setup() {                
  MIDI.begin(MIDI_CHANNEL_OMNI);
  MIDI.setHandleNoteOn(noteOn);
  MIDI.setHandleNoteOff(noteOff);
  pinMode(ledPin, OUTPUT);     
  pinMode(stpPin, OUTPUT);  
  pinMode(dirPin, OUTPUT); 
  digitalWrite(ledPin, LOW);  
  digitalWrite(stpPin, LOW);
  digitalWrite(dirPin, LOW);
  }

void loop() {
    
  MIDI.read(); 
    if(playing)
    {
         if(curr_delay > desired_delay) curr_delay -= glide;
         if(curr_delay < desired_delay) curr_delay += glide;
         if(abs(curr_delay - desired_delay) < glide) curr_delay = desired_delay;

         digitalWrite(stpPin, HIGH);
         delayMicroseconds(1);
         digitalWrite(stpPin, LOW);
         delayMicroseconds(curr_delay);
    }
   }

The MIDI note off message is different from the note on message, but a very large number of devices/computers do not send a note off, but instead they send a note on message with a zero volume.
If the library you are using does not translate the note on/zero volume into a noteoff message, you'll have to modify your noteOn handler to check for zero volume. If it sees zero volume it should call noteOff itself.

Pete

Thanks Pete!
I changed this small section-

void noteOn(byte channel, byte note, byte velocity)
{
  if  (velocity>0){
  last_note = note;

  // Set the desired delay by converting the MIDI note
  desired_delay = note2microseconds(note);

  // If we're not currently playing, then we should try to accelerate
  // into the requested note
  if(!playing)
    curr_delay = desired_delay + 600;

  playing = true;
  digitalWrite(ledPin, HIGH);
  }
  else{
    if(note == last_note)
  {
    playing = false;
    digitalWrite(ledPin, LOW);
  }
  }
}



void noteOff(byte channel, byte note, byte velocity)
{
if(note == last_note)
  {
    playing = false;
    digitalWrite(ledPin, LOW);
  }
}

and now it works great!
I really appreciate the help!
For anyone interested here is the complete working code:

#include "MIDI.h"
float notes[] = {
  8.1757989156,   // 0
  8.6619572180,   // 1
  9.1770239974,   // 2
  10.3008611535,  // 3
  10.3008611535,  // 4
  10.9133822323,  // 5
  11.5623257097,  // 6
  12.2498573744,  // 7
  12.9782717994,  // 8
  13.7500000000,  // 9
  14.5676175474,  // 10
  15.4338531643,  // 11
  16.3515978313,  // 12
  17.3239144361,  // 13
  18.3540479948,  // 14
  19.4454364826,  // 15
  20.6017223071,  // 16
  21.8267644646,  // 17
  23.1246514195,  // 18
  24.4997147489,  // 19
  25.9565435987,  // 20
  27.5000000000,  // 21
  29.1352350949,  // 22
  30.8677063285,  // 23
  32.7031956626,  // 24
  34.6478288721,  // 25
  36.7080959897,  // 26
  38.8908729653,  // 27
  41.2034446141,  // 28
  43.6535289291,  // 29
  46.2493028390,  // 30
  48.9994294977,  // 31
  51.9130871975,  // 32
  55.0000000000,  // 33
  58.2704701898,  // 34
  61.7354126570,  // 35
  65.4063913251,  // 36
  69.2956577442,  // 37
  73.4161919794,  // 38
  77.7817459305,  // 39
  82.4068892282,  // 40
  87.3070578583,  // 41
  92.4986056779,  // 42
  97.9988589954,  // 43
  103.8261743950,  // 44
  110.0000000000,  // 45
  116.5409403795,  // 46
  123.4708253140,  // 47
  130.8127826503,  // 48
  138.5913154884,  // 49
  146.8323839587,  // 50
  155.5634918610,  // 51
  164.8137784564,  // 52
  174.6141157165,  // 53
  184.9972113558,  // 54
  195.9977179909,  // 55
  207.6523487900,  // 56
  220.0000000000,  // 57
  233.0818807590,  // 58
  246.9416506281,  // 59
  261.6255653006,  // 60
  277.1826309769,  // 61
  293.6647679174,  // 62
  311.1269837221,  // 63
  329.6275569129,  // 64
  349.2282314330,  // 65
  369.9944227116,  // 66
  391.9954359817,  // 67
  415.3046975799,  // 68
  440.0000000000,  // 69
  466.1637615181,  // 70
  493.8833012561,  // 71
  523.2511306012,  // 72
  554.3652619537,  // 73
  587.3295358348,  // 74
  622.2539674442,  // 75
  659.2551138257,  // 76
  698.4564628660,  // 77
  739.9888454233,  // 78
  783.9908719635,  // 79
  830.6093951599,  // 80
  880.0000000000,  // 81
  932.3275230362,  // 82
  987.7666025122,  // 83
  1046.5022612024, // 84
  1108.7305239075, // 85
  1174.6590716696, // 86
  1244.5079348883, // 87
  1318.5102276515, // 88
  1396.9129257320, // 89
  1479.9776908465, // 90
  1567.9817439270, // 91
  1661.2187903198, // 92
  1760.0000000000, // 93
  1864.6550460724, // 94
  1975.5332050245, // 95
  2093.0045224048, // 96
  2217.4610478150, // 97
  2349.3181433393, // 98
  2489.0158697766, // 99
  2637.0204553030, // 100
  2793.8258514640, // 101
  2959.9553816931, // 102
  3135.9634878540, // 103
  3322.4375806396, // 104
  3520.0000000000, // 105
  3729.3100921447, // 106
  3951.0664100490, // 107
  4186.0090448096, // 108
  4434.9220956300, // 109
  4698.6362866785, // 110
  4978.0317395533, // 111
  5274.0409106059, // 112
  5587.6517029281, // 113
  5919.9107633862, // 114
  5919.9107633862, // 115
  6644.8751612791, // 116
  7040.0000000000, // 117
  7458.6201842894, // 118
  7902.1328200980, // 119
  8372.0180896192, // 120
  8869.8441912599, // 121
  9397.2725733570, // 122
  9956.0634791066, // 123
  10548.0818212118, // 124
  11175.3034058561, // 125
  11839.8215267723, // 126
  12543.8539514160 // 127
};


int ledPin = 13;
int stpPin = 12;
int dirPin = 14;


bool playing = false;

float desired_delay = 0.0;
float curr_delay = 0.0;
byte last_note = 0;
int const glide = 10;
float note2microseconds(byte note)
{
  return 1.0 / notes[note] * 1000000.0;
}

void noteOn(byte channel, byte note, byte velocity)
{
  if  (velocity>0){
  last_note = note;

  // Set the desired delay by converting the MIDI note
  desired_delay = note2microseconds(note);

  // If we're not currently playing, then we should try to accelerate
  // into the requested note
  if(!playing)
    curr_delay = desired_delay + 600;

  playing = true;
  digitalWrite(ledPin, HIGH);
  }
  else{
    if(note == last_note)
  {
    playing = false;
    digitalWrite(ledPin, LOW);
  }
  }
}



void noteOff(byte channel, byte note, byte velocity)
{
if(note == last_note)
  {
    playing = false;
    digitalWrite(ledPin, LOW);
  }
}


void setup() {                
  MIDI.begin(MIDI_CHANNEL_OMNI);
  MIDI.setHandleNoteOn(noteOn);
  MIDI.setHandleNoteOff(noteOff);
  pinMode(ledPin, OUTPUT);     
  pinMode(stpPin, OUTPUT);  
  pinMode(dirPin, OUTPUT); 
  digitalWrite(ledPin, LOW);  
  digitalWrite(stpPin, LOW);
  digitalWrite(dirPin, LOW);
  }

void loop() {
    
  MIDI.read(); 
    if(playing)
    {
         if(curr_delay > desired_delay) curr_delay -= glide;
         if(curr_delay < desired_delay) curr_delay += glide;
         if(abs(curr_delay - desired_delay) < glide) curr_delay = desired_delay;

         digitalWrite(stpPin, HIGH);
         delayMicroseconds(1);
         digitalWrite(stpPin, LOW);
         delayMicroseconds(curr_delay);
    }
   }