Skip to content

File MidiEvent.h

File List > external-docs > libDaisy > src > hid > MidiEvent.h

Go to the documentation of this file

Source Code

// TODO: make this adjustable
#define SYSEX_BUFFER_LEN 128

namespace daisy
{
enum MidiMessageType
{
    NoteOff,               
    NoteOn,                
    PolyphonicKeyPressure, 
    ControlChange,         
    ProgramChange,         
    ChannelPressure,       
    PitchBend,             
    SystemCommon,          
    SystemRealTime,        
    ChannelMode,           
    MessageLast,           
};

enum SystemCommonType
{
    SystemExclusive,     
    MTCQuarterFrame,     
    SongPositionPointer, 
    SongSelect,          
    SCUndefined0,        
    SCUndefined1,        
    TuneRequest,         
    SysExEnd,            
    SystemCommonLast,    
};

enum SystemRealTimeType
{
    TimingClock,        
    SRTUndefined0,      
    Start,              
    Continue,           
    Stop,               
    SRTUndefined1,      
    ActiveSensing,      
    Reset,              
    SystemRealTimeLast, 
};

enum ChannelModeType
{
    AllSoundOff,         
    ResetAllControllers, 
    LocalControl,        
    AllNotesOff,         
    OmniModeOff,         
    OmniModeOn,          
    MonoModeOn,          
    PolyModeOn,          
    ChannelModeLast,     
};

struct NoteOffEvent
{
    int     channel;  
    uint8_t note;     
    uint8_t velocity; 
};


struct NoteOnEvent
{
    int     channel;  
    uint8_t note;     
    uint8_t velocity; 
};
struct PolyphonicKeyPressureEvent
{
    int     channel;
    uint8_t note;
    uint8_t pressure;
};
struct ControlChangeEvent
{
    int     channel;        
    uint8_t control_number; 
    uint8_t value;          
};
struct ProgramChangeEvent
{
    int     channel; 
    uint8_t program; 
};
struct ChannelPressureEvent
{
    int     channel;  
    uint8_t pressure; 
};
struct PitchBendEvent
{
    int     channel; 
    int16_t value;   
};
struct ChannelModeEvent
{
    int             channel;    
    ChannelModeType event_type; 
    int16_t         value;      
};
struct SystemExclusiveEvent
{
    int     length;
    uint8_t data[SYSEX_BUFFER_LEN]; 
};
struct MTCQuarterFrameEvent
{
    uint8_t message_type; 
    uint8_t value;        
};
struct SongPositionPointerEvent
{
    uint16_t position; 
};
struct SongSelectEvent
{
    uint8_t song; 
};
struct AllSoundOffEvent
{
    int channel; 
};
struct ResetAllControllersEvent
{
    int     channel; 
    uint8_t value;   
};
struct LocalControlEvent
{
    int  channel;           
    bool local_control_off; 
    bool local_control_on;  
};
struct AllNotesOffEvent
{
    int channel; 
};
struct OmniModeOffEvent
{
    int channel; 
};
struct OmniModeOnEvent
{
    int channel; 
};
struct MonoModeOnEvent
{
    int     channel;      
    uint8_t num_channels; 
};
struct PolyModeOnEvent
{
    int channel; 
};


struct MidiEvent
{
    // Newer ish.
    MidiMessageType    type;                         
    int                channel;                      
    uint8_t            data[2];                      
    uint8_t            sysex_data[SYSEX_BUFFER_LEN]; 
    uint8_t            sysex_message_len;
    SystemCommonType   sc_type;
    SystemRealTimeType srt_type;
    ChannelModeType    cm_type;

    NoteOffEvent AsNoteOff()
    {
        NoteOffEvent m;
        m.channel  = channel;
        m.note     = data[0];
        m.velocity = data[1];
        return m;
    }

    NoteOnEvent AsNoteOn()
    {
        NoteOnEvent m;
        m.channel  = channel;
        m.note     = data[0];
        m.velocity = data[1];
        return m;
    }

