obniz のブザーで遊んでみる

巷で噂の obniz、スターターセットに入っていたブザーで遊んでみることにしました。

## 参考ドキュメント

[これを見ればすべてわかる](https://obniz.com/ja/sdk/parts/Keyestudio_Buzzer/README.md)

## とりあえずチュートリアル的なの

```Javascript:1000Hz
const speaker = obniz.wired("Keyestudio_Buzzer", { signal: 11, vcc: 10, gnd: 9 });
speaker.play(1000) // 1000 Hz
```
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">obnizであそんでる <a href="https://t.co/g7caIvMJVU">pic.twitter.com/g7caIvMJVU</a></p>&mdash; uma (@umaniel_) <a href="https://twitter.com/umaniel_/status/1304308440332865541?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

・・・なんとも言えない音がなりました。

## 周波数（音程）を変える

[こちら](http://www15.plala.or.jp/gundog/homepage/densi/onkai/onkai.html)を参考に、周波数を指定してみます。

```Javascript:C
const speaker = obniz.wired("Keyestudio_Buzzer", { signal: 11, vcc: 10, gnd: 9 });
speaker.play(523.23) // C
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ド <a href="https://t.co/yV0vRPgrwf">pic.twitter.com/yV0vRPgrwf</a></p>&mdash; uma (@umaniel_) <a href="https://twitter.com/umaniel_/status/1304308518153932801?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Cの音が鳴りました。

## 連続で音程を変えてみる

```Javascript:ドレミファソラシド
const speaker = obniz.wired("Keyestudio_Buzzer", { signal: 11, vcc: 10, gnd: 9 });

const C = 523.23;
const D = 587.34;
const E = 659.25;
const F = 698.45;
const G = 783.98;
const A = 879.99;
const B = 987.75;
const hC = 1046.5;
const score = [C, D, E, F, G, A, B, hC];

score.forEach((note) => {
  speaker.play(note);
  obniz.wait(500);
});

speaker.stop();
```

こんな感じでやってみます。

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/u2oBnlIJrN">pic.twitter.com/u2oBnlIJrN</a></p>&mdash; uma (@umaniel_) <a href="https://twitter.com/umaniel_/status/1304308671850004483?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ドレミファソラシドができました。

## 演奏したい

これだけでは味気ないので、スターターセットに入っていた距離センサを使い、テルミンのような物を作ってみようと思います。

距離センサのドキュメントは[これ](https://obniz.com/ja/sdk/parts/HC-SR04/README.md)

```Javascript:テルミン
const hcsr04 = obniz.wired("HC-SR04", { gnd: 0, echo: 1, trigger: 2, vcc: 3 });
const speaker = obniz.wired("Keyestudio_Buzzer", { signal: 11, vcc: 10, gnd: 9 });

while(true) {
  const val = await hcsr04.measureWait();
  speaker.play(val)
}
```
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/85hUmGJQSY">pic.twitter.com/85hUmGJQSY</a></p>&mdash; uma (@umaniel_) <a href="https://twitter.com/umaniel_/status/1304308742301777923?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

バグったゲームボーイみたいな感じになりました。
とても演奏できそうにありません。

## 演奏したい（リベンジ）

[これ](https://obniz.com/ja/sdk/parts/JoyStick/README.md)っぽいものを買ってきました。

スティックの向きでドレミファソラシドできるようにしようと思います。

なお、私が買ったものは sw のピンがなかったので、ボタンが機能しませんでした・・・
（ボタンでオクターブ上げたかった）

スティックをうごかして出力値をチェックしたところ、ニュートラルが 0 、最大値が 0.5、最小値が-0.5だったので、以下のような感じにしました。

```:イメージ
[-5, 5] [0, 5] [5, 5]
   hC      C      D
[-5, 0] [0, 0] [5, 0]
   B     stop     E
[-5, -5] [0, -5] [5, -5]
   A      G      F
```

コードは以下

```Javascript:joycon
const speaker = obniz.wired("Keyestudio_Buzzer", { signal: 11, vcc: 10, gnd: 9 });
const joystick = obniz.wired("JoyStick", { gnd: 3, sw: 4, y: 1, x: 0, vcc: 2 });
const C = 523.23;
const D = 587.34;
const E = 659.25;
const F = 698.45;
const G = 783.98;
const A = 879.99;
const B = 987.75;
const hC = 1046.5;

while (true) {
  const x = await joystick.getXWait();
  const y = await joystick.getYWait();

  switch (true) {
    case 0.1 > x && x > -0.1 && y > 0.4:
      speaker.play(C);
      break;
    case x > 0.4 && y > 0.4:
      speaker.play(D);
      break;
    case x > 0.4 && 0.1 > y && y > -0.1:
      speaker.play(E);
      break;
    case x > 0.4 && y < -0.4:
      speaker.play(F);
      break;
    case 0.1 > x && x > -0.1 && y < -0.4:
      speaker.play(G);
      break;
    case x < -0.4 && y < -0.4:
      speaker.play(A);
      break;
    case x < -0.4 && 0.1 > y && y > -0.1:
      speaker.play(B);
      break;
    case x < -0.4 && y > 0.4:
      speaker.play(hC);
      break;
    case 0.1 > x && x > -0.1 && 0.1 > y && y > -0.1:
      speaker.stop();
      break;
  }
}

```

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/qXdR5IXkDr">pic.twitter.com/qXdR5IXkDr</a></p>&mdash; uma (@umaniel_) <a href="https://twitter.com/umaniel_/status/1304308932316286976?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

満足しました。
傾きの感度は0.4にしましたが、これでもわりと遊びの部分が多いので、もう少し厳しくしてもいいかもしれません。


## おわりに

obniz、めっちゃ面白いです。
公式のドキュメントが充実していてとてもいい感じです。
Node.js のライブラリもあって、自分のローカル端末からインターネット経由で実行できるのもよさみです。
パーツリストを見ていると、NFCリーダなんかもあったりして（売ってるところ不明ですが）、なんか色々できそうな気がします。

おしまい