見出し画像

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の時間軸を混在させてはならない様です。

それにしてもフィルター制御が上手くいかないのは早くなんとかしたいところ。

とにかくドキュメントは良く読むべし。そして、最小構成で研究するべし。
これは間違いない様ですね。

当たり前すぎますが。。

またがんばります!

いいなと思ったら応援しよう!