2. Teensyの開発環境と準備

 今回は開発環境をインストールして、オーディオ・システム・デザインツールやドキュメントの使い方の概要を把握します。続いて音源のサンプルデータを入手して、サンプル・スケッチによる再生テストを行います。スケッチのロードと準備処理、コンパイルとTeensyへの書き込みを行ってサンプルデータを再生するまでの手順が明らかになります。最後に、Arduino開発環境下での Teensy独特のオーディオ処理ロジックについて、サンプル・スケッチの要点を説明します。



1.Arduino IDEのインストール

 前回にふれましたが、プロジェクト開発は Windows PCで行っていて(OSはWindows10)、開発環境は Arduino IDEを使用しています。すでに Arduino IDEをインストールして ESP32などの開発を行っている場合は、複数の開発環境を維持することが必要なケースもありますが、それは他の情報源にゆずることにします。調べて対応してください。
 ここでは、やや古くなっている Arduino IDEをアンインストールし、最新のものをインストールするものとして手順をまとめます。なお、Arduinoの開発環境とユーザー作成のスケッチは、Windowsの場合は次のフォルダーに格納されているはずなので、必要なものは事前にバックアップしておきましょう。
 ・ユーザー作成のスケッチ: C:\Users\ユーザー名\Documents\Arduino
 ・Arduino IDE: C:\Users\ユーザー名\AppData\Local\Arduino15

① Arduinoのアンインストール

 コントロール・パネルの「プログラムと機能」から「Arduino IDE」を右クリックし、[アンインストール]を選択。
 続いて、先にバックアップした C:\Users\ユーザー名\~配下の 2つのフォルダーを削除します。


②最新 Arduino IDEのインストール

・Arduinoのサイトにアクセスします。
    https://www.arduino.cc/en/software/
・2023年12月時点で最新の Arduino IDE 2.2.1をインストールします。
  Windows MSI installerをダウンロードする。
    ↓
  arduino-ide_2.2.1_Windows_64bit.msiがダウンロードされた。
    ↓
  arduino-ide_2.2.1_Windows_64bit.msiを実行する。
    ↓
  次の場所に Arduino IDE.exeなどがインストールされた。
   ・インストーラー
      C:\Users\ユーザー名\AppData\Local\arduino-ide-updater\installer.exe
   ・Arduino IDE.exe
      C:\Users\ユーザー名\AppData\Local\Programs\arduino-ide\Arduino IDE.exe
   ・その他、ロケール情報やリソースなど
      C:\Users\ユーザー名\AppData\Local\Programs\arduino-ide\locales
      C:\Users\ユーザー名\AppData\Local\Programs\arduino-ide\resources
   ・ログフォルダー
      C:\Users\ユーザー名\AppData\Roaming\Arduino IDE
          古いログ。
   ・arduino-ideフォルダー(4.7MB)
      C:\Users\ユーザー名\AppData\Roaming\arduino-ide
   ・ショートカット
      C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
   ・ライブラリなどのソース
      C:\Users\ユーザー名\AppData\Local\Arduino15\packages\teensy                              \hardware\avr\1.58.1\libraries
   ・サンプルプログラム
      C:\Users\m.ono\AppData\Local\Arduino15\packages\teensy                       \hardware\avr\1.58.1\libraries\Audio\examples
 これで Arduino IDE 2.2.1のインストールが完了しました。

2.Teensyduinoのインストール

 Teensyduinoは Teensyを Arduino IDE環境で使うために必要なアドオンです。Arduino IDEから簡単にインストールできます。
① Teensyボードマネージャの組み込み

・ Arduino IDEを起動して [ファイル]-[基本設定]で「基本設定ダイアログ」を開く。
    ↓
  一番下の「追加のボードマネージャのURL」の右端にあるアイコンをクリックする。
    ↓
 「追加のボードマネージャのURL」ダイアログが開くので、入力枠に次の URLを入力する。
    https://www.pjrc.com/teensy/package_teensy_index.json

   ところが、すでに次の内容が登録されていました。
   これは、以前に行った開発経過を引き継いだものと思われます。
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    https://raw.githubusercontent.com/mikaelpatel/Cosa/master/package_cosa_index.json
    https://www.pjrc.com/teensy/package_teensy_index.json
      ↓
  [OK]で「基本設定ダイアログ」を閉じる。

② Teensyduinoのインストール

