Spresenseで楽器を作る第一歩

## はじめに

先日elchikaで開催された『2022年 SPRESENSE™ 活用コンテスト』にてギターを制作しましたので、
初期プロトの作成方法を共有したいと思います。

Arduinoについては情報が多いですが、Spresenseで同じようなことをやろうとすると、つまづくことも多いかと思います。
Spresenseを使って楽器を作ってみたい！、と思った方の第一歩になれば幸いです。

## 作るもの

タッチセンサーとスイッチを使った楽器を制作します。
ギターやバイオリン同様、左手で音程を決め、右手で音を出す方式です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/OW9FACB0zFs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 仕組み

* 音程のコントロール（左手）：
    * タッチセンサーの値をSpresenseのポートで読み取り、その値を周波数としてBeepライブラリに渡します
* 発音のコントロール（右手）：
    * スイッチのON/OFFをSpresenseのポートで読み取り、ONの間だけ音を鳴らします。
    * また、ONの時にLEDを点灯させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/d58fd4ca-e90f-2807-062f-de4a56a52aab.png)



## 必要なもの

* Spresense（本体、拡張ボード）
* PC
* USBケーブル
* タッチセンサー
    * メーカー：spectrasymbol
    * 型番：TSP-L-0300-103-1%-RH
* ブレッドボード
* 抵抗（2kΩ）
* ジャンパー線×9
* スイッチ（４本足）
* 赤色LED
* イヤホン
* 板（任意）
* マジック（任意）

## 事前準備

以下セットアップが終わっている状態とします。
具体的な作業方法は、参考文献１の第１章に沿って実施しました。

* Arduino IDE のインストール
* Spresenseの初期設定
    * 拡張ボード取り付け
    * Spresense用USBドライバーのインストール
    * Spresense Arduino Board Packageのインストール
    * Spresense ブートローダのインストール

## 作り方

### 1. 配線

以下画像のように接続します。

* 回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/190c62e3-1dde-25e4-35ce-dcf58263f6b0.png)

* 全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/d7ae014d-fc9a-5840-5caf-eff02d1e4f40.png)

* 基板
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/c22413a0-7720-be4b-d457-46f54f2ad4c3.png)

* タッチセンサー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/85e3fcaa-40aa-d004-dda7-2b5acc98e8bb.png)

* Spresense（拡張ボードにはイヤホンを挿しておきます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/176f5807-b91a-3a3f-42f9-6bb408bde585.png)



### 2. 組み込み

Arduino IDEを使用し、以下をSpresenseに書き込みます。

```
#include <Audio.h>

int LED_PIN = 13;  // 13ピンをLEDに割り当て
int INPUT_PIN = 8; // タクトスイッチからの入力を8ピンに割り当て
int val;
int beep_switch;

AudioClass *theAudio;

//初回セッティング
void setup()
{
  //シリアル通信。
  Serial.begin(9600);

  theAudio = AudioClass::getInstance();
  theAudio->begin();
  puts("initialization Audio Library");

  theAudio->setPlayerMode(AS_SETPLAYER_OUTPUTDEVICE_SPHP, 0, 0);

  pinMode(LED_PIN, OUTPUT);         // LEDに繋いだピンを出力に設定
  pinMode(INPUT_PIN, INPUT_PULLUP); // タクトスイッチに繋いだピンを入力に設定
}

//メイン処理（以下が無限ループする）
void loop()
{
  val = digitalRead(INPUT_PIN);   // 入力ピン(タクトスイッチ)の状態を読み取る
  digitalWrite(LED_PIN, 1 - val); // 入力ピンの状態によりLEDの点灯・消灯

  // アナログ入力をpotとして取得
  int pot = analogRead(0);
  int freq = 100 + pot/2; // ボトム100Hzにpot値を加えて音程を変化

  if (val == 0){
    // valが0の時、ビープをONにする
    beep_switch = 1;
    Serial.println(freq); //周波数をモニター
  } else{
    // valが0の時、ビープをOFFにする
    beep_switch = 0;
    Serial.println(freq);
  }

  // setBeep(ON/OFF,音量 0がmax, 周波数)
  theAudio->setBeep(beep_switch, 0, freq);

  // theNote(pos).timeだけ待つ。s→ms換算ため1000している。
  usleep(100); // ms
}
```


### 3. 音程をメモ（任意）

タッチセンサーは音程のコントロールが難しいので、音階をメモしておくと演奏しやすいです。
板に固定し、マジックでメモするのがオススメ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612859/77fce784-6de8-9a65-c68f-94e28ab2d94e.png)


## 終わりに

無事、作れたでしょうか？
ここまでできると、色々なアイデアを試しやすくなると思います。
Spresenseを使って、面白い楽器を作っていきましょう！


## 参考文献

* Spresenseの初期設定
    * 「SPRESENSEではじめるローパワーエッジAI」、太田義則
* タッチセンサーを使った楽器の作り方
    * 「Arduinoではじめる手作り電子楽器」、中西宣人
* 『2022年 SPRESENSE™ 活用コンテスト』、elchika
    * https://elchika.com/promotion/spresense2022/