【Linux】もっと多くの音を鳴らす方法【Ubuntu】【Ubuntu MATE】

# 概要

Linuxでは、Windowsとはまた違ったサウンドの設定があります。

Linuxのサウンドの作り方は、過去の記事で紹介しました。

https://qiita.com/toracatman/items/4ab91c5e4faaa5d18dcb

登録しても、使われない音もあります。
なので今回は、起動音、終了音などより多くの音を鳴らす方法を紹介します。

# ダウンロード

今回のセットのリンクを貼ります。

お使いのデスクトップ環境のscripts.tar.gzをダウンロードして下さい。

(2022/9/1追記)
セットを更新して、形式をtar.gzにしました。

## MATE

https://1drv.ms/u/s!AqD6uwiKk7tcgekSiMaXhODMnmxLUQ?e=BVgKqI

## GNOME、Budgie、GNOMEベースのデスクトップ環境

https://1drv.ms/u/s!AqD6uwiKk7tcgektdY57nFE66FVWAA?e=yDm7r6

## Xfce

https://1drv.ms/u/s!AqD6uwiKk7tcgekrfNLG-WtB0Et7Yw?e=cSvnaZ

## LXQt

https://1drv.ms/u/s!AqD6uwiKk7tcgekoQxT4Nq9Ytqm0sg?e=CnQ4pT

## 注意

Cinnamon、KDE、Trinity(Q4OS)は、サウンドのテーマの構造が異なっているので、
紹介するとしたら別記事で紹介します。

(2022/9/1追記)
記事ができました。

https://qiita.com/toracatman/items/0e9c515565e7a71c4c94

# 登録方法

例として、Ubuntu MATEでMATE用のセットを使って登録してみます。
なお、ここに載せてあるシェルスクリプトは、全てMATE用です。

scripts.tar.gzをダウンロードします。（画像では7zになっていますが、tar.gzだと思ってください）

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/13b56fd6-57b5-8ebb-cbce-626ebe2d6d59.png)

scripts.tar.gzをホームに展開します。

コマンドで展開する場合は、scripts.tar.gzをホームに移動し、ホームから端末を開いて
`tar zxvf scripts.tar.gz`
を実行します。

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/91df6275-10c8-e850-1247-c08f1d7d08a4.png)

scriptsフォルダーから端末を使って1-prepare-sound.shを実行します。

`./1-prepare-sound.sh`

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/1f5f3d1e-3e75-bac7-a2c5-1b38400f5b2b.png)

```sh:1-prepare-sound.sh
#!/bin/bash

gsettings set org.mate.sound event-sounds true
gsettings set org.mate.sound input-feedback-sounds true

directory=$(cd $(dirname $0); pwd)

XDG_DESKTOP_DIR=`xdg-user-dir DESKTOP`
cd $XDG_DESKTOP_DIR
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=window-close\nIcon[ja]=window-close\nName[ja]=ゴミ箱を空にする\nExec=$directory/recycle.sh\nName=ゴミ箱を空にする" > ゴミ箱を空にする.desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=system-log-out\nIcon[ja]=system-log-out\nName[ja]=ログアウト\nExec=$directory/logout.sh\nName=ログアウト" > ログアウト.desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=system-lock-screen\nIcon[ja]=system-lock-screen\nName[ja]=ロック\nExec=$directory/lock.sh\nName=ロック" > ロック.desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=system-hibernate\nIcon[ja]=system-hibernate\nName[ja]=ハイバネート\nExec=systemctl hibernate\nName=ハイバネート" > ハイバネート.desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=system-suspend\nIcon[ja]=system-suspend\nName[ja]=サスペンド\nExec=systemctl suspend\nName=サスペンド" > サスペンド.desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=system-reboot\nIcon[ja]=system-reboot\nName[ja]=再起動\nExec=$directory/reboot.sh\nName=再起動" > 再起動.desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nIcon=system-shutdown\nIcon[ja]=system-shutdown\nName[ja]=シャットダウン\nExec=$directory/shutdown.sh\nName=シャットダウン" > シャットダウン.desktop
chmod 755 *.desktop

mkdir ~/.config/autostart
cd ~/.config/autostart
echo -e "[Desktop Entry]\nType=Application\nExec=canberra-gtk-play -i \"desktop-login\"\nHidden=false\nName[ja]=起動音\nName=起動音\nComment[ja]=\nComment=\nX-MATE-Autostart-Delay=0" > canberra-gtk-play.desktop

if [ -d "/sys/class/power_supply" ]; then
	sudo apt update
	sudo apt install acpi

	echo -e "[Desktop Entry]\nType=Application\nExec=$directory/battery-alarm.sh\nHidden=false\nName[ja]=バッテリーアラーム\nName=バッテリーアラーム\nComment[ja]=\nComment=\nX-MATE-Autostart-Delay=0" > battery-alarm.sh.desktop

	($directory/battery-alarm.sh &)
fi
```