・メイン ウィンドウで、左側のボード アイコン(上から2つ目)をクリックしてボード・マネージャーを開く。
      ↓
   「teensy」を検索して、「Teensy」の[インストール]をクリックする。

 ※インストールにはしばらく時間がかかるので、終了するまで待つ。
  Output窓に以下の内容が表示される。
    Downloading packages
    teensy:teensy-tools@1.58.0
    teensy:teensy-compile@11.3.1
    teensy:teensy-discovery@1.58.0
    teensy:teensy-monitor@1.58.0
    teensy:avr@1.58.1
    Installing teensy:teensy-tools@1.58.0
    Configuring tool.
    teensy:teensy-tools@1.58.0をインストールしました
    Installing teensy:teensy-compile@11.3.1
    Configuring tool.
    teensy:teensy-compile@11.3.1をインストールしました
    Installing teensy:teensy-discovery@1.58.0
    Configuring tool.
    teensy:teensy-discovery@1.58.0をインストールしました
    Installing teensy:teensy-monitor@1.58.0
    Configuring tool.
    teensy:teensy-monitor@1.58.0をインストールしました
    Installing platform teensy:avr@1.58.1
    Configuring platform.
    Platform teensy:avr@1.58.1 installed

 こうして、次のバージョンがインストールされました。
   Teensy 1.58.1

3.デザインツールとドキュメント

 Teensyのオーディオ・アプリケーションの作成は、使用するオーディオ・オブジェクトを定義して、オーディオ・オブジェクト間の信号の流れを結合関係(Connection)として指定することから始まります。これらは直接コードで記述することもできますが、オーディオ・オブジェクトはたくさんの種類があり、ひとつのオブジェクトが複数の結合端子(例えばステレオの左右、ミキサーへの複数入力など)持つものもあるので、場合によっては複雑に絡み合ってきます。これをサポートする「Audio System Design Tool for Teensy Audio Library」というツールがあります。Webブラウザ上で利用できるツールで、次のリンクをクリックすると下図のようなデザイン・ツールが表示されます。
    https://www.pjrc.com/teensy/gui/index.html
 画面の左欄からオーディオ・オブジェクトを選択して中央の画面へ配置し、オブジェクト端子間をマウスでドラッグして結合することができます。


 画面上の[Export]ボタンをクリックすると、これらのオブジェクトと結合関係の定義コードを生成してダイアログに表示し、クリップボードにコピーできます。これをスケッチに貼り付けるだけでヘッダーファイルのインクルードとオーディオ・オブジェクトの定義部分が出来上がります。
 これが生成されたコードです。コメントの xy=に続く数字は描画座標で、「// GUItool: begin~」から「// GUItool: end~」までをデザイン・ツールに[import]すると、再描画することができます。

    
#include <Audio.h> #include <Wire.h> #include <SPI.h> #include <SD.h> #include <SerialFlash.h> // GUItool: begin automatically generated code AudioInputI2S i2s2; //xy=114.19999694824219,90.19999694824219 AudioAnalyzePeak peak1; //xy=288.19998931884766,68.20000648498535 AudioAmplifier amp2; //xy=292.2000045776367,177.20001602172852 AudioAmplifier amp1; //xy=299.1999702453613,122.20001411437988 AudioOutputI2S i2s1; //xy=479.1999969482422,147.1999969482422 AudioConnection patchCord1(i2s2, 0, peak1, 0); AudioConnection patchCord2(i2s2, 0, amp1, 0); AudioConnection patchCord3(i2s2, 1, amp2, 0); AudioConnection patchCord4(amp2, 0, i2s1, 1); AudioConnection patchCord5(amp1, 0, i2s1, 0); AudioControlSGTL5000 sgtl5000_1; //xy=274.1999969482422,239.1999969482422 // GUItool: end automatically generated code


 デザイン画面の左欄には input, output, mixer, effect, filterなど10分類で、合計 89個のオブジェクトが登録されています。画面右欄には、左側欄で選択したオブジェクトまたは中央画面で選択されて枠がオレンジ色になっているオブジェクトのドキュメントが表示されます。

 下図は右欄を少し幅広に表示したものですが、Object name, Summary, Audio Connections, Functions, Hardware, Examples, Notesなどが記載されています(Examplesにはサンプルスケッチへのパスが表示されます)。

 このドキュメントはとても良くできているので、左欄から関心がもてそうなオブジェクトを選びながら、しっかり読み込むことが Teensyを理解する近道になると思います。

