Daisy には様々な開発環境・言語があるが、ざっくり
- Daisy 独自(DaisySP + libDaisy)
- Arduino 互換(ArduinoAudio、ArduinoDaisySP)
- それ以外のを変換(Max/MSP、PureData など。これはまだ準備中?)
の3つの路線があるっぽい。とりあえず Daisy 独自のやつが一番例が充実してそうなのでそれでやってみる。
セットアップ
DaisySP が音声信号を処理するライブラリ、 libDaisy はハードウェアのI/Oまわり(ADC、 GPIO、MIDI)の面倒を見てくれるライブラリ、で、どちらも必要。なのでまずはこれを git submodule として追加する(すでに DaisyExamples
をクローンしていると思うので、そっちの submodule にパスを通すのでもいい)
git init daisy-test cd daisy-test mkdir lib git submodule add git@github.com:electro-smith/DaisySP.git lib/DaisySP git submodule add git@github.com:electro-smith/libDaisy.git lib/libDaisy
これをビルドする。
(cd lib/DaisySP/ && make clean && make) (cd lib/libDaisy/ && make clean && make)
DaisySP
の examples
下にテンプレートプロジェクトがあるのでそれを適当な名前(ここでは osc1
)でコピーする。
mkdir projects cp -r lib/DaisySP/examples/template/ projects/osc1
そしてファイルを編集していく。ここでは VS Code を使う手順をメモ。
code projects/osc1
ファイルの書き換え
Makefile
Makefile
は、 TARGET
と CPP_SOURCES
を適当に書き換え(CPP ファイルもリネームするのを忘れずに)、 LIBDAISY_DIR
と DAISYSP_DIR
は適切なパスに書き換える。
# Project Name TARGET = osc1 # Sources CPP_SOURCES = osc1.cpp # Library Locations LIBDAISY_DIR ?= ../../lib/libDaisy DAISYSP_DIR ?= ../../lib/DaisySP # Core location, and generic Makefile. SYSTEM_FILES_DIR = $(LIBDAISY_DIR)/core include $(SYSTEM_FILES_DIR)/Makefile
.vscode/tasks.json
VS Code で作業する上で、とりあえず build
は定義しておいたほうが便利なのでそうする。あとは好みで load
とか clean
みたいなタスクを登録しておく。
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "make", "problemMatcher": [], "group": { "kind": "build", "isDefault": true } }, { "label": "load", "type": "shell", "command": "make", "args": [ "program-dfu" ] } ] }
.vscode/c_cpp_properties.json
補完が効くようにするために以下の2行を includePath
に追加
"${workspaceFolder}/../../lib/DaisySP/**", "${workspaceFolder}/../../lib/libDaisy/src/**"
osc1.cpp
この例を盗み見つつ、エンベロープとか使わずただサイン波が鳴り続けているだけ、みたいなやつをつくる。
たぶんこんな感じが一番シンプル?
#include "daisy_seed.h" #include "daisysp.h" using namespace daisy; using namespace daisysp; static DaisySeed seed; static Oscillator osc; static void AudioCallback(float *in, float *out, size_t size) { float output; // size 分だけ output を埋める for (size_t i = 0; i < size; i += 2) { output = osc.Process(); // left out out[i] = output; // right out out[i + 1] = output; } } int main(void) { // ハードウェアを初期化 seed.Configure(); seed.Init(); // オシレーターを初期化 float samplerate = seed.AudioSampleRate(); osc.Init(samplerate); // 適当な波形、音量、周波数を設定 osc.SetWaveform(osc.WAVE_SIN); osc.SetAmp(1.f); osc.SetFreq(1000); // 音を出す seed.StartAudio(AudioCallback); // 無限ループ for (;;) { } }
これをコンパイルして Daisy にロードするとサイン波が鳴る。具体的には、19番、18番ピンが出力で 20 番ピンが GND。↓の図は electro-smith/Hardware で MIT ライセンスで配布されているピンアウト表。
今回は 19 番ピンも 18 番ピンも同じ音が出ているので、どちらかと GND をスピーカーにつなげば音が鳴る。
ADC から値を取る方法とかもさっきの example code に載ってるけど、今回はいったんここで終わり。コード類は以下に置きました。