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