Go Down

Topic: Midi Out delay and strange noise Problem (Read 1 time) previous topic - next topic

Berntl123

Hey Guys

i have a small Problem during my Midi Out Project. Maybe somebody can help me.

scope of work: To send a note without delay via midi out on TX Port  by pressing a button until its released.

Problem: If i push and hold the button principal the note signal works and is send without a delay and thats fine. I tryed it with my yamaha keyboard and its midi in port. The strange thing is that if i insert a delay after the noteOn message it sounds clear but without a delay time when i push the button it sounds first like going from a low frequency to a high very fast before i hear the right and clear tone. Could it be something with the debouncing time? Maybe somebody has an idea. Thanks :)

Here is my primitive code

const int buttonPin = 4;
int buttonState = 0;

void setup() {
  //  Set MIDI baud rate:
  Serial.begin(31250);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // play notes from F#-0 (0x1E) to F#-5 (0x5A):
   buttonState = digitalRead(buttonPin);
  {
    int note1 = 0x40;
    //Note on channel 1 (0x90), some note value (note), middle velocity (0x45):
    if (buttonState == HIGH){
   
    noteOn(0x90, note1, 0x45);
    }
      else {
   }   
  }
}

//  plays a MIDI note.  Doesn't check to see that
//  cmd is greater than 127, or that data values are  less than 127:
void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

MikeOToole

#1
Nov 06, 2012, 01:57 am Last Edit: Nov 06, 2012, 02:17 am by MikeOToole Reason: 1
I'm only beginning play with midi code but I was under the impression once you send note-on it would play until you send note-off?

Apart from that... it might also depend on how your how yamaha keyboard interprets midi signals... best bet is to add debounce...

MarkT

Remember loop is looping constantly - you will be calling noteOn maybe a thousand times a second (depending on the serial clock for midi).

You need to detect button-down event and button-up event separately - you don't want to do actions everytime you see a state, just when you see the state change - ie a state-transition.

[BTW note use of code tags...]

Code: [Select]

int prev_state ;

void loop ()
{
  int state = digitalRead (buttonPin)
  if (state != prev_state)  // only do actions on state-changes
  {
    prev_state = state ;   // record for next time
    if (state == HIGH)  // decide which action
    {
      noteOn(0x90, note1, 0x45);
    }
    else
    {
      noteOff(...) ; // or whatever
    }
  }
}

[ I won't respond to messages, use the forum please ]

Go Up