Core2D [Spat]ial Sound System
BlitzMax Forums/BlitzMax Programming/Core2D [Spat]ial Sound System
| ||
The SetChannelPan command is pretty neat, but especially neat when you pair it up with a pointer and dynamically pan to a moving object on screen! Here's what I call [Spat]ial Sound System. Try to use a sound that is 5 seconds or longer so you can really hear it pan in real-time as you move the mouse left to right. Please test and comment. Thanks. ' [Spat]ial Sound System (part of the Core2D Nirvana Sound Module) ' by Chroma Private Global _hgw Global _spats Global _spatList:TList = CreateList() Public Type TSpat Field chn:TChannel Field xInt:Int Ptr Field xFlt:Float Ptr Function Create:TSpat(chn:TChannel,xFlt:Float Ptr,xInt:Int Ptr) Local spat:TSpat = New TSpat spat.chn = chn spat.xInt = xInt spat.xFlt = xFlt Return spat End Function End Type Function SpatInit(gfxWidth) _hgw = gfxwidth / 2 End Function Function PlaySpat(sound:TSound,xFlt:Float Ptr,xInt:Int Ptr=Null,track=0) If Not _hgw RuntimeError("ALERT: SpatInit(graphicsWidth) is Not set.") Local x#,pan#,chn:TChannel If xFlt <> Null x = xFlt[0] Else x = xInt[0] pan = x / (_hgw / 2.0) - 1 chn = AllocChannel() SetChannelPan(chn,pan) PlaySound(sound,chn) If track _spatList.AddLast(TSpat.Create(chn,xFlt,xInt)) _spats:+1 EndIf End Function Function UpdateSpats() If _spats Local spat:TSpat,x#,pan# For spat = EachIn _spatList If spat.xFlt <> Null x = spat.xFlt[0] Else x = spat.xInt[0] pan = x / (_hgw / 2.0) - 1 SetChannelPan(spat.chn,pan) If Not ChannelPlaying(spat.chn) _spatList.Remove(spat) _spats:-1 EndIf Next EndIf End Function '===TEST=== Graphics 1024,768 SpatInit(1024) 'set this to your graphics width or virtual resolution width Local snd:TSound = LoadSound("chest_open.wav") 'put in your own sound, try to use a longer sound Local mxFloat:Float 'must use Float variable with Float Ptr Local mxInt:Int 'must use Int variable with Int Ptr While Not KeyHit(KEY_ESCAPE) Cls mxFloat = MouseX() mxInt = MouseX() my = MouseY() DrawText "Mouse: "+MouseX()+","+MouseY(),10,10 '-->You MUST put Varptr() in there for your x position variable If MouseHit(1) PlaySpat(snd,Varptr(mxFloat),Null,True) 'Like this for Float vars 'If MouseHit(1) PlaySpat(snd,Null,Varptr(mxInt),True) 'Like this for Int vars UpdateSpats() Flip Wend Last edited 2010 |