タッチバーにワンタップでマイクのミュート/ミュート解除ができるボタンを作る

これです

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">世は正に大リモートワーク時代なのでタッチバーにマイクのミュート操作できるボタン設置した。 <a href="https://t.co/FKYD10rrGC">pic.twitter.com/FKYD10rrGC</a></p>&mdash; 2357gi (@2357gi) <a href="https://twitter.com/2357gi/status/1258374502699810817?ref_src=twsrc%5Etfw">May 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# td;dr
リモートワークによりマイクを使う場面が増えた昨今ですが、
マイクのミュートって咄嗟に行いたい割には通話アプリを開いて(前面に持ってきて)ミュートボタンを押したり
となかなか面倒くさいですよね。
どうにか簡単にミュートができないかなと考えた末タッチバーにいい感じのものを実装することができたので解説したいと思います。

上記の動画のようにワンタップでシステムの入力音量を変更し、`ミュート` / `ミュート解除`を行うことができます。
欠点として入力音量をゼロにすることによりミュートを実現しているので、zoom等で自分がミュートにしていることが相手に伝わらないという点が挙げられますのでご注意ください。

google meetはシステムの入力音量監視していて、**入力音量ゼロになったらミュートアイコンが表示される**のでmeetで通話するのであれば問題ないですが...!!

zoomで使用する場合もzoom側で音量の自動調節設定を外す必要があります。

# 必要なもの
- タッチバー付きmacbook
- [BetterTouchTool](https://folivora.ai/)  
    タッチバーやタッチパッドなどを拡張するツール。30日間のトライアルあり。
    ここでは導入方法を解説しません。

# 実装
## 下ごしらえ
AppleScriptと、BetterTouchToolの機能である**任意の条件でAppleScriptを実行する**機能と**AppleScriptの実行結果をタッチバーに表示する**機能を使用します。
まずはBetterTouchToolを起動し、全てのアプリでタッチバーボタン/ウィジェットの追加を行います。
追加するものは`AppleScript / JavaScript Widget`です。バージョンによって翻訳されていたりするかもしれません。
`Widget Identifier`欄にこのウィジェットの適当な名前をつけておきましょう。

<img width="1337" alt="スクリーンショット 2020-05-08 23.47.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270408/288c2496-4287-7c10-5c01-950f596d45ad.png">

これは、AppeScript/JavaScriptを実行し、実行結果をタッチバーに表示するというウィジェットです。
ここではAppleScriptを用いてシステムの入力音量を取得し、ミュートかどうかをウィジェットとして表示したいのですが、
まずは本質である**タップするとミュート/ミュート解除が行われる**を実装したいと思います。

## 先ほど作成したウィジェットをタップするとミュート/ミュート解除をトグルするようにする
真ん中のカラムより、アクションの追加を行います。
タップすると発火されるものです。
追加するアクションは`AppleScriptを実行する`というものです。
実行するAppleScriptはこちらです。

```AppleScript
set inputVolume to input volume of (get volume settings)
if inputVolume = 0 then
	set inputVolume to 100
else
	set inputVolume to 0
end if
set volume input volume inputVolume
return

```
入力音量を拾ってきて、0であれば100に、100であれば0に変更するものです。
せっかくなのでトグルをmacの通知で教えてくれるようにしましょう。

```applescript

set inputVolume to input volume of (get volume settings)
if inputVolume = 0 then
	set inputVolume to 100
	set displayNotification to "Microphone active"
else
	set inputVolume to 0
	set displayNotification to "Microphone muted"
end if
set volume input volume inputVolume
display notification displayNotification
```
いいですね。これでタッチバーボタンを押すだけでミュート/ミュート解除ができるようになりました。

## ミュートしているかどうかを(かっこよく)表示する
ミュートしているかどうかは常時サッと見れるようにしておきたいですよね。
というわけで先述した`AppleScript/JavaScript Widget`を用いて状態を表示してみたいと思います。

`AppleScript/JavaScript Widget`の設定画面に戻り、AppleScriptを変更します。

```applescript
set inputVolume to input volume of (get volume settings)

if inputVolume = 0 then
	set status to "active"
else
	set status to "mute"
end if
return status
```

これでactive/muteが表示されるようになりました。
しかしこれではわかりにくいですね。背景を変えて、さらに状態をアイコンでも表現するようにしてみましょう。
`代替カラー正規表現:`に先ほどのapplescriptでミュートにした際に表示される文字列とマッチする正規表現を入力します。
ここでは`mute`とします。
次に、`ウィジェット固有|一般`のボタンから一般の設定を開き、背景色と代替背景色、アイコンと代替アイコンを設定します。
お好みで`アイコンのみ表示`のチェックも入れるとアイコンと背景色だけでスッキリしていい感じです。


# まとめ
これでタッチバーにミュートのトグルボタンを設置できたはずです、おめでとうございます！
ちなみに、デフォルトのタッチバーはESCボタンが小さかったり、いまいち使いにくいですよね。
しかし、BetterTouchToolを用いることによってESCボタンをおっきくすることもできますし、
長押しで別の挙動をあてがうこともできますし、shellscript ウィジェットを使ってssidを表示させたりすることもできます！
<img width="1085" alt="Touch Barショット 2020-05-09 0.15.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270408/75f66898-946b-2d25-6418-25cf9f63d703.png">

タッチバーをいじるのは結構楽しいので是非ともやってみてください...!!

ESCおっきくしたり、SSID表示させたりするのはこちら...
[お前らのタッチバーはダサい](https://qiita.com/2357gi/items/8235093de77aa3e5fecc)