プログラマブルモジュール Daisy Patchで遊んでみる
今回は、Electro SmithからリリースされているDaisy Patchというプログマブルなモジュールを試してみました。
Daisyとは?
Electro-SmithからリリースされているDaisyは、Arduinoのようなマイコン・ボード/開発プラットホームです。他のマイコン・ボードとの違いは、オーディオ・アプリケーションに特化されている点で、32bit/96kHzでオーディオ処理を実行でき、64MBのRAMも備えています。オーディオ・アプリケーションに特化されたDaisyでは、オーディオ/MIDI周りのライブラリーがひととおり用意されているので、ユーザーはコア部分のコーディングに集中できるのがポイントです。
自分はあまりDSP処理に明るくないので、フィルタやエフェクトなど一通りよく使うものは用意されていて、クリエイティブな部分に集中できそうなのが嬉しいですね。
Daisyには、ボード単体のDaisy Seed、可変抵抗やプッシュスイッチ、Audio I/Oなど必要最低限のインターフェースを備えたDaisy Pod、ユーロラックモジュラーのインターフェースが付属したDisy Patch、など様々なバリエーションとしてリリースされています。今回はモジュラーのインターフェースを備えた Daisy Patchを取り上げています。
まずはサンプルプログラムを動かしてみる
Getting Started的なページを見てみることにします。githubのwikiがあり、簡単なチュートリアルが記述されています。
Daisyはブラウザからサンプルプログラムをボードに書き込むことができるようになっています。
開発環境を整える
Daisyのソフトウェアの開発環境としては、以下の通り現状3パターン用意されています。
1. C++ とmakeで開発
C++ DSPライブラリ DaisySP、Daisyハードウェア抽象ライブラリ libDaisyを使って開発。Daisy開発環境のコアで、最も開発が進んでいる。組み込み開発に慣れている人にとっては最もパフォーマンスが出しやすい方法。
2. Arduino IDEと専用ライブラリで開発
Arduino IDE用ライブラリ DaisyDuinoを用いて開発。DaisySP、libDaisyがArduinoで使いやすく内包された形で用意されている。Arduino IDEからライブラリをインストールするだけなので、組み込み開発に慣れていないデザイナーでも気軽に開発が始められる。
3. Cycling'74 Max(gen~)で開発
oopsyというリポジトリで開発が進められている。まだベータリリース段階ではあるが、Maxユーザーにとっては最も手軽な方法になりそう。
まずは最も気楽そうなArduino IDEとDaisyDuinoを選んで始めてみました。
開発環境の構築はDaisyWikiの通りに行えばよく、特にひっかかるようなこともありませんでした。
ちなみにAruidno IDEはコード補完など使えず辛いので、VSCodeでコーディングからスケッチのアップロードまで出来るようにセットアップしています。
DaisyDuinoで簡単なスケッチを書いてみる
まずは全体像を把握するために、Exampleを参考にしながら簡単なスケッチを書いてみます。
DaisyをDaisyDuinoで開発する時の要点としては、DaisyDuino.hで、このクラスに最低限必要なインターフェースが集約されています。また、オーディオエフェクトを作ったり、オシレータを作ったりする場合は、DaisySPに色々と便利なクラスが揃っています。
以下は、最もシンプルなDaisyの初期化とオーディオコールバックの例です。
#include "DaisyDuino.h"
void setup() {
// DAISYはAudioClassのexternとしてDaisyDuino.hに定義されている
// サンプルレート48kで初期化
DAISY.init(DAISY_PATCH, AUDIO_SR_48K);
// コールバック開始
DAISY.begin(AudioCallback);
}
static void AudioCallback(float **in, float **out, size_t size) {
// 初期化で指定したサンプルレートで呼ばれる
}
PatchやPodなど、ハードウェアに依存したインターフェース部分(ロータリーエンコーダーや可変抵抗やGATE INなど)は、同じくDaisyDuino.hのDaisyHardwareクラスに定義されています。ただ、現状では全てのインターフェースがここに集約されている訳ではなく、PatchのCV端子や、GATE OUTなどは普通にanalogWriteとか、digitalWriteを直接書く形になるみたいです。Patchの各ピン番号の定義はこちらです。ここら辺も将来的には、DaisyHardwareに集約されるのかもしれません。以下、簡単な使い方です。
#include "DaisyDuino.h"
DaisyHardware hw;
void setup() {
// 戻り値は DaisyHardware
hw = DAISY.init(DAISY_PATCH, AUDIO_SR_48K);
// ピン入出力設定
pinMode(PIN_PATCH_GATE_OUT, OUTPUT);
pinMode(PIN_PATCH_CV_1, OUTPUT);
DAISY.begin(AudioCallback);
}
void loop() {
// ロータリーエンコーダー
hw.DebounceControls();
int inc = hw.encoder.Increment();
// GATE IN
bool state = hw.gateIns[0].State();
// GATE OUT
digitalWrite(PIN_PATCH_GATE_OUT, 1);
// 可変抵抗(CTRL) 値が反転しているので戻して使う
uint32_t val = (4095 - analogRead(PIN_PATCH_CTRL_1));
// CV out
analogWrite(PIN_PATCH_CV_1, 0);
}
static void AudioCallback(float **in, float **out, size_t size) {
// 初期化で指定したサンプルレートで呼ばれる
}
これらを踏まえた上で、簡単にスケッチを書いてみました。Mutable Instrumnets PlaitsのChordモードのような簡易FMコードオシレータです。
ソースコードは以下で公開しています。改変などご自由にお使いください。
oopsyを使ってみる
oopsyはMaxのgen~をDaisyにエクスポートする仕組みで、OLEDでの波形表示やパラメータUI、モード切り替えなどの機能がOS的に提供されていて、複数の機能を切り替えて使うことなども出来るようになっています。
まだサンプルを試した程度ではありますが、特にベースになっているUIやアプリ切り替え周りが格段に便利そうな印象です。OLED上のUIを独自のものにしたい、などの用途でなければ、DaisyDuinoよりさらに楽に実装出来るんじゃないかなと思ったので、今後、こちらも深堀りしてみるつもりです。
まとめ
使ってみた感触としては、比較的手軽にオリジナルのユーロラック モジュールを作れるのは面白いと思いました。ライブラリ側はまだ発展途上な部分も多そうですが、開発もアクティブに進んでいて、oopsyなどは特に今後が楽しみだと思います。
今回はDaisyファミリーの中でもPatchを取りあげて説明しましたが、seed単体で使って、オリジナルハードを作ったり、サウンドインスタレーションのシステムモジュールにしたりもできそうですね。