/*---------------------------------------------------------------------------- | |
* | |
* File: | |
* eas_vm_protos.h | |
* | |
* Contents and purpose: | |
* Declarations, interfaces, and prototypes for voice manager. | |
* | |
* Copyright Sonic Network Inc. 2004 | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* | |
*---------------------------------------------------------------------------- | |
* Revision Control: | |
* $Revision: 736 $ | |
* $Date: 2007-06-22 13:51:24 -0700 (Fri, 22 Jun 2007) $ | |
*---------------------------------------------------------------------------- | |
*/ | |
#ifndef _EAS_VM_PROTOS_H | |
#define _EAS_VM_PROTOS_H | |
// includes | |
#include "eas_data.h" | |
#include "eas_sndlib.h" | |
/*---------------------------------------------------------------------------- | |
* VMInitialize() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMInitialize (S_EAS_DATA *pEASData); | |
/*---------------------------------------------------------------------------- | |
* VMInitMIDI() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMInitMIDI (S_EAS_DATA *pEASData, S_SYNTH **ppSynth); | |
/*---------------------------------------------------------------------------- | |
* VMInitializeAllChannels() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMInitializeAllChannels (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMResetControllers() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMResetControllers (S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMInitMIPTable() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Initialize the SP-MIDI MIP table | |
* | |
* Inputs: | |
* pEASData - pointer to synthesizer instance data | |
* mute - EAS_FALSE to unmute channels, EAS_TRUE to mute | |
* | |
* Outputs: | |
* | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMInitMIPTable (S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMSetMIPEntry() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Sets the priority and MIP level for a MIDI channel | |
* | |
* Inputs: | |
* pEASData - pointer to synthesizer instance data | |
* channel - MIDI channel number | |
* priority - priority (0-15 with 0 = highest priority) | |
* mip - maximum instantaneous polyphony | |
* | |
* Outputs: | |
* | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMSetMIPEntry (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 priority, EAS_U8 mip); | |
/*---------------------------------------------------------------------------- | |
* VMUpdateMIPTable() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* This routine is called when the polyphony count in the synthesizer changes | |
* | |
* Inputs: | |
* pEASData - pointer to synthesizer instance data | |
* | |
* Outputs: | |
* | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMUpdateMIPTable (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMInitializeAllVoices() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMInitializeAllVoices (S_VOICE_MGR *pVoiceMgr, EAS_INT vSynthNum); | |
/*---------------------------------------------------------------------------- | |
* VMStartNote() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Update the synth's state to play the requested note on the requested | |
* channel if possible. | |
* | |
* Inputs: | |
* nChannel - the MIDI channel | |
* nKeyNumber - the MIDI key number for this note | |
* nNoteVelocity - the key velocity for this note | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMStartNote (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 note, EAS_U8 velocity); | |
/*---------------------------------------------------------------------------- | |
* VMCheckKeyGroup() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* If the note that we've been asked to start is in the same key group as | |
* any currently playing notes, then we must shut down the currently playing | |
* note in the same key group and then start the newly requested note. | |
* | |
* Inputs: | |
* nChannel - synth channel that wants to start a new note | |
* nKeyNumber - new note's midi note number | |
* nRegionIndex - calling routine finds this index and gives to us | |
* nNoteVelocity - new note's velocity | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* pbVoiceStealingRequired - flag: this routine sets true if we needed to | |
* steal a voice | |
* | |
* Side Effects: | |
* gsSynthObject.m_sVoice[free voice num].m_nKeyNumber may be assigned | |
* gsSynthObject.m_sVoice[free voice num].m_nVelocity may be assigned | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMCheckKeyGroup (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U16 keyGroup, EAS_U8 channel); | |
/*---------------------------------------------------------------------------- | |
* VMCheckPolyphonyLimiting() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* We only play at most 2 of the same note on a MIDI channel. | |
* E.g., if we are asked to start note 36, and there are already two voices | |
* that are playing note 36, then we must steal the voice playing | |
* the oldest note 36 and use that stolen voice to play the new note 36. | |
* | |
* Inputs: | |
* nChannel - synth channel that wants to start a new note | |
* nKeyNumber - new note's midi note number | |
* nNoteVelocity - new note's velocity | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* pbVoiceStealingRequired - flag: this routine sets true if we needed to | |
* steal a voice | |
* * | |
* Side Effects: | |
* psSynthObject->m_sVoice[free voice num].m_nKeyNumber may be assigned | |
* psSynthObject->m_sVoice[free voice num].m_nVelocity may be assigned | |
*---------------------------------------------------------------------------- | |
*/ | |
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); | |
/*---------------------------------------------------------------------------- | |
* VMStopNote() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Update the synth's state to end the requested note on the requested | |
* channel. | |
* | |
* Inputs: | |
* nChannel - the MIDI channel | |
* nKeyNumber - the key number of the note to stop | |
* nNoteVelocity - the note-off velocity | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* Side Effects: | |
* gsSynthObject.m_sVoice[free voice num].m_nSynthChannel may be assigned | |
* gsSynthObject.m_sVoice[free voice num].m_nKeyNumber is assigned | |
* gsSynthObject.m_sVoice[free voice num].m_nVelocity is assigned | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMStopNote (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 key, EAS_U8 velocity); | |
/*---------------------------------------------------------------------------- | |
* VMFindAvailableVoice() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Find an available voice and return the voice number if available. | |
* | |
* Inputs: | |
* pnVoiceNumber - really an output, see below | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* pnVoiceNumber - returns the voice number of available voice if found | |
* success - if there is an available voice | |
* failure - otherwise | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMFindAvailableVoice (S_VOICE_MGR *pVoiceMgr, EAS_INT *pVoiceNumber, EAS_I32 lowVoice, EAS_I32 highVoice); | |
/*---------------------------------------------------------------------------- | |
* VMStealVoice() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Steal a voice and return the voice number | |
* | |
* Stealing algorithm: steal the best choice with minimal work, taking into | |
* account SP-Midi channel priorities and polyphony allocation. | |
* | |
* In one pass through all the voices, figure out which voice to steal | |
* taking into account a number of different factors: | |
* Priority of the voice's MIDI channel | |
* Number of voices over the polyphony allocation for voice's MIDI channel | |
* Amplitude of the voice | |
* Note age | |
* Key velocity (for voices that haven't been started yet) | |
* If any matching notes are found | |
* | |
* Inputs: | |
* nChannel - the channel that this voice wants to be started on | |
* nKeyNumber - the key number for this new voice | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* pnVoiceNumber - voice stolen | |
* EAS_RESULT EAS_SUCCESS - always successful | |
*---------------------------------------------------------------------------- | |
*/ | |
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); | |
/*---------------------------------------------------------------------------- | |
* VMAddSamples() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Synthesize the requested number of samples. | |
* | |
* Inputs: | |
* nNumSamplesToAdd - number of samples to write to buffer | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* number of samples actually written to buffer | |
* | |
* Side Effects: | |
* - samples are added to the presently free buffer | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_I32 VMAddSamples (S_VOICE_MGR *pVoiceMgr, EAS_I32 *pMixBuffer, EAS_I32 numSamplesToAdd); | |
/*---------------------------------------------------------------------------- | |
* VMProgramChange() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Change the instrument (program) for the given channel. | |
* | |
* Depending on the program number, and the bank selected for this channel, the | |
* program may be in ROM, RAM (from SMAF or CMX related RAM wavetable), or | |
* Alternate wavetable (from mobile DLS or other DLS file) | |
* | |
* This function figures out what wavetable should be used, and sets it up as the | |
* wavetable to use for this channel. Also the channel may switch from a melodic | |
* channel to a rhythm channel, or vice versa. | |
* | |
* Inputs: | |
* | |
* Outputs: | |
* Side Effects: | |
* gsSynthObject.m_sChannel[nChannel].m_nProgramNumber is likely changed | |
* gsSynthObject.m_sChannel[nChannel].m_psEAS may be changed | |
* gsSynthObject.m_sChannel[nChannel].m_bRhythmChannel may be changed | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMProgramChange (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 program); | |
/*---------------------------------------------------------------------------- | |
* VMChannelPressure() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Change the channel pressure for the given channel | |
* | |
* Inputs: | |
* nChannel - the MIDI channel | |
* nVelocity - the channel pressure value | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* Side Effects: | |
* gsSynthObject.m_sChannel[nChannel].m_nChannelPressure is updated | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMChannelPressure (S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 value); | |
/*---------------------------------------------------------------------------- | |
* VMPitchBend() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Change the pitch wheel value for the given channel. | |
* This routine constructs the proper 14-bit argument when the calling routine | |
* passes the pitch LSB and MSB. | |
* | |
* Note: some midi disassemblers display a bipolar pitch bend value. | |
* We can display the bipolar value using | |
* if m_nPitchBend >= 0x2000 | |
* bipolar pitch bend = postive (m_nPitchBend - 0x2000) | |
* else | |
* bipolar pitch bend = negative (0x2000 - m_nPitchBend) | |
* | |
* Inputs: | |
* nChannel - the MIDI channel | |
* nPitchLSB - the LSB byte from the pitch bend message | |
* nPitchMSB - the MSB byte from the message | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* gsSynthObject.m_sChannel[nChannel].m_nPitchBend is changed | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMPitchBend (S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 pitchLSB, EAS_U8 pitchMSB); | |
/*---------------------------------------------------------------------------- | |
* VMControlChange() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Change the controller (or mode) for the given channel. | |
* | |
* Inputs: | |
* nChannel - the MIDI channel | |
* nControllerNumber - the controller number | |
* nControlValue - the controller number for this control change | |
* nControlValue - the value for this control change | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* Side Effects: | |
* gsSynthObject.m_sChannel[nChannel] controller is changed | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMControlChange (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 controller, EAS_U8 value); | |
/*---------------------------------------------------------------------------- | |
* VMUpdateRPNStateMachine() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Call this function when we want to parse a stream of RPN messages. | |
* NOTE: The synth has only one set of global RPN data instead of RPN data | |
* per channel. | |
* So actually, we don't really need to look at the nChannel parameter, | |
* but we pass it to facilitate future upgrades. Furthermore, we only | |
* support RPN0 (pitch bend sensitivity), RPN1 (fine tuning) and | |
* RPN2 (coarse tuning). Any other RPNs are rejected. | |
* | |
* Inputs: | |
* nChannel - the MIDI channel | |
* nControllerNumber - the RPN controller number | |
* nControlValue - the value for this control change | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* gsSynthObject.m_RPN0 (or m_RPN1 or m_RPN2) may be updated if the | |
* proper RPN message sequence is parsed. | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMUpdateRPNStateMachine (S_SYNTH *pSynth, EAS_U8 channel, EAS_U8 controller, EAS_U8 value); | |
/*---------------------------------------------------------------------------- | |
* VMUpdateStaticChannelParameters() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Update all of the static channel parameters for channels that have had | |
* a controller change values | |
* Or if the synth has signalled that all channels must forcibly | |
* be updated | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* none | |
* | |
* Side Effects: | |
* - psSynthObject->m_sChannel[].m_nStaticGain and m_nStaticPitch | |
* are updated for channels whose controller values have changed | |
* or if the synth has signalled that all channels must forcibly | |
* be updated | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMUpdateStaticChannelParameters (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMReleaseAllDeferredNoteOffs() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Call this functin when the sustain flag is presently set but | |
* we are now transitioning from damper pedal on to | |
* damper pedal off. This means all notes in this channel | |
* that received a note off while the damper pedal was on, and | |
* had their note-off requests deferred, should now proceed to | |
* the release state. | |
* | |
* Inputs: | |
* nChannel - this channel has its sustain pedal transitioning from on to off | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* Side Effects: | |
* any voice with deferred note offs on this channel are updated such that | |
* | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMReleaseAllDeferredNoteOffs (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel); | |
/*---------------------------------------------------------------------------- | |
* VMCatchNotesForSustainPedal() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Call this function when the sustain flag is presently clear and | |
* the damper pedal is off and we are transitioning from damper pedal OFF to | |
* damper pedal ON. Currently sounding notes should be left | |
* unchanged. However, we should try to "catch" notes if possible. | |
* If any notes have levels >= sustain level, catch them, | |
* otherwise, let them continue to release. | |
* | |
* Inputs: | |
* nChannel - this channel has its sustain pedal transitioning from on to off | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* Side Effects: | |
* any voice with deferred note offs on this channel are updated such that | |
* psVoice->m_sEG1.m_eState = eEnvelopeStateSustainPedal | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMCatchNotesForSustainPedal (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel); | |
/*---------------------------------------------------------------------------- | |
* VMUpdateAllNotesAge() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Increment the note age for all voices older than the age of the voice | |
* that is stopping, effectively making the voices "younger". | |
* | |
* Inputs: | |
* nAge - age of voice that is going away | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* m_nAge for some voices is incremented | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMUpdateAllNotesAge (S_VOICE_MGR *pVoiceMgr, EAS_U16 nAge); | |
/*---------------------------------------------------------------------------- | |
* VMFindRegionIndex() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Find the region index for the given instrument using the midi key number | |
* and the RPN2 (coarse tuning) value. By using RPN2 as part of the | |
* region selection process, we reduce the amount a given sample has | |
* to be transposed by selecting the closest recorded root instead. | |
* | |
* Inputs: | |
* nChannel - current channel for this note | |
* nKeyNumber - current midi note number | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* pnRegionIndex - valid only if we returned success | |
* success if we found the region index number, otherwise | |
* failure | |
* | |
* Side Effects: | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMFindRegionIndex (S_VOICE_MGR *pVoiceMgr, EAS_U8 channel, EAS_U8 note, EAS_U16 *pRegionIndex); | |
/*---------------------------------------------------------------------------- | |
* VMIncRefCount() | |
*---------------------------------------------------------------------------- | |
* Increment reference count for virtual synth | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMIncRefCount (S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMReset() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* We call this routine to start the process of reseting the synth. | |
* This routine sets a flag for the entire synth indicating that we want | |
* to reset. | |
* We also force all voices to mute quickly. | |
* However, we do not actually perform any synthesis in this routine. That | |
* is, we do not ramp the voices down from this routine, but instead, we | |
* let the "regular" synth processing steps take care of adding the ramp | |
* down samples to the output buffer. After we are sure that all voices | |
* have completed ramping down, we continue the process of resetting the | |
* synth (from another routine). | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* - set a flag (in gsSynthObject.m_nFlags) indicating synth reset requested. | |
* - force all voices to update their envelope states to mute | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMReset (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_BOOL force); | |
/*---------------------------------------------------------------------------- | |
* VMMuteAllVoices() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* We call this in an emergency reset situation. | |
* This forces all voices to mute quickly. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* - forces all voices to update their envelope states to mute | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMMuteVoice (S_VOICE_MGR *pVoiceMgr, EAS_I32 voiceNum); | |
void VMMuteAllVoices (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMReleaseAllVoices() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* We call this after we've encountered the end of the Midi file. | |
* This ensures all voice are either in release (because we received their | |
* note off already) or forces them to mute quickly. | |
* We use this as a safety to prevent bad midi files from playing forever. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* - forces all voices to update their envelope states to release or mute | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMReleaseAllVoices (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMAllNotesOff() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Quickly mute all notes on the given channel. | |
* | |
* Inputs: | |
* nChannel - quickly turn off all notes on this channel | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* - forces all voices on this channel to update their envelope states to mute | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMAllNotesOff (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_U8 channel); | |
/*---------------------------------------------------------------------------- | |
* VMDeferredStopNote() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Stop the notes that had deferred note-off requests. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* None. | |
* | |
* Side Effects: | |
* voices that have had deferred note-off requests are now put into release | |
* gsSynthObject.m_sVoice[i].m_nFlags has the VOICE_FLAG_DEFER_MIDI_NOTE_OFF | |
* cleared | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMDeferredStopNote (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMSetSynthPolyphony() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Set the synth to a new polyphony value. Value must be >= 1 and | |
* <= MAX_SYNTH_VOICES. This function will pin the polyphony at those limits | |
* | |
* Inputs: | |
* pVoiceMgr pointer to synthesizer data | |
* synth synthesizer number (0 = onboard, 1 = DSP) | |
* polyphonyCount desired polyphony count | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMSetSynthPolyphony (S_VOICE_MGR *pVoiceMgr, EAS_I32 synth, EAS_I32 polyphonyCount); | |
/*---------------------------------------------------------------------------- | |
* VMGetSynthPolyphony() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Set the synth to a new polyphony value. Value must be >= 1 and | |
* <= MAX_SYNTH_VOICES. This function will pin the polyphony at those limits | |
* | |
* Inputs: | |
* pVoiceMgr pointer to synthesizer data | |
* synth synthesizer number (0 = onboard, 1 = DSP) | |
* polyphonyCount desired polyphony count | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMGetSynthPolyphony (S_VOICE_MGR *pVoiceMgr, EAS_I32 synth, EAS_I32 *pPolyphonyCount); | |
/*---------------------------------------------------------------------------- | |
* VMSetPolyphony() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Set the virtual synth polyphony. 0 = no limit (i.e. can use | |
* all available voices). | |
* | |
* Inputs: | |
* pVoiceMgr pointer to synthesizer data | |
* polyphonyCount desired polyphony count | |
* pSynth pointer to virtual synth | |
* | |
* Outputs: | |
* Returns error code | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMSetPolyphony (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 polyphonyCount); | |
/*---------------------------------------------------------------------------- | |
* VMGetPolyphony() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Returns the current polyphony setting | |
* | |
* Inputs: | |
* pVoiceMgr pointer to synthesizer data | |
* pSynth pointer to virtual synth | |
* pPolyphonyCount pointer to variable to receive data | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMGetPolyphony (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 *pPolyphonyCount); | |
/*---------------------------------------------------------------------------- | |
* VMSetPriority() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Set the virtual synth priority | |
* | |
* Inputs: | |
* pVoiceMgr pointer to synthesizer data | |
* priority new priority | |
* pSynth pointer to virtual synth | |
* | |
* Outputs: | |
* Returns error code | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMSetPriority (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 priority); | |
/*---------------------------------------------------------------------------- | |
* VMGetPriority() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Get the virtual synth priority | |
* | |
* Inputs: | |
* pVoiceMgr pointer to synthesizer data | |
* pPriority pointer to variable to hold priority | |
* pSynth pointer to virtual synth | |
* | |
* Outputs: | |
* Returns error code | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMGetPriority (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, EAS_I32 *pPriority); | |
/*---------------------------------------------------------------------------- | |
* VMSetVolume() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Set the master volume for this sequence | |
* | |
* Inputs: | |
* nSynthVolume - the desired master volume | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* | |
* Side Effects: | |
* overrides any previously set master volume from sysex | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMSetVolume (S_SYNTH *pSynth, EAS_U16 masterVolume); | |
/*---------------------------------------------------------------------------- | |
* VMSetPitchBendRange() | |
*---------------------------------------------------------------------------- | |
* Set the pitch bend range for the given channel. | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMSetPitchBendRange (S_SYNTH *pSynth, EAS_INT channel, EAS_I16 pitchBendRange); | |
/*---------------------------------------------------------------------------- | |
* VMSetEASLib() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Sets the pointer to the sound library | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMSetGlobalEASLib (S_VOICE_MGR *pVoiceMgr, EAS_SNDLIB_HANDLE pEAS); | |
EAS_RESULT VMSetEASLib (S_SYNTH *pSynth, EAS_SNDLIB_HANDLE pEAS); | |
#ifdef DLS_SYNTHESIZER | |
/*---------------------------------------------------------------------------- | |
* VMSetDLSLib() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Sets the pointer to the sound library | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMSetGlobalDLSLib (EAS_DATA_HANDLE pEASData, EAS_DLSLIB_HANDLE pDLS); | |
EAS_RESULT VMSetDLSLib (S_SYNTH *pSynth, EAS_DLSLIB_HANDLE pDLS); | |
#endif | |
/*---------------------------------------------------------------------------- | |
* VMSetTranposition() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Sets the global key transposition used by the synthesizer. | |
* Transposes all melodic instruments up or down by the specified | |
* amount. Range is limited to +/-12 semitones. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* transposition - transpose amount (+/-12) | |
* | |
* Outputs: | |
* | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMSetTranposition (S_SYNTH *pSynth, EAS_I32 transposition); | |
/*---------------------------------------------------------------------------- | |
* VMGetTranposition() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Gets the global key transposition used by the synthesizer. | |
* Transposes all melodic instruments up or down by the specified | |
* amount. Range is limited to +/-12 semitones. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMGetTranposition (S_SYNTH *pSynth, EAS_I32 *pTransposition); | |
/*---------------------------------------------------------------------------- | |
* VMGetNoteCount() | |
*---------------------------------------------------------------------------- | |
* Returns the total note count | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_I32 VMGetNoteCount (S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMRender() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* This routine renders a frame of audio | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* pVoicesRendered - number of voices rendered this frame | |
* | |
* Side Effects: | |
* sets psMidiObject->m_nMaxWorkloadPerFrame | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_RESULT VMRender (S_VOICE_MGR *pVoiceMgr, EAS_I32 numSamples, EAS_I32 *pMixBuffer, EAS_I32 *pVoicesRendered); | |
/*---------------------------------------------------------------------------- | |
* VMInitWorkload() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Clears the workload counter | |
* | |
* Inputs: | |
* pVoiceMgr - pointer to instance data | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMInitWorkload (S_VOICE_MGR *pVoiceMgr); | |
/*---------------------------------------------------------------------------- | |
* VMSetWorkload() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Sets the max workload for a single frame. | |
* | |
* Inputs: | |
* pVoiceMgr - pointer to instance data | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMSetWorkload (S_VOICE_MGR *pVoiceMgr, EAS_I32 maxWorkLoad); | |
/*---------------------------------------------------------------------------- | |
* VMCheckWorkload() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Checks to see if work load has been exceeded on this frame. | |
* | |
* Inputs: | |
* pVoiceMgr - pointer to instance data | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_BOOL VMCheckWorkload (S_VOICE_MGR *pVoiceMgr); | |
/*---------------------------------------------------------------------------- | |
* VMActiveVoices() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Returns the number of active voices in the synthesizer. | |
* | |
* Inputs: | |
* pEASData - pointer to instance data | |
* | |
* Outputs: | |
* Returns the number of active voices | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_I32 VMActiveVoices (S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMMIDIShutdown() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Clean up any Synth related system issues. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* None | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMMIDIShutdown (S_EAS_DATA *pEASData, S_SYNTH *pSynth); | |
/*---------------------------------------------------------------------------- | |
* VMShutdown() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Clean up any Synth related system issues. | |
* | |
* Inputs: | |
* psEASData - pointer to overall EAS data structure | |
* | |
* Outputs: | |
* None | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMShutdown (S_EAS_DATA *pEASData); | |
#ifdef EXTERNAL_AUDIO | |
/*---------------------------------------------------------------------------- | |
* EAS_RegExtAudioCallback() | |
*---------------------------------------------------------------------------- | |
* Register a callback for external audio processing | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMRegExtAudioCallback (S_SYNTH *pSynth, EAS_VOID_PTR pInstData, EAS_EXT_PRG_CHG_FUNC cbProgChgFunc, EAS_EXT_EVENT_FUNC cbEventFunc); | |
/*---------------------------------------------------------------------------- | |
* VMGetMIDIControllers() | |
*---------------------------------------------------------------------------- | |
* Returns the MIDI controller values on the specified channel | |
*---------------------------------------------------------------------------- | |
*/ | |
void VMGetMIDIControllers (S_SYNTH *pSynth, EAS_U8 channel, S_MIDI_CONTROLLERS *pControl); | |
#endif | |
#ifdef _SPLIT_ARCHITECTURE | |
/*---------------------------------------------------------------------------- | |
* VMStartFrame() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Starts an audio frame | |
* | |
* Inputs: | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_BOOL VMStartFrame (S_EAS_DATA *pEASData); | |
/*---------------------------------------------------------------------------- | |
* VMEndFrame() | |
*---------------------------------------------------------------------------- | |
* Purpose: | |
* Stops an audio frame | |
* | |
* Inputs: | |
* | |
* Outputs: | |
* | |
* Side Effects: | |
* | |
*---------------------------------------------------------------------------- | |
*/ | |
EAS_BOOL VMEndFrame (S_EAS_DATA *pEASData); | |
#endif | |
#endif /* #ifdef _EAS_VM_PROTOS_H */ | |