1. Teensyとオーディオ処理

 teensyは「とても小さい、ちっぽけな」という意味で、英語ではティーンジ、米語ではティーンシと発音するようですが、自分はこのチップを、ローマ字読みで「天使」と呼びたいほど愛着を感じています。
 国内ではオーディオ・サンプラーや DJミキサーの製作レポート、アマチュア無線の有志によるSDR(ソフトウェア無線:Software Defined Radio)への取り組みなど、比較的少数ですが主にオーディオ関係の記事が見られます。一方、海外ではシンセサイザー製作などのオーディオ関連はもちろん、ロボットやライトショー(電飾)、ロケットの製作、ゲーム機や各種コントローラーなど多彩な分野への応用が紹介されています。
 本章ではまず最初に、Teensyがどのようなものであるかを大まかに眺めることにします。ただし性能も機能も広範囲にわたるため、今回のプロジェクトに関係があるものに限定しています。続いて重要な機能について詳細を調べ、最後にちょっとした工作をしてこれから使う Teensy systemに仕上げます。



1.Teensyとオーディオ・アダプタボード

① Teensy 4.0 USB 開発ボード

 Teensyは最大周波数が 600MHz以上で動作する、ARM Cortex-M7を搭載した小型のマイコンボードです。ピンヘッダをハンダ付けすれば、そのままブレッドボード上で扱うことができます。
 8種類のモデルがありまずが、ここでは Teensy 4.0を使用します。最新のモデルは Teensy 4.1で、これは 4.0を細長くした形状で micro SDカードスロットを搭載し、フラッシュメモリは4倍に増加、また I/Oピンが増えて I/O機能が強化されています。

 どちらも処理速度など基本性能は同じであることから、サイズが小さい 4.0を選びました。写真のような USB開発ボードで、サイズは 18mm x 37mm、電源は開発用 PCにつないだ USBケーブルから供給します(ここでは Windows PCを使用)。右の図はピンレイアウトです。いかに機能が豊富であるかがよくわかります。なお、プログラムの開発は Windows以外に Mac、Linux(Ubuntu)でも可能です。

〔仕様・特徴〕
 ・600MHzのARM Cortex-M7
 ・1024K RAM(512Kは密結合)
 ・2048Kフラッシュ(64Kはリカバリおよび
      EEPROMエミュレーション用に予約済み)
 ・2つのUSBポート、両方とも480MBit /秒
 ・3 CANバス(CAN FDで1つ)
 ・2 I2Sデジタルオーディオ
 ・1 S / PDIFデジタルオーディオ
 ・1 SDIO(4ビット)ネイティブSD
 ・3 SPI、すべて16ワードFIFO
 ・3 I2C、すべて4バイトFIFO
 ・7シリアル、すべて4バイトFIFO
 ・32個の汎用DMAチャネル
 ・31個のPWMピン
 ・40個のデジタルピン、すべて割り込み可能
 ・14個のアナログピン、チップ上の2個のADC  など

 さらに、必要であれば 600MHzを超えるオーバークロックも可能です。また電源管理機能や日付/時刻の RTCもあり、ボタン電池で日付と時刻を保持し続けることができます。
 開発環境には Arduino IDEや VSCodeを使用でき、このプロジェクトでは Arduino IDEを使います。最新バージョンでは、オートコンプリートや組み込みデバッガーが使えるなどユーザー・インターフェイスが向上していること、それに使いなれていて軽量であることが主な理由です。

※今回のプロジェクトはリアルタイム・オーディオ処理が前提であり、次に掲げるオーディオ・アダプタが必須です。
 後で述べるようにこれらは物理的に一体化して使うことになります。今後は特に断らない限り、これらをワンセットとして「Teensy」と表現します。

② オーディオ・アダプタボード

 正式な名称は「Teensy 4 オーディオアダプタボード (Rev D)」です。Teensy 4.0に、16bit、44.1kHzのオーディオ機能を追加できる拡張ボードです。写真のように、3.5mmオーディオジャックとオーディオファイル保存用の microSDカードスロットが搭載されています。
 後で詳しく見ることになりますが、このボードに搭載されている SGTL5000ステレオ・コーデックはきわめて高性能であり、聴力支援ツール HAT24のサウンド処理だけでなく、さまざまなオーディオ処理をこなせる優れものです。

