anchor.diff:  		return
   	// and play
   	var/turf/source = get_turf(instrumentObj)
  -	for(var/mob/M in get_hearers_in_view(15, source))
  -		if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS))
  -			continue
  -		M.playsound_local(source, soundfile, 100, falloff = 5)
  +	if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
  +		hearers = list()
  +		for(var/mob/M in get_hearers_in_view(15, source))
  +			if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS))
  +				continue
  +			LAZYSET(hearers, M, TRUE)
  +		last_hearcheck = world.time
  +	if(LAZYLEN(hearers))
  +		for(var/i in hearers)
  +			var/mob/M = hearers[i]
  +			M.playsound_local(source, soundfile, 100, falloff = 5)
   
   /datum/song/proc/updateDialog(mob/user)
   	instrumentObj.updateDialog()		// assumes it's an object in world, override if otherwise
  
positive.code: 
  #define MUSIC_MAXLINES 300
  #define MUSIC_MAXLINECHARS 50
  
  
negative.code: 
  	else if(href_list["stop"])
  		playing = FALSE
  		hearers = null
  
  	updateDialog(usr)
  	return
  