サンプラーっぽいものを作ってみよう！

#初めに
小ネタですが、Spresense が超高速で音声を再生できる機能を持っていたので、これをうまく使えないかな～、と思いちょっとしたサンプラーのようなものを作ってました。

これを整理してQiitaに書いておこうというモチベーションです。
※[Advent Calendar 2021](https://qiita.com/advent-calendar/2021/spresense) の記事を埋めるためというわけでは…。

#用意したもの


[**SPRESENSEメインボード[CXD5602PWBMAIN1]**
https://www.switch-science.com/catalog/3900/](https://www.switch-science.com/catalog/3900/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/3900/500x500/42ccd153-3e89-4f7c-921c-775bc7de996d.jpg" width="200">

[**B-stem PDA01 SPRESENSE用機能拡張ボード**
https://www.switch-science.com/catalog/5687/](https://www.switch-science.com/catalog/3900/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/5687/500x500/0a013974-3601-4d76-9228-a4bbbde7b45b.jpeg" width="300">

今回も、単純に音が出るものであればよかったんだけど、既にPDA01を持っていたので使いました。
当然、純正拡張ボードでも良いです。

[**SPRESENSE拡張ボード[CXD5602PWBEXT1]**
https://www.switch-science.com/catalog/3901/](https://www.switch-science.com/catalog/3901/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/3901/500x500/5ecdbd33-8e31-4798-b31f-cedc64e19830.jpg" width="200">

それに、Qwiicのコネクタとキーパッド。
[**SPRESENSE用Qwiic接続基板**
https://www.switch-science.com/catalog/6318/](https://www.switch-science.com/catalog/6318/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/6318/500x500/d1e4f607-c416-42a2-9950-0a158e342f7b.jpg" width="200">

[**Qwiic - キーパッド（12ボタン）**
https://www.switch-science.com/catalog/5535/](https://www.switch-science.com/catalog/5535/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/5535/500x500/7f028162-2b8a-4504-b0b6-adcc949ee388.jpg" width="200">


さらに、SDカード。KIOXIAだと問題ないです。

[**KIOXIA(キオクシア) 旧東芝メモリ microSDHCカード 32GB**
https://www.amazon.co.jp/dp/B08PTNWQ6P?aaxitk=a8f1b316576d3af7dc8db832d10d5cd9&smid=AN1VRQENFRJN5&ref=dacx_dp_7467415030103_8217637380303&th=1](https://www.amazon.co.jp/dp/B08PTNWQ6P?aaxitk=a8f1b316576d3af7dc8db832d10d5cd9&smid=AN1VRQENFRJN5&ref=dacx_dp_7467415030103_8217637380303&th=1)
<img src="https://m.media-amazon.com/images/I/716kcHywjlS._AC_SL1500_.jpg" width="200">

#ブログ（元ネタ）
この記事は、以下のブログに過去に投稿したもののまとめです。

[サンプラーっぽいものを作ってみよう！
http://spresense.livedoor.blog/archives/24494066.html](http://spresense.livedoor.blog/archives/24494066.html)

#サンプルプログラム
Spresense のサンプルの中に、**文字** を打つとすぐに **音を鳴らせる** サンプルがあります。

[1.3.3. 低遅延再生する
https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_%E4%BD%8E%E9%81%85%E5%BB%B6%E5%86%8D%E7%94%9F%E3%81%99%E3%82%8B](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_%E4%BD%8E%E9%81%85%E5%BB%B6%E5%86%8D%E7%94%9F%E3%81%99%E3%82%8B)

これを使うと、シリアル入力した文字に合わせて、遅延なく音を出せるので、
これをスイッチに繋ぐだけで簡単にできます。

#音源ファイルの準備
音源ファイルは、[**チュートリアル**](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_%E4%BD%8E%E9%81%85%E5%BB%B6%E5%86%8D%E7%94%9F%E3%81%99%E3%82%8B)にあるように、鳴らしたい音の数分用意してください。
音源ファイルのフォーマットは、**生のPCM** ファイルです。

[**Audacity**](https://www.audacityteam.org/) とか使うとWAVのヘッダのない生のPCMファイル簡単に作れます。


[**Audacity**
https://www.audacityteam.org/](https://www.audacityteam.org/)
<img src="https://www.audacityteam.org/wp-content/uploads/2017/12/Theme_Dark.png" width="400">

#入力をキーパッドに変更する

では、早速、このサンプルを変更していきます。

[**application/rendering_objif/rendering_objif.ino**]
(https://github.com/sonydevworld/spresense-arduino-compatible/tree/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/Audio/examples/application/rendering_objif/rendering_objif.ino)

まず、キーパッドが使えるように、以下をincludeとインスタンスを追加。

```c:rendering_objif.ino
#include <Wire.h>
#include "SparkFun_Qwiic_Keypad_Arduino_Library.h"
KEYPAD keypad1; //Create instance of this object
```

次に、setupの中の "Serial.begin(115200);"の後で、で、初期化を呼ぶ。

```c:rendering_objif.ino
  if (keypad1.begin() == false) 	// Note, using begin() like this will use default I2C address, 0x4B. 
									// You can pass begin() a different address like so: keypad1.begin(Wire, 0x4A).
  {
    Serial.println("Keypad does not appear to be connected. Please check wiring. Freezing...");
    while (1);
  }
```

で、文字をscanしている部分を、キーパッド入力に変える。

```c:rendering_objif.ino
  keypad1.updateFIFO();  // necessary for keypad to pull button from stack to readable register
  char button = keypad1.getButton();

  while (button == -1)
  {
    Serial.println("No keypad detected");
    delay(1000);
  }

  if (button != 0)
    {
      switch (button) {
        case '1': // play
          playno = start_event(playno,0);
          break;
        case '2': // play
          playno = start_event(playno,1);
          break;
        case '3': // play
          playno = start_event(playno,2);
          break;
        case '#': // stop
          if (s_state == Active)
            {
              stop();
            }
          s_state = Stopping;
          break;
          
        default:
          break;
      }
    }
```

これで、簡単に、ボタンを押すと効果音が鳴るようになりました！


<img src="https://livedoor.blogimg.jp/spresense/imgs/0/f/0f27a9e1-s.jpg">