〔仕様・特徴〕
 ・16 bit、44.1 kHzサンプルレートオーディオ
 ・非圧縮WAVと生のオーディオデータを再生
 ・4チャンネルミキサー
 ・3.5 mmオーディオジャック
 ・microSDカードスロット
 ・ステレオヘッドフォンおよびステレオライン出力をサポート

2.Teensyと ARM Coretex-M7

 Teensyに搭載された ARM Coretex-M7は組み込み用プロセッサーです。Raspberry PiがOSを搭載して動作するのに対して(Pi Picoを除く)、ARM Coretex-M7は複雑なOSを利用しなくても動作するのが特徴で、オーバーヘッドが発生しないためリアルタイム高速処理に適しています。
 CPUのパフォーマンスを測る CoreMark Benchmarkで、同じ組み込み用の ESP32に比べ約6.6倍の処理能力と評価されています。これは単にクロック周波数が高いだけでなく、優れた浮動小数点演算性能やクロックサイクル毎に2つの命令を実行するアーキテクチャーが効いているのでしょう。
 さらに、オーディオ処理用の DSP(Digital Signal Processor:デジタル信号処理装置)を備えていて、高度なオーディオ処理を実行し、オーディオ・アプリケーションに必要な制御やユーザーインタフェースを提供しています。

 ここまで Teensyの優れた機能や特徴を説明しましたが、実は仕様面でもの足りない点があります。それは、外部との通信機能が装備されてないことです。現時点では、WiFiや Bluetoothを利用できないということです。したがって、スマートフォンなどからビジュアルにオーディオの設定を調整するようなことはできません。
 解決方法として、マイクロコントローラー ESP32や WizFi360といった WiFiモジュールと連携させる方法がありますが、これは物理的なサイズや消費電力の関係で簡単に採用することはできません。本サイトのコンテンツの解説で「デジタル版聴覚補助ツールの決定版(?)」としたのは、今後に通信機能が組み込まれると、さらに使いやすい版への発展もあり得るとの含みを残したためです。

 組み込み用ボードを最初に使用する場合、独特のプログラム構造になじめないかも知れません。OSのコマンドや開発環境から実行を制御できるコンピュータと違って、組み込み用プロセッサーは、機械語に翻訳してメモリーに記録したプログラムをひたすら実行し続けます。したがって、初期化処理で必要な準備をすべて指示することが必須要件になります。
 初期化処理で準備が完了するとエンドレスのループに入って、ループ内の処理を永遠に実行し続けます。この間に行うべき計測や外部からの指示の感知、それに対応して実行するアクションなどをすべてこのループ内に記述することになります。すべてをループ内にそのまま書くのではなく、外部に記述した関数などを呼び出すことも可能です。
 これらの点を理解してサンプル・プログラムを読むとわかりやすいでしょう。


3.ステレオ・コーデック SGTL5000とは

 NXP Semiconductors製の SGTL5000は低電力のステレオ・コーデックです。
 データシートに記載された内部ブロック図を見ると、なぜもっと早くこのコーデックと出会えなかったのかと悔しくなってしまいます。3mm角の小さなチップの中に、以下のすべての機能が含まれているのです。
 ・ステレオのライン入力
 ・バイアス付きマイク入力
 ・ADコンバーター
 ・DAコンバーター
 ・ヘッドフォンアンプとヘッドフォン出力
 ・ステレオのライン出力
 ・イコライザーなどのオーディオ処理


 オーディオ処理を構成する電子回路や、オーディオ処理の細々した理論は知らなくてもかまわないし、ましてやそれらを電子工作で作成する必要はありません。今まで取り組んできたことは何だったのだろうかと、頭を傾げたくなるほど素晴らしいチップです。
 図中にある「Digital Audio Processing section」を参照すると、次のような記載があります。

 SGTL5000 には、ソース選択スイッチに接続されたデジタル オーディオ処理ブロック (DAP) が含まれています。デジタル化されたソース選択スイッチからの信号は、オーディオ処理のために DAPブロックにルーティングできます。DAPには次の 5 つのサブブロックがあります。
 • Dual Input Mixer
 • NXP Surround
 • NXP Bass Enhancement
 • 7-Band Parameter EQ / 5-Band Graphic EQ / Tone Control (only one can be used at a time)
 • Automatic Volume Control (AVC)
 続いて、これらのブロックを通過する信号のシーケンスが図示されています。


 さらに、DAPブロックを追加する場合は、それぞれを個別に有効にする必要があり、ポップ音やクリック音を回避するためにミュートするようにと、ていねいな注意書きがあります。


 このルーティングの仕組みは SGTL5000の大きな特長であり、これによって多様なオーディオ処理を簡潔に操作することが可能になっています。HAT24では、上記のブロックから「7-Band Parameter EQ」を利用します。通常は以上の概要を知っておくだけで十分ですが、さらに次のような詳細情報が揃っています。少し踏み込んで独自のライブラリを開発する場合には必読です。
  ・Data Sheet: Technical Data
  ・SGTL5000 Initialization and Programming
  ・SGTL5000 I2S DSP Mode


