/***************************************************
     hb-midilib-defines.c
     Realtime MIDI Library for the MIT HandyBoard
     colby leider (cnl@dartmouth.edu)
     last updated 9.16.97

     http://music.dartmouth.edu/~colby/hb.html
***************************************************/


/*
     Note: Functions in the Handy Board Realtime MIDI Library
     generally accept separate arguments for channel, pitch, and
     velocity.  They may easily be modified to use structs
     instead ofindividual integer arguments.
*/

struct midi_chunk {
   int channel;
   int pitch;
   int velocity;
};

struct scheduled_midi_event {
    int channel;
    int pitch;
    int velocity;
    int controller_number;
    int controller_value;
    float time_on;
    float duration;
};
    

/* selected abstractions from the MIDI Specification v1.0 */

/* abstractions for basic MIDI status bytes */
#define NOTE_OFF_STATUS 0b1000
#define NOTE_ON_STATUS 0b1001
#define POLY_KEY_PRESSURE_STATUS 0b1010
#define CONTROL_CHANGE_STATUS 0b1011
#define PROGRAM_CHANGE_STATUS 0b1100
#define AFTERTOUCH_STATUS 0b1101
#define PITCH_BEND_STATUS 0b1110
#define SELECT_CHANNEL_MODE_STATUS 0b1011
#define SYSTEM_EXCLUSIVE_STATUS 0b11110000
#define SYSTEM_COMMON_STATUS 0b11110
#define SYSTEM_REAL_TIME_STATUS 0b11111

/* abstrations for Channel Mode messages */
#define CHANNEL_MODE_STATUS 1011
#define    ALL_SOUND_OFF_CONTROLLER 120
#define    ALL_SOUND_OFF_VALUE 0
#define    RESET_ALL_CONTROLLERS_CONTROLLER 121
#define    RESET_ALL_CONTROLLERS_VALUE 0
#define    LOCAL_CONTROL_CONTROLLER 122
#define    LOCAL_CONTROL_OFF_VALUE 0
#define    LOCAL_CONTROL_ON_VALUE 127
#define    ALL_NOTES_OFF_CONTROLLER 123
#define    ALL_NOTES_OFF_VALUE 0
#define    OMNI_MODE_OFF_CONTROLLER 124
#define    OMNI_MODE_OFF_VALUE 0
#define    OMNI_MODE_ON_CONTROLLER 125
#define    OMNI_MODE_ON_VALUE 0
#define    MONO_MODE_ON_CONTROLLER 126
#define    POLY_MODE_ON_CONTROLLER 127
#define    POLY_MODE_ON_VALUE 0

/* abstractions for controller numbers */
#define BANK_SELECT 0
#define MODULATION_WHEEL 1
#define BREATH_CONTROLLER 2
#define FOOT_CONTROLLER 4
#define PORTAMENTO_TIME 5
#define DATA_ENTRY_MSB 6
#define MAIN_VOLUME 7
#define BALANCE 8
#define PAN 10
#define EXPRESSION_CONTROLLER 11
#define EFFECT_CONTROL_1 12
#define EFFECT_CONTROL_2 13
#define GENERAL_PURPOSE_CONTROLLER_1 16
#define GENERAL_PURPOSE_CONTROLLER_2 17
#define GENERAL_PURPOSE_CONTROLLER_3 18
#define GENERAL_PURPOSE_CONTROLLER_4 19
#define DAMPER_PEDAL 64
#define    SUSTAIN_PEDAL 64
#define PORTAMENTO_ON_OFF 65
#define SOSTENUTO_PEDAL 66
#define SOFT_PEDAL 67
#define LEGATO_FOOTSWITCH 68
#define HOLD_2 69
#define SOUND_CONTROLLER_1 70
#define SOUND_CONTROLLER_2 71
#define SOUND_CONTROLLER_3 72
#define SOUND_CONTROLLER_4 73
#define SOUND_CONTROLLER_5 74
#define SOUND_CONTROLLER_6 75
#define SOUND_CONTROLLER_7 76
#define SOUND_CONTROLLER_8 77
#define SOUND_CONTROLLER_9 78
#define SOUND_CONTROLLER_10 79
#define GENERAL_PURPOSE_CONTROLLER_5 80
#define GENERAL_PURPOSE_CONTROLLER_6 81
#define GENERAL_PURPOSE_CONTROLLER_7 82
#define GENERAL_PURPOSE_CONTROLLER_8 83
#define PORTAMENTO_CONTROL 84
#define EFFECTS_1_DEPTH 91
#define EFFECTS_2_DEPTH 92
#define EFFECTS_3_DEPTH 93
#define EFFECTS_4_DEPTH 94
#define EFFECTS_5_DEPTH 95
#define DATA_INCREMENT 96
#define DATA_DECREMENT 97
#define NON_REGISTERED_PARAMETER_NUMBER_LSB 98
#define NON_REGISTERED_PARAMETER_NUMBER_MSG 99
#define REGISTERED_PARAMETER_NUMBER_LSB 100
#define REGISTERED_PARAMETER_NUMBER_MSB 101

/* abstractions for Registered Parameter Numbers */
#define PITCH_BEND_SENSITIVITY_LSB 0
#define PITCH_BEND_SENSITIVITY_MSB 0
#define FINE_TUNING_LSB 1
#define FINE_TUNING_MSB 0
#define COARSE_TUNING_LSB 2
#define COARSE_TUNING_MSB 0
#define TUNING_PROGRAM_SELECT_LSB 3
#define TUNING_PROGRAM_SELECT_MSB 0
#define TUNING_BANK_SELECT_LSB 4
#define TUNING_BANK_SELECT_MSB 0

/* abstractions for System Exclusive Messages */
#define BULK_DUMP_STATUS 0b11110000
#define END_OF_EXCLUSIVE_STATUS 0b11110111
#define EOX 0b11110111