4.音源データと再生テスト

 Teensyについての情報は、サイト PJRCにパイルアップしています。オーディオ分野でスタートするなら、次のリンクがその入口になります。
    『Teensy Audio Library』

 このリンクにはチュートリアルとワークショップのビデオがあり、先ほどのインストールですでに組み込まれているサンプルプログラムをわかりやすく解説しています。ただ、そのためにはハードの準備が必要なので、これはしばらくサイト情報を閲覧してからの方がよいでしょう。

 注目したいのは、ヘッダー部の[Blog]や[Forum]、そしてサイドバーです。サイドバーはご覧の通りで、Teensyの基本的な情報やライブラリのインデックスです。Blogには Teensyを使った作品が多数掲載されています。そして驚くほどのテーマ数と熱量がある Forumからは、問題解決や開発のヒントを得ることができるでしょう。開発のベテランメンバーも参加する大変充実したコーナーです。

 これらはさておき、まず最初の音楽再生テストで使う音源ファイルをダウンロードすることにしましょう。その前に microSDカードと、それに書き込みできる SDカードリーダー/ライターを用意してください(写真右)。SDカードは記録容量が小さいもので十分です。SDカードリーダー/ライターが手元になければ、500~1,000円足らずで購入できます。

 引き続き、画面の「General Audio Library Usage」の下にある「Data Files for Examples」をクリックします。次に表示された「Audio Data Files」の画面(右の図)で、SDTEST1~4.WAVの4つのリンクをそれぞれ右クリックして、[名前を付けてリンク先を保存]を選択してダウンロードしてください。


 microSDカードを初期化して、PCにダウンロードした 4つの WAVファイルを書き込みます。このSDカードを Teensyの SDスロットルに差し込むと準備完了です。
 3.5mmオーディオジャックにイヤフォンのプラグを挿して、USBケーブルで Teensyと PCを接続します。なお、写真の Teensyは第1章の最後のものと姿が変わっていますが、これはマイクアンプへの電源供給や、マイクアンプからのステレオ・ライン入力のためのピンソケットを設置しているからです。これについては次章で説明の予定です。

 これからサンプル・スケッチをコンパイルして Teensyに書き込み、SDカードのWAVファイル SDTEST1~4.WAVを再生してみましょう。まず、Arduino IDEを起動してください。

①サンプル・スケッチを取り出す

 オーディオのサンプル・スケッチホルダーから WAVファイルを再生するサンプル・スケッチ「WavFilePlayer」を取り出します。IDEのヘッダー部の[ファイル]をクリックして、
  [スケッチ例(Examples)]→[Audio]とたどって[WavFillePlayer]をクリックします。


 新たなウィンドウが開いて「WavFilePlayer」のスケッチが表示されます。しかしこのままでは、Teensyと PCが通信できる状態ではないので、IDEヘッダー部の[ツール]をクリックして、次のように[ボード種別]で「Teensy 4.0」を、[ポート]で「COM~ Serial(Teensy 4.0)」を選択します。




②コンパイルと書き込み

 IDEヘッダー部の矢印の「書き込み」ボタンをクリックするとコンパイルが始まります。画面下部の「出力」窓にはコンパイル結果が表示されます。初回のコンパイルは時間がかかりますが、2回目以降は10秒ほどで(スケッチの複雑さやサイズによりますが)終わります。コンパイルが完了すると、翻訳された機械語を Teensyに書き込んで実行します。
 イヤフォンを耳に近づけると、歯切れの良い音楽が聞こえます。その素晴らしい音質に、ちょっと感動する瞬間です!


 「書き込み」ボタンの左のチェック印は「検証」ボタンで、コンパイルだけする場合に使います。Teensyで実行中のタスクに影響することなく、スケッチにコンパイル・エラーがないかどうかを確かめる場合に使用します。

③ Teensyとのコミュニケーション

 IDEヘッダー部の[ツール]をクリックして[シリアルモニタ]を選択すると、画面下部がシリアルモニタに替わり、実行中のスケッチに表示命令が記載されていれば、それが表示されます。また、表示部の上にはメッセージボックスがあり、スケッチに外部からのキー入力命令が書かれていると、ここに入力した内容が取り込まれます。



 以上で Teensyの動作が確認でき、Arduino IDEのだいたいの使い方がわかったことと思います。Arduino IDEは直感的に理解しやすいので、なおいろいろ試してみてください。