4.Teensyを組み立てる

 今回の最後は Teensyの組み立て作業です。20W程度のハンダごて糸ハンダを準備してください。ハンダ付け用の台としてブレッドボードがあると便利です。
 なお、Teensy 4.0とオーディオ・アダプタボードはスイッチサイエンス社で、ピンソケットとピンヘッダは秋月電子通商で購入しました。Teensyにはピンヘッダを実装済みものもあります。価格・在庫などは次のリンクで確認してください。
 Teensy 4.0
 Teensy 4.0 (ピンヘッダ実装済み)
 Teensy 4 オーディオアダプタボード (Rev D)
 分割ロングピンソケット 1×42
 ピンヘッダ 1×40

 分割ロングピンソケットとピンヘッダは、それぞれ14本の位置で切り離し、それを Teensy 4.0にハンダ付けします。まず、Teensyボードをハンダ付けしやすいようにブレッドボード上に固定します。
 ボードのピンホールに合わせて、ブレッドボードにピンヘッダの長い方の足を差し込みます。その上、つまりピンヘッダの短い足の上に Teensyボードを乗せると固定できます。

 ハンダは多すぎないように、しかし接合が不完全にならないように注意します。ハンダ付けに不慣れな場合は、「ハンダ付けの仕方」などで Web検索して説明や動画を参考にしてください。


 次に、オーディオ・アダプタボードの裏面にピンソケットをハンダ付けします。
 先ほどハンダ付けが終わったピンヘッダをピンソケットに挿して裏返します。その上に、オーディオ・アダプタボードの裏面が上になるように置きます。セロテープなどでぐらつかないように固定して溶接します。


 これで完成です。2つのボードの位置関係を確認し、右の写真のように、Teensyの SDカードスロットがアダプタボードのヘッドフォンジャックの側にくるようにします。
 なお、この状態では Teensyボードとアダプタボードの間に 10mmのスキ間ができます。これは 3mmもあれば十分なので、丸ピンIC用のピンやソケットを使って背を低くすると、より小型化が可能です。

 次回は開発環境をインストールして、サンプルプログラムなどで動作を確認します。素晴らしい音色を聴くことができるのでお楽しみに!




〔参考情報:失敗事例〕

 Raspberry Piの OSとオーディオ関連ライブラリの不整合でエラーが発生することがわかってから、別の方法を模索していました。OSやライブラリのバージョンや組み合わせを変えたり、新たなボードを試したりでかなりの時間を消費しました。
 その途中で、Raspberry Pi Zeroシリーズ用のオーディオ ボード「IQaudio Codec Zero(写真はそれを Pi Zeroに組み付けたもの)」を見つけました。5バンドのイコライザー機能があり、Pi Zero専用ということで期待して購入したのですが、関連資料がほとんど見当たらずアプリケーションも乏しい。海外情報を含め、見つかるのは「インストールの問題」ばかりで、これは大失敗でした。
 あれこれテストをした結果、マイク入力をヘッドフォンに直接ルーティングする機能がないことがわかって打ち切りです。無理やり使うと1秒前後の遅延が発生してしまい、リアルタイム・オーディオ処理では使いものになりません。事前に十分な情報収集をしなければ、購入価格どころではない、大切な時間を浪費してしまうことになるという典型事例です。焦っての衝動買いにはくれぐれも注意しましょう!