途中で指示が入った場合は、指示に従って操作します。

# ランチャー

`1-prepare-sound.sh`が終了すると、デスクトップに7つのランチャーが作られます。

![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/39910d48-a33c-d260-7393-f79b83af11d4.png)

ゴミ箱を空にするは、ゴミ箱を空にしてから、`trash-empty`を鳴らします。

```sh:recycle.sh
#!/bin/bash
rm -r ~/.local/share/Trash/files/*
rm -r ~/.local/share/Trash/info/*
rm -r /media/*/*/.Trash-1000
canberra-gtk-play -i "trash-empty"
```

ログアウト、再起動、シャットダウンは、
`desktop-logout`、`desktop-logoff`、`system-shutdown`のいずれかを鳴らしてから、
ログアウト、再起動、シャットダウンします。

```sh:logout.sh
#!/bin/bash

canberra-gtk-play -i "desktop-logout" || canberra-gtk-play -i "desktop-logoff" || canberra-gtk-play -i "system-shutdown"
killall mate-session
```

```sh:reboot.sh
#!/bin/bash

canberra-gtk-play -i "desktop-logout" || canberra-gtk-play -i "desktop-logoff" || canberra-gtk-play -i "system-shutdown"
reboot
```

```sh:shutdown.sh
#!/bin/bash

canberra-gtk-play -i "desktop-logout" || canberra-gtk-play -i "desktop-logoff" || canberra-gtk-play -i "system-shutdown"
poweroff
```

ロックは、`service-logout`を鳴らしてから画面ロックします。
その後、zenityコマンドでメッセージボックスを表示して待機し、
メッセージボックスが閉じられたら`service-login`を鳴らします。

![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/22d10186-d496-b304-5bed-88afbdf0683a.png)

```sh:lock.sh
#!/bin/bash

mate-screensaver-command -l
canberra-gtk-play -i "service-logout"

zenity --info --text="再開します。" --no-wrap
canberra-gtk-play -i "service-login"
```

ハイバネート、サスペンドは、そのままハイバネート、サスペンドします。（シェルスクリプトを使っていません）

# 起動音

起動音も登録されます。

```sh:startup-sound.sh
#!/bin/bash

directory=$(cd $(dirname $0); pwd)

canberra-gtk-play -i "desktop-login" || canberra-gtk-play -i "system-ready"
```

# バッテリーアラーム

さらに、ノートパソコンの場合は、バッテリーアラームをつけます。
80%以上になったら、バッテリ充電完了アラーム`battery-full`、

![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/a56c864b-c61f-be6c-e018-6f97c90023e1.png)

30%以下になったらバッテリ低下アラーム`battery-low`、

![g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/3a9f21a5-aaf7-bc0a-3cc4-e629400e0b41.png)

20%以下になったらバッテリ切れアラーム`battery-caution`を鳴らします。

![h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/a742e524-77d6-2c5a-a464-fe60552a338f.png)

なお、アラームが鳴るのは範囲に入ったら一度だけです（連続では鳴りません）。