④スケッチの要点について

 少し長くなりますが、このサンプル・スケッチにはオーディオ処理の基本的な手続きが記述されているので、ザッと眺めておきましょう。次章からのコードを理解する基礎知識になります。なお以下のスケッチは、見やすくするために元のコードから多くのコメントや不要な記述をカットしています。

 スケッチの言語は C++を基本にしたものですが、最初に実行する main()関数がない独特のスタイルで記述します。それに代えて 22行目の setup()関数で初期化などの準備処理を記述し、この関数が最初に実行されます。そして、60行目の loop()関数で監視や計測などの処理を記述することになっていて、この2つはスケッチの必須関数です。

 4~8行までのインクルードファイルは、このスケッチで使用するか否かにかかわらず、基本的なオーディオ処理に対応できる定番の記述です。
 10~15行はオーディオ処理特有の記述です。10,11行でオーディオ・オブジェクトの作成を指示しています。AudioPlaySdWavと AudioOutputI2Sは、それぞれ SDカード上のWAVファイル再生とオーディオ出力を担う既定のオブジェクトで、先に説明したデザインツールから詳細仕様を確認することができます。左サイドバーの[playSdWav]をクリックすると、AudioPlaySdWavには play(filename), stop(), isPlaying()などのメソッドがあることがわかります。それぞれのオブジェクトには適当なオブジェクト名 playWav1と audioOutputをつけています。
 13,14行ではオーディオ・オブジェクト間のコネクションを指定しています。patchCordはコネクション名で、重複しない名前にするために番号を付けています。patch cordは電子機器などを結ぶワイヤのことであり、文字通りの意味で使われています。playWav1の出力を audioOutputへと接続しているのです。オブジェクト名の後の数字は 0が左、1が右を意味していて、ステレオ接続を指示しているわけです。
 15行の AudioControlSGTL5000はここで使用しているステレオ・コーデックのオブジェクトです。これもデザインツールで参照すると、シグナル制御やオーディオ制御のためのたくさんのメソッドを持っていることがわかります。

 22行からの初期化処理では、シリアルモニタとの通信を行うために 9600bpsで通信を開始し、オーディオ処理で必要なメモリーを確保しています。次に SGTL5000を起動し、volume(0.5)で音量の設定をしています。この引数の値は 0から 1.0までを設定でき、0.5が「comfortable listening level」とされています。これを大きな 値にする場合は、耳を傷めないように注意してください。
 32~41行は、SDカードスロットを準備する定番の手順です。

 43行目から始まる playFile(filename)は、引数で指定された名前のファイルを再生するための関数です。指定されたファイル名をシリアルモニタに表示して、WAVファイル再生オブジェクトの playメソッドで再生を指示しています。この表示命令があるので、シリアルモニタを開くと再生ファイル名が表示されるわけです。56行では、指定されたファイルの再生が終わるまで、この関数の実行が終わらなくするためのループです。

 そして再生の指定は、60行の loop()の中で行います。61行のように先の playFile関数を実行し、再生が終了して戻ってきたら少し待って次のファイルを再生させています。順番に4つめのファイルの再生が終わると初めに戻り、永遠に再生を繰り返します。
// Simple WAV file player example
// This example code is in the public domain.

#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

AudioPlaySdWav           playWav1;
AudioOutputI2S           audioOutput;

AudioConnection          patchCord1(playWav1, 0, audioOutput, 0);
AudioConnection          patchCord2(playWav1, 1, audioOutput, 1);
AudioControlSGTL5000     sgtl5000_1;

// Use these with the Teensy Audio Shield
#define SDCARD_CS_PIN    10
#define SDCARD_MOSI_PIN  7   // Teensy 4 ignores this, uses pin 11
#define SDCARD_SCK_PIN   14  // Teensy 4 ignores this, uses pin 13

void setup() {
  Serial.begin(9600);

  // Audio connections require memory to work.  For more
  // detailed information, see the MemoryAndCpuUsage example
  AudioMemory(8);

  sgtl5000_1.enable();
  sgtl5000_1.volume(0.5);

  SPI.setMOSI(SDCARD_MOSI_PIN);
  SPI.setSCK(SDCARD_SCK_PIN);
  if (!(SD.begin(SDCARD_CS_PIN))) {
    // stop here, but print a message repetitively
    while (1) {
      Serial.println("Unable to access the SD card");
      delay(500);
    }
  }
}

void playFile(const char *filename)
{
  Serial.print("Playing file: ");
  Serial.println(filename);

  // Start playing the file.  This sketch continues to
  // run while the file plays.
  playWav1.play(filename);

  // A brief delay for the library read WAV info
  delay(25);

  // Simply wait for the file to finish playing.
  while (playWav1.isPlaying()) {
  }
}

void loop() {
  playFile("SDTEST1.WAV");
  delay(500);
  playFile("SDTEST2.WAV");
  delay(500);
  playFile("SDTEST3.WAV");
  delay(500);
  playFile("SDTEST4.WAV");
  delay(1500);
}

 今回は以上です。
 次回は新聴覚補助ツール HAT24の基本構想をまとめ、イコライザーの簡素化について検討します。そしてマイクアンプを製作する予定です。お楽しみに!