obnizでテルミンもどき🎶

これを作りました🎶

<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/hDeXBs76pc">pic.twitter.com/hDeXBs76pc</a></p>&mdash; kohbis (@kohbis) <a href="https://twitter.com/kohbis/status/1203574365805113344?ref_src=twsrc%5Etfw">December 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![obniz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123634/38923694-85c2-fdbb-8a68-41d2134da519.jpeg)



## 必要なもの

- obniz
- モジュール
    - スピーカー
    - 距離センサー
- 音を出しても怒られない環境

## モジュールたち

### スピーカー

[ドキュメント](https://obniz.io/ja/sdk/parts/Speaker/README.md)

こちらのスピーカーを使用しました。
周波数に対応した音が鳴ります。
（ブザーっぽい音が結構な大きさで鳴るので夜は動かせませんでした笑）

```js
var speaker = obniz.wired("Speaker", {signal:0, gnd:1});
speaker.play("周波数");
```
🎶ドレミファソラシド🎶

|音名 ||周波数|
|:--:|:--:|:--:|
|ド|C4|523.251|
|レ|D4|587.330|
|ミ|E4|659.255|
|ファ|F4|698.456|
|ソ|G4|783.991|
|ラ|A4|880.000|
|シ|B4|987.767|
|ド|C5|1046.502|


```js
const obniz = new Obniz("XXXX-XXXX");

const C4 = 523.251;
const D4 = 587.330;
const E4 = 659.255;
const F4 = 698.456;
const G4 = 783.991;
const A4 = 880.000;
const B4 = 987.767;
const C5 = 1046.502;

const music = [C4, D4, E4, F4, G4, A4, B4, C5];

obniz.onconnect = async () => {
  const speaker = obniz.wired("Speaker", {signal:10, gnd:11});

  for(let m of music) {
    speaker.play(m);
    await obniz.wait(1000);
  }

  speaker.stop();
};
```

### 距離センサー

[ドキュメント](https://obniz.io/sdk/parts/HC-SR04/README.md)

障害物との距離を `mm(ミリメートル)` で返してくれます。
センサーから50mm単位で音階を割り当てて、テルミンっぽい感じで音を鳴らせるようにします。

公式のサンプルを参考にさせていただき、最終的にはこんな感じになります。

```js
const obniz = new Obniz("XXXX-XXXX");

const C4 = 523.251;
const D4 = 587.330;
const E4 = 659.255;
const F4 = 698.456;
const G4 = 783.991;
const A4 = 880.000;
const B4 = 987.767;
const C5 = 1046.502;

obniz.onconnect = async () => {

  const hcsr04 = obniz.wired("HC-SR04", {gnd:3, echo:2, trigger:1, vcc:0});
  const speaker = obniz.wired("Speaker", {signal:10, gnd:11});

  while(true) {
    let avg = 0;
    let count = 0;
    for (let i=0; i<3; i++) {
      const val = await hcsr04.measureWait();
      if (val) {
        count++;
        avg += val;
      }
    }
    if (count > 1) {
      avg /= count;
    }

    if (50 < avg && avg < 100) {
      speaker.play(C4);
    } else if (100 < avg && avg < 150) {
      speaker.play(D4);
    } else if (150 < avg && avg < 200) {
      speaker.play(E4);
    } else if (200 < avg && avg < 250) {
      speaker.play(F4);
    } else if (250 < avg && avg < 300) {
      speaker.play(G4);
    } else if (300 < avg && avg < 350) {
      speaker.play(A4);
    } else if (350 < avg && avg < 400) {
      speaker.play(B4);
    } else if (400 < avg && avg < 450) {
      speaker.play(C5);
    } else {
      speaker.stop();
    }
    await obniz.wait(400);
  }
}
```
## 演奏

（クオリティはご勘弁ください🙇‍♂️）

### チューリップ

ドレミだけで、かつテンポが一定の曲は演奏しやすいです。

<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/9sWLU1YPC7">pic.twitter.com/9sWLU1YPC7</a></p>&mdash; kohbis (@kohbis) <a href="https://twitter.com/kohbis/status/1203575056737042432?ref_src=twsrc%5Etfw">December 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### パプリカ

半音を組み合わせると、演奏できる曲がぐっと増えますね！
ただテンポが一定でないので、距離センサーの判定タイミングとずれると難しい。。

<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/ZEp0L5vEqe">pic.twitter.com/ZEp0L5vEqe</a></p>&mdash; kohbis (@kohbis) <a href="https://twitter.com/kohbis/status/1203577072221708289?ref_src=twsrc%5Etfw">December 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 最後に

距離センサーで取得した値を処理していくので、どうしても一定の間隔が必要になり、テルミンの「うゎんうゎん」感を出すことはできませんでした。（頑張ったらできるのかな）

先日参加した養老乃瀧ハッカソンで↓を作ったのですが、そのときに「音×IoT」って面白いな！と思ったので今回テルミンもどきを作ってみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/yorohack?src=hash&amp;ref_src=twsrc%5Etfw">#yorohack</a> 指ぱんっちんでオーダーww <a href="https://t.co/cLQ4cYdGlJ">pic.twitter.com/cLQ4cYdGlJ</a></p>&mdash; 菅原のびすけ (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1188389690891620354?ref_src=twsrc%5Etfw">October 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

obnizは持っていたもののサーボモーターくらいしかまともに使ったことはなかったので、とても楽しかったです！
RaspberryPiやM5Stackも好きですが、Javascriptでサクッと開発できてしまうこの手軽さは本当にすばらしいと思います。

Thank you, Obniz!!
Let's Obniz!!