/*----------------------------------------------------------------------------
 *
 * File:
 * eas_midi.c
 *
 * Contents and purpose:
 * This file implements the MIDI stream parser. It is called by eas_smf.c to parse MIDI messages
 * that are streamed out of the file. It can also parse live MIDI streams.
 *
 * Copyright Sonic Network Inc. 2005

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *----------------------------------------------------------------------------
 * Revision Control:
 *   $Revision: 794 $
 *   $Date: 2007-08-01 00:08:48 -0700 (Wed, 01 Aug 2007) $
 *----------------------------------------------------------------------------
*/

#include "eas_data.h"
#include "eas_report.h"
#include "eas_miditypes.h"
#include "eas_midi.h"
#include "eas_vm_protos.h"
#include "eas_parser.h"

#ifdef JET_INTERFACE
#include "jet_data.h"
#endif


/* state enumerations for ProcessSysExMessage */
typedef enum
{
    eSysEx,
    eSysExUnivNonRealTime,
    eSysExUnivNrtTargetID,
    eSysExGMControl,
    eSysExUnivRealTime,
    eSysExUnivRtTargetID,
    eSysExDeviceControl,
    eSysExMasterVolume,
    eSysExMasterVolLSB,
    eSysExSPMIDI,
    eSysExSPMIDIchan,
    eSysExSPMIDIMIP,
    eSysExMfgID1,
    eSysExMfgID2,
    eSysExMfgID3,
    eSysExEnhancer,
    eSysExEnhancerSubID,
    eSysExEnhancerFeedback1,
    eSysExEnhancerFeedback2,
    eSysExEnhancerDrive,
    eSysExEnhancerWet,
    eSysExEOX,
    eSysExIgnore
} E_SYSEX_STATES;

/* local prototypes */
static EAS_RESULT ProcessMIDIMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_INT parserMode);
static EAS_RESULT ProcessSysExMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_U8 c, EAS_INT parserMode);

/*----------------------------------------------------------------------------
 * EAS_InitMIDIStream()
 *----------------------------------------------------------------------------
 * Purpose:
 * Initializes the MIDI stream state for parsing.
 *
 * Inputs:
 *
 * Outputs:
 * returns EAS_RESULT (EAS_SUCCESS is OK)
 *
 * Side Effects:
 *
 *----------------------------------------------------------------------------
*/
void EAS_InitMIDIStream (S_MIDI_STREAM *pMIDIStream)
{
    pMIDIStream->byte3 = EAS_FALSE;
    pMIDIStream->pending = EAS_FALSE;
    pMIDIStream->runningStatus = 0;
    pMIDIStream->status = 0;
}

