Arduinoの自作シンセ、Mozziの基礎練習
Mozziの動きが理解できていない反省を踏まえて、最小の構成で色々試してみます。
とりあえず実装したもの
・ノコギリ波のオシレータ
・Event Delayによる発音繰り返し処理
・MozziのLowPassFilter
・ポテンショメータによるローパスフィルター操作
とりあえずこれだけの構成でやってみます
#include <Mozzi.h>
#include <Oscil.h>
#include <EventDelay.h>
#include <tables/saw2048_int8.h>
#include <LowPassFilter.h>
#define MOZZI_CONTROL_RATE 64
Oscil<SAW2048_NUM_CELLS, MOZZI_AUDIO_RATE> aSaw(SAW2048_DATA);
LowPassFilter lpf;
EventDelay toggle;
bool noteOn = true; // 発音フラグ
const int analogPin1 = A0;
int freq = 55;
int cutOffFreq = 440;
void setup(){
startMozzi();
aSaw.setFreq(freq);
lpf.setCutoffFreq(cutOffFreq); // フィルタを初期化
toggle.start(50); // 待ち時間
}
void updateControl(){
int potValue = mozziAnalogRead(analogPin1);
cutOffFreq = map(potValue, 0, 1023, 20, 180);
lpf.setCutoffFreq(cutOffFreq); // LPFカットオフ周波数を設定
if (toggle.ready()){
noteOn = !noteOn; // 音のオンオフ
toggle.start(50); // 待ち時間を作る
}
if (noteOn){
aSaw.setFreq(freq); // 発音
} else {
aSaw.setFreq(0); // 停止
}
}
AudioOutput updateAudio(){
int audioSignal = aSaw.next(); // オシレーター更新
audioSignal = lpf.next(audioSignal); // フィルター適用
return MonoOutput::from8Bit(audioSignal); // 出力
}
void loop(){
audioHook();
}
動いている様子
えっ!?動いている。。。。
結局ローパスフィルターが反映された発音はできています。
なんでできる様になったのかが分からないのが困りどころです。
気をつけたところ
・公式ドキュメントをよく読む
・analogReadを使わずにmozziAnalogReadに変えた
このぐらいなのですが、しっかりフィルターが効いている様です。
まだわからないところ
map(potValue, 0, 1023, 20, 180);
この部分。
カットオフの周波数を20から180の間にマッピングしていますが、上限を186以上にすると音がぶっ壊れます。
ここは何か決まり事があるのだろうと思います。
これまでの不具合について
Mozziは何かと時間軸にうるさいようで、Arduinoの標準機能であるdelay()とかanalogRead()を使うと途端にグリッチ音(Glitch)が発生するので、予想していた通りArduinoとMozziの時間軸を混在させてはならない様です。
それにしてもフィルター制御が上手くいかないのは早くなんとかしたいところ。
とにかくドキュメントは良く読むべし。そして、最小構成で研究するべし。
これは間違いない様ですね。
当たり前すぎますが。。
またがんばります!