    PolyphonicKeyPressureEvent AsPolyphonicKeyPressure()
    {
        PolyphonicKeyPressureEvent m;
        m.channel  = channel;
        m.note     = data[0];
        m.pressure = data[1];
        return m;
    }

    ControlChangeEvent AsControlChange()
    {
        ControlChangeEvent m;
        m.channel        = channel;
        m.control_number = data[0];
        m.value          = data[1];
        return m;
    }

    ProgramChangeEvent AsProgramChange()
    {
        ProgramChangeEvent m;
        m.channel = channel;
        m.program = data[0];
        return m;
    }

    ChannelPressureEvent AsChannelPressure()
    {
        ChannelPressureEvent m;
        m.channel  = channel;
        m.pressure = data[0];
        return m;
    }

    PitchBendEvent AsPitchBend()
    {
        PitchBendEvent m;
        m.channel = channel;
        m.value   = ((uint16_t)data[1] << 7) + (data[0] - 8192);
        return m;
    }

    ChannelModeEvent AsChannelMode()
    {
        ChannelModeEvent m;

        m.channel    = channel;
        m.event_type = (ChannelModeType)(data[0] - 120);
        m.value      = data[1];

        return m;
    }

    SystemExclusiveEvent AsSystemExclusive()
    {
        SystemExclusiveEvent m;
        m.length = sysex_message_len;
        for(int i = 0; i < SYSEX_BUFFER_LEN; i++)
        {
            m.data[i] = 0;
            if(i < m.length)
            {
                m.data[i] = sysex_data[i];
            }
        }
        return m;
    }
    MTCQuarterFrameEvent AsMTCQuarterFrame()
    {
        MTCQuarterFrameEvent m;
        m.message_type = (data[0] & 0x70) >> 4;
        m.value        = data[0] & 0x0f;
        return m;
    }
    SongPositionPointerEvent AsSongPositionPointer()
    {
        SongPositionPointerEvent m;
        m.position = ((uint16_t)data[1] << 7) | data[0];
        return m;
    }
    SongSelectEvent AsSongSelect()
    {
        SongSelectEvent m;
        m.song = data[0];
        return m;
    }
    AllSoundOffEvent AsAllSoundOff()
    {
        AllSoundOffEvent m;
        m.channel = channel;
        return m;
    }
    ResetAllControllersEvent AsResetAllControllers()
    {
        ResetAllControllersEvent m;
        m.channel = channel;
        m.value   = data[1];
        return m;
    }
    LocalControlEvent AsLocalControl()
    {
        LocalControlEvent m;
        m.channel           = channel;
        m.local_control_off = data[1] == 0;
        m.local_control_on  = data[1] == 127;
        return m;
    }
    AllNotesOffEvent AsAllNotesOff()
    {
        AllNotesOffEvent m;
        m.channel = channel;
        return m;
    }
    OmniModeOffEvent AsOmniModeOff()
    {
        OmniModeOffEvent m;
        m.channel = channel;
        return m;
    }
    OmniModeOnEvent AsOmniModeOn()
    {
        OmniModeOnEvent m;
        m.channel = channel;
        return m;
    }
    MonoModeOnEvent AsMonoModeOn()
    {
        MonoModeOnEvent m;
        m.channel      = channel;
        m.num_channels = data[1];
        return m;
    }
    PolyModeOnEvent AsPolyModeOn()
    {
        PolyModeOnEvent m;
        m.channel = channel;
        return m;
    }

    static const char* GetTypeAsString(MidiEvent& msg)
    {
        switch(msg.type)
        {
            case NoteOff: return "NoteOff";
            case NoteOn: return "NoteOn";
            case PolyphonicKeyPressure: return "PolyKeyPres.";
            case ControlChange: return "CC";
            case ProgramChange: return "Prog. Change";
            case ChannelPressure: return "Chn. Pressure";
            case PitchBend: return "PitchBend";
            case SystemCommon: return "Sys. Common";
            case SystemRealTime: return "Sys. Realtime";
            case ChannelMode: return "Chn. Mode";
            default: return "Unknown";
        }
    }
};


} //namespace daisy