1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714 |
- Apogee Sound System
- Version 1.09
- by Jim Dos‚
- Revision notes
- When your game is in beta, you must fax me your beta reports with sound
- problems since I will not see them otherwise.
- Please be sure to include my name in the credits for your program. I'm
- not asking for a design or game programming credit, just credit for the
- sound system. This includes the credits screen, the manual, and the
- text files accompanying the game (if the credits for the game are listed
- in them). Thank you.
- NOTE: make sure that you unzipped the zip file using the "-d"
- parameter. This will create some directories that the demo needs.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Known problems: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- - GUS may crash on systems with a VMM since the GUS code does not lock
- any of its allocated memory.
- - GUS only supports IRQs below 8. At higher IRQs, the dos extender seems
- to be too slow.
- - PAS mixer does not have a linear sounding volume change.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ To-do list: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- - Add support for playback of stereo sounds. If anyone needs this
- right away, let me know.
- - Add permanant debugging code to various modules.
- - If an error occurs loading a patch file, GUS code should return
- which file it is.
- - Finish this doc file. Music functions have to be documented using the
- new format.
- - Change current limit of one upper IRQ.
- - Get upper IRQ's working for GUS code.
- - Lock memory in GUS code.
- - Test code on OS/2 and Windows
- - Lookup table for PAS mixer for more linear volume change.
- - MOD music playback.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Revision History: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- 5/14/96
- - Version 1.12
- - Fixed a reverb bug where 8-bit fast reverb would round down to -infinity
- instead of 0. This caused a bit of noise since the mix buffer would
- only reduce down to -1 and 0.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 5/10/96
- - Version 1.11
- - added function FX_EndLooping to break a looping sound out of its loop.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/16/96
- - Modified Maketmb to chop off bits not relevant to OPL2 cards.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/8/96
- - Version 1.09
- - ***** IMPORTANT *****
- Any code that is called by the sound system should be compiled with
- the -zu option. This tells the compiler to assume that SS is not
- equal to DS. This is required for any code that's called from the
- sound system while it's in an interrupt (I switch to a custom stack
- upon entering the interrupt). Any function that is used with
- TS_ScheduleTask or FX_SetCallBack should be compiled this way (you may
- want to put them in a separate module. I recommend doing this for
- USRHOOKS functions as well, in case you free a task from within a timer
- function (MUSIC_FadeVolume does this, so if you use it, USRHOOKS must
- be compiled with -zu).
- - The sound system now uses the ULTRAMID.INI in the current directory if
- it exists, otherwise it uses the one pointed to by the ULTRADIR environment
- variable.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/4/96
- - Fixed a bug with fast 8-bit reverb. Also made a few optimizations to
- it.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 12/18/95
- - Version 1.08
- - I'm a dumbass. I left a "strcat( InstrumentDirectory, name );"
- after locating the ULTRAMID.INI file for the Gravis Ultrasound. So
- if you haven't been able to initialize music in a while, you know
- who's to blame. :)
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 12/12/95
- - New utility called PS. Allows you to test a WAV, VOC, or raw sound
- file from the command line using the sound system. Check in the
- PS directory for the source code.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 12/8/95
- - Version 1.07
- - Added adjustable delay on the reverb. The following functions allow
- you to manipulate the delay setting.
- int FX_GetMaxReverbDelay( void );
- int FX_GetReverbDelay( void );
- void FX_SetReverbDelay( int delay );
- The delay is measured in the number of samples to delay before the
- sound is regenerated. To calculate the delay in seconds, just do this:
- seconds = delay / mixingrate; (using floats, obviously). The minimum
- delay is 256 samples. The maximum depends on whether you're doing
- 16 bit or 8 bit, and stereo or mono mixing. Use FXGetMaxReverbDelay
- to get the maximum (after the FX_Init has been called). In 8-bit mono,
- the delay is about 1/2 of a second. The maximum delay is constrained
- by the size of the buffer I allocate to mix the sound in. If anyone
- wants longer delays, let me know and I can increase the buffer size
- for you (I'd probably make it adjustable by you).
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 12/6/95
- - 18 voice FM music on OPL3 cards.
- - FM music is no longer limited to MIDI channels 1 through 10. For
- backward compatability sake, the function MUSIC_SetMaxFMMidiChannel
- can be used to limit it, but why would anyone want to do that?
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/13/95
- - Fixed a bug with Adlib music where the default pitch bend range was
- set too low. Thanks Peter!
- - 1.06a library upload.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/7/95
- - 1.06 update. Time sure flies...
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 8/21/95
- - 1.05 update.
- - Full EMIDI support.
- - Context sensitive music through EMIDI.
- - Added the ability to fastforward to a specific beat/measure or time
- in a song.
- - GUSMIDI.INI file no longer required (this may return, we're still debating).
- - Probably a few other things that I can't think of right now.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 7/24/95
- - Changed GUS code to use software mixing instead of hardware mixing.
- GUS purists will hate me (if they found out), but it makes a lot more
- sense this way since I only have to maintain one playback method, plus
- it allows GUS owners to hear reverb and gives better control over panning.
- There may be other benefits, but I can't think of them right now.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 5/31/95
- - Playback of 16-bit digitized sound now supported. Source data must
- be signed data. Still need to do GUS version, but I'm uploading it for
- Jason Blochowiak.
- - Reverb code rewritten in assembly. Still needs to be fine-tuned.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 5/25/95
- - Using "option eliminate" with the sound library should no longer crash
- the linker.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 5/8/95
- - Added some new functions:
- void FX_SetReverseStereo( int setting );
- int FX_GetReverseStereo( void );
- void FX_SetReverb( int reverb );
- void FX_SetFastReverb( int reverb );
- FX_SetReverseStereo and FX_GetReverseStereo allow you to swap the left
- and right channel volumes for people whose speakers are reversed. Zero
- is no swap, non-zero swaps channels.
- FX_SetReverb and FX_SetFastReverb set the amount of echo to mix into
- the sound. It's a very mechanical sounding echo, kind of like the spring
- reverb on guitar amps. The effect is much like the echo effects in
- Super Mario World on the SNES.
- FX_SetReverb accepts values from 0 to 255. 0 means no reverb and 255
- is 100% reverb (sound repeats infinitely). Values above 96 are probably
- overkill. Speedwise, reverb costs about as much as one sound effect.
- FX_SetFastReverb uses a bitwise shift instead of table lookup to scale
- the volume of the echo. A value of 0 is no echo, 1 is echo at half
- volume (equivalent to 128 with FX_SetReverb), 2 to 1/4 volume
- (equivalent to 64), etc. If you're not doing dynamic changes in reverb,
- this may be preferable since it's a bit faster.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 4/7/95
- - void MUSIC_RegisterTimbreBank( unsigned char *timbres );
- Added the function MUSIC_RegisterTimbreBank to allow developers to use
- their own FM timbres on Sound Blaster and Adlib compatibles. Use the
- supplied utility MAKETMB to create data files using a script and IBK
- files. The resulting file can be loaded by the program at runtime and
- a pointer to it passed to MUSIC_RegisterTimbreBank. Afterwards, the
- memory can be deallocated (the audio library copies the supplied timbres
- over the default timbres.
- If you decide to use your own timbres, I can recommend a good shareware
- program that helps you to create them. Just give me a call.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/17/95
- - Finished looping functions. Here is how to loop a sample:
- For a raw sample, use FX_PlayLoopedRaw. Here is it's definition:
- int FX_PlayLoopedRaw
- (
- char *ptr,
- unsigned long length,
- char *loopstart,
- char *loopend,
- unsigned rate,
- int pitchoffset,
- int vol,
- int left,
- int right,
- int priority,
- unsigned long callbackval
- );
- ptr is a pointer to the start of the sample. It can actually be
- later in the sample than the start of the loop. This is usefull for
- MOD players which may start a sample at an offset into the sound.
- length is the number of samples to play before the loop begins. In
- most cases, this will be ( loopend - ptr ). It may seem strange to be
- able to play past the end of the loop on the first time through the
- sound, but it's the most flexible.
- loopstart is a pointer to the start of the loop. The can be before
- or after the start of the sample.
- loopend is a pointer to the end of the loop. This points to the last
- sample to play in the loop.
- For a WAV file, use FX_PlayLoopedWAV.
- int FX_PlayLoopedWAV
- (
- char *ptr,
- long loopstart,
- long loopend,
- int pitchoffset,
- int vol,
- int left,
- int right,
- int priority,
- unsigned long callbackval
- );
- ptr is the start of the WAV file. WAV files currently do not have
- the flexibility that raw files do, in that the sound must start at the
- beginning of the WAV file. All looping is based past the beginning of
- the WAV file. The sound will loop after the sample pointed to by
- loopend.
- loopstart is the offset (not pointer) of the sample to begin the loop
- on. This must be a positive value. Any negative values or values past
- the end of the sound will cause the WAV to only play once.
- loopend is the offset (not pointer) of the sample to end the loop on
- (the sample will loop after this sample is played). If the offset is
- past the end of the sample, the loop end will be set to the last sample
- in the file.
- For a VOC file, use FX_PlayLoopedVOC.
- int FX_PlayLoopedVOC
- (
- char *ptr,
- long loopstart,
- long loopend,
- int pitchoffset,
- int vol,
- int left,
- int right,
- int priority,
- unsigned long callbackval
- );
- ptr is the start of the VOC file. VOC files currently do not have
- the flexibility that raw files do, in that the sound must start at the
- beginning of the VOC file. All looping is based past the beginning of
- the VOC file. Since VOC files can contain multiple blocks of data,
- looping samples will only play the first block of data.
- loopstart is the offset (not pointer) of the sample to begin the loop
- on. This must be a positive value. Any negative values or values past
- the end of the sound will cause the VOC to play normally.
- loopend is the offset (not pointer) of the sample to end the loop on
- (the sample will loop after this sample is played). If the offset is
- past the end of the sample, the loop end will be set to the last sample
- in the file.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/16/95
- - I have changed the names of the two functions for playing VOCs. It just
- no longer makes sense to call them PlaySound when there are a variety of
- file formats supported.
- Here's an updated list of functions that play digitized sound:
- FX_PlayRaw : Plays raw sampled data once
- FX_PlayLoopedRaw : Plays raw sampled data with looping
- FX_PlayWAV : Plays a WAV file once
- FX_PlayLoopedWAV : Plays a WAV file with looping
- FX_PlayVOC3D : Plays a VOC file once using '3D' panning
- FX_PlayVOC : Plays a VOC file once
- FX_PlayLoopedVOC : Plays a VOC file with looping
- I'm thinking about moving the '3D' routines out of the library since
- they are really just panning tables. This way, users could create their
- own method.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/15/95
- - Increased the reported maximum number of voices you can play on some cards
- to 32. Since all voice tables are dynamically allocated, you could have
- more, but anything beyond 16 is a bit ridiculous. The Gravis Ultrasound
- is limited to 24 currently, and any voices used for sound fx leaves fewer
- voices for music. In any case, 8 voices is the recommended maximum, but
- if you have reason to use more, go ahead.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/14/95
- - Added special routines optimized to mix only 1 channel into stereo.
- Whenever the volume of the left or the right channel is zero for a
- voice, only one channel is mixed. This is especially useful if you
- intend to play a sound with the left and right channels' frequencies are
- slightly different. Peter Freese (from Q Studios, who are developing
- Blood) needs to do this for his Sonic Holography 3D sound library that
- he is developing.
- - Fixed a problem on the Sound Source. I noticed that pitches were higher
- than normal on the Sound Source, and discovered that it was possible to
- overflow the FIFO buffer without causing the overflow flag to be set.
- Since the Sound Source can only play sound at 7khz, I must poll the
- port to see if it's ready for sound. The overflow flag sometimes doesn't
- register imediatly, so I changed my routine to write only 14 samples at
- a time to the port. This causes the pitch to be nearly 7khz.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/13/95
- - Increased the resolution of the volume levels that digitized sounds can
- play from 16 to 64. Since the volumes were passed in as 0 to 255, there
- is no need for users to change any code to take advantage of this.
- Although this requires more memory (in 16bit mode, 32k as opposed to 8k),
- it means smooth volume changes and allows for MOD playback.
- - Added new function for changing pitch: FX_SetFrequency. This allows you
- to change the rate that a sound is mixed at. This isn't very usefull for
- VOC playback since the VOC file can override the rate, it is very usefull
- for playback of raw data since you will already know the sampling rate.
- This is also usefull for MOD playback.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/10/95
- - Added embedded looping commands for MIDI files. To loop a specific
- track, use controller 116 on any MIDI channel on that track with a value
- of 0 for infinite, or > 0 for the number of times to loop. To mark the
- end of a loop, use controller 117 with a value of 127. NOTE: Currently,
- you must put loop info on all tracks to if you want all of them to loop.
- This may seem like a pain at first, but I thought that it would give
- the musician extra flexibility. If no one likes this, I'll change it so
- that you only have to do one loop controller.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 3/9/95
- - Added support for .WAV files and raw samples.
- - Added two new functions allowing the programmer to control the relative
- volume of each MIDI channel of a song. Use MUSIC_SetMidiChannelVolume
- to set the volume of a MIDI channel and MUSIC_ResetMidiChannelVolumes
- to restore all channels to full volume. I do not reset the volumes
- when you play a new song so that you can set the volume of all the
- channels before playing a song.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 2/14/95
- - Found a potential bug where the pitch scaling function could go outside
- of the array bounds given certain pitch offsets.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 2/4/95
- - Stereo FM temporarally commented out for ROTT. Seems to take too long on
- some computers and causes the mouse driver to miss interrupts.
- Have to contact Creative Labs to find out which chips have fast timings.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 2/3/95
- - Added FX_VoiceAvailable. Checks if a voice can be played at the
- specified priority.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/30/95
- - Version 1.02 uploaded for all current developers.
- - Various initialization routines improved.
- - Now performs checks to see if DMA and IRQ are working.
- - Added the ability to do custom Sound Blaster setup. Now users can enter
- the DMA, card address, and IRQ.
- - Fixed problem with SB16 and Sound Canvas Daughterboard. This was
- caused by an undocumented IRQ disable flag in the SB16.
- - GUS initialization no longer bombs if all the patches in GUSMIDI.INI
- could not be loaded. I was forced to do this due to the problems
- that can be caused by a slight error in the patch list. Gravis has changed
- the patch sizes over several versions making it difficult to create a patch
- list that works on all cards. Since the last patches loaded are percussion,
- these are the ones that will be affected.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/11/95
- - Additive timbres now respond to volume changes.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/7/95
- - Added better error checking and detection for AWE32.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 1/4/95
- - Version 1.01 uploaded for all current developers.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 12/20/94 - Version 1.01
- - Version built for Rise of the Triad.
- - Fixed some problems with MIDI playback on SoundScape. It was
- missing program changes (instruments).
- - GUS uses GUSMIDI.INI in local directory instead of ULTRAMID.INI.
- This is so that a custom patch list could be included with your
- game. If you own a GUS, copy the file ULTRAMIDI.INI from your
- ULTRASND\MIDI directory. I will come up with something more
- convenient in the future.
- - When command line parameter "ASSVER" used, the library returns
- an error when initialized. The error string will contain the
- version text. This was done so that your programs could perform
- their normal shutdown procedure before exiting to DOS.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 12/15/94
- - Optimized mixing routines. 50% increase in 8-bit mono and stereo
- playback and 20%-30% increase in 16-bit playback.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/28/94
- - Pitch tables are now linked in rather than generated at startup.
- This gets rid of any floating point code.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/14/94
- - Added function FX_SoundsPlaying to report the number of voices
- playing.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/13/94
- - Fixed problem with SoundScape where it wasn't reporting the MaxBits
- and MaxVoices properly.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/6/94 - Version 1.00
- - SoundScape now automatically gets MIDI port address from SNDSCAPE.INI.
- - WaveBlaster now automatically gets MIDI port address from the BLASTER
- environment string.
- - TaskMan now locks the link list manager's memory in case FX_Init
- and MUSIC_Init are not called.
- - All developers must make sure that they ask for the midi port on the
- following cards: GenMidi, and SoundCanvas.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 11/5/94
- - Made the GUSWAVE play voice routine allocate voice with a priority of
- 0, which tells gf1_play_digital to not attempt voice stealing. This
- prevents the music playback from stealing sound fx voices and was
- the source of the bug in Boppin' where voices would be cutoff.
- - VOC decoder now deals with block type 8 properly. Bug caused it to be
- ignored.
- - GUS set volume function now sets volume of all playing voices. Before,
- it would only set the volume for new voices.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 10/31/94
- - Now keeping track of version number. From any game that uses the
- sound system, you can type "ASSVER" to get version number.
- - Added command line parameter "DEBUGGUS" to Gravis Ultrasound GUSWAVE
- to help track down a voice dropout problem. I'll eventually add similar
- parameters to other modules.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 10/26/94
- - Added native support for the Ensoniq SoundScape. This card is capable
- of playing 8 and 16 bit stereo or mono data and uses wavetable synthesis
- for music. Please add this to your config.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 10/23/94
- - Did some optimizing and found that for 16-bit mixing it is slightly
- quicker to use code to do harsh clipping than to use tables. This
- gets rid of a 64k lookup table I had. With 8-bit sound, it is quicker
- to use a table, but it only takes up 512 bytes.
- Here is the various mixing modes in order of fastest to slowest:
- 8-bit mono, 16-bit mono, 8-bit stereo, 16-bit stereo.
- Just for reference, 8-bit mono is only about 40% faster than 16-bit
- stereo. And considering that at 11khz, mixing is only called about
- 10 times a second, it's not an incredible difference.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 10/20/94
- - Fixed the PAS slowdown bug. DMA channel was not being disabled after
- a PCM transfer. On some computers with PAS-16s, when the DMA circuitry
- in the PAS was turned off, it left the DRQ line on the DMA in a floating
- state, causing the DMA to do a continuous burst transfer, which would
- slow down the computer. This would not happen on other cards, since
- their DMA circuitry is always active.
- - Fixed the WaveBlaster bug. Bug caused by a problem with playing
- WaveBlaster music and Sound Blaster-16 that is completely undocumented
- in Creative Labs' developer kits.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 10/4/94
- - Added several new cards to enum list in SNDCARDS.H. Unless you use all
- of these, you are not supporting all sound cards----PUT THEM IN!
- - AWE32 support for General MIDI.
- - Midi callback system for implimenting digital drums and other music-
- synced events.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 9/7/94
- - All interrupt service routines now allocate their own 1024 byte stack
- in case Windows or OS/2 don't leave enough stack space. This was
- suggested by Steve Lepisto (Accursed Toys) who kindly supplied example
- code.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 9/6/94
- - PC speaker sound fx can now be turned off by setting the volume to 0.
- - Turned off panning on the FM rhythm channel.
- - Found and fixed another FM panning bug.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 9/2/94
- - Added ability to reroute data from a MIDI channel to a user function.
- Good for digital drums or animation synced to music.
- - Fixed a problem on the GUS with instruments that use tremelo. Only
- showed up when volume was set to 0.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 9/1/94
- - Fixed the high volume notes on GUS.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- 8/26/94
- - Ummm, added revision notes! What follows is what I've added in the
- past few weeks.
- - Locked down memory on all cards except GUS.
- - Support for higher IRQ's on PAS and Sound Blaster. Requires Dos4gw Pro
- version 1.97.
- - Internal support for PAS mixer control (using MVSOUND.SYS). Requires
- Dos4gw Pro version 1.97.
- - FM pan position defaulted to full left. Only noticable if midi file
- didn't set its own pan positions. Now defaults to center.
- - Added stereo panning on FM music.
- - Added stereo detuning on FM music.
- - Added harsh clipping so that digitized sounds playback at same volume
- no matter how many voices are allocated. Could distort when many sounds
- are playing, but that's the price you pay.
- - Changed panning from sine tables to a linear attenuation ramp as you
- deviate from center.
- - GUS can now choose number of voices to use (used to be 8 no matter what).
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Header files: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- There are four header files that you'll need: TASK_MAN.H, SNDCARDS.H,
- MUSIC.H and FX_MAN.H. MUSIC.H contains all functions that control music.
- FX_MAN.H contains all functions for control of digitized and synthesized
- sound. SNDCARDS.H contains sound card definitions and is brought in by
- MUSIC.H and FX_MAN.H. TASK_MAN.H is a module used for timer management.
- SNDCARDS.H defines the following enumerated type:
- typedef enum
- {
- SoundBlaster,
- ProAudioSpectrum,
- SoundMan16,
- Adlib,
- GenMidi, <--- Requires midi port
- SoundCanvas, <--- Requires midi port
- Awe32,
- WaveBlaster,
- SoundScape,
- UltraSound,
- SoundSource,
- TandySoundSource,
- PC,
- NumSoundCards
- } soundcardnames;
- These are used to select which card to use when initializing the routines.
- Do not use hard coded values since the value of these cards may change
- in future versions of the library. NumSoundCards is simply to identify
- how many cards are supported (since support for more cards may be added
- in the future).
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Functions: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- In the functions that follow, TRUE is assumed to be the value returned by
- the expression ( 1 == 1 ) and FALSE is assumed to be the value returned
- by the expression ( !TRUE ). Using macros, you could define them this
- way:
- #define TRUE ( 1 == 1 )
- #define FALSE ( !TRUE )
- This method is used because it makes no assumptions on the value of the
- boolean expressions when they are evaluated by the compiler.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Sound Effects: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- The following cards will be supported for sound effects: SoundBlaster,
- ProAudioSpectrum, UltraSound, SoundSource, TandySoundSource, AWE32,
- SoundMan16, and the PC speaker.
- Functions that return an error status will return one of the following:
- FX_Ok (if the function was successfull), FX_Error (if an error occurred),
- or FX_Warning (if a non-critical error occurred).
- The number of the last error or warning is stored in the global variable
- FX_ErrorCode. Whether an error is worth exiting for is up to you. Check
- out the names of the possible errors in the header file.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_ErrorString
- Synopsis:
- #include "fx_man.h"
- char *FX_ErrorString( int ErrorNumber );
- Description:
- The FX_ErrorString function maps the error number contained
- in ErrorNumber to a string describing the error.
- ErrorNumber can be the number of any error. If ErrorNumber is
- set to FX_Error or FX_Warning, FX_ErrorString will return the
- string corresponding with the last error that occurred.
- Returns:
- The FX_ErrorString function returns a pointer to the error message.
- This string of data should not be modified by the program.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_SetupCard
- Synopsis:
- #include "fx_man.h"
- int FX_SetupCard( int SoundCard, fx_device *device );
- Description:
- The FX_SetupCard function is used to detect a sound card and
- get information on what the card can do.
- SoundCard:
- This is an int passed into the function and corresponds
- to the enumerated list of cards.
- device:
- This is the address of the data structure to store information
- about the card.
- Here is the definition of fx_device:
- typedef struct
- {
- int MaxVoices;
- int MaxSampleBits;
- int MaxChannels;
- } fx_device;
- MaxVoices:
- This is the recommended maximum number of digitized sound
- that can be played at once. 4 voices is adequate for most games,
- although 8 voices is great for games that have a lot of atmosphere
- sounds (like 3D games). You should offer an option to select the
- number of voices to use for people with slower machines.
- MaxSampleBits:
- This will be either 8 or 16, depending on whether you have an
- 8-bit or 16-bit sound card. The routines only support playback
- of 8-bit samples, but can mix them as 16-bit. This provides better
- quality sound, especially at low volumes, however it is slower since
- you have twice as much data to mix. You might want to offer this
- as an option to people with slower machines.
- MaxChannels:
- This will be 1 if you have a mono card and 2 if you have a stereo
- card. Again, offer this as a choice in case the user has a slow
- machine. If you are not using the panning capabilities of the
- sound system, choose mono sound since there would be no benefit
- in using stereo.
- Returns:
- The FX_SetupCard function will return FX_Ok if the sound card was
- detected succesfully, and FX_Error if the card was not found or
- could not be initialized.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_Init
- Synopsis:
- #include "fx_man.h"
- int FX_Init( int SoundCard, int numvoices, int mixmode, int samplebits,
- unsigned mixrate );
- Description:
- The function FX_Init configures the sound engine by selecting the
- sound card, the maximum number of sounds that can play, and whether
- to mix the sound in 8 or 16 bits.
- SoundCard:
- This is an int passed into the function to select and corresponds
- to the enumerated list of cards.
- numvoices:
- This is the number of digitized sound that can be played at once.
- mixmode:
- This is the number of channels to mix the sound into. 1 for mono,
- 2 for stereo.
- samplebits:
- This should be either 8 or 16, depending on whether sound should
- be mixed in 8-bits or 16.
- mixrate:
- This selects the rate in hertz that sound should be mixed.
- Example:
- int status;
- fx_device device;
- status = FX_SetupCard( UltraSound, &device );
- if ( status != FX_Ok )
- {
- printf( "%s\n", FX_ErrorString( status ) );
- exit( 1 );
- }
- status = FX_Init( UltraSound, 8, 2, 16, 11000 );
- if ( status != FX_Ok )
- {
- printf( "%s\n", FX_ErrorString( status ) );
- exit( 1 );
- }
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_Shutdown
- Synopsis:
- #include "fx_man.h"
- int FX_Shutdown( void );
- Description:
- The function FX_Shutdown ends use of the sound card and restores
- any system resources that were used. This should be called when
- you exit to DOS, or when you change sound devices.
- Returns:
- The function FX_Shutdown returns FX_Ok if it was succesfull in
- shutting down the sound card and restoring resources. Otherwise,
- it returns FX_Error or FX_Warning.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_SetCallBack
- Synopsis:
- #include "fx_man.h"
- int FX_SetCallBack( void ( *function )( unsigned long ) );
- Description:
- The function FX_SetCallBack instructs the engine to call the
- user-defined function when sounds stop playing.
- function:
- This is the function that the engine should call when a sound stops
- playing. The user-defined function should accept an unsigned long
- as it's parameter. The value passed to this function is a user-
- defined value identifying the sound that just finished playing and
- may be an actual pointer to a user-defined data structure.
- Returns:
- FX_SetCallBack returns FX_Error or FX_Warning when the assignment
- failed. Otherwise it returns FX_Ok.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_SetVolume
- Synopsis:
- #include "fx_man.h"
- void FX_SetVolume( int volume );
- Description:
- The function FX_SetVolume sets the total volume of sound
- effects.
- volume:
- This is the volume to set the sound fx device to.
- Valid volumes are from 0 to 255.
- Returns:
- The function FX_SetVolume does not return a value.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_GetVolume
- Synopsis:
- #include "fx_man.h"
- int FX_GetVolume( void );
- Description:
- The FX_GetVolume function returns the total volume of the sound fx
- device.
- Returns:
- If an error occurs, FX_GetVolume returns FX_Warning or FX_Error,
- otherwise it returns the total volume of sound effects. Valid
- volumes are from 0 to 255.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Playing Sounds: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- FX_PlaySound
- Synopsis:
- #include "fx_man.h"
- int FX_PlaySound( char *ptr, int pitchoffset, int vol, int left,
- int right, int priority, unsigned long callbackval );
- Description:
- The function FX_PlaySound begins playback of digitized sound.
- The sound data must be formated as a valid VOC sound file.
- ptr:
- This is the address to the VOC format sound data to be played.
- pitchoffset:
- This is the amount to transpose the pitch of the sound up or down
- measured in 1/100th's of a semitone. For example, to transpose
- the pitch up one octave use 1200. To transpose the pitch down
- one octave use -1200. For no transposition, use 0.
- vol:
- This is the volume of the sound in mono mode. Valid values range
- from 0 to 255. Note: A volume of 0 does not always mean total
- silence.
- left:
- This is the volume of the sound played through the left speaker in
- stereo mode. Valid values range is from 0 to 255. Note: A volume
- of 0 does not always mean total silence.
- right:
- This is the volume of the sound played through the right speaker
- in stereo mode. Valid values range from 0 to 255. Note: A volume
- of 0 does not always mean total silence.
- priority:
- This sets the order that sounds should be cancelled if a new sound
- is played when no voices are available. When this occurs, the
- oldest sound with the lowest priority is replaced with the new
- sound. If the new sound's priority is lower than all the sounds
- playing, then it will not be played.
- callbackval:
- This is the value that should be sent to the user-defined callback
- function when the sound ends. See FX_SetCallBack.
- Returns:
- If an error occurs, FX_PlaySound returns FX_Error, or FX_Warning.
- Otherwise, it returns a voice handle. To determine if a return value
- is a voice handle, check to see if it is greater than FX_Ok. Valid
- voice handles are always greater than FX_Ok. The most common error
- that can occur is when there are no voices and the new sound's
- priority was too low.
- The voice handle can be used later to stop the voice from playing or to
- test if the voice is still playing.
- Example:
- int voicehandle;
- voicehandle = FX_PlaySound( address, pitchoffset, vol, left, right,
- priority, callbackval );
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_Play3D
- Synopsis:
- #include "fx_man.h"
- int FX_Play3D( char *ptr, int pitchoffset, int angle, int distance,
- int priority, unsigned long callbackval );
- Description:
- The function FX_Play3D begins playback of digitized sound. The sound
- data must be formated as a valid VOC sound file.
- ptr:
- This is the address to the VOC sound data to be played.
- pitchoffset:
- This is the amount to transpose the pitch of the sound up or down
- measured in 1/100th's of a semitone. For example, to transpose
- the pitch up one octave use 1200. To transpose the pitch down
- one octave use -1200. For no transposition, use 0.
- angle:
- This is the clockwise angle of the sound in relation to the player
- from 0 to 31. 0 is center, 8 is full right, 16 is directly behind
- the listener, and 24 is full left.
- distance:
- This is the distance of the sound from the player. Valid values
- range from 0 to 255, with 255 being the furthest from the player
- (note: this does not mean silence on all cards).
- priority:
- This sets the order that sounds should be cancelled if a new sound
- is played when no voices are available. When this occurs, the
- oldest sound with the lowest priority is replaced with the new
- sound. If the new sound's priority is lower than all the sounds
- playing, then it will not be played.
- callbackval:
- This is the value that should be sent to the user-defined callback
- function when the sound ends. See FX_SetCallBack.
- Returns:
- If an error occurs, FX_Play3D returns FX_Error, or FX_Warning.
- Otherwise, it returns a voice handle. To determine if a return value
- is a voice handle, check to see if it is greater than FX_Ok. Valid
- voice handles are always greater than FX_Ok. The most common error
- that can occur is when there are no voices and the new sound's
- priority was too low.
- The voice handle can be used later to stop the voice from playing or to
- test if the voice is still playing.
- Example:
- int voicehandle;
- voicehandle = FX_Play3D( address, pitchoffset, angle, distance,
- priority, callbackval );
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_SetPan
- Synopsis:
- #include "fx_man.h"
- int FX_SetPan( int handle, int vol, int left, int right );
- Description:
- The function FX_SetPan sets the mono and stereo volumes of a
- currently playing sound. This can be used for sounds started
- with FX_PlaySound or FX_Play3D.
- handle:
- This is the voice handle of the sound. This is the value returned
- by FX_PlaySound and FX_Play3D.
- vol:
- This is the volume of the sound in mono mode. Range is from 0 to
- 255. Note: A volume of 0 does not always mean total silence.
- left:
- This is the volume of the sound played through the left speaker
- in stereo mode. Range is from 0 to 255. Note: A volume of 0
- does not always mean total silence.
- right:
- This is the volume of the sound played through the right speaker
- in stereo mode. Range is from 0 to 255. Note: A volume of 0
- does not always mean total silence.
- Returns:
- If the sound is no longer playing, FX_SetPan will return FX_Warning,
- otherwise, it will return FX_Ok.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_Pan3D
- Synopsis:
- #include "fx_man.h"
- int FX_Pan3D( int handle, int angle, int distance );
- Description:
- The function FX_Pan3D sets the angle and the distance of a
- currently playing sound in relation to the player. This can
- be used for sounds started with FX_PlaySound or FX_Play3D.
- handle:
- This is the voice handle of the sound. This is the value
- returned by FX_PlaySound and FX_Play3D.
- angle:
- This is the clockwise angle of the sound in relation to the player
- from 0 to 31. 0 is center, 8 is full right, 16 is directly behind
- the listener, and 24 is full left.
- distance:
- This is the distance of the sound from the player. Valid values
- range from 0 to 255, with 255 being the furthest from the player
- (note: this does not mean silence on all cards).
- Returns:
- If the sound is no longer playing, FX_Pan3D will return FX_Warning,
- otherwise, it will return FX_Ok.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_SetPitch
- Synopsis:
- #include "fx_man.h"
- int FX_SetPitch( int handle, int pitchoffset );
- Description:
- The function FX_SetPitch sets the pitch of a currently playing sound.
- handle:
- This is the voice handle of the sound. This is the value returned by
- FX_PlaySound and FX_Play3D.
- pitchoffset:
- This is the amount to transpose the pitch of the sound up or down
- measured in 1/100th's of a semitone. For example, to transpose
- the pitch up one octave use 1200. To transpose the pitch down
- one octave use -1200. For no transposition, use 0.
- Returns:
- If the sound is no longer playing, FX_SetPitch will return FX_Warning,
- otherwise, it will return FX_Ok.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_SoundActive
- Synopsis:
- #include "fx_man.h"
- int FX_SoundActive( int handle );
- Description:
- The function FX_SoundActive tests if the sound with the specified
- handle is currently playing.
- handle:
- This is the voice handle of the sound to test. This is the value
- returned by FX_PlaySound and FX_Play3D.
- Returns:
- FX_SoundActive returns TRUE if the sound is playing, otherwise it
- returns FALSE.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int FX_StopSound( int handle );
- FX_StopSound stops playback of the sound with the associated handle.
- If the return value is not equal to FX_Ok, the sound was not found.
- handle is the voice handle of the sound. This is the value returned by
- FX_PlaySound and FX_Play3D.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- FX_StopAllSounds
- Synopsis:
- #include "fx_man.h"
- int FX_StopAllSounds( void );
- Description:
- The function FX_StopAllSounds halts output of all playing sounds.
- Returns:
- FX_StopAllSounds returns FX_Warning or FX_Error if an error occured,
- otherwise, it returns FX_Ok.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Music Playback: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- The following cards are supported for music: SoundBlaster, ProAudioSpectrum,
- Adlib, GenMidi, WaveBlaster, UltraSound, SoundMan16, Awe32, and SoundCanvas.
- TandSoundSource, SoundSource and PC are not supported.
- Similar error codes are returned for music as for sound effects. The
- codes are MUSIC_Ok, MUSIC_Warning, and MUSIC_Error. The last error that
- occurred is stored in MUSIC_ErrorCode.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- char *MUSIC_ErrorString( int ErrorNumber );
- Same as FX_ErrorString, except for music.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_Init( int SoundCard, int Address );
- MUSIC_Init select and initializes a sound card for music. If the card
- is not detected or some error occured, it returns MUSIC_Error.
- Address is only used for General Midi and Wave Blaster. It is the
- address of the MPU401 interface. For other cards, just use 0.
- The two most common values are 0x330, and 0x300. Doom and Raptor
- list other values, also. To be on the safe side, you might want to
- support them also. The other values are: 0x220, 0x230, 0x240, 0x250,
- 0x300, 0x320, 0x330, 0x332, 0x334, 0x336, 0x340, 0x360.
- Incidently, I recommend doing your config files as text files with the
- extension ".INI". This would allow people to manually enter certain
- settings. I suggest the extension becuase people are familiar with it
- from Windows. Check out the config file in Raptor sometime.
- Example:
- status = MUSIC_Init( GenMidi, 0x330 );
- if ( status != MUSIC_Ok )
- {
- printf( "Error - %s\n", MUSIC_ErrorString( MUSIC_Error ) );
- exit( 1 );
- }
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_Shutdown( void );
- Ends use of the selected music card.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void MUSIC_SetVolume( int volume );
- Sets the total volume of music. Valid volumes are from 0 to 255.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_GetVolume( void );
- Returns the total volume of music. Valid volumes are from 0 to 255.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_PlaySong( unsigned char far *song, int loopflag );
- MUSIC_PlaySong begins playback of the midi file pointed to by song.
- Set loopflag to MUSIC_PlayOnce to play the song once, or to
- MUSIC_LoopSong to play it continuously. This is usefull for the Apogee
- fanfare music.
- Note: with MUSIC_PlayOnce, the song is simply paused at the end. You
- can call MUSIC_Continue to start it again. Although I stop playing songs
- when you call MUSIC_PlaySong again or MUSIC_Shutdown, I recommend you
- call MUSIC_StopSong when you are completly done. I chose to do it this
- way becuase MUSIC_StopSong will cut off sound immediatly. This allows the
- sounds to decay on their own before ending.
- Example:
- status = MUSIC_PlaySong( SongPtr, MUSIC_LoopSong );
- if ( status != MUSIC_Ok )
- {
- printf( "Error - %s\n", MUSIC_ErrorString( MUSIC_Error ) );
- exit( 1 );
- }
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void MUSIC_SetLoopFlag( int loopflag );
- MUSIC_SetLoopFlag allows you to change the type of looping after a song
- is started. This way, you can have the song end at the end of the song.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_StopSong( void );
- MUSIC_StopSong halts playback of the the current song.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void MUSIC_Pause( void );
- MUSIC_Pause temporarily pauses playback of the song. Use MUSIC_Continue
- to let the music continue.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void MUSIC_Continue( void );
- MUSIC_Continue allows music to continue playing after a call to MUSIC_Pause
- or when the loopflag is set to MUSIC_PlayOnce and the song has finished.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_SongPlaying( void );
- MUSIC_SongPlaying tests if a songs is playing. Calls to MUSIC_StopSong
- or MUSIC_Pause will cause this to send back FALSE.
- Example:
- // Play the fanfare music
- MUSIC_PlaySong( ApogeeFanfare, MUSIC_PlayOnce );
- // Hang out while it's playing
- while( MUSIC_SongPlaying() )
- {
- // Do nothing, or maybe check for a key.
- }
- // Stop the song when we're done
- MUSIC_StopSong();
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Fade Functions: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- These functions are provided for you to fade the music in and out.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_FadeVolume( int tovolume, int milliseconds );
- MUSIC_FadeVolume causes the volume of a song to gradually change to
- the specified volume.
- tovolume is the final volume the music should be at.
- milliseconds is the time, in milliseconds, in which to make the transition.
- Note: accuracy is only to 1/100 of a second.
- For example, to have the music fade in at the begining of a level :
- // First, make sure we start at 0.
- MUSIC_SetVolume( 0 );
- // Start the song
- MUSIC_PlaySong( Level1Music, MUSIC_LoopSong );
- // Fade up to the level the user set the music at over a
- // period of 4 seconds.
- MUSIC_FadeVolume( UserSelectedVolumeLevel, 4000 );
- PlayGame();
- // At the end of the game or level, fade out over a period of 4 seconds.
- MUSIC_FadeVolume( 0, 4000 );
- while( MUSIC_FadeActive() )
- {
- // Hang around until fade is done
- }
- // Stop the song when we're done
- MUSIC_StopSong();
- Note: Even if you fade the music volume to 0, the music is still playing.
- Remember to use MUSIC_StopSong() to end playback.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void MUSIC_StopFade( void );
- MUSIC_StopFade is used if you want to stop the fade. When called, the
- volume remains at the volume it had progressed to. You don't need to
- call this function unless you have a reason to. I use this internally
- and left it public in case someone needed it.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int MUSIC_FadeActive( void );
- MUSIC_FadeActive returns a flag stating if a fade is in progress. This
- is useful if you want to wait until the music has faded out before doing
- something.
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ Timer Functions: ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- Since my routines depend heavily on the timer, I have to assume I own
- it. To make it easy for you to do timing, I wrote Task_Man to handle
- all requests for the timer.
- To use Task_Man, you must include "Task_Man.h".
- Here's an example how to set up a simple counter running at 30 times
- per second:
- #include <stdio.h>
- #include "task_man.h"
- void TimeFunction( task *Task );
- // Here's our timer function. It just increments a counter.
- void TimeFunction
- (
- task *Task
- )
- {
- int *Count;
- Count = Task->data;
- ( *Count )++;
- }
- void main
- (
- void
- )
- {
- task *TimerTask;
- int Count;
- Count = 0;
- // Schedule our timing task
- TimerTask = TS_ScheduleTask( TimeFunction, 30, 1, &Count );
- // Make sure we start it
- TS_Dispatch();
- while( !kbhit() )
- {
- printf( "Count = %d\n", Count );
- }
- // clear the key that was hit
- getch();
- // Hey, let's change it so it runs at 1000 times a second!
- TS_SetTaskRate( TimerTask, 1000 );
- while( !kbhit() )
- {
- printf( "Count = %d\n", Count );
- }
- // clear the key that was hit
- getch();
- // Stop the clock before we leave
- TS_Terminate( TimerTask );
- }
- Try out that program to see how it works.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- task *TS_ScheduleTask( void ( *Function )( task * ), int rate,
- int priority, void *data );
- TS_ScheduleTask add your function to the list of routines that use the
- timer. You can it set to any rate you would normally be able to program
- the PC's internal timer for.
- rate is the number of times per second your routine should be called.
- priority is used for when tasks occur simultaniously and must be called in
- a specific order.
- data allows you to pass variables into your timer. You could set up
- several tasks using one function, but sending in pointers to different
- data. Here's how to use it:
- int Data1 = 0;
- int Data2 = 100;
- task *Timer1;
- task *Timer2;
- Timer1 = TS_ScheduleTask( Function, 100, 1, &Data1 );
- Timer2 = TS_ScheduleTask( Function, 200, 1, &Data2 );
- TS_Dispatch();
- .
- .
- .
- void Function
- (
- task *Task
- )
- {
- int *data;
- data = ( int * )Task->data;
- *data++;
- }
- The task * that's passed in can also be used to control your task.
- For example, to terminate your task after a certain period of time:
- void Function
- (
- task *Task
- )
- {
- int *data;
- data = ( int * )Task->data;
- *data++;
- // After 100 times, this task commits suicide.
- if ( *data > 100 )
- {
- TS_Terminate( Task );
- }
- }
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void TS_Dispatch( void );
- TS_Dispatch starts the timer on all waiting scheduled events. Several
- events may be scheduled before calling TS_Dispatch.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- int TS_Terminate( task *ptr );
- TS_Terminate ends a task. Use this when your done with a task.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
- void TS_SetTaskRate( task *Task, int rate );
- TS_SetTaskRate allows you to change the rate a task runs at after you've
- started it up.
- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|