3D Sound System - Realistic frequency dampening

I can’t hear the difference between BlindTest vs BlindTestModule and your game vs EngineAttenuation. Do you have any other examples that might be clearer?

3 Likes

I suppose if you replace the SoundID with the ID of a sound with more high frequencies in it, the reduction of high frequency would be more apparent.

2 Likes

It would be kind of cool to see roll off used with this!

2 Likes

I would suggest also adding an function to attach an audio to this, so it can support all audios rather than just audios created by the script. I am going to modify the code to fit my use by doing this and if people are interested, I can link it here.

3 Likes

I’d love for you to share your changes!

1 Like

Here’s the code I used (Posted directly after :Create() function)

function SoundSystem:Attach(sound)
	local Equalizer	= sound:FindFirstChildOfClass("EqualizerSoundEffect") or newInst("EqualizerSoundEffect")
	Equalizer.LowGain	= 0
	Equalizer.MidGain	= 0
	Equalizer.HighGain	= 0
	Equalizer.Parent = sound
	local tbl = {Sound = sound}
	CurrentObjects[tbl]	= true
	spawn(function()
		repeat wait() until not sound:IsDescendantOf(workspace)
		
		CurrentObjects[tbl] = nil
	end)
end

Edit: I would like to add that this has not been tested, and will be pending testing until I have properly incorporated my Vehicle Physics into the file with this.

1 Like

I don’t have access to my PC for a few days, but I plan on adding this feature to the master branch.

I do plan on rewriting the code, but the API is nice. I just think creating a thread to do a repeat wait() until is not the best way to accomplish that.

1 Like

I made this for a StreamingEnabled environment, so it works pretty well for me. I use this quite often without seeing any sort of memory issues or anything related to that. I suppose you could do wait(1) if you are concerned.

1 Like

Wait a second, this won’t work. It’ll call Emitter.WorldPosition to do the angle math, which would return nil instead of a Vector3.

2 Likes

as said before, I have not yet tested it. I can fix that as soon as I have the vehicles properly setup in this file.

2 Likes

I haven’t tested it, but this may break if someone uses the system and changes a user’s listener - although I’m not sure many people use it, it can be used to change where a user ‘hears’ from.

local listenerType, listener = game:GetService("SoundService"):GetListener()

You seem to use the angle to the user’s camera to do the effects, so if the player is listening from somewhere else, it won’t work correctly. (unless you’ve changed something since I’ve last looked.)

2 Likes

I didn’t know that was a thing. When I have a chance, I’ll fiddle with it until that is supported. Thanks for letting me know!

1 Like

Adding a hint of reverb might help. When I created this demonstration, I had added reverb as well. It’s a little too much, but adding the perfect amount helps as well.

1 Like

Specifically on the left and right. It isn’t for realism, but for making the difference more audible.

I’ve got pretty much all of my game working with this code, and it only required a small amount of modification. Just replace the ‘RenderStepped’ function with the following function.

RunService.RenderStepped:Connect(function()
	for Emitter, _ in pairs(CurrentObjects) do
		if Emitter.ClassName == "Attachment" then
			Emitter.Sound.EqualizerSoundEffect.HighGain = -(-25 * cos(acos(dot(cf(Camera.CFrame.Position,v3(Camera.CFrame.LookVector.X,Camera.CFrame.Position.Y,Camera.CFrame.LookVector.Z)).LookVector.Unit,v3(Emitter.WorldPosition.Unit.X,Camera.CFrame.Position.Y,Emitter.WorldPosition.Unit.Z)))/pi * (pi / 2)) + 25)
		elseif Emitter.Sound.Parent:IsA("BasePart") then
			Emitter.Sound.EqualizerSoundEffect.HighGain = -(-25 * cos(acos(dot(cf(Camera.CFrame.Position,v3(Camera.CFrame.LookVector.X,Camera.CFrame.Position.Y,Camera.CFrame.LookVector.Z)).LookVector.Unit,v3(Emitter.Sound.Parent.Position.Unit.X,Camera.CFrame.Position.Y,Emitter.Sound.Parent.Position.Unit.Z)))/pi * (pi / 2)) + 25)
		end
	end
end)
2 Likes

This is very cool!
Can I use this for my upcoming tactical shooter game?

2 Likes

You most certainly can! I have a few updates planned, so I suggest you wait a bit before implementing this.

2 Likes

My game isn’t really in alpha yet, so we can wait, and I can’t accept not to credit you my guy! :slight_smile:

1 Like

Update!

Changes have been pushed to GitHub and the Roblox Library.


Summary:

  • Added SoundSystem:Attach(SoundObj)
  • Added support for SoundService:SetListener()
  • Cleaned up the math and actually fixed a couple issues with it

SoundSystem:Attach(SoundObj)

Suggested by @xXVernandoXx!

Until now, the module could only add the 3D effect to sounds it created from the :Create() function. Now, if you have a Sound created some other way, be it by another script or before runtime, you can call :Attach() on it to attach the module’s effect onto it as well.

SoundService:SetListener()

Suggested by @lArekan!

Prior to this update, the module assumed you use the default listener: the Camera. Now, it actually gets the Listener, therefore adding support for setting your listener to various objects or CFrames.

Math changes

Big thanks to @EgoMoose’s Dot Product video!

The previous version had some odd behaviours when you left the origin, due to an oversight on my part. Forgot to test while walking around :neutral_face: Fixed that now!
Also, changed the easing aspect to -(25 * ((Angle/pi)^2)), which gives a nicer curve.

16 Likes

This is epic. Games like Rainbow Six Siege and Call of duty take advantage of 3-10D Audio. I can already imagine the ideas for like FPS games with the 3D Sound System.
Epik