[WIP] Arduinoで音を出したい(メモ)
Arduinoといえば、何故かMIDI関連ばっか作ってるので、毛色を変えて音が出るモノを作ってみたいと思います。
あまり変わってない?
というわけで、簡単にArduinoで音を出したい(サウンドを生成して鳴らす)というメモ。
今日は休日ということもあり、こんな感じ(圧電スピーカーだけ!w)で試すことに。
※よく見るとArduino UNOじゃなく互換機なのですが、お気になさらずw
tone()
これが一番簡単ですね。tone()
で、矩形波が出ます。周波数で音程を指定できます。
たとえば、こんなコードで簡単に音が鳴ります。
void setup()
{
pinMode(8, OUTPUT); // D8にスピーカー繋ぐ。
}
int sounds[] = {200,300,400,600,800,1200,1600,2400};
int v = 0;
void loop()
{
tone(8,sounds[v],10);
delay(50);
v ++;
if(v > 7){
v =0;
}
}
公式のチュートリアルも用意されてます。
上記チュートリアルにノートナンバーと周波数の変換用の定義も置いてあるのですが、例えばMIDIと変換するような場合は下記のような配列を使うと良いと思います。
(MIDIノートと周波数の関係(g200kgさん)を見ながら乱雑につくったものです。)
PROGMEM int freqs[] = {
8,8,9,9,10,11,11,12,13,14,15,15,16,17,18,19,
21,22,23,24,26,28,29,31,33,35,37,39,41,44,46,49,
52,55,58,62,65,69,73,78,82,87,93,98,104,110,117,123,
131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,
330,349,370,392,415,440,466,494,523,554,587,623,659,698,740,784,
831,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,
2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699,4978,
5274,5588,5920,6272,6645,7040,7459,7902,8372,8870,9397,9956,10548,11175,11840,12544
};
Arduinoで音を出す、光らせる、動かす
@mio_kさんの記事です。
Arduinoで音を出すには、出力ピンに高速にON/OFFすればいいんですね。。そういえばそっか!
という、原理のようなモノを体感させてくれる、良記事です。
Arduino DDS Sinewave Generator
矩形波だけでなく、正弦波(sine wave)を出したいと思って探してたら見つかったのがこのサイト。
まだちゃんと仕組みは理解してないのですが、サンプルコードをArduinoに流したら確かに音が出ました!
(サイトにあるローパスフィルタは作りませんでしたが、圧電スピーカー鳴らすくらいなら大丈夫でした)
Arduino Realtime Audio Processing
さきほどのサイトの中に、こんなコンテンツもありました。
こちらは、入力した音を加工したりすることも出来るよ、というモノ。凄い!
今回は回路が無い(今はスピーカーしか無いんじゃw)ので、後日実験してみたいと思います。
PWMDAC_Synthライブラリ
こちらは、Akiyoshi Kamideさんが公開されているシンセサイザーライブラリです。
CAmiDionという電子楽器を作られているようです。
早速、使ってみました。
#define PWMDAC_OUTPUT_PIN 11
#include <PWMDAC_Synth.h>
void setup(){
pinMode(13,OUTPUT);
PWM_SYNTH.setup();
}
int cnt1 = 0;
int v = 0;
byte notes[] = {70,74,78,82,86,90,94,98};
void loop()
{
if(cnt1 == 0){
digitalWrite(13,HIGH);
PWM_SYNTH.noteOn(1,notes[v],120);
}
if(cnt1 == 1000){
digitalWrite(13,LOW);
PWM_SYNTH.noteOff(1,notes[v],0);
v ++;
if(v > 7){
v = 0;
}
}
cnt1++;
if(cnt1 >= 2000){
cnt1 = 0;
}
PWM_SYNTH.updateEnvelopeStatus();
}
とりあえず、今回はMIDIを使わず、入力デバイスも無い状態で実験してるので、こんなヘッポコなコードになってしまいましたw
音は鳴ってくれたのですが、圧電スピーカーだとキツいかも。。。そろそろw
これは、以前に100均のヘッドホンをバラして取り出したスピーカーです。
こっちの方がマトモに聞こえます。下の方で作り方書きます。
Mozzi
Tim Barrassさんが公開しているシンセサイザーライブラリ。
ダウンロードしてみると判りますが、膨大なファイルが!
サンプルも沢山あるので(このライブラリのサンプルはスピーカーをD9に繋ぐ前提なので注意)試してみると面白いです。すげー!
まとめ
というわけで、いろいろ触ってみようと思います。
適宜Updateしようと思いますので、「こんなんもあるよ〜!」と教えて頂けたらうれしいです!
おまけ。実験用スピーカーの作り方。
すぐに圧電スピーカーの限界に達してしまったため、100均ヘッドホンから実験用スピーカーを作りました。
こういう実験のために、オーディオ機器に繋ぐのは危険です!壊しちゃうかも。
というわけで、実験には壊しても平気な100均スピーカーがオススメ。
とくに、ヘッドホンから取り出すと、音は小さいですが、2つ取れますw
こんなのを買います。(私はダイソーで買いました)
容赦なくバラします。
もともと繋がってるケーブルは、取っちゃいます。使いません。
替わりに、中が単芯の電線を使つなげます。
(固いジャンパー作る時に使うコレがおすすめ)
(より線しか無い場合、差し込み口作るのが面倒です)
早速ハンダづけます。
左側が+(Arduinoのデジタルピンに繋ぐ方)、右側が-(GND) です。
このとき、スピーカーが磁石でハンダゴテにひっついて、あわわ〜! ってなるので注意。
スピーカーを固定しときましょう。
完成!
こんなに見るからに安っぽいモノなら、壊れても平気で、存分に実験に使えますね!w
Arduinoにも直接ささる!
もちろんブレッドボードにも刺さります。
というわけで、便利な実験用スピーカーの作り方でした〜
(記事を書くために、もう1個GETw)