#ifndef _MIDI_EVENT_
#define _MIDI_EVENT_

#include <iostream>
#include <stdio.h>

// midi aint' changing... so I'm hard coding the parameters.
#define ACTIVE_SENS_EVENT 0xf
// active sensing is like clock or a heartbeat..

#define KEY_ON_EVENT 0x1
// note pressed.
// note for note release, most indictions show that 
// a key on message is generated with velocity 0.

#define  CTRL_CHANGE 0x4
// these are the sliders,knobs, and mod wheel 
// on the radium or other midi input device

#define PITCH_BEND 0x7
// pitch bend controller from standard midi device

// radium controller defintions
#define RADIUM_SLIDER_1 82
#define RADIUM_SLIDER_2 83
#define RADIUM_SLIDER_3 28
#define RADIUM_SLIDER_4 29
#define RADIUM_SLIDER_5 16
#define RADIUM_SLIDER_6 80
#define RADIUM_SLIDER_7 18
#define RADIUM_SLIDER_8 19

#define RADIUM_KNOB_9   74
#define RADIUM_KNOB_10  71
#define RADIUM_KNOB_11  81
#define RADIUM_KNOB_12  91
#define RADIUM_KNOB_13  2
#define RADIUM_KNOB_14  10
#define RADIUM_KNOB_15  5
#define RADIUM_KNOB_16  21
#define RADIUM_KNOB_DATAENTRY 7

#define RADIUM_MOD_WHEEL 7

using namespace std;

class MidiEvent{
  
 public:
  
  MidiEvent();
  MidiEvent(int event_type, int channel, int note, int velocity);
  void setData(int event_type, int channel, int note, int velocity);   
  void printData();
  int getEventType(){return event_type;};
  int getChannel(){return channel;};
  int getNote() {return note;};
  int getVelocity() { return velocity;};

  int getControllerNumber(){return note;};
  // controller number for a control change event

  int getControllerValue(){return velocity;};
  // controller value for a control change event

  int getPitchBendValueA(){return note;};
  
  int getPitchBendValueB(){return velocity;};

  // tests for event types. see notes above
  
  int isActiveSensingEvent(){ 
    return (event_type == ACTIVE_SENS_EVENT);
  };

  int isKeyOnEvent(){
    return (event_type == KEY_ON_EVENT);
  };

  int isControlChangeEvent(){
    return (event_type == CTRL_CHANGE);
  };

  int isPitchBendEvent(){
    return (event_type == PITCH_BEND);
  };

  int isRadiumSlider1(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_1));
  }

  int isRadiumSlider2(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_2));
  }

  int isRadiumSlider3(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_3));
  }

  int isRadiumSlider4(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_4));
  }

  int isRadiumSlider5(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_5));
  }

  int isRadiumSlider6(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_6));
  }

  int isRadiumSlider7(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_7));
  }

  int isRadiumSlider8(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_SLIDER_8));
  }

  int isRadiumKnob9(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_9));
  }

  int isRadiumKnob10(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_10));
  }

  int isRadiumKnob11(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_11));
  }

  int isRadiumKnob12(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_12));
  }

  int isRadiumKnob13(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_13));
  }

  int isRadiumKnob14(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_14));
  }

  int isRadiumKnob15(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_15));
  }

  int isRadiumKnob16(){
    return (isControlChangeEvent() &&
       (getControllerNumber() == RADIUM_KNOB_16));
  }

  int isRadiumKnobDataEntry(){
    return (isControlChangeEvent() &&
	    (getControllerNumber() == RADIUM_KNOB_DATAENTRY));
  }

  int isRadiumModWheel(){
    return (isControlChangeEvent() &&
	    (getControllerNumber() == RADIUM_MOD_WHEEL));
  }

 private:

  int event_type;
  int channel;
  int note;
  int velocity;
 
};

#endif