```sh:battery-alarm.sh
#!/bin/bash

if [ $$ != `pgrep -fo $0` ]; then
	exit 1
fi

full_battery_alarm=0
low_battery_alarm=0
critical_battery_alarm=0

while true
	do
		export DISPLAY=:0.0
		battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
		if on_ac_power; then					#check if AC is plugged in
			if [ $battery_level -ge 80 ]; then		#check if the battery level is over 80%
				if [ $full_battery_alarm -eq 0 ]; then
					notify-send -u critical "バッテリ充電完了アラーム" "バッテリーの充電が完了しました。充電器を取り外してください。" -i battery-full-charged
					canberra-gtk-play -i "battery-full"
					full_battery_alarm=1
				fi
			fi
			low_battery_alarm=0
			critical_battery_alarm=0
		else
			if [ $battery_level -le 20 ]; then		#check if the battery level is under 20%
				if [ $critical_battery_alarm -eq 0 ]; then
					notify-send -u critical "バッテリ切れアラーム" "バッテリーが切れそうになりました。充電してください。" -i battery-caution
					canberra-gtk-play -i "battery-caution"
					critical_battery_alarm=1
				fi
			elif [ $battery_level -le 30 ]; then		#check if the battery level is under 30%
				if [ $low_battery_alarm -eq 0 ]; then
					notify-send -u normal "バッテリ低下アラーム" "バッテリーが低下しました。充電する準備をしてください。" -i battery-low
					canberra-gtk-play -i "battery-low"
					low_battery_alarm=1
				fi
			fi
			full_battery_alarm=0
		fi
		sleep 60						#wait for 60 seconds before checking again
	done
```

このシェルスクリプトは、こちらを参考にしました。

https://askubuntu.com/questions/1157608/how-do-i-set-battery-full-alert-tone-in-ubuntu-18-04-to-save-battery-wear-out

# サウンドのテーマの変更

Ubuntu MATEではサウンドの設定で簡単にサウンドのテーマを変更できますが、そうでないディストリビューションもたくさんあります。
そのために、`change-sound.sh`を用意しました。

```sh:change-sound.sh
#!/bin/bash

if [ $# -eq 0 ]; then
	ls /usr/share/sounds

	read theme
else
	theme=$1
fi

if [ -e "/usr/share/sounds/$theme/index.theme" ]; then
	gsettings set org.mate.sound theme-name $theme

	theme_name=`sed -n 's/Name=//p' "/usr/share/sounds/$theme/index.theme"`
	notify-send -i dialog-information "サウンドのテーマ変更" "サウンドのテーマを$theme_nameに変更しました。"
	canberra-gtk-play -i "theme-demo"
else
	notify-send -i dialog-error "サウンドのテーマ変更" "サウンドのテーマ$themeは見つかりませんでした。"
	canberra-gtk-play -i "dialog-error"
fi
```

このシェルスクリプトを実行すると、サウンドのテーマのフォルダー名が一覧表示されます。
フォルダー名を入力すると、サウンドのテーマが変更され、`theme-demo`が鳴ります。

ただし、index.themeがないフォルダーの場合、フォルダー名を入力してもサウンドのテーマは変更されません。

# サウンドのテスト

現在のサウンドのテーマをテストするシェルスクリプトを用意しました。
Linuxのすべての音をテストします。

sound-test.shは、サウンドのテーマにない音はデフォルトの音を鳴らします。

```sh:sound-test.sh（一部）
#!/bin/bash

play_sound() {
	clear
	echo "$1"
	canberra-gtk-play -i "$1"
}

play_sound "network-connectivity-lost"
play_sound "network-connectivity-error"
play_sound "dialog-error"
play_sound "battery-low"
play_sound "suspend-error"
play_sound "software-update-urgent"
play_sound "power-unplug-battery-low"
play_sound "message"
play_sound "message-new-instant"
play_sound "message-new-email"
```

sound-test-debug.shは、サウンドのテーマにない音は鳴らしません。
そして、音のフルパスを表示します。

```sh:sound-test-debug.sh（一部）
#!/bin/bash

play_sound_debug() {
	echo "$1"
	theme=`gsettings get org.mate.sound theme-name | sed "s/'//g"`
	sound="/usr/share/sounds/$theme/stereo/$1"
	if [ -e "$sound.oga" ]; then
		echo "$sound.oga"
		paplay "$sound.oga"
	elif [ -e "$sound.ogg" ]; then
		echo "$sound.ogg"
		paplay "$sound.ogg"
	elif [ -e "$sound.wav" ]; then
		echo "$sound.wav"
		paplay "$sound.wav"
	else
		echo "サウンドがありません。"
	fi
}

play_sound_debug "network-connectivity-lost"
play_sound_debug "network-connectivity-error"
play_sound_debug "dialog-error"
play_sound_debug "battery-low"
play_sound_debug "suspend-error"
play_sound_debug "software-update-urgent"
play_sound_debug "power-unplug-battery-low"
play_sound_debug "message"
play_sound_debug "message-new-instant"
play_sound_debug "message-new-email"
```

# 最後に

わからない、うまく動かない、改善案などがあれば、コメントでお知らせください。