5. 少しMozziの詳細を見てみる

ここまでサンプルを使って入門編を進めてきましたが、いよいよArduino IDEで編集可能なスケッチの中身に触れてみます。
まずは前回第4回で触れた内容を読み解いていきましょう。
重要な点として以下が挙げられます。

1. startMozzi(CONTROL_RATE)をsetup関数の中で宣言する
2. Arduinoにおける値の代入等の処理はupdateControl()内に既述する (loop()に書き込むとMozziが正常に動作しない)
3. updateAudio()内に出力の設定を書く (今後扱うgain設定など)
4. loop()内にはaudioHook()のみを書き込んでおく (オーディオバッファへの送信/再生が行われる)
5. センサ入力用にはmozziAnalogReadを使う

意外とシンプルな構造になっていると思います。

#include <MozziGuts.h>
#include <Oscil.h> // オシレーターのテンプレート
#include <tables/sin2048_int8.h> // オシレーター用のサイン波テーブル
#include <mozzi_midi.h> //Pdの[mtof]オブジェクトの代わり
 
// use: Oscil <table_size, update_rate> oscilName (wavetable)
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);// 配列変数SIN2048_DATA2048の8bitデータをaSinに格納
 
// use #define for CONTROL_RATE, not a constant
#define CONTROL_RATE 64 // コントロールレートの設定
 
float val = 0.f;
float pitch = 0.f; // 音の高さ (pitch) の変数
int sensorValue;
int pin = 0;
 
void setup(){
  startMozzi(CONTROL_RATE); // Mozziの初期化と処理開始
}
 
void updateControl(){ // Mozziの音出力設定はこの領域に書き込む
 
  sensorValue = mozziAnalogRead(pin);
 
  val = map(sensorValue, 0, 1024, 0, 127); //センサの値を0~127にマッピング
 
  if(val < 128 && val > 0){ // 1~127の値であれば...
    pitch = val; //pitchに値を格納する
    aSin.setFreq(mtof(pitch)); // pitchを周波数に変換し、オシレーター設定に代入する
  }
  else{ // その他の値がきた場合は...
    pitch = 0; //pitchを0にして...
    aSin.setFreq(0.f); // オシレーターを止める
  }
}
 
int updateAudio(){
  return aSin.next(); // オーディオの繰り返し出力処理
}
 
void loop(){
  audioHook(); // 再生のために必要
}