4. Pure Dataから離れて、Mozziだけでセンサ入力から音を出す

ここまでPure DataとともにMozzi学んできましたが、MozziはArduino上で動くため当然のことながらPdは必ずしも必要ありません…(ごめんなさい)

ですが、簡単なシリアル通信のプログラムを学習しましたので、ProcessingopenFrameworksMax/MSPなどのソフトウェア、プログラミング環境からMozziをコントロールするノウハウが提供できたと思います。

ここで、ソフトからはいったん離れてArduinoのみでMozziを操作する段階に移行したいと思います。
今回は第3回のプログラムをハードウェア上で実装したいと思います。

○ハード (以下は例です)
Arduino Unoなど (16MHz駆動のみ対応→MozziのHPを参照のこと)
ジャンプワイヤ (数本)
ブレッドボード (1枚, なくてもいい)
オーディオジャック
・スピーカ (ジャックに対応するもの)
可変抵抗 (5KΩBカーブなど)
○ソフト
・Arduino
・Mozzi

—既に終えている方は不要—
0-1) Arduinoをインストールし、Mozziをダウンロードする
(執筆時点で、Pure DataのバージョンはPd-Extended 0.43.4, Arduinoのバージョンは1.0.5, Mozziのバージョンは0.01.1zzzz)

0-2) ダウンロードしたフォルダを”Mozzi”にリネームして、Arduinoのライブラリフォルダ (Mac: 書類/Arduino/libraries, Win: Arduino.exeが入っているフォルダ/libraries) にコピーし、Arduino IDEを開いてください。
※上記階層にlibrariesフォルダが無い場合はご自分でlibrariesフォルダを作ってください。また、ご自分で管理方法を変更している場合はArduinoの環境設定で参照しているArduinoフォルダ内にコピーしてください。
—既に終えている方は不要—

1) Arduinoとステレオミニジャック, 可変抵抗を下図 (赤:Digital 9番ピン,黒:GND, 可変抵抗の足をそれぞれVCC, Analog0, GND) のように接続し、USBケーブルでArduinoをPCに接続してください。

2) メニューバーからツール (Tools) を選び、マイコンボード(Board) から使用するArduinoを選択してください

3) 同様にツール (Tools) からシリアルポート (Serial Port) を選び、Arduinoが接続されているUSBポートを選択してください

4) ページ下部のソースを参考にプログラムを書き込んでください

5) ArduinoIDEウィンドウの矢印 (→) マークをクリックし、Arduinoにスケッチを書き込んでください (pdパッチが開いている場合は[close]を押すか、 閉じてから書き込み)

6) 可変抵抗をまわすと音が出力されます

pot

#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(); // 再生のために必要
}

Pure Dataを使っていた頃よりもシンプルになったと思います。
「最初からこっちでやれ!」と言われてしまいそうですが、Arduino IDEで色々といじる前に多彩な音に触れてもらいたいと思い、こういった流れで入門編を執筆しています。
また、Pure Data等のソフトウェアでセンサ値の加工をしたり、アルゴリズムコンポジションの結果をArduinoから出力したり…といった使い方にもつながると思います。
次回からはいよいよArduinoスケッチの中身に迫っていきたいと思います。