Randomize Alert Sound Effect in Mac OS
Is there any way to randomize the alert sound effect in Mac OS? In system prefs I am able to select which sound effect I want to hear. Is there a way for the system to choose a random sound each time?
Solution 1:
This isn't built into macOS so this is something you are going to have to script and do a bit of customization. You will need the following:
- Custom location for your sound
- Script to randomize the sound
- launchd plist to run the script at a set interval
Custom Location for Sound
System sounds are in the /System/Library/Sounds
directory which I don't recommend attempting to modify. You can copy them to ~/Libary/Sounds
or another custom directory of your choosing. This way, you can add your own custom sounds without interfering with the System sounds themselves.
Script to Randomize Soundfile
The script below will generate a random number between 0 and the number of files you have in your sound directory. It will then create an array of all the file names and then select a random filename (array element) which it will then copy that file to another file called CustomAlert.aif
. You can customize the filename and path to suit your needs.
#!/bin/bash
#
# script filename: randomAlert.sh
#User Defined Variables
sdir="/Users/foobar/test"
sfname="CustomAlert.aif"
#Remove Custom Alert Sound if already Exists
if [ -f ${sdir}/${sfname} ]; then
rm -f ${sdir}/${sfname}
fi
#Get Number of Files in Directory
numfiles=(*)
numfiles=${#numfiles[@]}
#Generate Random Number
rnum=$(( $RANDOM % ${numfiles} + 0 ))
#Put names of files into array
fnames=(*)
#Copy file to Alert Sound File
cp ${sdir}/${fnames[${rnum}]} ${sdir}/${sfname}
exit
Make sure the script's permissions is set to allow execution:
chmod +x randomAlert.sh
Finally, make sure the script is in a "safe" location (a folder in your home directory is always a good place)
Launchd plist
To have the script run, you need to use the launchd
service. The plist can go in any one of 3 locations:
-
~/Library/LaunchAgents
- For just one user, run as the user (i.e. yourself) -
/Library/LaunchAgents
- For all users, run as the user -
/Library/LaunchDaemons
- As a system daemon (run as root)
I recommend either of the first two; it doesn't make sense to run as a system daemon.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.randomSound</string>
<key>ProgramArguments</key>
<array>
<string>/Users/USERNAME/Path_to_Scripts/randomAlert.sh</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>00</integer>
<key>Minute</key>
<integer>00</integer>
</dict>
</dict>
</plist>
Once you have copied it to the appropriate directory, you need to launch it with launchctl
launchctl load com.user.randomSound.plist
Set your Alert Sound to the Custom File
In your settings, set the alert to CustomAlert.aif
. Even though the sound will change, the name of the file will stay the same.
That's it! Every 24 hours, your script will kick off and set a new random alert sound.