【Linux】もっと多くの音を鳴らす方法（その2）【Cinnamon】【KDE】【Q4OS】

# 概要

前回の記事では、MATE、GNOMEなど、`/usr/share/sounds`にサウンドのテーマ入れればすぐに鳴らせるデスクトップ環境でもっと多くの音を鳴らす方法を紹介しました。

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

今回は、サウンドのテーマの構造が異なっているCinnamon、KDE、Trinity(Q4OS)でもっと多くの音を鳴らす方法を紹介します。

# ダウンロード

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

## Cinnamon

https://1drv.ms/u/s!AqD6uwiKk7tcgelzXauXwGHqhlMKnA?e=JlmQSw

## KDE

https://1drv.ms/u/s!AqD6uwiKk7tcgel0EkXNl1taUl-LTA?e=rh4H9E

## Trinity(Q4OS)

https://1drv.ms/u/s!AqD6uwiKk7tcgel3JePPkLW0CwCh-g?e=o7W8xt

# 登録方法

前回紹介した方法と同じです。

scripts.tar.gzをダウンロードします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/4056847f-1e9e-9916-667f-e518d6d9ebfb.png)

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

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/df17880b-db23-75df-f76a-427bd8734014.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/f9a9a495-0779-9710-dc4e-8fcff5989798.png)

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

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/e22b1031-a62c-0b66-c53b-23510454becb.png)

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

Cinnamon、KDE、Trinity(Q4OS)ではサウンドのテーマの構造が異なっていますが、可能な限りGNOMEなどと同じようにサウンドのテーマを変更できるようにしました。

サウンドのテーマの構造が異なっているとはいえ、GNOMEなどのサウンドのテーマの構造は使われていないだけで存在しているので、使われているのサウンドのテーマの構造と同時にGNOMEなどのサウンドのテーマも変更します。

`change-sound.sh`を実行すれば、同じようにサウンドのテーマのフォルダー名を入力して、テーマを変更できます。

# 説明

以下、説明です。

## Cinnamon

### サウンドのテーマの構造

サウンド設定はgsettingsの中に書かれています。

gssettingsとはWindowsでいうレジストリのようなものです。
`org.cinnamon.sounds`のようなURLのようなものをスキーマといいます。
スキーマの中に`login-enabled`などのような値が入っていて、これをキーといいます。

gsettingsの`org.cinnamon.sounds`の`（サウンド名）-enabled`が`true`だと有効、`false`だと無効です。
gsettingsの`org.cinnamon.sounds`の`（サウンド名）-file`にサウンドのパスが登録されています。

ただし、`volume-sound`だけがスキーマが`org.cinnamon.sounds`ではなく`org.cinnamon.desktop.sound`なので注意が必要です。

### change-cinnamon-sound.sh

GNOMEなどのサウンド設定に一致するCinnamonのサウンド設定をgsettingsに登録することによって、Cinnamonでも同じようにサウンドのテーマを使えるようにします。

GNOMEなどのサウンド設定にはCinnamonの`tile`に一致するサウンド設定はないので、コメントにしています。

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

theme=$1

change_cinnamon_sound() {
	sound="/usr/share/sounds/$theme/stereo/$2"
	if [ "$1" = "volume-sound" ]; then
		schema="org.cinnamon.desktop.sound"
	else
		schema="org.cinnamon.sounds"
	fi
	if [ -e "$sound.oga" ]; then
		gsettings set $schema $1-file "$sound.oga"
	elif [ -e "$sound.ogg" ]; then
		gsettings set $schema $1-file "$sound.ogg"
	elif [ -e "$sound.wav" ]; then
		gsettings set $schema $1-file "$sound.wav"
	else
		return 1
	fi
	return 0
}

change_cinnamon_sound "login" "desktop-login"
change_cinnamon_sound "logout" "desktop-logout" || change_cinnamon_sound "logout" "desktop-logoff"
change_cinnamon_sound "switch" "desktop-switch-left" || change_cinnamon_sound "switch" "desktop-switch-right"
change_cinnamon_sound "map" "window-new"
change_cinnamon_sound "close" "window-close"
change_cinnamon_sound "minimize" "window-minimized"
change_cinnamon_sound "maximize" "window-maximized"
change_cinnamon_sound "unmaximize" "window-unmaximized"
#change_cinnamon_sound "tile" "window-tile"
change_cinnamon_sound "plug" "device-added"
change_cinnamon_sound "unplug" "device-removed"
change_cinnamon_sound "notification" "notification"
change_cinnamon_sound "volume-sound" "audio-volume-change"
```

### play-cinnamon-sound.sh

`./play-cinnamon-sound.sh "（サウンド名）"`でCinnamonの音を鳴らします。
`volume-sound`の時だけスキーマを変更しています。

```shell:play-cinnamon-sound.sh
#!/bin/bash

