前回、tone関数を使ってArduino上で簡単な音の出力をしました。今回はもう一歩踏み込んで、オープンソースのライブラリMozziを利用して、音の波形をプログラミングで操ってみたいと思います。
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
- Arduino本体(Arduino Uno R3 /Arduino Pro Mini)
http://www.switch-science.com/catalog/789/
http://www.switch-science.com/catalog/946/ - ブレッドボード http://www.switch-science.com/catalog/313/
- 圧電スピーカー http://akizukidenshi.com/catalog/g/gP-04228/
- タクトスイッチ http://akizukidenshi.com/catalog/g/gP-03648/
Mozziとは
Mozzi(モッツィ)は、オープンソースで配布されているArduinoの音響合成ライブラリです。音響合成ライブラリと書くと難しく聞こえますが、簡単に言うと、Arduinoで音の波形をプログラミングで操作してスピーカーで鳴らすことのできるライブラリです。前回利用したtone関数では、ビープ音でしか鳴らすことができませんでしたが、Mozziを使えばアイデア次第でArduinoでテルミンやシンセサイザーなどの電子楽器を作ることも可能です。
Mozzi
http://sensorium.github.io/Mozzi/
参考動画:テルミンの演奏
MozziのウェブサイトにはExamplesとして実際にどのような音を出すことができるのかサンプルの音源とソースコードがたくさん掲載されています。このページでさまざまなサンプル音源を聴くとMozziで電子楽器が作れるような気がしてきますね。
Mozzi Examples
http://sensorium.github.io/Mozzi/examples/
ArduinoでMozziを使えるようにする
では、さっそくMozziをArduinoで使えるように設定をしていきます。Mozziの導入の流れは下記の通りです。
- Mozziライブラリをウェブサイトからダウンロード
- ArduinoにMozziライブラリを追加
Arduinoでは、他のライブラリも同様にツール上で手軽に追加することができるようになっています。
1.Mozziライブラリをウェブサイトからダウンロード
Mozziライブラリ本体をウェブサイトからダウンロードしてください。ダウンロードはトップページの右上のアイコンをクリックすると「Mozzi.zip」ファイルをダウンロードすることができます。
※この記事を書いているときの最新版は「version 2014-08-09-14:15」です。
2.ArduinoにMozziライブラリを追加
Mozzi.zipがダウンロードできたら次に、Arduinoを起動して画面上にあるメニューから「スケッチ」→「ライブラリを使用」→「Add Library…」を選択してください。ファイルを選択する画面が表示されますので、先ほどダウンロードした「Mozzi.zip」を選択してください。
再度「スケッチ」→「ライブラリを使用」を開いて、そこにMozziが追加されていれば無事にMozziの導入が完了です。
「Add Library…」からうまくライブラリを追加できない場合は、Mozzi.zipを解凍してその解凍したフォルダ「Mozzi」を確認しましょう。Arduinoをインストールしたフォルダ内に「libraries」フォルダがありますので、そこに直接追加したのち、Arduinoを再起動して「スケッチ」→「ライブラリを使用」を選択してください。
Mozziを使って音を鳴らしてみる
ライブラリの追加が完了したら、さっそくMozziを使って音を鳴らしてみたいと思います。まず音を鳴らすために、Arduinoにスピーカーを接続します。今回はコーンスピーカーを利用してみます。
Mozziでは、出力に9番ピンを利用しますので、スピーカーをGNDと9番ピンに接続してください。また、スピーカーは+—(プラスマイナス)の極性はないので、どちらをGNDにしても大丈夫ですが、今回利用するようなケーブル付きのスピーカーであれば、片方の線が黒色なので、黒色をGNDに繋いでおくのをお勧めします。
回路の準備ができたら、次にプログラムを実行してみます。はじめにサンプルに掲載されているBasicのスケッチプログラムで音を鳴らしてみます。
Basicsの中の02 SinewaveのプログラムをArduino上に記載してください。下記のURLから「show sketch」をクリックすると、プログラムを開くことができますので、コピーしてArduino上に貼り付けてください。このプログラムでは、Mozziを使ってtone関数と同じ正弦波=ビープ音を出力するプログラムになっています。
Mozzi Examples Basics
http://sensorium.github.io/Mozzi/examples/#01.Basics
/* Example playing a sinewave at a set frequency, using Mozzi sonification library. Demonstrates the use of Oscil to play a wavetable. Circuit: Audio output on digital pin 9 on a Uno or similar, or DAC/A14 on Teensy 3.1, or check the README or http://sensorium.github.com/Mozzi/ Mozzi help/discussion/announcements: https://groups.google.com/forum/#!forum/mozzi-users Tim Barrass 2012, CC by-nc-sa. */ //#include <ADC.h> // Teensy 3.1 uncomment this line and install http://github.com/pedvide/ADC #include <MozziGuts.h> #include <Oscil.h> // oscillator template #include <tables/sin2048_int8.h> // sine table for oscillator // use: Oscil <table_size, update_rate> oscilName (wavetable), look in .h file of table #included above Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA); // use #define for CONTROL_RATE, not a constant #define CONTROL_RATE 64 // powers of 2 please void setup(){ startMozzi(CONTROL_RATE); // set a control rate of 64 (powers of 2 please) aSin.setFreq(440); // set the frequency } void updateControl(){ // put changing controls in here } int updateAudio(){ return aSin.next(); // return an int signal centred around 0 } void loop(){ audioHook(); // required here }
tone関数と同じビープ音が鳴りましたね。このプログラムを使いながら簡単にMozziの処理の流れを説明します。
Mozziでは通常のArduinoの処理の流れとは違い、音を生成・コントロールする処理を間に挟みます。それがupdatecontrolとupdateAudioになります。
このサンプルでは、プログラムを大きく分けると3つになります。最初に、青色の枠で囲っている部分がMozziの利用や、Mozzi内の音の波形を利用するのに必要なプログラムの読み込みを宣言しています。
次に、緑色の枠の部分は、プログラムで利用する変数を宣言するほか、サイン波をオシレーター(音を出力するための発振回路)で出力する際の設定を記述します。
最後に図2で説明した部分で、Mozziの処理を記載します。
#include <MozziGuts.h> //Mozziのライブラリを利用するために読み込み #include <Oscil.h> //音出力用のオシレーターテンプレートの読み込み #include <tables/sin2048_int8.h> //オシレーターでサイン波を利用するために読み込み Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA); //オシレーターのサイン波の形式を設定 #define CONTROL_RATE 64 //コントロールレート void setup(){ startMozzi(CONTROL_RATE); //updateControlを呼び出すコントロールレートを設定 aSin.setFreq(440); //出力する周波数 } void updateControl(){ } int updateAudio(){ return aSin.next(); //サイン波を引き続き出力 } void loop(){ audioHook(); //音の出力 }
プログラムの赤色の部分の440の数字を変更してみてください。そうすると周波数が変化するので、音の高さが変わると思います。
では、次に動的に音を変えるようにするにはどのようにすれば良いでしょうか?下記のプログラムを実行してみてください。
#include <MozziGuts.h> //Mozziのライブラリを利用するために読み込み #include <Oscil.h> //音出力用のオシレーターテンプレートの読み込み #include <tables/sin2048_int8.h> //オシレーターでサイン波を利用するために読み込み Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA); //オシレーターのサイン波の形式を設定 #define CONTROL_RATE 64 //コントロールレート int pitch = 200; void setup(){ startMozzi(CONTROL_RATE); //コントロールレートを設定 aSin.setFreq(pitch); //出力する周波数 } void updateControl(){ if(pitch < 400){ pitch++; } else{ pitch = 200; } aSin.setFreq(pitch); //出力する周波数 } int updateAudio(){ return aSin.next(); //サイン波を引き続き出力 } void loop(){ audioHook(); //音の出力 }
このプログラムでは赤色の部分を変更・追加しました。
updateControlは、コントロールレートで設定されたタイミングで毎度処理が実行されるので、その時にaSin.setFreq()関数で、出力するサイン波の周波数を変更しています。UpdateControlが呼ばれる度にpitch変数が400以下ならpitch変数を+1として、400を越えたら200に戻す、ということをしています。
コントロールレートは、1秒間にupdateControlを呼び出す回数を指定することができます。コントロールレートを増やすと音の変化が早くなります。
ボリューム可変抵抗を使って音の高さを変えてみる
では、プログラムで音の高さを変化させる方法がわかったところで、これを回路に応用してみます。下記の回路を用意します。
#include <MozziGuts.h> //Mozziのライブラリを利用するために読み込み #include <Oscil.h> //音出力用のオシレーターテンプレートの読み込み #include <tables/sin2048_int8.h> //オシレーターでサイン波を利用するために読み込み Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA); //オシレーターのサイン波の形式を設定 #define CONTROL_RATE 64 //コントロールレート int pitch = 200; void setup(){ startMozzi(CONTROL_RATE); //コントロールレートを設定 aSin.setFreq(pitch); //出力する周波数 } void updateControl(){ int pitch = mozziAnalogRead(0); //0番ピンから入力 aSin.setFreq(pitch); //出力する周波数 } int updateAudio(){ return aSin.next(); //サイン波を引き続き出力 } void loop(){ audioHook(); //音の出力 }
先ほどプログラムで音の高さを変化させた箇所を、0番ピンに繋いだボリューム可変抵抗の入力値に置き換えることができました。
外観を整えて楽器っぽくしてみる
ある程度Mozziの操作がわかったところで、外観を整えてみます。今回はボリューム可変抵抗を利用しましたが、ボリューム可変抵抗の代わりに以前に紹介したフォトリフレクタや超音波センサーなどを利用して、テルミンのような操作で音を出すこともできます。いろいろなセンサーと組み合わせることで、自分だけのオリジナル電子楽器を作ってみてください。
まとめ
Mozziは、Arduinoで手軽に本格的な音の操作が可能なライブラリです。Arduinoでは、いろいろなライブラリを開発している人がおり、開発したライブラリをオープンソースで共有することでArduinoを拡張し、面白いものがどんどん出てくるサイクルが生まれてきます。
次回はArduinoでSDカードを利用して、センサーの値の記録や読み込みをしてみます。