この記事はN・S高等学校 Advent Calendar 2022の10日目です。
私はN/S高等学校の職員で12月まで通学プログラミングコース代々木のメンターを担当していました。通学プログラミングコース(通称プロクラ)はプログラミングを活用したものづくりを通して学ぶ環境で、作りたいものが具体的にある方には最適な環境かと思います。N/S高等学校 通学プログラミングコースの公式 Twitter アカウント(https://twitter.com/procla_official) もあるので、ぜひチェックしてみてください!
TL;DR
N/S高等学校の通学コース(通学プログラミングコースを含む)では、「キャンパスフェスティバル」という、いわゆる文化祭にあたるイベントが全国各地にあるキャンパスで実施されます。
プロクラ企画としても作品展示などを行なっていて、私も今年度はタイトルにあるようにオーディオインターフェースから入力を取り、Processing でビジュアライズする作品を作って出品しました。
ソースコードは GitHub(https://github.com/satoyuichi/GuitarVisualEffects) で公開しています。
この作品を開発するにあたり、オーディオインターフェースを利用する記事が見当たらなかったため要点を記事にすることにしました。
実装環境
今回の実装環境は以下の通りです。
- macOS Monterey 12.6
- Processing 4.0.1
- Soundライブラリ(https://processing.org/reference/libraries/sound/index.html)
オーディオデバイスを列挙する
import processing.sound.*;
void setup() {
Sound.list();
}
このようにするとコンソールに以下のように出力されます。同じデバイス名が複数ある場合は、max inputs
が 1 以上の device id
の番号が候補になります。例えば以下の場合は、3, 5 になります。
device id 0: Port LCD-DF241SXV
max inputs : 0
max outputs: 0
device id 1: Port iMacのマイク
max inputs : 0
max outputs: 0
device id 2: Port iMacのスピーカー
max inputs : 0
max outputs: 0
device id 3: Default Audio Device
max inputs : 1 (default)
max outputs: 2 (default)
device id 4: LCD-DF241SXV
max inputs : 0
max outputs: 2
device id 5: iMacのマイク
max inputs : 1
max outputs: 0
device id 6: iMacのスピーカー
max inputs : 0
max outputs: 2
オーディオデバイスを選択する
オーディオデバイスはSound.inputDevice(deviceId)
で選択できます。先ほどのリストでPCのマイクを選択する場合は以下のようになります。同じようにオーディオインターフェースの番号を指定すれば、そのデバイスが選択されます。
import processing.sound.*;
void setup() {
Sound sound = new Sound(this);
sound.inputDevice(5);
}
信号を取り込む
信号を取り込むにはAudioIn
クラスのインスタンスを作成し、start()
メソッドを呼ぶことで信号の取り込みが始まります。
import processing.sound.*;
void setup() {
Sound sound = new Sound(this);
sound.inputDevice(5);
audioIn = new AudioIn(this, 0);
audioIn.start();
}
信号解析をする
信号解析、例えばフーリエ解析をしたい場合はFFT
クラスのインスタンスを利用します。例えば以下のようになります。
import processing.sound.*;
FFT fft;
int bands = 512;
float[] spectrum = new float[bands];
void setup() {
Sound sound = new Sound(this);
sound.inputDevice(5);
audioIn = new AudioIn(this, 0);
audioIn.start();
fft = new FFT(this, bands);
fft.input(audioIn);
}
void draw() {
fft.analyze(spectrum);
// 以下、配列spectrumから数値を取り出す
}
他の解析をしたい場合も同じようにSoundライブラリの各種クラスを利用して解析をすることができます。その他の解析器などについてはSoundライブラリのマニュアル(https://processing.org/reference/libraries/sound/index.html) を参照ください。
実際の活用方法は先のGitHubで公開しているソースコードも参考にしてみてください。
オーディオインターフェースから入力できない場合がある
原因が特定できていないのですが、正常に動作しない場合が確認されています。
- iMac21,1
- macOS 12.6 (21G115)
- Darwin 21.6.0
- USB ハブ
- ZOOM AMS-24 ← オーディオインターフェース
特にエラーは出ていないので、オーディオインターフェースからの信号の大きさの問題かもしれません。