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 will NOT respond to personal messages, I WILL delete them, use the forum please ]

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy