xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_midi.c (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker  *
3*f81fb7c4SAndroid Build Coastguard Worker  * File:
4*f81fb7c4SAndroid Build Coastguard Worker  * eas_midi.c
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * This file implements the MIDI stream parser. It is called by eas_smf.c to parse MIDI messages
8*f81fb7c4SAndroid Build Coastguard Worker  * that are streamed out of the file. It can also parse live MIDI streams.
9*f81fb7c4SAndroid Build Coastguard Worker  *
10*f81fb7c4SAndroid Build Coastguard Worker  * Copyright Sonic Network Inc. 2005
11*f81fb7c4SAndroid Build Coastguard Worker 
12*f81fb7c4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
13*f81fb7c4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
14*f81fb7c4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
15*f81fb7c4SAndroid Build Coastguard Worker  *
16*f81fb7c4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
17*f81fb7c4SAndroid Build Coastguard Worker  *
18*f81fb7c4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
19*f81fb7c4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
20*f81fb7c4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21*f81fb7c4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
22*f81fb7c4SAndroid Build Coastguard Worker  * limitations under the License.
23*f81fb7c4SAndroid Build Coastguard Worker  *
24*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
25*f81fb7c4SAndroid Build Coastguard Worker  * Revision Control:
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Revision: 794 $
27*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2007-08-01 00:08:48 -0700 (Wed, 01 Aug 2007) $
28*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
29*f81fb7c4SAndroid Build Coastguard Worker */
30*f81fb7c4SAndroid Build Coastguard Worker 
31*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
32*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
33*f81fb7c4SAndroid Build Coastguard Worker #include "eas_miditypes.h"
34*f81fb7c4SAndroid Build Coastguard Worker #include "eas_midi.h"
35*f81fb7c4SAndroid Build Coastguard Worker #include "eas_vm_protos.h"
36*f81fb7c4SAndroid Build Coastguard Worker #include "eas_parser.h"
37*f81fb7c4SAndroid Build Coastguard Worker 
38*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
39*f81fb7c4SAndroid Build Coastguard Worker #include "jet_data.h"
40*f81fb7c4SAndroid Build Coastguard Worker #endif
41*f81fb7c4SAndroid Build Coastguard Worker 
42*f81fb7c4SAndroid Build Coastguard Worker 
43*f81fb7c4SAndroid Build Coastguard Worker /* state enumerations for ProcessSysExMessage */
44*f81fb7c4SAndroid Build Coastguard Worker typedef enum
45*f81fb7c4SAndroid Build Coastguard Worker {
46*f81fb7c4SAndroid Build Coastguard Worker     eSysEx,
47*f81fb7c4SAndroid Build Coastguard Worker     eSysExUnivNonRealTime,
48*f81fb7c4SAndroid Build Coastguard Worker     eSysExUnivNrtTargetID,
49*f81fb7c4SAndroid Build Coastguard Worker     eSysExGMControl,
50*f81fb7c4SAndroid Build Coastguard Worker     eSysExUnivRealTime,
51*f81fb7c4SAndroid Build Coastguard Worker     eSysExUnivRtTargetID,
52*f81fb7c4SAndroid Build Coastguard Worker     eSysExDeviceControl,
53*f81fb7c4SAndroid Build Coastguard Worker     eSysExMasterVolume,
54*f81fb7c4SAndroid Build Coastguard Worker     eSysExMasterVolLSB,
55*f81fb7c4SAndroid Build Coastguard Worker     eSysExSPMIDI,
56*f81fb7c4SAndroid Build Coastguard Worker     eSysExSPMIDIchan,
57*f81fb7c4SAndroid Build Coastguard Worker     eSysExSPMIDIMIP,
58*f81fb7c4SAndroid Build Coastguard Worker     eSysExMfgID1,
59*f81fb7c4SAndroid Build Coastguard Worker     eSysExMfgID2,
60*f81fb7c4SAndroid Build Coastguard Worker     eSysExMfgID3,
61*f81fb7c4SAndroid Build Coastguard Worker     eSysExEnhancer,
62*f81fb7c4SAndroid Build Coastguard Worker     eSysExEnhancerSubID,
63*f81fb7c4SAndroid Build Coastguard Worker     eSysExEnhancerFeedback1,
64*f81fb7c4SAndroid Build Coastguard Worker     eSysExEnhancerFeedback2,
65*f81fb7c4SAndroid Build Coastguard Worker     eSysExEnhancerDrive,
66*f81fb7c4SAndroid Build Coastguard Worker     eSysExEnhancerWet,
67*f81fb7c4SAndroid Build Coastguard Worker     eSysExEOX,
68*f81fb7c4SAndroid Build Coastguard Worker     eSysExIgnore
69*f81fb7c4SAndroid Build Coastguard Worker } E_SYSEX_STATES;
70*f81fb7c4SAndroid Build Coastguard Worker 
71*f81fb7c4SAndroid Build Coastguard Worker /* local prototypes */
72*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ProcessMIDIMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_INT parserMode);
73*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ProcessSysExMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_U8 c, EAS_INT parserMode);
74*f81fb7c4SAndroid Build Coastguard Worker 
75*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
76*f81fb7c4SAndroid Build Coastguard Worker  * EAS_InitMIDIStream()
77*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
78*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
79*f81fb7c4SAndroid Build Coastguard Worker  * Initializes the MIDI stream state for parsing.
80*f81fb7c4SAndroid Build Coastguard Worker  *
81*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
82*f81fb7c4SAndroid Build Coastguard Worker  *
83*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
84*f81fb7c4SAndroid Build Coastguard Worker  * returns EAS_RESULT (EAS_SUCCESS is OK)
85*f81fb7c4SAndroid Build Coastguard Worker  *
86*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
87*f81fb7c4SAndroid Build Coastguard Worker  *
88*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
89*f81fb7c4SAndroid Build Coastguard Worker */
EAS_InitMIDIStream(S_MIDI_STREAM * pMIDIStream)90*f81fb7c4SAndroid Build Coastguard Worker void EAS_InitMIDIStream (S_MIDI_STREAM *pMIDIStream)
91*f81fb7c4SAndroid Build Coastguard Worker {
92*f81fb7c4SAndroid Build Coastguard Worker     pMIDIStream->byte3 = EAS_FALSE;
93*f81fb7c4SAndroid Build Coastguard Worker     pMIDIStream->pending = EAS_FALSE;
94*f81fb7c4SAndroid Build Coastguard Worker     pMIDIStream->runningStatus = 0;
95*f81fb7c4SAndroid Build Coastguard Worker     pMIDIStream->status = 0;
96*f81fb7c4SAndroid Build Coastguard Worker }
97*f81fb7c4SAndroid Build Coastguard Worker 
98*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
99*f81fb7c4SAndroid Build Coastguard Worker  * EAS_ParseMIDIStream()
100*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
101*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
102*f81fb7c4SAndroid Build Coastguard Worker  * Parses a MIDI input stream character by character. Characters are pushed (rather than pulled)
103*f81fb7c4SAndroid Build Coastguard Worker  * so the interface works equally well for both file and stream I/O.
104*f81fb7c4SAndroid Build Coastguard Worker  *
105*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
106*f81fb7c4SAndroid Build Coastguard Worker  * c            - character from MIDI stream
107*f81fb7c4SAndroid Build Coastguard Worker  *
108*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
109*f81fb7c4SAndroid Build Coastguard Worker  * returns EAS_RESULT (EAS_SUCCESS is OK)
110*f81fb7c4SAndroid Build Coastguard Worker  *
111*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
112*f81fb7c4SAndroid Build Coastguard Worker  *
113*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
114*f81fb7c4SAndroid Build Coastguard Worker */
EAS_ParseMIDIStream(S_EAS_DATA * pEASData,S_SYNTH * pSynth,S_MIDI_STREAM * pMIDIStream,EAS_U8 c,EAS_INT parserMode)115*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_ParseMIDIStream (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_U8 c, EAS_INT parserMode)
116*f81fb7c4SAndroid Build Coastguard Worker {
117*f81fb7c4SAndroid Build Coastguard Worker 
118*f81fb7c4SAndroid Build Coastguard Worker     /* check for new status byte */
119*f81fb7c4SAndroid Build Coastguard Worker     if (c & 0x80)
120*f81fb7c4SAndroid Build Coastguard Worker     {
121*f81fb7c4SAndroid Build Coastguard Worker         /* save new running status */
122*f81fb7c4SAndroid Build Coastguard Worker         if (c < 0xf8)
123*f81fb7c4SAndroid Build Coastguard Worker         {
124*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->runningStatus = c;
125*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->byte3 = EAS_FALSE;
126*f81fb7c4SAndroid Build Coastguard Worker 
127*f81fb7c4SAndroid Build Coastguard Worker             /* deal with SysEx */
128*f81fb7c4SAndroid Build Coastguard Worker             if ((c == 0xf7) || (c == 0xf0))
129*f81fb7c4SAndroid Build Coastguard Worker             {
130*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode == eParserModeMetaData)
131*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_SUCCESS;
132*f81fb7c4SAndroid Build Coastguard Worker                 return ProcessSysExMessage(pEASData, pSynth, pMIDIStream, c, parserMode);
133*f81fb7c4SAndroid Build Coastguard Worker             }
134*f81fb7c4SAndroid Build Coastguard Worker 
135*f81fb7c4SAndroid Build Coastguard Worker             /* inform the file parser that we're in the middle of a message */
136*f81fb7c4SAndroid Build Coastguard Worker             if ((c < 0xf4) || (c > 0xf6))
137*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->pending = EAS_TRUE;
138*f81fb7c4SAndroid Build Coastguard Worker         }
139*f81fb7c4SAndroid Build Coastguard Worker 
140*f81fb7c4SAndroid Build Coastguard Worker         /* real-time message - ignore it */
141*f81fb7c4SAndroid Build Coastguard Worker         return EAS_SUCCESS;
142*f81fb7c4SAndroid Build Coastguard Worker     }
143*f81fb7c4SAndroid Build Coastguard Worker 
144*f81fb7c4SAndroid Build Coastguard Worker     /* 3rd byte of a 3-byte message? */
145*f81fb7c4SAndroid Build Coastguard Worker     if (pMIDIStream->byte3)
146*f81fb7c4SAndroid Build Coastguard Worker     {
147*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->d2 = c;
148*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->byte3 = EAS_FALSE;
149*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->pending = EAS_FALSE;
150*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode == eParserModeMetaData)
151*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
152*f81fb7c4SAndroid Build Coastguard Worker         return ProcessMIDIMessage(pEASData, pSynth, pMIDIStream, parserMode);
153*f81fb7c4SAndroid Build Coastguard Worker     }
154*f81fb7c4SAndroid Build Coastguard Worker 
155*f81fb7c4SAndroid Build Coastguard Worker     /* check for status received */
156*f81fb7c4SAndroid Build Coastguard Worker     if (pMIDIStream->runningStatus)
157*f81fb7c4SAndroid Build Coastguard Worker     {
158*f81fb7c4SAndroid Build Coastguard Worker 
159*f81fb7c4SAndroid Build Coastguard Worker         /* save new status and data byte */
160*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->status = pMIDIStream->runningStatus;
161*f81fb7c4SAndroid Build Coastguard Worker 
162*f81fb7c4SAndroid Build Coastguard Worker         /* check for 3-byte messages */
163*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->status < 0xc0)
164*f81fb7c4SAndroid Build Coastguard Worker         {
165*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->d1 = c;
166*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->pending = EAS_TRUE;
167*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->byte3 = EAS_TRUE;
168*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
169*f81fb7c4SAndroid Build Coastguard Worker         }
170*f81fb7c4SAndroid Build Coastguard Worker 
171*f81fb7c4SAndroid Build Coastguard Worker         /* check for 2-byte messages */
172*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->status < 0xe0)
173*f81fb7c4SAndroid Build Coastguard Worker         {
174*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->d1 = c;
175*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->pending = EAS_FALSE;
176*f81fb7c4SAndroid Build Coastguard Worker             if (parserMode == eParserModeMetaData)
177*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_SUCCESS;
178*f81fb7c4SAndroid Build Coastguard Worker             return ProcessMIDIMessage(pEASData, pSynth, pMIDIStream, parserMode);
179*f81fb7c4SAndroid Build Coastguard Worker         }
180*f81fb7c4SAndroid Build Coastguard Worker 
181*f81fb7c4SAndroid Build Coastguard Worker         /* check for more 3-bytes message */
182*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->status < 0xf0)
183*f81fb7c4SAndroid Build Coastguard Worker         {
184*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->d1 = c;
185*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->pending = EAS_TRUE;
186*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->byte3 = EAS_TRUE;
187*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
188*f81fb7c4SAndroid Build Coastguard Worker         }
189*f81fb7c4SAndroid Build Coastguard Worker 
190*f81fb7c4SAndroid Build Coastguard Worker         /* SysEx message? */
191*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->status == 0xF0)
192*f81fb7c4SAndroid Build Coastguard Worker         {
193*f81fb7c4SAndroid Build Coastguard Worker             if (parserMode == eParserModeMetaData)
194*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_SUCCESS;
195*f81fb7c4SAndroid Build Coastguard Worker             return ProcessSysExMessage(pEASData, pSynth, pMIDIStream, c, parserMode);
196*f81fb7c4SAndroid Build Coastguard Worker         }
197*f81fb7c4SAndroid Build Coastguard Worker 
198*f81fb7c4SAndroid Build Coastguard Worker         /* remaining messages all clear running status */
199*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->runningStatus = 0;
200*f81fb7c4SAndroid Build Coastguard Worker 
201*f81fb7c4SAndroid Build Coastguard Worker         /* F2 is 3-byte message */
202*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->status == 0xf2)
203*f81fb7c4SAndroid Build Coastguard Worker         {
204*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->byte3 = EAS_TRUE;
205*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
206*f81fb7c4SAndroid Build Coastguard Worker         }
207*f81fb7c4SAndroid Build Coastguard Worker     }
208*f81fb7c4SAndroid Build Coastguard Worker 
209*f81fb7c4SAndroid Build Coastguard Worker     /* no status byte received, provide a warning, but we should be able to recover */
210*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Received MIDI data without a valid status byte: %d\n",c); */ }
211*f81fb7c4SAndroid Build Coastguard Worker     pMIDIStream->pending = EAS_FALSE;
212*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
213*f81fb7c4SAndroid Build Coastguard Worker }
214*f81fb7c4SAndroid Build Coastguard Worker 
215*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
216*f81fb7c4SAndroid Build Coastguard Worker  * ProcessMIDIMessage()
217*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
218*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
219*f81fb7c4SAndroid Build Coastguard Worker  * This function processes a typical MIDI message. All of the data has been received, just need
220*f81fb7c4SAndroid Build Coastguard Worker  * to take appropriate action.
221*f81fb7c4SAndroid Build Coastguard Worker  *
222*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
223*f81fb7c4SAndroid Build Coastguard Worker  *
224*f81fb7c4SAndroid Build Coastguard Worker  *
225*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
226*f81fb7c4SAndroid Build Coastguard Worker  *
227*f81fb7c4SAndroid Build Coastguard Worker  *
228*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
229*f81fb7c4SAndroid Build Coastguard Worker  *
230*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
231*f81fb7c4SAndroid Build Coastguard Worker */
ProcessMIDIMessage(S_EAS_DATA * pEASData,S_SYNTH * pSynth,S_MIDI_STREAM * pMIDIStream,EAS_INT parserMode)232*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ProcessMIDIMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_INT parserMode)
233*f81fb7c4SAndroid Build Coastguard Worker {
234*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 channel;
235*f81fb7c4SAndroid Build Coastguard Worker 
236*f81fb7c4SAndroid Build Coastguard Worker     channel = pMIDIStream->status & 0x0f;
237*f81fb7c4SAndroid Build Coastguard Worker     switch (pMIDIStream->status & 0xf0)
238*f81fb7c4SAndroid Build Coastguard Worker     {
239*f81fb7c4SAndroid Build Coastguard Worker     case 0x80:
240*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"NoteOff: %02x %02x %02x\n",
241*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
242*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode <= eParserModeMute)
243*f81fb7c4SAndroid Build Coastguard Worker             VMStopNote(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
244*f81fb7c4SAndroid Build Coastguard Worker         break;
245*f81fb7c4SAndroid Build Coastguard Worker 
246*f81fb7c4SAndroid Build Coastguard Worker     case 0x90:
247*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->d2)
248*f81fb7c4SAndroid Build Coastguard Worker         {
249*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"NoteOn: %02x %02x %02x\n",
250*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
251*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->flags |= MIDI_FLAG_FIRST_NOTE;
252*f81fb7c4SAndroid Build Coastguard Worker             if (parserMode == eParserModePlay)
253*f81fb7c4SAndroid Build Coastguard Worker                 VMStartNote(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
254*f81fb7c4SAndroid Build Coastguard Worker         }
255*f81fb7c4SAndroid Build Coastguard Worker         else
256*f81fb7c4SAndroid Build Coastguard Worker         {
257*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"NoteOff: %02x %02x %02x\n",
258*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
259*f81fb7c4SAndroid Build Coastguard Worker             if (parserMode <= eParserModeMute)
260*f81fb7c4SAndroid Build Coastguard Worker                 VMStopNote(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
261*f81fb7c4SAndroid Build Coastguard Worker         }
262*f81fb7c4SAndroid Build Coastguard Worker         break;
263*f81fb7c4SAndroid Build Coastguard Worker 
264*f81fb7c4SAndroid Build Coastguard Worker     case 0xa0:
265*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"PolyPres: %02x %02x %02x\n",
266*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
267*f81fb7c4SAndroid Build Coastguard Worker         break;
268*f81fb7c4SAndroid Build Coastguard Worker 
269*f81fb7c4SAndroid Build Coastguard Worker     case 0xb0:
270*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"Control: %02x %02x %02x\n",
271*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
272*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode <= eParserModeMute)
273*f81fb7c4SAndroid Build Coastguard Worker             VMControlChange(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
274*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
275*f81fb7c4SAndroid Build Coastguard Worker         if (pMIDIStream->jetData & MIDI_FLAGS_JET_CB)
276*f81fb7c4SAndroid Build Coastguard Worker         {
277*f81fb7c4SAndroid Build Coastguard Worker             JET_Event(pEASData, pMIDIStream->jetData & (JET_EVENT_SEG_MASK | JET_EVENT_TRACK_MASK),
278*f81fb7c4SAndroid Build Coastguard Worker                 channel, pMIDIStream->d1, pMIDIStream->d2);
279*f81fb7c4SAndroid Build Coastguard Worker         }
280*f81fb7c4SAndroid Build Coastguard Worker #endif
281*f81fb7c4SAndroid Build Coastguard Worker         break;
282*f81fb7c4SAndroid Build Coastguard Worker 
283*f81fb7c4SAndroid Build Coastguard Worker     case 0xc0:
284*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"Program: %02x %02x\n",
285*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1); */ }
286*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode <= eParserModeMute)
287*f81fb7c4SAndroid Build Coastguard Worker             VMProgramChange(pEASData->pVoiceMgr, pSynth, channel, pMIDIStream->d1);
288*f81fb7c4SAndroid Build Coastguard Worker         break;
289*f81fb7c4SAndroid Build Coastguard Worker 
290*f81fb7c4SAndroid Build Coastguard Worker     case 0xd0:
291*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"ChanPres: %02x %02x\n",
292*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1); */ }
293*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode <= eParserModeMute)
294*f81fb7c4SAndroid Build Coastguard Worker             VMChannelPressure(pSynth, channel, pMIDIStream->d1);
295*f81fb7c4SAndroid Build Coastguard Worker         break;
296*f81fb7c4SAndroid Build Coastguard Worker 
297*f81fb7c4SAndroid Build Coastguard Worker     case 0xe0:
298*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"PBend: %02x %02x %02x\n",
299*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
300*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode <= eParserModeMute)
301*f81fb7c4SAndroid Build Coastguard Worker             VMPitchBend(pSynth, channel, pMIDIStream->d1, pMIDIStream->d2);
302*f81fb7c4SAndroid Build Coastguard Worker         break;
303*f81fb7c4SAndroid Build Coastguard Worker 
304*f81fb7c4SAndroid Build Coastguard Worker     default:
305*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL,"Unknown: %02x %02x %02x\n",
306*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->status, pMIDIStream->d1, pMIDIStream->d2); */ }
307*f81fb7c4SAndroid Build Coastguard Worker     }
308*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
309*f81fb7c4SAndroid Build Coastguard Worker }
310*f81fb7c4SAndroid Build Coastguard Worker 
311*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
312*f81fb7c4SAndroid Build Coastguard Worker  * ProcessSysExMessage()
313*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
314*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
315*f81fb7c4SAndroid Build Coastguard Worker  * Process a SysEx character byte from the MIDI stream. Since we cannot
316*f81fb7c4SAndroid Build Coastguard Worker  * simply wait for the next character to arrive, we are forced to save
317*f81fb7c4SAndroid Build Coastguard Worker  * state after each character. It would be easier to parse at the file
318*f81fb7c4SAndroid Build Coastguard Worker  * level, but then we lose the nice feature of being able to support
319*f81fb7c4SAndroid Build Coastguard Worker  * these messages in a real-time MIDI stream.
320*f81fb7c4SAndroid Build Coastguard Worker  *
321*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
322*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to synthesizer instance data
323*f81fb7c4SAndroid Build Coastguard Worker  * c                - character to be processed
324*f81fb7c4SAndroid Build Coastguard Worker  * locating         - if true, the sequencer is relocating to a new position
325*f81fb7c4SAndroid Build Coastguard Worker  *
326*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
327*f81fb7c4SAndroid Build Coastguard Worker  *
328*f81fb7c4SAndroid Build Coastguard Worker  *
329*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
330*f81fb7c4SAndroid Build Coastguard Worker  *
331*f81fb7c4SAndroid Build Coastguard Worker  * Notes:
332*f81fb7c4SAndroid Build Coastguard Worker  * These are the SysEx messages we can receive:
333*f81fb7c4SAndroid Build Coastguard Worker  *
334*f81fb7c4SAndroid Build Coastguard Worker  * SysEx messages
335*f81fb7c4SAndroid Build Coastguard Worker  * { f0 7e 7f 09 01 f7 } GM 1 On
336*f81fb7c4SAndroid Build Coastguard Worker  * { f0 7e 7f 09 02 f7 } GM 1/2 Off
337*f81fb7c4SAndroid Build Coastguard Worker  * { f0 7e 7f 09 03 f7 } GM 2 On
338*f81fb7c4SAndroid Build Coastguard Worker  * { f0 7f 7f 04 01 lsb msb } Master Volume
339*f81fb7c4SAndroid Build Coastguard Worker  * { f0 7f 7f 0b 01 ch mip [ch mip ...] f7 } SP-MIDI
340*f81fb7c4SAndroid Build Coastguard Worker  * { f0 00 01 3a 04 01 fdbk1 fdbk2 drive wet dry f7 } Enhancer
341*f81fb7c4SAndroid Build Coastguard Worker  *
342*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
343*f81fb7c4SAndroid Build Coastguard Worker */
ProcessSysExMessage(S_EAS_DATA * pEASData,S_SYNTH * pSynth,S_MIDI_STREAM * pMIDIStream,EAS_U8 c,EAS_INT parserMode)344*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ProcessSysExMessage (S_EAS_DATA *pEASData, S_SYNTH *pSynth, S_MIDI_STREAM *pMIDIStream, EAS_U8 c, EAS_INT parserMode)
345*f81fb7c4SAndroid Build Coastguard Worker {
346*f81fb7c4SAndroid Build Coastguard Worker 
347*f81fb7c4SAndroid Build Coastguard Worker     /* check for start byte */
348*f81fb7c4SAndroid Build Coastguard Worker     if (c == 0xf0)
349*f81fb7c4SAndroid Build Coastguard Worker     {
350*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->sysExState = eSysEx;
351*f81fb7c4SAndroid Build Coastguard Worker     }
352*f81fb7c4SAndroid Build Coastguard Worker     /* check for end byte */
353*f81fb7c4SAndroid Build Coastguard Worker     else if (c == 0xf7)
354*f81fb7c4SAndroid Build Coastguard Worker     {
355*f81fb7c4SAndroid Build Coastguard Worker         /* if this was a MIP message, update the MIP table */
356*f81fb7c4SAndroid Build Coastguard Worker         if ((pMIDIStream->sysExState == eSysExSPMIDIchan) && (parserMode != eParserModeMetaData))
357*f81fb7c4SAndroid Build Coastguard Worker             VMUpdateMIPTable(pEASData->pVoiceMgr, pSynth);
358*f81fb7c4SAndroid Build Coastguard Worker         pMIDIStream->sysExState = eSysExIgnore;
359*f81fb7c4SAndroid Build Coastguard Worker     }
360*f81fb7c4SAndroid Build Coastguard Worker 
361*f81fb7c4SAndroid Build Coastguard Worker     /* process SysEx message */
362*f81fb7c4SAndroid Build Coastguard Worker     else
363*f81fb7c4SAndroid Build Coastguard Worker     {
364*f81fb7c4SAndroid Build Coastguard Worker         switch (pMIDIStream->sysExState)
365*f81fb7c4SAndroid Build Coastguard Worker         {
366*f81fb7c4SAndroid Build Coastguard Worker         case eSysEx:
367*f81fb7c4SAndroid Build Coastguard Worker 
368*f81fb7c4SAndroid Build Coastguard Worker             /* first byte, determine message class */
369*f81fb7c4SAndroid Build Coastguard Worker             switch (c)
370*f81fb7c4SAndroid Build Coastguard Worker             {
371*f81fb7c4SAndroid Build Coastguard Worker             case 0x7e:
372*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExUnivNonRealTime;
373*f81fb7c4SAndroid Build Coastguard Worker                 break;
374*f81fb7c4SAndroid Build Coastguard Worker             case 0x7f:
375*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExUnivRealTime;
376*f81fb7c4SAndroid Build Coastguard Worker                 break;
377*f81fb7c4SAndroid Build Coastguard Worker             case 0x00:
378*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExMfgID1;
379*f81fb7c4SAndroid Build Coastguard Worker                 break;
380*f81fb7c4SAndroid Build Coastguard Worker             default:
381*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
382*f81fb7c4SAndroid Build Coastguard Worker                 break;
383*f81fb7c4SAndroid Build Coastguard Worker             }
384*f81fb7c4SAndroid Build Coastguard Worker             break;
385*f81fb7c4SAndroid Build Coastguard Worker 
386*f81fb7c4SAndroid Build Coastguard Worker         /* process GM message */
387*f81fb7c4SAndroid Build Coastguard Worker         case eSysExUnivNonRealTime:
388*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x7f)
389*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExUnivNrtTargetID;
390*f81fb7c4SAndroid Build Coastguard Worker             else
391*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
392*f81fb7c4SAndroid Build Coastguard Worker             break;
393*f81fb7c4SAndroid Build Coastguard Worker 
394*f81fb7c4SAndroid Build Coastguard Worker         case eSysExUnivNrtTargetID:
395*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x09)
396*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExGMControl;
397*f81fb7c4SAndroid Build Coastguard Worker             else
398*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
399*f81fb7c4SAndroid Build Coastguard Worker             break;
400*f81fb7c4SAndroid Build Coastguard Worker 
401*f81fb7c4SAndroid Build Coastguard Worker         case eSysExGMControl:
402*f81fb7c4SAndroid Build Coastguard Worker             if ((c == 1) || (c == 3))
403*f81fb7c4SAndroid Build Coastguard Worker             {
404*f81fb7c4SAndroid Build Coastguard Worker                 /* GM 1 or GM2 On, reset synth */
405*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode != eParserModeMetaData)
406*f81fb7c4SAndroid Build Coastguard Worker                 {
407*f81fb7c4SAndroid Build Coastguard Worker                     pMIDIStream->flags |= MIDI_FLAG_GM_ON;
408*f81fb7c4SAndroid Build Coastguard Worker                     VMReset(pEASData->pVoiceMgr, pSynth, EAS_FALSE);
409*f81fb7c4SAndroid Build Coastguard Worker                     VMInitMIPTable(pSynth);
410*f81fb7c4SAndroid Build Coastguard Worker                 }
411*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExEOX;
412*f81fb7c4SAndroid Build Coastguard Worker             }
413*f81fb7c4SAndroid Build Coastguard Worker             else
414*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
415*f81fb7c4SAndroid Build Coastguard Worker             break;
416*f81fb7c4SAndroid Build Coastguard Worker 
417*f81fb7c4SAndroid Build Coastguard Worker         /* Process Master Volume and SP-MIDI */
418*f81fb7c4SAndroid Build Coastguard Worker         case eSysExUnivRealTime:
419*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x7f)
420*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExUnivRtTargetID;
421*f81fb7c4SAndroid Build Coastguard Worker             else
422*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
423*f81fb7c4SAndroid Build Coastguard Worker             break;
424*f81fb7c4SAndroid Build Coastguard Worker 
425*f81fb7c4SAndroid Build Coastguard Worker         case eSysExUnivRtTargetID:
426*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x04)
427*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExDeviceControl;
428*f81fb7c4SAndroid Build Coastguard Worker             else if (c == 0x0b)
429*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExSPMIDI;
430*f81fb7c4SAndroid Build Coastguard Worker             else
431*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
432*f81fb7c4SAndroid Build Coastguard Worker             break;
433*f81fb7c4SAndroid Build Coastguard Worker 
434*f81fb7c4SAndroid Build Coastguard Worker         /* process master volume */
435*f81fb7c4SAndroid Build Coastguard Worker         case eSysExDeviceControl:
436*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x01)
437*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExMasterVolume;
438*f81fb7c4SAndroid Build Coastguard Worker             else
439*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
440*f81fb7c4SAndroid Build Coastguard Worker             break;
441*f81fb7c4SAndroid Build Coastguard Worker 
442*f81fb7c4SAndroid Build Coastguard Worker         case eSysExMasterVolume:
443*f81fb7c4SAndroid Build Coastguard Worker             /* save LSB */
444*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->d1 = c;
445*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExMasterVolLSB;
446*f81fb7c4SAndroid Build Coastguard Worker             break;
447*f81fb7c4SAndroid Build Coastguard Worker 
448*f81fb7c4SAndroid Build Coastguard Worker         case eSysExMasterVolLSB:
449*f81fb7c4SAndroid Build Coastguard Worker             if (parserMode != eParserModeMetaData)
450*f81fb7c4SAndroid Build Coastguard Worker             {
451*f81fb7c4SAndroid Build Coastguard Worker                 EAS_I32 gain = ((EAS_I32) c << 8) | ((EAS_I32) pMIDIStream->d1 << 1);
452*f81fb7c4SAndroid Build Coastguard Worker                 gain = (gain * gain) >> 15;
453*f81fb7c4SAndroid Build Coastguard Worker                 VMSetVolume(pSynth, (EAS_U16) gain);
454*f81fb7c4SAndroid Build Coastguard Worker             }
455*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExEOX;
456*f81fb7c4SAndroid Build Coastguard Worker             break;
457*f81fb7c4SAndroid Build Coastguard Worker 
458*f81fb7c4SAndroid Build Coastguard Worker         /* process SP-MIDI MIP message */
459*f81fb7c4SAndroid Build Coastguard Worker         case eSysExSPMIDI:
460*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x01)
461*f81fb7c4SAndroid Build Coastguard Worker             {
462*f81fb7c4SAndroid Build Coastguard Worker                 /* assume all channels are muted */
463*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode != eParserModeMetaData)
464*f81fb7c4SAndroid Build Coastguard Worker                     VMInitMIPTable(pSynth);
465*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->d1 = 0;
466*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExSPMIDIchan;
467*f81fb7c4SAndroid Build Coastguard Worker             }
468*f81fb7c4SAndroid Build Coastguard Worker             else
469*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
470*f81fb7c4SAndroid Build Coastguard Worker             break;
471*f81fb7c4SAndroid Build Coastguard Worker 
472*f81fb7c4SAndroid Build Coastguard Worker         case eSysExSPMIDIchan:
473*f81fb7c4SAndroid Build Coastguard Worker             if (c < NUM_SYNTH_CHANNELS)
474*f81fb7c4SAndroid Build Coastguard Worker             {
475*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->d2 = c;
476*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExSPMIDIMIP;
477*f81fb7c4SAndroid Build Coastguard Worker             }
478*f81fb7c4SAndroid Build Coastguard Worker             else
479*f81fb7c4SAndroid Build Coastguard Worker             {
480*f81fb7c4SAndroid Build Coastguard Worker                 /* bad MIP message - unmute channels */
481*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode != eParserModeMetaData)
482*f81fb7c4SAndroid Build Coastguard Worker                     VMInitMIPTable(pSynth);
483*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
484*f81fb7c4SAndroid Build Coastguard Worker             }
485*f81fb7c4SAndroid Build Coastguard Worker             break;
486*f81fb7c4SAndroid Build Coastguard Worker 
487*f81fb7c4SAndroid Build Coastguard Worker         case eSysExSPMIDIMIP:
488*f81fb7c4SAndroid Build Coastguard Worker             /* process MIP entry here */
489*f81fb7c4SAndroid Build Coastguard Worker             if (parserMode != eParserModeMetaData)
490*f81fb7c4SAndroid Build Coastguard Worker                 VMSetMIPEntry(pEASData->pVoiceMgr, pSynth, pMIDIStream->d2, pMIDIStream->d1, c);
491*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExSPMIDIchan;
492*f81fb7c4SAndroid Build Coastguard Worker 
493*f81fb7c4SAndroid Build Coastguard Worker             /* if 16 channels received, update MIP table */
494*f81fb7c4SAndroid Build Coastguard Worker             if (++pMIDIStream->d1 == NUM_SYNTH_CHANNELS)
495*f81fb7c4SAndroid Build Coastguard Worker             {
496*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode != eParserModeMetaData)
497*f81fb7c4SAndroid Build Coastguard Worker                     VMUpdateMIPTable(pEASData->pVoiceMgr, pSynth);
498*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExEOX;
499*f81fb7c4SAndroid Build Coastguard Worker             }
500*f81fb7c4SAndroid Build Coastguard Worker             break;
501*f81fb7c4SAndroid Build Coastguard Worker 
502*f81fb7c4SAndroid Build Coastguard Worker         /* process Enhancer */
503*f81fb7c4SAndroid Build Coastguard Worker         case eSysExMfgID1:
504*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x01)
505*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExMfgID1;
506*f81fb7c4SAndroid Build Coastguard Worker             else
507*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
508*f81fb7c4SAndroid Build Coastguard Worker             break;
509*f81fb7c4SAndroid Build Coastguard Worker 
510*f81fb7c4SAndroid Build Coastguard Worker         case eSysExMfgID2:
511*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x3a)
512*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExMfgID1;
513*f81fb7c4SAndroid Build Coastguard Worker             else
514*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
515*f81fb7c4SAndroid Build Coastguard Worker             break;
516*f81fb7c4SAndroid Build Coastguard Worker 
517*f81fb7c4SAndroid Build Coastguard Worker         case eSysExMfgID3:
518*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x04)
519*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExEnhancer;
520*f81fb7c4SAndroid Build Coastguard Worker             else
521*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
522*f81fb7c4SAndroid Build Coastguard Worker             break;
523*f81fb7c4SAndroid Build Coastguard Worker 
524*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEnhancer:
525*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0x01)
526*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExEnhancerSubID;
527*f81fb7c4SAndroid Build Coastguard Worker             else
528*f81fb7c4SAndroid Build Coastguard Worker                 pMIDIStream->sysExState = eSysExIgnore;
529*f81fb7c4SAndroid Build Coastguard Worker             break;
530*f81fb7c4SAndroid Build Coastguard Worker 
531*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEnhancerSubID:
532*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExEnhancerFeedback1;
533*f81fb7c4SAndroid Build Coastguard Worker             break;
534*f81fb7c4SAndroid Build Coastguard Worker 
535*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEnhancerFeedback1:
536*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExEnhancerFeedback2;
537*f81fb7c4SAndroid Build Coastguard Worker             break;
538*f81fb7c4SAndroid Build Coastguard Worker 
539*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEnhancerFeedback2:
540*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExEnhancerDrive;
541*f81fb7c4SAndroid Build Coastguard Worker             break;
542*f81fb7c4SAndroid Build Coastguard Worker 
543*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEnhancerDrive:
544*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExEnhancerWet;
545*f81fb7c4SAndroid Build Coastguard Worker             break;
546*f81fb7c4SAndroid Build Coastguard Worker 
547*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEnhancerWet:
548*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExEOX;
549*f81fb7c4SAndroid Build Coastguard Worker             break;
550*f81fb7c4SAndroid Build Coastguard Worker 
551*f81fb7c4SAndroid Build Coastguard Worker         case eSysExEOX:
552*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Expected F7, received %02x\n", c); */ }
553*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExIgnore;
554*f81fb7c4SAndroid Build Coastguard Worker             break;
555*f81fb7c4SAndroid Build Coastguard Worker 
556*f81fb7c4SAndroid Build Coastguard Worker         case eSysExIgnore:
557*f81fb7c4SAndroid Build Coastguard Worker             break;
558*f81fb7c4SAndroid Build Coastguard Worker 
559*f81fb7c4SAndroid Build Coastguard Worker         default:
560*f81fb7c4SAndroid Build Coastguard Worker             pMIDIStream->sysExState = eSysExIgnore;
561*f81fb7c4SAndroid Build Coastguard Worker             break;
562*f81fb7c4SAndroid Build Coastguard Worker         }
563*f81fb7c4SAndroid Build Coastguard Worker     }
564*f81fb7c4SAndroid Build Coastguard Worker 
565*f81fb7c4SAndroid Build Coastguard Worker     if (pMIDIStream->sysExState == eSysExIgnore)
566*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Ignoring SysEx byte %02x\n", c); */ }
567*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
568*f81fb7c4SAndroid Build Coastguard Worker } /* end ProcessSysExMessage */
569*f81fb7c4SAndroid Build Coastguard Worker 
570