/*----------------------------------------------------------------------------
 * EAS_ParseMIDIStream()
 *----------------------------------------------------------------------------
 * Purpose:
 * Parses a MIDI input stream character by character. Characters are pushed (rather than pulled)
 * so the interface works equally well for both file and stream I/O.
 *
 * Inputs:
 * c            - character from MIDI stream
 *
 * Outputs:
 * returns EAS_RESULT (EAS_SUCCESS is OK)
 *
 * Side Effects:
 *
 *----------------------------------------------------------------------------
*/
EAS_RESULT EAS_ParseMIDIStream (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_U8 c, EAS_INT parserMode)
{

    /* check for new status byte */
    if (c & 0x80)
    {
        /* save new running status */
        if (c < 0xf8)
        {
            pMIDIStream->runningStatus = c;
            pMIDIStream->byte3 = EAS_FALSE;

            /* deal with SysEx */
            if ((c == 0xf7) || (c == 0xf0))
            {
                if (parserMode == eParserModeMetaData)
                    return EAS_SUCCESS;
                return ProcessSysExMessage(pEASData, pSynth, pMIDIStream, c, parserMode);
            }

            /* inform the file parser that we're in the middle of a message */
            if ((c < 0xf4) || (c > 0xf6))
                pMIDIStream->pending = EAS_TRUE;
        }

        /* real-time message - ignore it */
        return EAS_SUCCESS;
    }

    /* 3rd byte of a 3-byte message? */
    if (pMIDIStream->byte3)
    {
        pMIDIStream->d2 = c;
        pMIDIStream->byte3 = EAS_FALSE;
        pMIDIStream->pending = EAS_FALSE;
        if (parserMode == eParserModeMetaData)
            return EAS_SUCCESS;
        return ProcessMIDIMessage(pEASData, pSynth, pMIDIStream, parserMode);
    }

    /* check for status received */
    if (pMIDIStream->runningStatus)
    {

        /* save new status and data byte */
        pMIDIStream->status = pMIDIStream->runningStatus;

        /* check for 3-byte messages */
        if (pMIDIStream->status < 0xc0)
        {
            pMIDIStream->d1 = c;
            pMIDIStream->pending = EAS_TRUE;
            pMIDIStream->byte3 = EAS_TRUE;
            return EAS_SUCCESS;
        }

        /* check for 2-byte messages */
        if (pMIDIStream->status < 0xe0)
        {
            pMIDIStream->d1 = c;
            pMIDIStream->pending = EAS_FALSE;
            if (parserMode == eParserModeMetaData)
                return EAS_SUCCESS;
            return ProcessMIDIMessage(pEASData, pSynth, pMIDIStream, parserMode);
        }

        /* check for more 3-bytes message */
        if (pMIDIStream->status < 0xf0)
        {
            pMIDIStream->d1 = c;
            pMIDIStream->pending = EAS_TRUE;
            pMIDIStream->byte3 = EAS_TRUE;
            return EAS_SUCCESS;
        }

        /* SysEx message? */
        if (pMIDIStream->status == 0xF0)
        {
            if (parserMode == eParserModeMetaData)
                return EAS_SUCCESS;
            return ProcessSysExMessage(pEASData, pSynth, pMIDIStream, c, parserMode);
        }

        /* remaining messages all clear running status */
        pMIDIStream->runningStatus = 0;

        /* F2 is 3-byte message */
        if (pMIDIStream->status == 0xf2)
        {
            pMIDIStream->byte3 = EAS_TRUE;
            return EAS_SUCCESS;
        }
    }

    /* no status byte received, provide a warning, but we should be able to recover */
    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Received MIDI data without a valid status byte: %d\n",c); */ }
    pMIDIStream->pending = EAS_FALSE;
    return EAS_SUCCESS;
}

