You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1087 lines
37 KiB
1087 lines
37 KiB
/*----------------------------------------------------------------------------
|
|
*
|
|
* 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 */
|
|
|