if [ "$1" = "volume-sound" ]; then
	schema=org.cinnamon.desktop.sound
else
	schema=org.cinnamon.sounds
fi
if [ `gsettings get $schema $1-enabled` = "true" ]; then
	paplay `gsettings get $schema $1-file | sed "s/'//g"`
fi
```

### cinnamon-sound-test.sh

Cinnamonの音をテストします。

```shell:cinnamon-sound-test.sh
#!/bin/bash

play_cinnamon_sound_debug() {
	echo "$2"
	if [ "$1" = "volume-sound" ]; then
		schema=org.cinnamon.desktop.sound
	else
		schema=org.cinnamon.sounds
	fi
	if [ `gsettings get $schema $1-enabled` = "true" ]; then
		sound=`gsettings get $schema $1-file | sed "s/'//g"`
		echo "$sound"
		paplay "$sound"
	else
		echo "無効"
	fi
}

play_cinnamon_sound_debug "login" "Cinnamon の開始"
play_cinnamon_sound_debug "logout" "Cinnamon の終了"
play_cinnamon_sound_debug "switch" "ワークスペースの切り替え"
play_cinnamon_sound_debug "map" "新しいウィンドウを開く"
play_cinnamon_sound_debug "close" "ウィンドウを閉じる"
play_cinnamon_sound_debug "minimize" "ウィンドウの最小化"
play_cinnamon_sound_debug "maximize" "ウィンドウの最大化"
play_cinnamon_sound_debug "unmaximize" "ウィンドウの最大化を解除"
play_cinnamon_sound_debug "tile" "ウィンドウのタイル表示/スナップ操作"
play_cinnamon_sound_debug "plug" "デバイスの接続"
play_cinnamon_sound_debug "unplug" "デバイスの取り外し"
play_cinnamon_sound_debug "notification" "通知の表示"
play_cinnamon_sound_debug "volume-sound" "音量の変更"
```

### reset-sound.sh

gsettingsをリセットすることにより、Cinnamonのサウンドをリセットします。

```shell:reset-sound.sh
#!/bin/bash

gsettings reset-recursively org.cinnamon.sounds
gsettings reset org.cinnamon.desktop.sound volume-sound-enabled
gsettings reset org.cinnamon.desktop.sound volume-sound-file
gsettings reset org.cinnamon.desktop.sound theme-name
```

## KDE

### サウンドのテーマの構造

デフォルトのサウンド設定は`/usr/share/knotifications5`の中の`.notifyrc`ファイルに書かれており、変更したサウンド設定は`~/.config`の中の`.notifyrc`ファイルに書かれています。

### make-notifyrc.sh

`.notifyrc`ファイルを作成します。
GNOMEなどのサウンド設定に一致するKDEのサウンド設定を`.notifyrc`ファイルに書き込むことによって、KDEでも同じようにサウンドのテーマを使えるようにします。

```shell:make-notifyrc.sh
#!/bin/bash

theme="$1"

check_sound() {
	if [ -e "/usr/share/sounds/$theme/stereo/$1.oga" ]; then
		format="oga"
	elif [ -e "/usr/share/sounds/$theme/stereo/$1.ogg" ]; then
		format="ogg"
	elif [ -e "/usr/share/sounds/$theme/stereo/$1.wav" ]; then
		format="wav"
	else
		return 1
	fi

	if [ "$3" = "" ]; then
		action=""
	else
		action="Action=$3\n"
	fi
	setting="[Event/$2]\n${action}Execute=\nLogfile=\nSound=$theme/stereo/$1.$format\nTTS="
	if [ -e ~/.config/$notifyrc.notifyrc ]; then
		echo -e "\n$setting" >> ~/.config/$notifyrc.notifyrc
	else
		echo -e "$setting" > ~/.config/$notifyrc.notifyrc
	fi

	return 0
}

notifyrc="plasma_workspace"
rm ~/.config/$notifyrc.notifyrc
check_sound "completion-fail" "Textcompletion: no match" "Sound"
check_sound "completion-partial" "Textcompletion: partial match" "Sound"
check_sound "completion-rotation" "Textcompletion: rotation" "Sound"
check_sound "trash-empty" "Trash: emptied" ""
check_sound "bell" "beep" "" || check_sound "bell-window-system" "beep" ""
check_sound "suspend-error" "catastrophe" ""
check_sound "desktop-logout" "exitkde" "Sound" || check_sound "desktop-logoff" "exitkde" "Sound"
check_sound "suspend-error" "fatalerror" ""
check_sound "dialog-error" "messageCritical" ""
check_sound "dialog-information" "messageInformation" ""
check_sound "dialog-warning" "messageWarning" ""
check_sound "dialog-question" "messageboxQuestion" ""
check_sound "notification" "notification" ""
check_sound "desktop-login" "startkde" "Sound"

