Bouncing exceeding 200 ms

I should have been clearer; I'm not using delay() or wait().

When the button state is novel, I'm recording the millis value at that time, subtracting it from the current time and checking if the result is greater than 200 ms.

Here's the code:

int btnStateStart[16];
int btnState[16];
int btnStatePrev[16];

void setup()
{
  for(int i=0; i < sizeof(btnState); i++){
    btnState[i] = 0;
    btnStatePrev[i] = 0;
  }
}

void run(){

  for (int i=0; i < 16; i++){
    if ((millis() - btnStateStart[i]) > 200){
      btnState[i] = digitalReadMUX1(i);        //get current button state
      if (btnState[i] != btnStatePrev[i]){
        if (btnState[i] == 1) {
          MIDI.sendProgramChange(i+1,1);
        }
        btnStateStart[i] = millis(); 
        btnStatePrev[i] = btnState[i];
      }
    }
  }
}

Should I be using a different primitive type for the btnStateStart array (containing millisecond values)?

EDIT: I've been looking at ints vs unsigned longs and I could be losing precision due to using ints. I come from a Java background so I wasn't aware that integers in Arduino are only 16-bit, I just assumed they were 32-bit. Could this be the issue? I've anecdotaly noticed that the bouncing seems to get slightly worse after a certain amount of time.

American2020:
You sure the problem is bouncing? One thing is bouncing and another is a button pressed that still sending 0s and 1s

Pressing them harder makes any difference?

How do you have them connected right now?

Yes, I've tested the buttons extensively. Its not a case of loose contacts or dodgy switch components; they work just fine and the mechanism seems solid enough. Pressing harder/softer/shorter/longer makes no difference.

I'm using crimps like these, but I tested both crimped connections and soldered ones and there was no difference.

fungus:

jrdoner:
I've used a 555 in difficult debounce cases. Use your switch to start a pulse, and feed that into the Arduino. Once the Arduino's seen it, send a reset out from the Arduino to the 555. That way, you can fine tune the process to minimize the wait for a bouncy switch to get done bouncing. Worked great for me in a clock setting circuit.

There's absolutely no need for extra hardware. Software can do it.

Just ignore all 'presses' that occur less than 200ms after the initial one (ie. remember when the initial press was).

What is a 555?