540 likes | 803 Views
Computer Audio/ fmod. CGDD 4603. Why fmod ?. Sound you might have in a game: Background music Sound effects Dialog How do you currently use these in your games? fmod is very popular Powerful – both 2D and 3D sound, DSP/effects… Cross platform (PS3, Wii, PC…)
E N D
Computer Audio/fmod CGDD 4603
Why fmod? • Sound you might have in a game: • Background music • Sound effects • Dialog • How do you currently use these in your games? • fmod is very popular • Powerful – both 2D and 3D sound, DSP/effects… • Cross platform (PS3, Wii, PC…) • Has a designer, sandbox and API
Partial List of Games that use fmod • Plants vs Zombies • Pure • Rise of Flight: The First Great Air War • Second Life • Shatter • Shattered Horizon[4] • Silent Hill: Shattered Memories • StarCraft II: Wings of Liberty • Stargate Worlds • Stranglehold • TimeShift • TNA iMPACT! • Tom Clancy's Ghost Recon • Tom Clancy's Rainbow Six Vegas 2 • Tomb Raider: Underworld • Torchlight • Tropico 3 • vSide • World of Tanks • World of WarCraft • You Don't Know Jack • Zuma • Allods Online • Audition Online • Battlestations: Pacific • BioShock • BioShock2 • Brutal Legend • Clive Barker's Jericho • Cortex Command • Crysis • Darkfall • DJ Hero • Batman: Arkham Asylum • De Blob • Dragon Age: Origins • Dogfighter • Far Cry • Forza Motorsport 2 • Forza Motorsport 3 • Guild Wars • Guitar Hero III • Guitar Hero: Aerosmith • Guitar Hero: World Tour • Heavenly Sword • Heroes of Newerth • Hellgate: London • Jurassic Park: Operation Genesis • Just Cause 2 • League of Legends • Lego Universe • LittleBigPlanet/LBP2 • Metroid Prime 3 • Natural Selection 2 • Need for Speed: Shift • Nicktoons Unite! • Nicktoons: Across the Second Dimension
Things You Should Know… • ADC/DAC – Audio to Digital Conversion • Sampling rate • # of times per second the computer “listens” • 44.1 KHz is CD • 22 KHz is good • Bits per sample • Computers have to approximate • 4 bits = 16 levels of approximation • 8 bits = 256 levels of approximation
Low Sampling Rate TIME
High Sampling Rate TIME
High Sampling Rate TIME
StairStep Effect TIME
Less StairStep TIME
Capturing Sounds • Usually done with: • a microphone (such as voice) • Line in • CD • Hollywood Edge® • Computer has sound card • Input types (RCA, MIDI, mini, ¼”, XLR) • Card has quality (plays 16-bit sound) • Need some kind of software • SoundForge/Audacity • Windows SoundRecorder (gag)
3D Sound • Sounds have position and velocity • There is a listener component • Relationship between the two • Attenuation (with distance) • Occlusion (low-pass filter) • Doppler (relative velocities) • Lots of “psycho-acoustic” options
Back to fmod • There are three primary components: • The Sound Designer • The Sandbox • The API • We’ll use all three • Start with Sound Designer
Setting up a Project • Take the advice of the video tutorials • Have a separate folder • Copy sounds into a “sounds” directory • Keeps the safe • Can have sub-directories • Create an “output” directory
Designer Interface Can delete this if you want, but need to have at least one group
Events • Used to define sound properties for an event • Can be comprised of • One sound • Several sounds randomly chosen • Monophonic vs Polyphonic • Can randomize pitch and attenuation • Events can be • Simple • Multi-track
Granular Sounds • These sounds aren’t looping • Allows for a sounds to occur between time ranges • Allows for polyphony
Event Options • Can vary attenuation (dropoff with distance) • Can vary pitch • Creates a sound considerably smaller than a “soundtrack” • Plays forever and is always random!
Sound Definitions • Required for multi-track events
Multi-track Events • Comprised of sound defs in layers
Multi-track Events • Careful when adding sounds • Choose sound def • Ambient noise is looping • Other sounds are granular, so choose “Oneshot” • Have parameters • Not based on time!
Multi-track Events • Can cross-fade and set fade out time
Parameter Properties • Can define range and velocity (to simulate time)
Engine Designer • fmod can specifically work with engine sounds • Need for Speed 2 • Based on the “load” of the engine • Right-click on a sound instance->properties • Auto-pitch • Window->fmod Engine Designer
The Build Process • Know which platform you’re targeting • Changes are applied only to that platform • Project->Clean, Project->Build
Interactive Music • Comprised of several short segments of music • Intro music • Darkening or discovery • Fighting/intense fighting • Release • Before you begin, you must know • Tempo of music (beats per minute – bpm) • Beats per measure (time signature)
Other Things • Supports deployment of multiple languages • Can deploy different builds based on • Platform • Language
A Look at the API • Basic API • Designer API • Built on basic API • Can read .fev files • Written for C/C++ • #include <fmod.h> // C • #include <fmod.hpp> // C++ • Read the documentation fmodex.chm
API Parts • A System is the fmod engine • A Sound is the raw resource • 2D uses FMOD_2D • 3D uses FMOD_3D result = system->createSound(“music.wav", FMOD_2D, 0, &sound);
API Parts • A Channel is an instance of a Sound • Each time you play a sound, you get a new channel • Channels can start out paused • You can set the • Volume (0.0f – 1.0f) • Pan (-1.0f – 1.0f) • Frequency (in Hz as a float) • Always use FMOD_CHANNEL_FREE to pick for you
#include<iostream> #include<fmod.hpp> #include<fmod_errors.h> usingnamespacestd; usingnamespaceFMOD; voidmain(){ FMOD_RESULTresult; System*system; // Create the fmod system. We only need one of these result=System_Create(&system); // Specify a max number of simultaneous channels result=system->init(100,FMOD_INIT_NORMAL,0); Sound*sound; // Decompress the entire mp3 into 16-bit PCM in memory result=system->createSound("winning.mp3",FMOD_DEFAULT,0,&sound); if(result!=FMOD_OK){ cout<<"Couldn't open it! "<<FMOD_ErrorString(result)<<endl; } Channel*channel; // Used for setting volume, pan, pausing... // You have the option of passing that channel as the last parameter result=system->playSound(FMOD_CHANNEL_FREE,sound,false,&channel); channel->setFrequency (44100.0f); if(result!=FMOD_OK){ cout<<"Couldn't play it! "<<FMOD_ErrorString(result)<<endl; } while(true){ cout<<"1"; system->update(); // Now required in fmod } }
Virtual Voices • Supports “virtual voices” when hardware is limited • Set from System::init() • System::getCPUUsage() • Try to keep < 1000 • May need to set the priority of a channel if it’s important • channel->isVirtual()
3D Sound in fmod • Sound attenuation • Logarithmic • Set the mindistance of a sound channel to start attenuation • Bee = 0.1f • Jet = 50.0f • Leave max distance alone (default is 10,000) • Set 3D settings with System::set3DSettings() • Doppler • Distance factor (in cm, m, feet) • Rolloff scale (attenuation models)
3D Sound • fmod uses a left-handed coordinate system result=system->init(100, (FMOD_MODE)(FMOD_INIT_3D_RIGHTHANDED|FMOD_3D), 0); • With velocity, you must pass it as meters per second velx= (posx-lastposx) * 1000 / timedelta; vel = 0.1 * 1000 / 16.67 = 6 meters per second vel = 0.2 * 1000 / 33.33 = 6 meters per second
void main () { FMOD_RESULT result; FMOD_VECTOR soundPos, soundVel; FMOD_VECTOR listenerPos, listenerVel, listenerForward, listenerUp; System* system; result = System_Create(&system); result = system->init(100, (FMOD_MODE)(FMOD_3D), 0); intnumHC = 0; result = system->getHardwareChannels(&numHC); cout << "Hardware channels: " << numHC << endl; Sound* sound; result = system->createSound(“train.mp3", FMOD_3D, 0, &sound); if (result != FMOD_OK) { cout << "Couldn't open it! " << FMOD_ErrorString(result) << endl; } Channel* channel; result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel); channel->setFrequency(44100.0f); if (result != FMOD_OK) { cout << "Couldn't play it! " << FMOD_ErrorString(result) << endl; } float dsp, stream, geometry, update, total; soundPos.y= soundVel.x = soundVel.y = 0.0f; soundPos.z = -100.0f; soundPos.x = 5.0f; soundVel.z = 6.0f; channel->set3DMinMaxDistance(10, 10000); listenerPos.x = listenerPos.y = listenerPos.z = 0.0f; listenerVel.x = listenerVel.y = listenerVel.z = 0.0f; listenerForward.x = listenerForward.y = listenerUp.x = listenerUp.z = 0.0f; listenerForward.z = listenerUp.y = 1.0f; system->set3DListenerAttributes(0, &listenerPos, &listenerVel, &listenerForward, &listenerUp); while (true) { system->update(); system->getCPUUsage(&dsp, &stream, &geometry, &update, &total); cout << total << endl; soundPos.z+=0.01f; channel->set3DAttributes(&soundPos, &soundVel); } }
Interfacing with Sound Designer • You should have received • .fev file (Designer file – event data) • .fsb file (raw audio data) • .txt file (describes the events and parameters) • May want to start by creating a helper function voidcheckErrors(FMOD_RESULT result) { if(result != FMOD_OK) { cout<< "fmod error: " << FMOD_ErrorString(result) << endl; exit(1); } }
#include <iostream> #include <fmod.hpp> #include <fmod_event.hpp> #include <fmod_errors.h> using namespace std; using namespace FMOD; void main () { EventSystem* eventSystem = NULL; EventGroup* eventGroup = NULL; Event* myEvent = NULL; EventParameter* eventPar; FMOD_RESULT result = EventSystem_Create(&eventSystem); checkErrors(result); result = eventSystem->init(64, FMOD_INIT_NORMAL, 0, FMOD_EVENT_INIT_NORMAL); eventSystem->setMediaPath("..//"); result = eventSystem->load("fmodTest.fev", 0, 0); result = eventSystem->getGroup("fmodTest/beeps", false, &eventGroup); result = eventGroup->getEvent("PossessedComputer", FMOD_EVENT_DEFAULT, &myEvent); result = myEvent->getParameter("proximityToComputer", &eventPar); myEvent->start(); float dir = 0.0001f; float currentParVal = -1.0f; eventPar->setValue(0.1f); while (true){cout << currentParVal << endl; eventPar->getValue(¤tParVal); currentParVal+=dir; eventPar->setValue(currentParVal); if ((currentParVal >= 1.0)||(currentParVal <= 0.0)) { dir = -dir; } } }
void main () { EventSystem* eventSystem = NULL; MusicSystem* musicSystem = NULL; MusicPrompt* introPrompt, *fightPrompt, *fight2Prompt, *releasePrompt; FMOD_MUSIC_ITERATOR cueIter; FMOD_MUSIC_ITERATOR paramIter; FMOD_MUSIC_ID intensityParID = -1.0f; FMOD_RESULT result = EventSystem_Create(&eventSystem); result = eventSystem->init(64, FMOD_INIT_NORMAL, 0, FMOD_EVENT_INIT_NORMAL); result = eventSystem->load("acid_test.fev", 0, 0); result = eventSystem->getMusicSystem(&musicSystem); musicSystem->setVolume(1.0f); result = musicSystem->getCues(&cueIter); cout<< "Iter ID: " << cueIter.value->id << endl; result = musicSystem->prepareCue(cueIter.value->id, &fightPrompt); result = musicSystem->getNextCue(&cueIter); cout<< "Iter ID: " << cueIter.value->id << endl; result = musicSystem->prepareCue(cueIter.value->id, &fight2Prompt); result = musicSystem->getNextCue(&cueIter); result = musicSystem->prepareCue(cueIter.value->id, &introPrompt); result = musicSystem->getNextCue(&cueIter); result = musicSystem->prepareCue(cueIter.value->id, &releasePrompt); musicSystem->getParameters(¶mIter); intensityParID = paramIter.value->id; cout << "paramIter.value->name is " << paramIter.value->name << endl; musicSystem->setParameterValue(intensityParID, 7.5f); result = introPrompt->begin(); while (true){ eventSystem->update(); } }
Other Things You Should Look Into… • The 3D Reverb API • Asynchronously loading data (by default) • Memory management for non-PC platforms • FMOD::Memory_Initialize() // fix size of fmod • Using compressed samples • Built-in DSP
Configuration Notes • You’ll be working with • Header files • C/C++ -> General->Additional Include Directories • Lib files • Linker->General->Additional Library Directories • Linker->General->Additional Dependencies • DLLs (which you should put into Windows/System32) • There’s also a FMOD.NET site…