notifyrc="ksmserver"
rm ~/.config/$notifyrc.notifyrc
check_sound "service-logout" "locked" "Sound"
check_sound "service-login" "unlocked" "Sound"

notifyrc="networkmanagement"
rm ~/.config/$notifyrc.notifyrc
check_sound "network-connectivity-established" "ConnectionActivated" "Sound|Popup"
check_sound "network-connectivity-lost" "ConnectionDeactivated" "Sound|Popup"
check_sound "network-connectivity-error" "FailedToActivateConnection" "Sound|Popup"

notifyrc="powerdevil"
rm ~/.config/$notifyrc.notifyrc
check_sound "battery-caution" "criticalbattery" ""
check_sound "battery-full" "fullbattery" "Sound"
check_sound "battery-low" "lowbattery" ""
check_sound "battery-low" "lowperipheralbattery" ""
check_sound "power-plug" "pluggedin" ""
check_sound "power-unplug" "unplugged" ""

notifyrc="akonadi_newmailnotifier_agent"
rm ~/.config/$notifyrc.notifyrc
check_sound "message-new-email" "new-email" "Sound|Popup"

notifyrc="konsole"
rm ~/.config/$notifyrc.notifyrc
check_sound "bell" "BellInvisible" "Sound|Popup" || check_sound "bell-terminal" "BellInvisible" "Sound|Popup"
check_sound "bell" "BellVisible" "Sound" || check_sound "bell-terminal" "BellVisible" "Sound"
```

### play-kde-sound.sh

`/usr/share/knotifications5`の中の`.notifyrc`と`~/.config`の中の`.notifyrc`ファイルを解析して、現在のサウンド設定を読み取り、音を鳴らします。

`./play-kde-sound.sh "（アプリケーション名）" "（サウンド名）"`でKDEの音を鳴らします。

```shell:play-sound.sh
#!/bin/bash

notifyrc=`sed -E '/^(Name|Comment)/d' /usr/share/knotifications5/$1.notifyrc`
l=`echo "$notifyrc" | grep -m 1 -n "^\[Event/$2\]" | grep -E -o '^[0-9]+'`
if [ "$l" != "" ]; then
	notifyrc=`echo "$notifyrc" | sed "1,${l}d"`
	l=`echo "$notifyrc" | grep -m 1 -n '^\[' | grep -E -o '^[0-9]+'`
	if [ "$l" != "" ]; then
		notifyrc=`echo "$notifyrc" | head -n $(($l - 1))`
	fi
	action=`echo "$notifyrc" | sed -n 's/Action=//p'`
	sound=`echo "$notifyrc" | sed -n 's/Sound=//p'`
	if [ -e ~/.config/$1.notifyrc ]; then
		notifyrc=`cat ~/.config/$1.notifyrc`
		l=`echo "$notifyrc" | grep -m 1 -n "^\[Event/$2\]" | grep -E -o '^[0-9]+'`
		if [ "$l" != "" ]; then
			notifyrc=`echo "$notifyrc" | sed "1,${l}d"`
			l=`echo "$notifyrc" | grep -m 1 -n '^\[' | grep -E -o '^[0-9]+'`
			if [ "$l" != "" ]; then
				notifyrc=`echo "$notifyrc" | head -n $(($l - 1))`
			fi
			if [[ "$notifyrc" =~ "Action=" ]]; then
				action=`echo "$notifyrc" | sed -n 's/Action=//p'`
			fi
			if [[ "$notifyrc" =~ "Sound=" ]]; then
				sound=`echo "$notifyrc" | sed -n 's/Sound=//p'`
			fi
		fi
	fi
	if [[ "$action" =~ "Sound" ]]; then
		if [ "${sound::1}" != "/" ] && [ "${sound::1}" != "~" ]; then
			sound="/usr/share/sounds/$sound"
		fi
		paplay "$sound"
	fi
fi
```

### kde-sound-test.sh

全部は多いので、`plasma_workspace`、`ksmserver`、`networkmanagement`、`powerdevil`、`akonadi_newmailnotifier_agent`、`konsole`のKDEの音をテストします。

`kde-sound-test-debug.sh`はデバッグ用にサウンドのパスを表示しながら鳴らします。

```shell:kde-sound-test.sh
#!/bin/bash

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

