1 /*----------------------------------------------------------------------------
2  *
3  * File:
4  * eas_vm_protos.h
5  *
6  * Contents and purpose:
7  * Declarations, interfaces, and prototypes for voice manager.
8  *
9  * Copyright Sonic Network Inc. 2004
10 
11  * Licensed under the Apache License, Version 2.0 (the "License");
12  * you may not use this file except in compliance with the License.
13  * You may obtain a copy of the License at
14  *
15  *      http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS,
19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  * See the License for the specific language governing permissions and
21  * limitations under the License.
22  *
23  *----------------------------------------------------------------------------
24  * Revision Control:
25  *   $Revision: 736 $
26  *   $Date: 2007-06-22 13:51:24 -0700 (Fri, 22 Jun 2007) $
27  *----------------------------------------------------------------------------
28 */
29 
30 #ifndef _EAS_VM_PROTOS_H
31 #define _EAS_VM_PROTOS_H
32 
33 // includes
34 #include "eas_data.h"
35 #include "eas_sndlib.h"
36 
37 /*----------------------------------------------------------------------------
38  * VMInitialize()
39  *----------------------------------------------------------------------------
40  * Purpose:
41  *
42  * Inputs:
43  * psEASData - pointer to overall EAS data structure
44  *
45  * Outputs:
46  *
47  *----------------------------------------------------------------------------
48 */
49 EAS_RESULT VMInitialize (S_EAS_DATA *pEASData);
50 
51 /*----------------------------------------------------------------------------
52  * VMInitMIDI()
53  *----------------------------------------------------------------------------
54  * Purpose:
55  *
56  * Inputs:
57  * psEASData - pointer to overall EAS data structure
58  *
59  * Outputs:
60  *
61  *----------------------------------------------------------------------------
62 */
63 EAS_RESULT VMInitMIDI (S_EAS_DATA *pEASData, S_SYNTH **ppSynth);
64 
65 /*----------------------------------------------------------------------------
66  * VMInitializeAllChannels()
67  *----------------------------------------------------------------------------
68  * Purpose:
69  *
70  * Inputs:
71  * psEASData - pointer to overall EAS data structure
72  *
73  * Outputs:
74  *
75  *----------------------------------------------------------------------------
76 */
77 void VMInitializeAllChannels (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth);
78 
79 /*----------------------------------------------------------------------------
80  * VMResetControllers()
81  *----------------------------------------------------------------------------
82  * Purpose:
83  *
84  * Inputs:
85  * psEASData - pointer to overall EAS data structure
86  *
87  * Outputs:
88  *
89  *----------------------------------------------------------------------------
90 */
91 void VMResetControllers (S_SYNTH *pSynth);
92 
93 /*----------------------------------------------------------------------------
94  * VMInitMIPTable()
95  *----------------------------------------------------------------------------
96  * Purpose:
97  * Initialize the SP-MIDI MIP table
98  *
99  * Inputs:
100  * pEASData         - pointer to synthesizer instance data
101  * mute             - EAS_FALSE to unmute channels, EAS_TRUE to mute
102  *
103  * Outputs:
104  *
105  *
106  * Side Effects:
107  *
108  *----------------------------------------------------------------------------
109 */
110 void VMInitMIPTable (S_SYNTH *pSynth);
111 
112 /*----------------------------------------------------------------------------
113  * VMSetMIPEntry()
114  *----------------------------------------------------------------------------
115  * Purpose:
116  * Sets the priority and MIP level for a MIDI channel
117  *
118  * Inputs:
119  * pEASData         - pointer to synthesizer instance data
120  * channel          - MIDI channel number
121  * priority         - priority (0-15 with 0 = highest priority)
122  * mip              - maximum instantaneous polyphony
123  *
124  * Outputs:
125  *
126  *
127  * Side Effects:
128  *
129  *----------------------------------------------------------------------------
130 */
131 void VMSetMIPEntry (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 priority, EAS_U8 mip);
132 
133 /*----------------------------------------------------------------------------
134  * VMUpdateMIPTable()
135  *----------------------------------------------------------------------------
136  * Purpose:
137  * This routine is called when the polyphony count in the synthesizer changes
138  *
139  * Inputs:
140  * pEASData         - pointer to synthesizer instance data
141  *
142  * Outputs:
143  *
144  *
145  * Side Effects:
146  *
147  *----------------------------------------------------------------------------
148 */
149 void VMUpdateMIPTable (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth);
150 
151 /*----------------------------------------------------------------------------
152  * VMInitializeAllVoices()
153  *----------------------------------------------------------------------------
154  * Purpose:
155  *
156  * Inputs:
157  * psEASData - pointer to overall EAS data structure
158  *
159  * Outputs:
160  *
161  *----------------------------------------------------------------------------
162 */
163 void VMInitializeAllVoices (S_VOICE_MGR *pVoiceMgr, EAS_INT vSynthNum);
164 
165 /*----------------------------------------------------------------------------
166  * VMStartNote()
167  *----------------------------------------------------------------------------
168  * Purpose:
169  * Update the synth's state to play the requested note on the requested
170  * channel if possible.
171  *
172  * Inputs:
173  * nChannel - the MIDI channel
174  * nKeyNumber - the MIDI key number for this note
175  * nNoteVelocity - the key velocity for this note
176  * psEASData - pointer to overall EAS data structure
177  *
178  * Outputs:
179  *
180  *----------------------------------------------------------------------------
181 */
182 void VMStartNote (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 note, EAS_U8 velocity);
183 
184 /*----------------------------------------------------------------------------
185  * VMCheckKeyGroup()
186  *----------------------------------------------------------------------------
187  * Purpose:
188  * If the note that we've been asked to start is in the same key group as
189  * any currently playing notes, then we must shut down the currently playing
190  * note in the same key group and then start the newly requested note.
191  *
192  * Inputs:
193  * nChannel - synth channel that wants to start a new note
194  * nKeyNumber - new note's midi note number
195  * nRegionIndex - calling routine finds this index and gives to us
196  * nNoteVelocity - new note's velocity
197  * psEASData - pointer to overall EAS data structure
198  *
199  * Outputs:
200  * pbVoiceStealingRequired - flag: this routine sets true if we needed to
201  *                                 steal a voice
202  *
203  * Side Effects:
204  * gsSynthObject.m_sVoice[free voice num].m_nKeyNumber may be assigned
205  * gsSynthObject.m_sVoice[free voice num].m_nVelocity may be assigned
206  *----------------------------------------------------------------------------
207 */
208 void VMCheckKeyGroup (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U16 keyGroup, EAS_U8 channel);
209 
210 /*----------------------------------------------------------------------------
211  * VMCheckPolyphonyLimiting()
212  *----------------------------------------------------------------------------
213  * Purpose:
214  * We only play at most 2 of the same note on a MIDI channel.
215  * E.g., if we are asked to start note 36, and there are already two voices
216  * that are playing note 36, then we must steal the voice playing
217  * the oldest note 36 and use that stolen voice to play the new note 36.
218  *
219  * Inputs:
220  * nChannel - synth channel that wants to start a new note
221  * nKeyNumber - new note's midi note number
222  * nNoteVelocity - new note's velocity
223  * psEASData - pointer to overall EAS data structure
224  *
225  * Outputs:
226  * pbVoiceStealingRequired - flag: this routine sets true if we needed to
227  *                                 steal a voice
228  * *
229  * Side Effects:
230  * psSynthObject->m_sVoice[free voice num].m_nKeyNumber may be assigned
231  * psSynthObject->m_sVoice[free voice num].m_nVelocity may be assigned
232  *----------------------------------------------------------------------------
233 */
234 EAS_BOOL VMCheckPolyphonyLimiting (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 note, EAS_U8 velocity, EAS_U16 regionIndex, EAS_I32 lowVoice, EAS_I32 highVoice);
235 
236 /*----------------------------------------------------------------------------
237  * VMStopNote()
238  *----------------------------------------------------------------------------
239  * Purpose:
240  * Update the synth's state to end the requested note on the requested
241  * channel.
242  *
243  * Inputs:
244  * nChannel - the MIDI channel
245  * nKeyNumber - the key number of the note to stop
246  * nNoteVelocity - the note-off velocity
247  * psEASData - pointer to overall EAS data structure
248  *
249  * Outputs:
250  * Side Effects:
251  * gsSynthObject.m_sVoice[free voice num].m_nSynthChannel may be assigned
252  * gsSynthObject.m_sVoice[free voice num].m_nKeyNumber is assigned
253  * gsSynthObject.m_sVoice[free voice num].m_nVelocity is assigned
254  *----------------------------------------------------------------------------
255 */
256 void VMStopNote (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 key, EAS_U8 velocity);
257 
258 /*----------------------------------------------------------------------------
259  * VMFindAvailableVoice()
260  *----------------------------------------------------------------------------
261  * Purpose:
262  * Find an available voice and return the voice number if available.
263  *
264  * Inputs:
265  * pnVoiceNumber - really an output, see below
266  * psEASData - pointer to overall EAS data structure
267  *
268  * Outputs:
269  * pnVoiceNumber - returns the voice number of available voice if found
270  * success - if there is an available voice
271  * failure - otherwise
272  *----------------------------------------------------------------------------
273 */
274 EAS_RESULT VMFindAvailableVoice (S_VOICE_MGR *pVoiceMgr, EAS_INT *pVoiceNumber, EAS_I32 lowVoice, EAS_I32 highVoice);
275 
276 /*----------------------------------------------------------------------------
277  * VMStealVoice()
278  *----------------------------------------------------------------------------
279  * Purpose:
280  * Steal a voice and return the voice number
281  *
282  * Stealing algorithm: steal the best choice with minimal work, taking into
283  * account SP-Midi channel priorities and polyphony allocation.
284  *
285  * In one pass through all the voices, figure out which voice to steal
286  * taking into account a number of different factors:
287  * Priority of the voice's MIDI channel
288  * Number of voices over the polyphony allocation for voice's MIDI channel
289  * Amplitude of the voice
290  * Note age
291  * Key velocity (for voices that haven't been started yet)
292  * If any matching notes are found
293  *
294  * Inputs:
295  * nChannel - the channel that this voice wants to be started on
296  * nKeyNumber - the key number for this new voice
297  * psEASData - pointer to overall EAS data structure
298  *
299  * Outputs:
300  * pnVoiceNumber - voice stolen
301  * EAS_RESULT EAS_SUCCESS - always successful
302  *----------------------------------------------------------------------------
303 */
304 EAS_RESULT VMStealVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_INT *pVoiceNumber, EAS_U8 channel, EAS_U8 note, EAS_I32 lowVoice, EAS_I32 highVoice);
305 
306 /*----------------------------------------------------------------------------
307  * VMAddSamples()
308  *----------------------------------------------------------------------------
309  * Purpose:
310  * Synthesize the requested number of samples.
311  *
312  * Inputs:
313  * nNumSamplesToAdd - number of samples to write to buffer
314  * psEASData - pointer to overall EAS data structure
315  *
316  * Outputs:
317  * number of samples actually written to buffer
318  *
319  * Side Effects:
320  * - samples are added to the presently free buffer
321  *
322  *----------------------------------------------------------------------------
323 */
324 EAS_I32 VMAddSamples (S_VOICE_MGR *pVoiceMgr, EAS_I32 *pMixBuffer, EAS_I32 numSamplesToAdd);
325 
326 /*----------------------------------------------------------------------------
327  * VMProgramChange()
328  *----------------------------------------------------------------------------
329  * Purpose:
330  * Change the instrument (program) for the given channel.
331  *
332  * Depending on the program number, and the bank selected for this channel, the
333  * program may be in ROM, RAM (from SMAF or CMX related RAM wavetable), or
334  * Alternate wavetable (from mobile DLS or other DLS file)
335  *
336  * This function figures out what wavetable should be used, and sets it up as the
337  * wavetable to use for this channel. Also the channel may switch from a melodic
338  * channel to a rhythm channel, or vice versa.
339  *
340  * Inputs:
341  *
342  * Outputs:
343  * Side Effects:
344  * gsSynthObject.m_sChannel[nChannel].m_nProgramNumber is likely changed
345  * gsSynthObject.m_sChannel[nChannel].m_psEAS may be changed
346  * gsSynthObject.m_sChannel[nChannel].m_bRhythmChannel may be changed
347  *
348  *----------------------------------------------------------------------------
349 */
350 void VMProgramChange (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 program);
351 
352 /*----------------------------------------------------------------------------
353  * VMChannelPressure()
354  *----------------------------------------------------------------------------
355  * Purpose:
356  * Change the channel pressure for the given channel
357  *
358  * Inputs:
359  * nChannel - the MIDI channel
360  * nVelocity - the channel pressure value
361  * psEASData - pointer to overall EAS data structure
362  *
363  * Outputs:
364  * Side Effects:
365  * gsSynthObject.m_sChannel[nChannel].m_nChannelPressure is updated
366  *----------------------------------------------------------------------------
367 */
368 void VMChannelPressure (S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 value);
369 
370 /*----------------------------------------------------------------------------
371  * VMPitchBend()
372  *----------------------------------------------------------------------------
373  * Purpose:
374  * Change the pitch wheel value for the given channel.
375  * This routine constructs the proper 14-bit argument when the calling routine
376  * passes the pitch LSB and MSB.
377  *
378  * Note: some midi disassemblers display a bipolar pitch bend value.
379  * We can display the bipolar value using
380  * if m_nPitchBend >= 0x2000
381  *      bipolar pitch bend = postive (m_nPitchBend - 0x2000)
382  * else
383  *      bipolar pitch bend = negative (0x2000 - m_nPitchBend)
384  *
385  * Inputs:
386  * nChannel - the MIDI channel
387  * nPitchLSB - the LSB byte from the pitch bend message
388  * nPitchMSB - the MSB byte from the message
389  * psEASData - pointer to overall EAS data structure
390  *
391  * Outputs:
392  *
393  * Side Effects:
394  * gsSynthObject.m_sChannel[nChannel].m_nPitchBend is changed
395  *
396  *----------------------------------------------------------------------------
397 */
398 void VMPitchBend (S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 pitchLSB, EAS_U8 pitchMSB);
399 
400 /*----------------------------------------------------------------------------
401  * VMControlChange()
402  *----------------------------------------------------------------------------
403  * Purpose:
404  * Change the controller (or mode) for the given channel.
405  *
406  * Inputs:
407  * nChannel - the MIDI channel
408  * nControllerNumber - the controller number
409  * nControlValue - the controller number for this control change
410  * nControlValue - the value for this control change
411  * psEASData - pointer to overall EAS data structure
412  *
413  * Outputs:
414  * Side Effects:
415  * gsSynthObject.m_sChannel[nChannel] controller is changed
416  *
417  *----------------------------------------------------------------------------
418 */
419 void VMControlChange (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 controller, EAS_U8 value);
420 
421 /*----------------------------------------------------------------------------
422  * VMUpdateRPNStateMachine()
423  *----------------------------------------------------------------------------
424  * Purpose:
425  * Call this function when we want to parse a stream of RPN messages.
426  * NOTE: The synth has only one set of global RPN data instead of RPN data
427  * per channel.
428  * So actually, we don't really need to look at the nChannel parameter,
429  * but we pass it to facilitate future upgrades. Furthermore, we only
430  * support RPN0 (pitch bend sensitivity), RPN1 (fine tuning) and
431  * RPN2 (coarse tuning). Any other RPNs are rejected.
432  *
433  * Inputs:
434  * nChannel - the MIDI channel
435  * nControllerNumber - the RPN controller number
436  * nControlValue - the value for this control change
437  * psEASData - pointer to overall EAS data structure
438  *
439  * Outputs:
440  *
441  * Side Effects:
442  * gsSynthObject.m_RPN0 (or m_RPN1 or m_RPN2) may be updated if the
443  * proper RPN message sequence is parsed.
444  *----------------------------------------------------------------------------
445 */
446 EAS_RESULT VMUpdateRPNStateMachine (S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 controller, EAS_U8 value);
447 
448 /*----------------------------------------------------------------------------
449  * VMUpdateStaticChannelParameters()
450  *----------------------------------------------------------------------------
451  * Purpose:
452  * Update all of the static channel parameters for channels that have had
453  * a controller change values
454  * Or if the synth has signalled that all channels must forcibly
455  * be updated
456  *
457  * Inputs:
458  * psEASData - pointer to overall EAS data structure
459  *
460  * Outputs:
461  * none
462  *
463  * Side Effects:
464  * - psSynthObject->m_sChannel[].m_nStaticGain and m_nStaticPitch
465  * are updated for channels whose controller values have changed
466  * or if the synth has signalled that all channels must forcibly
467  * be updated
468  *----------------------------------------------------------------------------
469 */
470 void VMUpdateStaticChannelParameters (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth);
471 
472 /*----------------------------------------------------------------------------
473  * VMReleaseAllDeferredNoteOffs()
474  *----------------------------------------------------------------------------
475  * Purpose:
476  * Call this functin when the sustain flag is presently set but
477  * we are now transitioning from damper pedal on to
478  * damper pedal off. This means all notes in this channel
479  * that received a note off while the damper pedal was on, and
480  * had their note-off requests deferred, should now proceed to
481  * the release state.
482  *
483  * Inputs:
484  * nChannel - this channel has its sustain pedal transitioning from on to off
485  * psEASData - pointer to overall EAS data structure
486  *
487  * Outputs:
488  * Side Effects:
489  * any voice with deferred note offs on this channel are updated such that
490  *
491  *
492  *----------------------------------------------------------------------------
493 */
494 void VMReleaseAllDeferredNoteOffs (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel);
495 
496 /*----------------------------------------------------------------------------
497  * VMCatchNotesForSustainPedal()
498  *----------------------------------------------------------------------------
499  * Purpose:
500  * Call this function when the sustain flag is presently clear and
501  * the damper pedal is off and we are transitioning from damper pedal OFF to
502  * damper pedal ON. Currently sounding notes should be left
503  * unchanged. However, we should try to "catch" notes if possible.
504  * If any notes have levels >= sustain level, catch them,
505  * otherwise, let them continue to release.
506  *
507  * Inputs:
508  * nChannel - this channel has its sustain pedal transitioning from on to off
509  * psEASData - pointer to overall EAS data structure
510  *
511  * Outputs:
512  * Side Effects:
513  * any voice with deferred note offs on this channel are updated such that
514  * psVoice->m_sEG1.m_eState = eEnvelopeStateSustainPedal
515  *----------------------------------------------------------------------------
516 */
517 void VMCatchNotesForSustainPedal (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel);
518 
519 /*----------------------------------------------------------------------------
520  * VMUpdateAllNotesAge()
521  *----------------------------------------------------------------------------
522  * Purpose:
523  * Increment the note age for all voices older than the age of the voice
524  * that is stopping, effectively making the voices "younger".
525  *
526  * Inputs:
527  * nAge - age of voice that is going away
528  * psEASData - pointer to overall EAS data structure
529  *
530  * Outputs:
531  *
532  * Side Effects:
533  * m_nAge for some voices is incremented
534  *----------------------------------------------------------------------------
535 */
536 void VMUpdateAllNotesAge (S_VOICE_MGR *pVoiceMgr, EAS_U16 nAge);
537 
538 /*----------------------------------------------------------------------------
539  * VMFindRegionIndex()
540  *----------------------------------------------------------------------------
541  * Purpose:
542  * Find the region index for the given instrument using the midi key number
543  * and the RPN2 (coarse tuning) value. By using RPN2 as part of the
544  * region selection process, we reduce the amount a given sample has
545  * to be transposed by selecting the closest recorded root instead.
546  *
547  * Inputs:
548  * nChannel - current channel for this note
549  * nKeyNumber - current midi note number
550  * psEASData - pointer to overall EAS data structure
551  *
552  * Outputs:
553  * pnRegionIndex - valid only if we returned success
554  * success if we found the region index number, otherwise
555  * failure
556  *
557  * Side Effects:
558  *----------------------------------------------------------------------------
559 */
560 EAS_RESULT VMFindRegionIndex (S_VOICE_MGR *pVoiceMgr, EAS_U8 channel, EAS_U8 note, EAS_U16 *pRegionIndex);
561 
562 /*----------------------------------------------------------------------------
563  * VMIncRefCount()
564  *----------------------------------------------------------------------------
565  * Increment reference count for virtual synth
566  *----------------------------------------------------------------------------
567 */
568 void VMIncRefCount (S_SYNTH *pSynth);
569 
570 /*----------------------------------------------------------------------------
571  * VMReset()
572  *----------------------------------------------------------------------------
573  * Purpose:
574  * We call this routine to start the process of reseting the synth.
575  * This routine sets a flag for the entire synth indicating that we want
576  * to reset.
577  * We also force all voices to mute quickly.
578  * However, we do not actually perform any synthesis in this routine. That
579  * is, we do not ramp the voices down from this routine, but instead, we
580  * let the "regular" synth processing steps take care of adding the ramp
581  * down samples to the output buffer. After we are sure that all voices
582  * have completed ramping down, we continue the process of resetting the
583  * synth (from another routine).
584  *
585  * Inputs:
586  * psEASData - pointer to overall EAS data structure
587  *
588  * Outputs:
589  *
590  * Side Effects:
591  * - set a flag (in gsSynthObject.m_nFlags) indicating synth reset requested.
592  * - force all voices to update their envelope states to mute
593  *
594  *----------------------------------------------------------------------------
595 */
596 void VMReset (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_BOOL force);
597 
598 /*----------------------------------------------------------------------------
599  * VMMuteAllVoices()
600  *----------------------------------------------------------------------------
601  * Purpose:
602  * We call this in an emergency reset situation.
603  * This forces all voices to mute quickly.
604  *
605  * Inputs:
606  * psEASData - pointer to overall EAS data structure
607  *
608  * Outputs:
609  *
610  * Side Effects:
611  * - forces all voices to update their envelope states to mute
612  *
613  *----------------------------------------------------------------------------
614 */
615 void VMMuteVoice (S_VOICE_MGR *pVoiceMgr, EAS_I32 voiceNum);
616 void VMMuteAllVoices (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth);
617 
618 /*----------------------------------------------------------------------------
619  * VMReleaseAllVoices()
620  *----------------------------------------------------------------------------
621  * Purpose:
622  * We call this after we've encountered the end of the Midi file.
623  * This ensures all voice are either in release (because we received their
624  * note off already) or forces them to mute quickly.
625  * We use this as a safety to prevent bad midi files from playing forever.
626  *
627  * Inputs:
628  * psEASData - pointer to overall EAS data structure
629  *
630  * Outputs:
631  *
632  * Side Effects:
633  * - forces all voices to update their envelope states to release or mute
634  *
635  *----------------------------------------------------------------------------
636 */
637 void VMReleaseAllVoices (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth);
638 
639 /*----------------------------------------------------------------------------
640  * VMAllNotesOff()
641  *----------------------------------------------------------------------------
642  * Purpose:
643  * Quickly mute all notes on the given channel.
644  *
645  * Inputs:
646  * nChannel - quickly turn off all notes on this channel
647  * psEASData - pointer to overall EAS data structure
648  *
649  * Outputs:
650  *
651  * Side Effects:
652  * - forces all voices on this channel to update their envelope states to mute
653  *
654  *----------------------------------------------------------------------------
655 */
656 void VMAllNotesOff (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel);
657 
658 /*----------------------------------------------------------------------------
659  * VMDeferredStopNote()
660  *----------------------------------------------------------------------------
661  * Purpose:
662  * Stop the notes that had deferred note-off requests.
663  *
664  * Inputs:
665  * psEASData - pointer to overall EAS data structure
666  *
667  * Outputs:
668  * None.
669  *
670  * Side Effects:
671  * voices that have had deferred note-off requests are now put into release
672  * gsSynthObject.m_sVoice[i].m_nFlags has the VOICE_FLAG_DEFER_MIDI_NOTE_OFF
673  *  cleared
674  *----------------------------------------------------------------------------
675 */
676 void VMDeferredStopNote (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth);
677 
678 /*----------------------------------------------------------------------------
679  * VMSetSynthPolyphony()
680  *----------------------------------------------------------------------------
681  * Purpose:
682  * Set the synth to a new polyphony value. Value must be >= 1 and
683  * <= MAX_SYNTH_VOICES. This function will pin the polyphony at those limits
684  *
685  * Inputs:
686  * pVoiceMgr        pointer to synthesizer data
687  * synth            synthesizer number (0 = onboard, 1 = DSP)
688  * polyphonyCount   desired polyphony count
689  *
690  * Outputs:
691  *
692  * Side Effects:
693  *
694  *----------------------------------------------------------------------------
695 */
696 EAS_RESULT VMSetSynthPolyphony (S_VOICE_MGR *pVoiceMgr, EAS_I32 synth, EAS_I32 polyphonyCount);
697 
698 /*----------------------------------------------------------------------------
699  * VMGetSynthPolyphony()
700  *----------------------------------------------------------------------------
701  * Purpose:
702  * Set the synth to a new polyphony value. Value must be >= 1 and
703  * <= MAX_SYNTH_VOICES. This function will pin the polyphony at those limits
704  *
705  * Inputs:
706  * pVoiceMgr        pointer to synthesizer data
707  * synth            synthesizer number (0 = onboard, 1 = DSP)
708  * polyphonyCount   desired polyphony count
709  *
710  * Outputs:
711  *
712  * Side Effects:
713  *
714  *----------------------------------------------------------------------------
715 */
716 EAS_RESULT VMGetSynthPolyphony (S_VOICE_MGR *pVoiceMgr, EAS_I32 synth, EAS_I32 *pPolyphonyCount);
717 
718 /*----------------------------------------------------------------------------
719  * VMSetPolyphony()
720  *----------------------------------------------------------------------------
721  * Purpose:
722  * Set the virtual synth polyphony. 0 = no limit (i.e. can use
723  * all available voices).
724  *
725  * Inputs:
726  * pVoiceMgr        pointer to synthesizer data
727  * polyphonyCount   desired polyphony count
728  * pSynth           pointer to virtual synth
729  *
730  * Outputs:
731  * Returns error code
732  *
733  * Side Effects:
734  *
735  *----------------------------------------------------------------------------
736 */
737 EAS_RESULT VMSetPolyphony (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 polyphonyCount);
738 
739 /*----------------------------------------------------------------------------
740  * VMGetPolyphony()
741  *----------------------------------------------------------------------------
742  * Purpose:
743  * Returns the current polyphony setting
744  *
745  * Inputs:
746  * pVoiceMgr        pointer to synthesizer data
747  * pSynth           pointer to virtual synth
748  * pPolyphonyCount  pointer to variable to receive data
749  *
750  * Outputs:
751  *
752  * Side Effects:
753  *
754  *----------------------------------------------------------------------------
755 */
756 EAS_RESULT VMGetPolyphony (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 *pPolyphonyCount);
757 
758 /*----------------------------------------------------------------------------
759  * VMSetPriority()
760  *----------------------------------------------------------------------------
761  * Purpose:
762  * Set the virtual synth priority
763  *
764  * Inputs:
765  * pVoiceMgr        pointer to synthesizer data
766  * priority         new priority
767  * pSynth           pointer to virtual synth
768  *
769  * Outputs:
770  * Returns error code
771  *
772  * Side Effects:
773  *
774  *----------------------------------------------------------------------------
775 */
776 EAS_RESULT VMSetPriority (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 priority);
777 
778 /*----------------------------------------------------------------------------
779  * VMGetPriority()
780  *----------------------------------------------------------------------------
781  * Purpose:
782  * Get the virtual synth priority
783  *
784  * Inputs:
785  * pVoiceMgr        pointer to synthesizer data
786  * pPriority        pointer to variable to hold priority
787  * pSynth           pointer to virtual synth
788  *
789  * Outputs:
790  * Returns error code
791  *
792  * Side Effects:
793  *
794  *----------------------------------------------------------------------------
795 */
796 EAS_RESULT VMGetPriority (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 *pPriority);
797 
798 /*----------------------------------------------------------------------------
799  * VMSetVolume()
800  *----------------------------------------------------------------------------
801  * Purpose:
802  * Set the master volume for this sequence
803  *
804  * Inputs:
805  * nSynthVolume - the desired master volume
806  * psEASData - pointer to overall EAS data structure
807  *
808  * Outputs:
809  *
810  *
811  * Side Effects:
812  * overrides any previously set master volume from sysex
813  *
814  *----------------------------------------------------------------------------
815 */
816 void VMSetVolume (S_SYNTH *pSynth, EAS_U16 masterVolume);
817 
818 /*----------------------------------------------------------------------------
819  * VMSetPitchBendRange()
820  *----------------------------------------------------------------------------
821  * Set the pitch bend range for the given channel.
822  *----------------------------------------------------------------------------
823 */
824 void VMSetPitchBendRange (S_SYNTH *pSynth, EAS_INT channel, EAS_I16 pitchBendRange);
825 
826 /*----------------------------------------------------------------------------
827  * VMSetEASLib()
828  *----------------------------------------------------------------------------
829  * Purpose:
830  * Sets the pointer to the sound library
831  *
832  * Inputs:
833  * psEASData - pointer to overall EAS data structure
834  *
835  * Outputs:
836  *
837  *----------------------------------------------------------------------------
838 */
839 EAS_RESULT VMSetGlobalEASLib (S_VOICE_MGR *pVoiceMgr, EAS_SNDLIB_HANDLE pEAS);
840 EAS_RESULT VMSetEASLib (S_SYNTH *pSynth, EAS_SNDLIB_HANDLE pEAS);
841 
842 #ifdef DLS_SYNTHESIZER
843 /*----------------------------------------------------------------------------
844  * VMSetDLSLib()
845  *----------------------------------------------------------------------------
846  * Purpose:
847  * Sets the pointer to the sound library
848  *
849  * Inputs:
850  * psEASData - pointer to overall EAS data structure
851  *
852  * Outputs:
853  *
854  *----------------------------------------------------------------------------
855 */
856 EAS_RESULT VMSetGlobalDLSLib (EAS_DATA_HANDLE pEASData, EAS_DLSLIB_HANDLE pDLS);
857 EAS_RESULT VMSetDLSLib (S_SYNTH *pSynth, EAS_DLSLIB_HANDLE pDLS);
858 #endif
859 
860 /*----------------------------------------------------------------------------
861  * VMSetTranposition()
862  *----------------------------------------------------------------------------
863  * Purpose:
864  * Sets the global key transposition used by the synthesizer.
865  * Transposes all melodic instruments up or down by the specified
866  * amount. Range is limited to +/-12 semitones.
867  *
868  * Inputs:
869  * psEASData        - pointer to overall EAS data structure
870  * transposition    - transpose amount (+/-12)
871  *
872  * Outputs:
873  *
874  *
875  * Side Effects:
876  *
877  *----------------------------------------------------------------------------
878 */
879 void VMSetTranposition (S_SYNTH *pSynth, EAS_I32 transposition);
880 
881 /*----------------------------------------------------------------------------
882  * VMGetTranposition()
883  *----------------------------------------------------------------------------
884  * Purpose:
885  * Gets the global key transposition used by the synthesizer.
886  * Transposes all melodic instruments up or down by the specified
887  * amount. Range is limited to +/-12 semitones.
888  *
889  * Inputs:
890  * psEASData - pointer to overall EAS data structure
891  *
892  * Outputs:
893  *
894  *
895  * Side Effects:
896  *
897  *----------------------------------------------------------------------------
898 */
899 void VMGetTranposition (S_SYNTH *pSynth, EAS_I32 *pTransposition);
900 
901 /*----------------------------------------------------------------------------
902  * VMGetNoteCount()
903  *----------------------------------------------------------------------------
904 * Returns the total note count
905 *----------------------------------------------------------------------------
906 */
907 EAS_I32 VMGetNoteCount (S_SYNTH *pSynth);
908 
909 /*----------------------------------------------------------------------------
910  * VMRender()
911  *----------------------------------------------------------------------------
912  * Purpose:
913  * This routine renders a frame of audio
914  *
915  * Inputs:
916  * psEASData        - pointer to overall EAS data structure
917  *
918  * Outputs:
919  * pVoicesRendered  - number of voices rendered this frame
920  *
921  * Side Effects:
922  * sets psMidiObject->m_nMaxWorkloadPerFrame
923  *
924  *----------------------------------------------------------------------------
925 */
926 EAS_RESULT VMRender (S_VOICE_MGR *pVoiceMgr, EAS_I32 numSamples, EAS_I32 *pMixBuffer, EAS_I32 *pVoicesRendered);
927 
928 /*----------------------------------------------------------------------------
929  * VMInitWorkload()
930  *----------------------------------------------------------------------------
931  * Purpose:
932  * Clears the workload counter
933  *
934  * Inputs:
935  * pVoiceMgr            - pointer to instance data
936  *
937  * Outputs:
938  *
939  * Side Effects:
940  *
941  *----------------------------------------------------------------------------
942 */
943 void VMInitWorkload (S_VOICE_MGR *pVoiceMgr);
944 
945 /*----------------------------------------------------------------------------
946  * VMSetWorkload()
947  *----------------------------------------------------------------------------
948  * Purpose:
949  * Sets the max workload for a single frame.
950  *
951  * Inputs:
952  * pVoiceMgr            - pointer to instance data
953  *
954  * Outputs:
955  *
956  * Side Effects:
957  *
958  *----------------------------------------------------------------------------
959 */
960 void VMSetWorkload (S_VOICE_MGR *pVoiceMgr, EAS_I32 maxWorkLoad);
961 
962 /*----------------------------------------------------------------------------
963  * VMCheckWorkload()
964  *----------------------------------------------------------------------------
965  * Purpose:
966  * Checks to see if work load has been exceeded on this frame.
967  *
968  * Inputs:
969  * pVoiceMgr            - pointer to instance data
970  *
971  * Outputs:
972  *
973  * Side Effects:
974  *
975  *----------------------------------------------------------------------------
976 */
977 EAS_BOOL VMCheckWorkload (S_VOICE_MGR *pVoiceMgr);
978 
979 /*----------------------------------------------------------------------------
980  * VMActiveVoices()
981  *----------------------------------------------------------------------------
982  * Purpose:
983  * Returns the number of active voices in the synthesizer.
984  *
985  * Inputs:
986  * pEASData         - pointer to instance data
987  *
988  * Outputs:
989  * Returns the number of active voices
990  *
991  * Side Effects:
992  *
993  *----------------------------------------------------------------------------
994 */
995 EAS_I32 VMActiveVoices (S_SYNTH *pSynth);
996 
997 /*----------------------------------------------------------------------------
998  * VMMIDIShutdown()
999  *----------------------------------------------------------------------------
1000  * Purpose:
1001  * Clean up any Synth related system issues.
1002  *
1003  * Inputs:
1004  * psEASData - pointer to overall EAS data structure
1005  *
1006  * Outputs:
1007  * None
1008  *
1009  * Side Effects:
1010  *
1011  *----------------------------------------------------------------------------
1012 */
1013 void VMMIDIShutdown (S_EAS_DATA *pEASData, S_SYNTH *pSynth);
1014 
1015 /*----------------------------------------------------------------------------
1016  * VMShutdown()
1017  *----------------------------------------------------------------------------
1018  * Purpose:
1019  * Clean up any Synth related system issues.
1020  *
1021  * Inputs:
1022  * psEASData - pointer to overall EAS data structure
1023  *
1024  * Outputs:
1025  * None
1026  *
1027  * Side Effects:
1028  *
1029  *----------------------------------------------------------------------------
1030 */
1031 void VMShutdown (S_EAS_DATA *pEASData);
1032 
1033 #ifdef EXTERNAL_AUDIO
1034 /*----------------------------------------------------------------------------
1035  * EAS_RegExtAudioCallback()
1036  *----------------------------------------------------------------------------
1037  * Register a callback for external audio processing
1038  *----------------------------------------------------------------------------
1039 */
1040 void VMRegExtAudioCallback (S_SYNTH *pSynth, EAS_VOID_PTR pInstData, EAS_EXT_PRG_CHG_FUNC cbProgChgFunc, EAS_EXT_EVENT_FUNC cbEventFunc);
1041 
1042 /*----------------------------------------------------------------------------
1043  * VMGetMIDIControllers()
1044  *----------------------------------------------------------------------------
1045  * Returns the MIDI controller values on the specified channel
1046  *----------------------------------------------------------------------------
1047 */
1048 void VMGetMIDIControllers (S_SYNTH *pSynth, EAS_U8 channel, S_MIDI_CONTROLLERS *pControl);
1049 #endif
1050 
1051 #ifdef _SPLIT_ARCHITECTURE
1052 /*----------------------------------------------------------------------------
1053  * VMStartFrame()
1054  *----------------------------------------------------------------------------
1055  * Purpose:
1056  * Starts an audio frame
1057  *
1058  * Inputs:
1059  *
1060  * Outputs:
1061  *
1062  * Side Effects:
1063  *
1064  *----------------------------------------------------------------------------
1065 */
1066 EAS_BOOL VMStartFrame (S_EAS_DATA *pEASData);
1067 
1068 /*----------------------------------------------------------------------------
1069  * VMEndFrame()
1070  *----------------------------------------------------------------------------
1071  * Purpose:
1072  * Stops an audio frame
1073  *
1074  * Inputs:
1075  *
1076  * Outputs:
1077  *
1078  * Side Effects:
1079  *
1080  *----------------------------------------------------------------------------
1081 */
1082 EAS_BOOL VMEndFrame (S_EAS_DATA *pEASData);
1083 #endif
1084 
1085 #endif /* #ifdef _EAS_VM_PROTOS_H */
1086 
1087