Core2D [Spat]ial Sound System

BlitzMax Forums/BlitzMax Programming/Core2D [Spat]ial Sound System

Chroma(Posted 2010) [#1]
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