ここまでサンプルを使って入門編を進めてきましたが、いよいよArduino IDEで編集可能なスケッチの中身に触れてみます。 まずは前回第4回で触れた内容を読み解いていきましょう。 重要な点として以下が挙げられます。
startMozzi(CONTROL_RATE)
をsetup関数の中で宣言する
Arduinoにおける値の代入等の処理はupdateControl()
内に既述する (loop()
に書き込むとMozziが正常に動作しない)
updateAudio()
内に出力の設定を書く (今後扱うgain設定など)
loop()
内にはaudioHook()
のみを書き込んでおく (オーディオバッファへの送信/再生が行われる)
センサ入力用にはmozziAnalogRead
を使う
意外とシンプルな構造になっていると思います。
1#include <MozziGuts.h>
2#include <Oscil.h> // オシレーターのテンプレート
3#include <tables/sin2048_int8.h> // オシレーター用のサイン波テーブル
4#include <mozzi_midi.h> //Pdの[mtof]オブジェクトの代わり
5
6// use: Oscil <table_size, update_rate> oscilName (wavetable)
7Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);// 配列変数SIN2048_DATA2048の8bitデータをaSinに格納
8
9// use #define for CONTROL_RATE, not a constant
10#define CONTROL_RATE 64 // コントロールレートの設定
11
12float val = 0.f;
13float pitch = 0.f; // 音の高さ (pitch) の変数
14int sensorValue;
15int pin = 0;
16
17void setup(){
18 startMozzi(CONTROL_RATE); // Mozziの初期化と処理開始
19}
20
21void updateControl(){ // Mozziの音出力設定はこの領域に書き込む
22
23 sensorValue = mozziAnalogRead(pin);
24
25 val = map(sensorValue, 0, 1024, 0, 127); //センサの値を0~127にマッピング
26
27 if(val < 128 && val > 0){ // 1~127の値であれば...
28 pitch = val; //pitchに値を格納する
29 aSin.setFreq(mtof(pitch)); // pitchを周波数に変換し、オシレーター設定に代入する
30 }
31 else{ // その他の値がきた場合は...
32 pitch = 0; //pitchを0にして...
33 aSin.setFreq(0.f); // オシレーターを止める
34 }
35}
36
37int updateAudio(){
38 return aSin.next(); // オーディオの繰り返し出力処理
39}
40
41void loop(){
42 audioHook(); // 再生のために必要