メモ:Electro-Smith Daisy でサイン波を鳴らす

Daisy には様々な開発環境・言語があるが、ざっくり

  • Daisy 独自(DaisySP + libDaisy)
  • Arduino 互換(ArduinoAudio、ArduinoDaisySP)
  • それ以外のを変換(Max/MSPPureData など。これはまだ準備中?)

の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)

DaisySPexamples 下にテンプレートプロジェクトがあるのでそれを適当な名前(ここでは osc1 )でコピーする。

mkdir projects
cp -r lib/DaisySP/examples/template/ projects/osc1

そしてファイルを編集していく。ここでは VS Code を使う手順をメモ。

code projects/osc1

ファイルの書き換え

Makefile

Makefile は、 TARGETCPP_SOURCES を適当に書き換え(CPP ファイルもリネームするのを忘れずに)、 LIBDAISY_DIRDAISYSP_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 ライセンスで配布されているピンアウト表。

f:id:yutannihilation:20200705194318p:plain:w400
Daisy のピンアウト

今回は 19 番ピンも 18 番ピンも同じ音が出ているので、どちらかと GND をスピーカーにつなげば音が鳴る。

f:id:yutannihilation:20200705195025j:plain:w400

ADC から値を取る方法とかもさっきの example code に載ってるけど、今回はいったんここで終わり。コード類は以下に置きました。