This is pretty straightforward. You can use different audioProfiles to define the distance and volume of sounds, and you create different audioDatas for each version of your sound effect, then call each one when appropriate.
For each version of your weapon, you're inevitably going to need to duplicate it into new datablocks. So just use a different sound for each weapon.