/*----------------------------------------------------------------------------
 * ProcessMIDIMessage()
 *----------------------------------------------------------------------------
 * Purpose:
 * This function processes a typical MIDI message. All of the data has been received, just need
 * to take appropriate action.
 *
 * Inputs:
 *
 *
 * Outputs:
 *
 *
 * Side Effects:
 *
 *----------------------------------------------------------------------------
*/
static EAS_RESULT ProcessMIDIMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_INT parserMode)
{
    EAS_U8 channel;

    channel = pMIDIStream->status & 0x0f;
    switch (pMIDIStream->status & 0xf0)
    {
    case 0x80:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"NoteOff: %02x %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
        if (parserMode < eParserModeMute)
            VMStopNote(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
        break;

    case 0x90:
        if (pMIDIStream->d2)
        {
            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"NoteOn: %02x %02x %02x\n",
                pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
            pMIDIStream->flags |= MIDI_FLAG_FIRST_NOTE;
            if (parserMode == eParserModePlay)
                VMStartNote(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
        }
        else
        {
            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"NoteOff: %02x %02x %02x\n",
                pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
            if (parserMode < eParserModeMute)
                VMStopNote(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
        }
        break;

    case 0xa0:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"PolyPres: %02x %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
        break;

    case 0xb0:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"Control: %02x %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
        if (parserMode < eParserModeMute)
            VMControlChange(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
#ifdef JET_INTERFACE
        if (pMIDIStream->jetData & MIDI_FLAGS_JET_CB)
        {
            JET_Event(pEASData, pMIDIStream->jetData & (JET_EVENT_SEG_MASK | JET_EVENT_TRACK_MASK),
                channel, pMIDIStream->d1, pMIDIStream->d2);
        }
#endif
        break;

    case 0xc0:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"Program: %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1); */ }
        if (parserMode < eParserModeMute)
            VMProgramChange(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1);
        break;

    case 0xd0:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"ChanPres: %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1); */ }
        if (parserMode < eParserModeMute)
            VMChannelPressure(pSynth, channel, pMIDIStream->d1);
        break;

    case 0xe0:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"PBend: %02x %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
        if (parserMode < eParserModeMute)
            VMPitchBend(pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
        break;

    default:
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"Unknown: %02x %02x %02x\n",
            pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
    }
    return EAS_SUCCESS;
}

/*----------------------------------------------------------------------------
 * ProcessSysExMessage()
 *----------------------------------------------------------------------------
 * Purpose:
 * Process a SysEx character byte from the MIDI stream. Since we cannot
 * simply wait for the next character to arrive, we are forced to save
 * state after each character. It would be easier to parse at the file
 * level, but then we lose the nice feature of being able to support
 * these messages in a real-time MIDI stream.
 *
 * Inputs:
 * pEASData         - pointer to synthesizer instance data
 * c                - character to be processed
 * locating         - if true, the sequencer is relocating to a new position
 *
 * Outputs:
 *
 *
 * Side Effects:
 *
 * Notes:
 * These are the SysEx messages we can receive:
 *
 * SysEx messages
 * { f0 7e 7f 09 01 f7 } GM 1 On
 * { f0 7e 7f 09 02 f7 } GM 1/2 Off
 * { f0 7e 7f 09 03 f7 } GM 2 On
 * { f0 7f 7f 04 01 lsb msb } Master Volume
 * { f0 7f 7f 0b 01 ch mip [ch mip ...] f7 } SP-MIDI
 * { f0 00 01 3a 04 01 fdbk1 fdbk2 drive wet dry f7 } Enhancer
 *
 *----------------------------------------------------------------------------
*/
static EAS_RESULT ProcessSysExMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_U8 c, EAS_INT parserMode)
{

    /* check for start byte */
    if (c == 0xf0)
    {
        pMIDIStream->sysExState = eSysEx;
    }
    /* check for end byte */
    else if (c == 0xf7)
    {
        /* if this was a MIP message, update the MIP table */
        if ((pMIDIStream->sysExState == eSysExSPMIDIchan) && (parserMode != eParserModeMetaData))
            VMUpdateMIPTable(pEASData->pVoiceMgr, pSynth);
        pMIDIStream->sysExState = eSysExIgnore;
    }

    /* process SysEx message */
    else
    {
        switch (pMIDIStream->sysExState)
        {
        case eSysEx:

            /* first byte, determine message class */
            switch (c)
            {
            case 0x7e:
                pMIDIStream->sysExState = eSysExUnivNonRealTime;
                break;
            case 0x7f:
                pMIDIStream->sysExState = eSysExUnivRealTime;
                break;
            case 0x00:
                pMIDIStream->sysExState = eSysExMfgID1;
                break;
            default:
                pMIDIStream->sysExState = eSysExIgnore;
                break;
            }
            break;

        /* process GM message */
        case eSysExUnivNonRealTime:
            if (c == 0x7f)
                pMIDIStream->sysExState = eSysExUnivNrtTargetID;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExUnivNrtTargetID:
            if (c == 0x09)
                pMIDIStream->sysExState = eSysExGMControl;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExGMControl:
            if ((c == 1) || (c == 3))
            {
                /* GM 1 or GM2 On, reset synth */
                if (parserMode != eParserModeMetaData)
                {
                    pMIDIStream->flags |= MIDI_FLAG_GM_ON;
                    VMReset(pEASData->pVoiceMgr, pSynth, EAS_FALSE);
                    VMInitMIPTable(pSynth);
                }
                pMIDIStream->sysExState = eSysExEOX;
            }
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        /* Process Master Volume and SP-MIDI */
        case eSysExUnivRealTime:
            if (c == 0x7f)
                pMIDIStream->sysExState = eSysExUnivRtTargetID;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExUnivRtTargetID:
            if (c == 0x04)
                pMIDIStream->sysExState = eSysExDeviceControl;
            else if (c == 0x0b)
                pMIDIStream->sysExState = eSysExSPMIDI;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        /* process master volume */
        case eSysExDeviceControl:
            if (c == 0x01)
                pMIDIStream->sysExState = eSysExMasterVolume;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExMasterVolume:
            /* save LSB */
            pMIDIStream->d1 = c;
            pMIDIStream->sysExState = eSysExMasterVolLSB;
            break;

        case eSysExMasterVolLSB:
            if (parserMode != eParserModeMetaData)
            {
                EAS_I32 gain = ((EAS_I32) c << 8) | ((EAS_I32) pMIDIStream->d1 << 1);
                gain = (gain * gain) >> 15;
                VMSetVolume(pSynth, (EAS_U16) gain);
            }
            pMIDIStream->sysExState = eSysExEOX;
            break;

        /* process SP-MIDI MIP message */
        case eSysExSPMIDI:
            if (c == 0x01)
            {
                /* assume all channels are muted */
                if (parserMode != eParserModeMetaData)
                    VMInitMIPTable(pSynth);
                pMIDIStream->d1 = 0;
                pMIDIStream->sysExState = eSysExSPMIDIchan;
            }
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExSPMIDIchan:
            if (c < NUM_SYNTH_CHANNELS)
            {
                pMIDIStream->d2 = c;
                pMIDIStream->sysExState = eSysExSPMIDIMIP;
            }
            else
            {
                /* bad MIP message - unmute channels */
                if (parserMode != eParserModeMetaData)
                    VMInitMIPTable(pSynth);
                pMIDIStream->sysExState = eSysExIgnore;
            }
            break;

        case eSysExSPMIDIMIP:
            /* process MIP entry here */
            if (parserMode != eParserModeMetaData)
                VMSetMIPEntry(pEASData->pVoiceMgr, pSynth, pMIDIStream->d2, pMIDIStream->d1, c);
            pMIDIStream->sysExState = eSysExSPMIDIchan;

            /* if 16 channels received, update MIP table */
            if (++pMIDIStream->d1 == NUM_SYNTH_CHANNELS)
            {
                if (parserMode != eParserModeMetaData)
                    VMUpdateMIPTable(pEASData->pVoiceMgr, pSynth);
                pMIDIStream->sysExState = eSysExEOX;
            }
            break;

        /* process Enhancer */
        case eSysExMfgID1:
            if (c == 0x01)
                pMIDIStream->sysExState = eSysExMfgID1;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExMfgID2:
            if (c == 0x3a)
                pMIDIStream->sysExState = eSysExMfgID1;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExMfgID3:
            if (c == 0x04)
                pMIDIStream->sysExState = eSysExEnhancer;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExEnhancer:
            if (c == 0x01)
                pMIDIStream->sysExState = eSysExEnhancerSubID;
            else
                pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExEnhancerSubID:
            pMIDIStream->sysExState = eSysExEnhancerFeedback1;
            break;

        case eSysExEnhancerFeedback1:
            pMIDIStream->sysExState = eSysExEnhancerFeedback2;
            break;

        case eSysExEnhancerFeedback2:
            pMIDIStream->sysExState = eSysExEnhancerDrive;
            break;

        case eSysExEnhancerDrive:
            pMIDIStream->sysExState = eSysExEnhancerWet;
            break;

        case eSysExEnhancerWet:
            pMIDIStream->sysExState = eSysExEOX;
            break;

        case eSysExEOX:
            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Expected F7, received %02x\n", c); */ }
            pMIDIStream->sysExState = eSysExIgnore;
            break;

        case eSysExIgnore:
            break;

        default:
            pMIDIStream->sysExState = eSysExIgnore;
            break;
        }
    }

    if (pMIDIStream->sysExState == eSysExIgnore)
        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Ignoring SysEx byte %02x\n", c); */ }
    return EAS_SUCCESS;
} /* end ProcessSysExMessage */