notifyrcs=("plasma_workspace" "ksmserver" "networkmanagement" "powerdevil" "akonadi_newmailnotifier_agent" "konsole")

for i in "${notifyrcs[@]}"
do
	for j in `sed -n 's%^\[Event/%%p' /usr/share/knotifications5/$i.notifyrc | sed 's/\]//g' | sed 's/ /!/g'`
	do
		clear
		echo "$i/${j//!/ }"
		$directory/play-kde-sound.sh "$i" "${j//!/ }"
	done
done
```

### reset-sound.sh

`.notifyrc`を削除することにより、KDEのサウンドをリセットします。

```shell:reset-sound.sh
#!/bin/bash

rm ~/.config/*.notifyrc
```

## Trinity(Q4OS)

### サウンドのテーマの構造

KDEとよく似ています。
デフォルトのサウンド設定は`/opt/trinity/share/apps/（アプリケーション名）`の中の`eventsrc`ファイルに書かれており、変更したサウンド設定は`~/.trinity/share/config`の中の`.eventsrc`ファイルに書かれています。

### make-eventsrc.sh

`.eventsrc`ファイルを作成します。
GNOMEなどのサウンド設定に一致するKDEのサウンド設定を`.eventsrc`ファイルに書き込むことによって、Trinity(Q4OS)でも同じようにサウンドのテーマを使えるようにします。

```shell:make-eventsrc.sh
#!/bin/bash

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

theme="$1"

copy_eventsrc() {
	cp $directory/$eventsrc.eventsrc ~/.trinity/share/config
}

check_sound() {
	if [ -e "/usr/share/sounds/$theme/stereo/$1.oga" ]; then
		format="oga"
	elif [ -e "/usr/share/sounds/$theme/stereo/$1.ogg" ]; then
		format="ogg"
	elif [ -e "/usr/share/sounds/$theme/stereo/$1.wav" ]; then
		format="wav"
	else
		return 1
	fi

	sed -i "$(($2 + 3))cpresentation=$(($3 | 1))" ~/.trinity/share/config/$eventsrc.eventsrc
	sed -i "$(($2 + 4))csoundfile\[\$e\]=/usr/share/sounds/$theme/stereo/$1.$format" ~/.trinity/share/config/$eventsrc.eventsrc

	return 0
}

eventsrc="knotify"
copy_eventsrc
check_sound "completion-fail" 1 1	#Textcompletion: no match
check_sound "completion-partial" 7 1	#Textcompletion: partial match
check_sound "completion-rotation" 13 1	#Textcompletion: rotation
check_sound "trash-empty" 19 1		#Trash: emptied
check_sound "suspend-error" 37 2	#catastrophe
check_sound "desktop-logout" 43 1 || check_sound "desktop-logoff" 43 1	#exittde
check_sound "suspend-error" 49 2	#fatalerror
check_sound "dialog-error" 55 65	#messageCritical
check_sound "dialog-information" 61 65	#messageInformation
check_sound "dialog-warning" 67 65	#messageWarning
check_sound "dialog-question" 73 65	#messageboxQuestion
check_sound "notification" 79 1		#notification
check_sound "desktop-login" 91 1	#starttde

eventsrc="twin"
copy_eventsrc
check_sound "window-maximized" 151 0	#maximize
check_sound "window-minimized" 157 0	#minimize
check_sound "window-move-end" 163 0	#moveend
check_sound "window-move-start" 169 0	#movestart
check_sound "window-resize-end" 193 0	#resizeend
check_sound "window-resize-start" 199 0	#resizestart
check_sound "window-slide-in" 205 0	#shadedown
check_sound "window-slide-out" 211 0	#shadeup
check_sound "window-unmaximized" 229 0	#unmaximize
check_sound "window-unminimized" 235 0	#unminimize

eventsrc="tdenetworkmanager"
copy_eventsrc
check_sound "network-connectivity-established" 1 0	#tdenm-nm-connected
check_sound "network-connectivity-error" 13 0		#tdenm-nm-connection-attempt-failed
check_sound "network-connectivity-lost" 31 0		#tdenm-nm-disconnected

eventsrc="tdepowersave"
copy_eventsrc
check_sound "suspend-start" 13 17	#autosuspend_event
check_sound "battery-caution" 19 17	#battery_critical_event
check_sound "battery-low" 25 17		#battery_low_event
check_sound "battery-low" 31 17		#battery_warning_event
check_sound "suspend-start" 49 0	#freeze_event
check_sound "lid-open" 55 0		#lid_opened_event
check_sound "lid-close" 61 0		#lid_closed_event
check_sound "power-plug" 67 17		#plug_event
check_sound "suspend-resume" 73 0	#resume_from_freeze_event
check_sound "suspend-resume" 79 0	#resume_from_standby_event
check_sound "suspend-resume" 85 0	#resume_from_suspend2disk_event
check_sound "suspend-resume" 91 0	#resume_from_suspend2ram_event
check_sound "suspend-start" 127 0	#standby_event
check_sound "suspend-start" 133 0	#suspend2disk_event
check_sound "suspend-start" 139 0	#suspend2ram_event
check_sound "power-unplug" 145 17	#unplug_event

eventsrc="konsole"
copy_eventsrc
check_sound "bell" 7 16 || check_sound "bell-terminal" 7 16	#BellInvisible
check_sound "bell" 13 1 || check_sound "bell-terminal" 13 1	#BellVisible
```

### play-tde-sound.sh

`/opt/trinity/share/apps/（アプリケーション名）`の中の`eventsrc`と`~/.trinity/share/config`の中の`.eventsrc`ファイルを解析して、現在のサウンド設定を読み取り、音を鳴らします。

`./play-tde-sound.sh "（アプリケーション名）" "（サウンド名）"`でTrinity(Q4OS)の音を鳴らします。

```shell:play-tde-sound.sh
#!/bin/bash

presentation=0
soundfile=""
if [ -e ~/.trinity/share/config/$1.eventsrc ]; then
	eventsrc=`cat ~/.trinity/share/config/$1.eventsrc`
else
	eventsrc=`sed -E '/^(Name|Comment)/d' /opt/trinity/share/apps/$1/eventsrc`
fi
l=`echo "$eventsrc" | grep -m 1 -n "^\[$2\]" | grep -E -o '^[0-9]+'`
if [ "$l" != "" ]; then
	eventsrc=`echo "$eventsrc" | sed "1,${l}d"`
	l=`echo "$eventsrc" | grep -m 1 -n '^\[' | grep -E -o '^[0-9]+'`
	if [ "$l" != "" ]; then
		eventsrc=`echo "$eventsrc" | head -n $(($l - 1))`
	fi
	if [[ "$eventsrc" =~ "default_presentation=" ]]; then
		presentation=`echo "$eventsrc" | sed -n 's/default_presentation=//p'`
	elif [[ "$eventsrc" =~ "presentation=" ]]; then
		presentation=`echo "$eventsrc" | sed -n 's/presentation=//p'`
	fi
	if [[ "$eventsrc" =~ 'default_sound=' ]]; then
		soundfile=`echo "$eventsrc" | sed -n 's/default_sound=//p'`
	elif [[ "$eventsrc" =~ 'soundfile[$e]=' ]]; then
		soundfile=`echo "$eventsrc" | sed -n 's/soundfile\[\$e\]=//p'`
	fi
fi
if [ $(($presentation & 1)) -eq 1 ]; then
	if [ "$soundfile" != "" ]; then
		if [ "${soundfile::5}" = '$HOME' ]; then
			soundfile=${soundfile/\$HOME/$HOME}
		elif [ "${soundfile::1}" != "/" ] && [ "${soundfile::1}" != "~" ]; then
			soundfile="/opt/trinity/share/sounds/$soundfile"
		fi
		paplay "$soundfile"
	fi
fi
```

### tde-sound-test.sh

全部は多いので、`knotify`、`twin`、`tdenetworkmanager`、`tdepowersave`、`konsole`のTrinity(Q4OS)の音をテストします。

`tde-sound-test-debug.sh`はデバッグ用にサウンドのパスを表示しながら鳴らします。

```shell:tde-sound-test.sh
#!/bin/bash

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

eventsrcs=("knotify" "twin" "tdenetworkmanager" "tdepowersave" "konsole")

for i in "${eventsrcs[@]}"
do
	for j in `sed -n 's%^\[%%p' /opt/trinity/share/apps/$i/eventsrc | sed 's/\]//g' | sed 's/ /!/g'`
	do
		if [ "$j" != "!Global!" ]; then
			clear
			echo "$i/${j//!/ }"
			$directory/play-tde-sound.sh "$i" "${j//!/ }"
		fi
	done
done
```

### reset-sound.sh

`.eventsrc`を削除することにより、KDEのサウンドをリセットします。

```shell:reset-sound.sh
#!/bin/bash

rm ~/.trinity/share/config/*.eventsrc
```

# 最後に

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

自分でも説明が不足している部分があると思うので、多分この記事は何回も編集すると思います。