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


初めに

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

これを整理してQiitaに書いておこうというモチベーションです。
Advent Calendar 2021 の記事を埋めるためというわけでは…。

用意したもの

SPRESENSEメインボード[CXD5602PWBMAIN1]
https://www.switch-science.com/catalog/3900/

B-stem PDA01 SPRESENSE用機能拡張ボード
https://www.switch-science.com/catalog/5687/

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

SPRESENSE拡張ボード[CXD5602PWBEXT1]
https://www.switch-science.com/catalog/3901/

それに、Qwiicのコネクタとキーパッド。
SPRESENSE用Qwiic接続基板
https://www.switch-science.com/catalog/6318/

Qwiic - キーパッド(12ボタン)
https://www.switch-science.com/catalog/5535/

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

KIOXIA(キオクシア) 旧東芝メモリ microSDHCカード 32GB
https://www.amazon.co.jp/dp/B08PTNWQ6P?aaxitk=a8f1b316576d3af7dc8db832d10d5cd9&smid=AN1VRQENFRJN5&ref=dacx_dp_7467415030103_8217637380303&th=1

ブログ(元ネタ)

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

サンプラーっぽいものを作ってみよう!
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

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

音源ファイルの準備

音源ファイルは、チュートリアルにあるように、鳴らしたい音の数分用意してください。
音源ファイルのフォーマットは、生のPCM ファイルです。

Audacity とか使うとWAVのヘッダのない生のPCMファイル簡単に作れます。

Audacity
https://www.audacityteam.org/

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

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

application/rendering_objif/rendering_objif.ino

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

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

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

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している部分を、キーパッド入力に変える。

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;
      }
    }

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