Go Down

Topic: midi in debugging (Read 702 times) previous topic - next topic

Rupertt

HEllo,
im creating a midi in circuit for my sequencer, the question ist
how can I check if my circuit is right and the code also.
I use this circuit adn the code below:
http://www.instructables.com/file/FUJ0J5BFPBKZZB1/

The arduino is a mega and the midi in ist connected to RX0.

Code: [Select]
byte midi_start = 0xfa;
byte midi_stop = 0xfc;
byte midi_clock = 0xf8;
byte midi_continue = 0xfb;
int play_flag = 0;
byte data;
//midi in end

void setup() {
  //  set the states of the I/O pins:
  for (int x = 0;x<16;x++) {
    pinMode(LEDpins[x], OUTPUT);
    pinMode(switchPins[x], INPUT);
  }
                   
  pinMode(timePin1, INPUT);
  pinMode(timePin2, INPUT);
  pinMode(playPin, INPUT);
   pinMode(holdPin, INPUT);
    pinMode(dualPin, INPUT);
    pinMode(midiin, INPUT);
  //  Set MIDI baud rate:
  Serial.begin(31250);
  Serial1.begin(31250);
  // turn all notes off
  noteOn(0xB00, 0x7B, 0x00);
  noteOn(0xB01, 0x7B, 0x00);
  noteOn(0xB02, 0x7B, 0x00);
  noteOn(0xB03, 0x7B, 0x00);
  noteOn(0xB04, 0x7B, 0x00);
  noteOn(0xB05, 0x7B, 0x00);
  noteOn(0xB06, 0x7B, 0x00);
  noteOn(0xB07, 0x7B, 0x00);
  blink(3);
  timer_start = millis();
  //------------------------------
  // Control Voltage Section start
  byte clr;
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device

  SPCR = (1<<SPE)|(1<<MSTR);
  //SPCR = B01010000;
  clr=SPSR;
  clr=SPDR;
  delay(10);
  // Control Voltage Section end
  //------------------------------
  //---analog read timing
  sbi(ADCSRA,ADPS2) ;
  cbi(ADCSRA,ADPS1) ;
  sbi(ADCSRA,ADPS0) ;
  //-----------------------------
}

void loop() {

 

//Main sequence
 
//begin midi in here
if(Serial.available() > 0) {
  data = Serial.read();
  if(data == midi_start) {
    play_flag = 1;
  }
  else if(data == midi_continue) {
    play_flag = 1;
  }
  else if(data == midi_stop) {
    play_flag = 0;
  }
  else if((data == midi_clock) && (play_flag == 1)) {
  //
  currentSwitchState[step] = digitalRead(switchPins[step]);

     //mopdes are:
     // normal sequencer
     
     modeState = digitalRead(modePin);
     
     if (modeState == 0) {
   
       
        dualState = digitalRead(dualPin);
        if (dualState == 1) {
           currentSwitchState[step] = digitalRead(switchPins[step]);
           playstep1(step, 8, 0);
           if (step < 8) {
              step++;
           } else {
              step = 0;
           }
           currentSwitchState[step2] = digitalRead(switchPins[step2]);
           playstep2(step2, 15, 8);
            if (step2 < 15) {
              step2++;
           } else {
              step2 = 8;
           }
        } else {
           playstep(step);
           if (step < 15) {
              step++;
           } else {
              step = 0;
        }
        }
     } else {
       loopstep(step);
        if (step < 8) {
        step++;
      } else {
        step = 0;
      }
     }

    }
  //else { blink(1); }
   //
   
    }

   

}

Rupertt

#1
Jan 09, 2012, 10:47 am Last Edit: Jan 09, 2012, 01:36 pm by Rupertt Reason: 1
ok, i got a signal now and the sequencer runs according to the sequencer, but its far to fast, how can and have I to devide the incoming signal?

Code: [Select]
if(Serial.available() > 0) {
 data = Serial.read();
 if(data == midi_start) {
   play_flag = 1;
 }
 else if(data == midi_continue) {
   play_flag = 1;
 }
 else if(data == midi_stop) {
   play_flag = 0;
 }
 else if((data == midi_clock) && (play_flag == 1)) {
 //
//here are my steps...


EDIT:

when I only do every 4 ticks something the timing seems right:

Code: [Select]
if(counter < 5) {
  counter++;
  } else {
  counter = 0; 
  currentSwitchState[step] = digitalRead(switchPins[step]);

shooking

Hi Rupert

I recently got into this Arduino thang and have developed a MIDI processor using a Mega1280.

I had read most of the MIDI topics thoroughly, and settled on the Mega because

1] I need the program space to store the databases's to control my particular synth and
2] the Mega not only has a plethora of pins, but up to 4 UARTs.

From what I can read the virtual serial ones produce snags if you dont physically disconnect the midi from the RX/TX since these are shared for the USB flashing too.

Questions if I may.

Why do you use Serial as MIDI instead of Serial1 (pins 18/19) and Serial2?

These can prevent the nause of either interfering with the program flashing and/or your MIDI stream getting early corruption.

Also, I found Serial1.available() was necessary but insufficient to prevent a different pathology ... one you will want to avoid if you are getting it.

If you read, and nothing is available, read() returns -1.
If you are assigning the value to a byte, this will get interpreted as 255 or 0xff -- bad news this is also MIDI for RESET.
If however you read an int, and ignore -1, then convert valid values back to an byte I've found this reduces spurious data.

Apologies if you are not hitting this issue. I know I was but once I ignored the -1's my midi streams settled down _almost_ nicely.

Now to look up buffering on UARTs to see how to handle large Sysex transfers without dropping bytes.

Regards

Steve H

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