Pages: [1]   Go Down
Author Topic: Arduino mega USB MIDI with loopMidi and S2Midi  (Read 1347 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hey guys!
This is my first post, i doesnt really know anything about the rules here, so im sorry if i cross any of them.
I have an old keyboard, and i want to modify it to send midi to my pc via usb.
I heard about flashing the firmware on the arduino, but thats not an option for me since i want to use it for many other projects, and i dont want to do flash it every time.
Heres my code:
Code:
#define LED 13    // LED pin on Arduino board
#define switch1 2              // 1st Switch
#define MIDI_COMMAND_CONTROL_CHANGE 0xB0
#define MIDI_COMMAND_NOTE_ON B10010000
#define MIDI_COMMAND_NOTE_OFF B10000000

//Variables
int switch1LastState = 0;
int switch1CurrentState = 0;

// the format of the message to send Via serial
typedef union {
    struct {
 uint8_t command;
 uint8_t channel;
 uint8_t data2;
 //uint8_t data3;
    } msg;
    uint8_t raw[3];
} t_midiMsg;
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(switch1,INPUT);
  Serial.begin(115000);
}

void loop() {
 
t_midiMsg midiMsg1;  // MIDI message for Switch 1
switch1CurrentState = digitalRead(switch1);
if (switch1CurrentState == 1){
    if(switch1LastState == 0){
           midiMsg1.msg.command = MIDI_COMMAND_NOTE_ON ;
           midiMsg1.msg.channel = 0x3D;
           midiMsg1.msg.data2   = 0x79;
           //midiMsg1.msg.data3   = 0x30;
           //Serial.write(midiMsg1.raw, sizeof(midiMsg1));
           Serial.write(midiMsg1.raw,sizeof(midiMsg1));
switch1LastState = 1;               
}
                                 }
if (switch1CurrentState == 0){
    if(switch1LastState == 1){
           midiMsg1.msg.command = MIDI_COMMAND_NOTE_OFF;
           midiMsg1.msg.channel = 0x10;
           midiMsg1.msg.data2   = 0x20;
           //midiMsg1.msg.data3   = 0x30;
           Serial.write(midiMsg1.raw, sizeof(midiMsg1)); 
switch1LastState = 0;     
         }
}

}

I started this tutorial : https://sites.google.com/site/bharatbhushankonka/home/diy-midi-over-usb-using-arduino-uno
His t_midiusb union uses 4 bytes, and it works, but as i checked with midi-ox hes wrong with the names,
data3 is lost in the communication, and only the first 3 bytes is used. I readd various descriptions on midi, and all of them said that the standard midi messege is 3 bytes long.Like this one http://tonalsoft.com/pub/pitch-bend/pitch.2005-08-24.17-00.aspx
So i deleted the 4th byte, and now it doesnt works and i dont know why.
But thats not my biggest problem.
The problem is, that the note off doesnt shows up, however the arduino sends the right messege
for example 80 10 20 , or 80 10 20 30, but theres no note off in midi-ox, and i dont know why.
Is there anyone who can help me?
Sorry for my bad english.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a simple solution: If i want a note off, then i send a midi messege with 0 velocity.
It works, but its ugly. Anyone with any idea how to use the note off?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

According to http://www.usb.org/developers/devclass_docs/midi10.pdf page 16, Midi in USB messages are always four bytes with unused bytes padded with zeroes.
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

Why do you define your MIDI message like this ?
   struct {
 uint8_t command;
 uint8_t channel;
 uint8_t data2;
}

You can see here that a MIDI Message has a Status, and 1 or 2 data values :
http://www.midi.org/techspecs/midimessages.php

So you should define it like this :

   struct {
 uint8_t status;
 uint8_t data1;
 uint8_t data2;
}

The channel is inside "status" value.
For example, if you want to send a NoteOn message on channel 1, you send :
status = 0b10010001
data1 = pitch
data2 = velocity

a noteOff :
status = 0b10000001
data1 = pitch
data2 = velocity

But the best should be to use the MIDI.h library, you wouldn't loose your time.
http://playground.arduino.cc/Main/MIDILibrary
Logged

Build a groove box with Arduino Due :
http://groovuino.blogspot.com/

Pages: [1]   Go Up
Jump to: