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*/ 49EAS_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*/ 63EAS_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*/ 77void 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*/ 91void 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*/ 110void 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*/ 131void 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*/ 149void 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*/ 163void 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*/ 182void 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*/ 208void 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*/ 234EAS_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*/ 256void 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*/ 274EAS_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*/ 304EAS_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*/ 324EAS_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*/ 350void 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*/ 368void 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*/ 398void 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*/ 419void 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*/ 446EAS_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*/ 470void 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*/ 494void 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*/ 517void 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*/ 536void 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*/ 560EAS_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*/ 568void 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*/ 596void 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*/ 615void VMMuteVoice (S_VOICE_MGR *pVoiceMgr, EAS_I32 voiceNum); 616void 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*/ 637void 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*/ 656void 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*/ 676void 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*/ 696EAS_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*/ 716EAS_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*/ 737EAS_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*/ 756EAS_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*/ 776EAS_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*/ 796EAS_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*/ 816void VMSetVolume (S_SYNTH *pSynth, EAS_U16 masterVolume); 817 818/*---------------------------------------------------------------------------- 819 * VMSetPitchBendRange() 820 *---------------------------------------------------------------------------- 821 * Set the pitch bend range for the given channel. 822 *---------------------------------------------------------------------------- 823*/ 824void 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*/ 839EAS_RESULT VMSetGlobalEASLib (S_VOICE_MGR *pVoiceMgr, EAS_SNDLIB_HANDLE pEAS); 840EAS_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*/ 856EAS_RESULT VMSetGlobalDLSLib (EAS_DATA_HANDLE pEASData, EAS_DLSLIB_HANDLE pDLS); 857EAS_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*/ 879void 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*/ 899void VMGetTranposition (S_SYNTH *pSynth, EAS_I32 *pTransposition); 900 901/*---------------------------------------------------------------------------- 902 * VMGetNoteCount() 903 *---------------------------------------------------------------------------- 904* Returns the total note count 905*---------------------------------------------------------------------------- 906*/ 907EAS_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*/ 926EAS_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*/ 943void 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*/ 960void 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*/ 977EAS_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*/ 995EAS_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*/ 1013void 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*/ 1031void 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*/ 1040void 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*/ 1048void 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*/ 1066EAS_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*/ 1082EAS_BOOL VMEndFrame (S_EAS_DATA *pEASData); 1083#endif 1084 1085#endif /* #ifdef _EAS_VM_PROTOS_H */ 1086 1087