【UiPath】"きらきら星"を奏でよう

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

この記事はUiPathブログ発信チャレンジ2023サマーの10日目の記事です。

【初めに】
ロボットのその終了を通知するには、メールで通知する、メッセージボックスを表示するなどいろいろな方法があると思います。**「警告音」アクティビティ**を使って、システムサウンドを鳴らすのも「手」ですね。

しかし、システムサウンドを一回鳴らしただけでは聞き逃してしまう場合もあり。かといって何回も **「警告音」アクティビティ**を使用しても、聞きなれた音は聞き逃してしまいがちです。

今回は、別の音を鳴らしてみようと思いました。
- - - 
## １）「システム・サウンド」を使って鳴らしてみる。
Windowsのシステムサウンドは、なにかのイベントが発生した場合に出される音です。
システムサウンドには、以下のものがあります。
- Beep音（Windowsの「一般の警告音」で、いわゆる「ビープ音」）
　⇒ **「警告音」アクティビティ**はこのBeepを使っています。
- Exclamation音（Windowsの「メッセージ (警告)」の音）
- Asterisk音（Windowsの「メッセージ (情報)」の音）
- Question音（Windowsの「メッセージ (問い合わせ)」の音）
- Hand音（Windowsの「システム エラー」の音）
これらのシステム・サウンドは、Windowsの［コントロール パネル］の［サウンドとオーディオ デバイス］より確認および変更することができます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/458b5127-a93d-b482-1c6c-0a8a75d58436.png">

ここの設定で、「一般の警告音」システムサウンドと音源ファイルとを結びつける事で、**「警告音」アクティビティ**を使って、本来とは別の音を鳴らす事が出来ますね。

このシステムサウンドの詳細は、こちらに記載があります。
[SystemSounds クラス](https://learn.microsoft.com/ja-jp/dotnet/api/system.media.systemsounds?view=windowsdesktop-7.0)

- - - 
## ２）PCサウンド（マシンに内蔵されているブザーの音）を使って鳴らしてみる。
PCサウンドは、電子的に作り出したブザー音となります。ここでは、Consoleクラスの静的なBeepメソッドを使ってみましょう。

このシステムサウンドの詳細は、こちらに記載があります。

https://learn.microsoft.com/ja-jp/dotnet/api/system.console.beep?view=net-7.0

それによると、このメソッドでは、周波数と時間を指定して、コンソールのスピーカーからビープ音を出力する事ができます。
[Beep(Int32, Int32)](https://learn.microsoft.com/ja-jp/dotnet/api/system.console.beep?view=net-7.0#system-console-beep#system-int32-system-int32)

UiPathでの実装に際しては、**「メソッドを呼び出し」アクティビティを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/eeb8db99-d46b-3b45-e2c5-eb334e924ff1.png)
```
TargetType:System.Console
MethodName:Beep
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/94a92571-fc2b-10c9-334c-99eb880aefa2.png)
```
第一引数(int32):400
第二引数(int32):2000
```
この例では、400Hzの音が2000ミリ秒鳴ります。

- - - 
## ３）周波数をドレミにしてみる。
Console.Beep(周波数, 鳴動時間)で、任意の音が、任意の長さ鳴らせる事がわかりました。
任意の音。ならばドレミを鳴らしてみよう！と言うことで、このサイトを参考にしてました！

https://inalesson.com/frequency_list/2417/

|番号|音名|国際式表記|周波数(Hz)|Int32|配列|
|:-:|:-:|:-:|:-:|:-:|:-:|
|4|ド|C4|261.626|261|0|
||レ|D4|293.665|293|1|
||ミ|E4|329.628|329|2|
||ファ|F4|349.228|349|3|
||ソ|G4|391.995|391|4|
||ラ|A4|440.000|440|5|
||シ|B4|493.883|493|6|
|5|ド|C5|523.251|523|7|

Console.Beep(周波数, 鳴動時間)の周波数は、Int32型なので、適当に丸めます。それをInt32[]に定義します。
```
DOREMI:{261,293,329,349,391,440,493,523}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/7acc38f1-69e5-d17e-3738-2d33c6f1bfe0.png)

- - - 
## ４）譜面をInt32型配列にする。
この周波数（音階配列）の配列位置を利用して、譜面をInt32型配列にします。
鳴動時間を制御するには、鳴動時間の配列も必要なのですが、ロボット終了時に鳴らすだけなので、簡単な曲にしました。それが**きらきら星**です。

譜面は、ここのサイトからの情報を参考にしました。

https://pianojuku.info/free-sheet-kirakiraboshi/

```
SCORE:{0,0,4,4,5,5,4,-1,3,3,2,2,1,1,0,-1,4,4,3,3,2,2,1,-1,4,4,3,3,2,2,1,-1,0,0,4,4,5,5,4,-1,3,3,2,2,1,1,0,-1}
```
配列0はド、配列1はレ、配列-1は存在しないので、ロジックで**休止**とする。

- - - 
## ５）演奏させる
譜面数回の配列を繰返すので、無論 **「繰り返し (コレクションの各要素)」アクティビティ**を使います。
一拍のミリ秒は、ここでは600（ミリ秒）としました。

譜面の値が-1は**休止**とするので、**「メソッドを呼び出し」アクティビティを使用し、実装します。

Thread.Sleepメソッドは、こちらに記載があります。

https://learn.microsoft.com/ja-jp/dotnet/api/system.threading.thread.sleep?view=net-7.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/baf312f6-fbd0-939b-f43a-8ae99a23d89f.png)
```
TargetType:System.Threading.Thread
MethodName:Speep
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/8ead7609-270d-0c89-b306-7a6761373c78.png)
```
millisecondsTimeout:600
```

譜面の値が-1以外は[音]なので、Console.Beepメソッドを550ミリ秒と、Thread.Sleepメソッドを50ミリ秒として実装します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/825fecc3-7e3c-df34-d763-b13a5638cfce.png)

実装したら、鳴らしてみましょう！

:::note warn
注意
パソコンの性能に大きく左右され、曲として聞こえる場合もあったり、なんだかよくわからない時もあります（お客様貸与ＰＣでは鳴ったけど、自分のパソコンでは、トツトツと鳴るだけでした...orz）
:::


## 【まとめ】
・調子に乗って、オクターブ上の音階を鳴らしてみようとしたのですが、なりませんでした。
・鳴動時間を制御して、もっとリッチな曲も鳴らせるかもしれませんが、それは逆に「遊んでいる」って思われそうですね(^^♪

- - - 

##おわりに
いかがでした？

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！