obnizとブザーで兄弟配管工ゲームのコイン音を出してみた


#作ろうと思ったきっかけ 
 - ProtoOutoStudio　３回目授業でobnizに触れる
 - ブザーが面白かった
 

　兄弟配管工ゲームでは、ブロックを叩くとコインが出てきますよね。その時の効果音を再現してみようと思いました。

#”あの”効果音の音階を調べてみた

[コインの音](https://muuu.jp/koneta/sm-coin/)

が、楽譜が読めないぞ....。オクターブもよく分からん....。
よし、トライ＆エラーか？？？（音痴です）

#まずはベースとなる”ド”を鳴らす

”ド”の音が何Hzか調べました。今回は[こちら](https://general-knowledge.xyz/frequency-and-scale/)のサイトを参考に周波数を設定していきます。

【鳴らしてみた様子】

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">obnizにブザーをつけてみた。まずはドの音を実装！<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/4pDRjS9z9N">pic.twitter.com/4pDRjS9z9N</a></p>&mdash; まえぷー@出窓菜園 BWG (@kmaepu) <a href="https://twitter.com/kmaepu/status/1246646818122764288?ref_src=twsrc%5Etfw">April 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

音を鳴らすだけなら、obnizの[Javascriptパーツライブラリ](https://obniz.io/ja/sdk/parts/Speaker/README.md)から試すと爆速で確認できます。

　obniz IDを入力し、Test Runをクリックすると、指定した音が鳴ります。デフォルトは1000Hzになっているので、鳴らしたい音に合わせるといいかなと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/e43ba33a-406f-8405-f1e2-66877f1f363f.png)

　今回はobnizのボタンを押すと、指定の音が鳴るようなプログラムをNode.jsで動かしています。ソースコードはこちら。

```javascript
const Obniz = require('obniz');
var obniz = new Obniz("OBNIZ-ID");  // OBNIZ-IDに自分のIDを入れます
obniz.onconnect = async function () {

  // スピーカーを呼び出す
  var speaker = obniz.wired("Speaker", {signal:0, gnd:1});

  // ディスプレイ処理
  obniz.display.clear();  // 一旦クリアする
  obniz.display.print("Hello obniz!");  // Hello obniz!という文字を出す

  // スイッチの反応を常時監視
  obniz.switch.onchange = function(state) {
    if (state === "push") {
      // 押されたとき
      console.log("pushed");
      // ディスプレイ処理
      obniz.display.clear();  // 一旦クリアする
      obniz.display.print("pushed");  // pushed という文字を出す
      // 音を鳴らす
      speaker.play(523.25); // ドの音
    } else if (state === "none") {
      // none で押してないとき
      obniz.display.clear();  // 一旦クリアする
      // スピーカーで音を鳴らさない stop
      speaker.stop();
    }
  }
}
```

　上述のプログラムを使う際は、obniz.jsが必要となります。次のコードでインストールしておきましょう。

```
npm i obniz
```

#あの効果音に使われている音を鳴らす
 あの効果音は”**シ**”と”**ミ**”の２音で構成されているようです。といっても”ミ”は１つ上のオクターブになっているようです。

では、音階表を参考にしてみると....。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/b30fd500-dacc-9532-5a2f-d1beba2c17e7.png)

”シ”は987.76Hz、”ミ”は1318.51Hzでつくります。

　音を鳴らしてみるとこのようになりました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちょっと発展。<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/SDfbhotxgO">pic.twitter.com/SDfbhotxgO</a></p>&mdash; まえぷー@出窓菜園 BWG (@kmaepu) <a href="https://twitter.com/kmaepu/status/1246660048379473922?ref_src=twsrc%5Etfw">April 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　よさそうですね！あとは自動化してタイミング調整だな....

#組み合わせる
　音を順番に出力するのは簡単ですが、タイミングがわからない！！！！！！！！
楽譜を見ると次のようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/2a9b21f2-4460-5ad5-062f-c2deeccf7662.png)

　[こちら](https://flip-4.com/129)のサイトを参考にしてみると、200bpsのテンポであると読み解きました。200bpsとは、1分間に200拍の速度です。つまり、

　　1分間（60秒） ÷　200　＝ **0.3秒**

となります。楽譜をみると、どうやら”シ”と”ミ”の間は何も記号がないので１拍だとして、”ミ”の後は2拍ありそうなので0.6秒として作りました。

結果....。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あの効果音に少し近づいたか？<br>オクターブを1つ上げれば良さそう(^^)<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/TiLEEtjqCd">pic.twitter.com/TiLEEtjqCd</a></p>&mdash; まえぷー@出窓菜園 BWG (@kmaepu) <a href="https://twitter.com/kmaepu/status/1246681516664471553?ref_src=twsrc%5Etfw">April 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
　
　思っていたより音が低そうなので、１オクターブあげてみましょう。


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">１オクターブあげてみた。<br>こっちの方が良さそう。でも、なにか物足りなさが…。<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/3abNA7yBQH">pic.twitter.com/3abNA7yBQH</a></p>&mdash; まえぷー@出窓菜園 BWG (@kmaepu) <a href="https://twitter.com/kmaepu/status/1246682649294327809?ref_src=twsrc%5Etfw">April 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　こちらの方が近そうですね！でも何か足りない気がしてくる....
何度も同じ音を聞いていると分からなくなってしまうなぁ。でもこれで良しとしますか。



#余談
　圧電スピーカーで効果音作るの楽しそう....沼に片足いれはじめてしまうぅ!

#最終的なソースコード

```javascript
const Obniz = require('obniz');

var obniz = new Obniz("Obniz_ID");  // Obniz_IDに自分のIDを入れます
obniz.onconnect = async function () {

  // スピーカーを呼び出す
  var speaker = obniz.wired("Speaker", {signal:0, gnd:1});

  // ディスプレイ処理
  obniz.display.clear();  // 一旦クリアする
  obniz.display.print("Hello obniz!");  // Hello obniz!という文字を出す

  // スイッチの反応を常時監視
  obniz.switch.onchange = async function(state) {
    if (state === "push") {
      // 押されたとき
      console.log("pushed");
      // ディスプレイ処理
      obniz.display.clear();  // 一旦クリアする
      obniz.display.print("pushed");  // pushed という文字を出す
      // 音を鳴らす
      speaker.play(1975.53);     // シ
      await obniz.wait(300);   // Wait
      speaker.play(2637.02);    //　ミ
      await obniz.wait(600);   // Wait
      speaker.stop();
    } else if (state === "none") {
      // none で押してないとき
      obniz.display.clear();  // 一旦クリアする
      // スピーカーで音を鳴らさない stop
      speaker.stop();
    } else if (state === "left") {
      speaker.play(1318.51); //　ミ
    }
  }
}
```