ELテープとArduinoで作るミュージックビジュアライザー - 音に合わせて光る
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| EL Shield for Arduino(SeeedStudio製等) | 1 |
| ELテープ 緑 1m | 1 |
| ELテープ 赤 1m | 1 |
| ELテープ 青 1m | 1 |
プロジェクト概要
Arduino UNOとELシールド、3色のELテープ(電界発光テープ)を使用し、音楽のビートに合わせて発光するビジュアライザーを作ります。ELシールドの4チャンネルのうち3つにELテープを接続し、ProcessingとArduinoライブラリを用いて音声解析を行い、キック・スネア・ハイハットそれぞれに対応する色のELテープを点灯させます。
セットアップ手順
- ELテープをELシールドのチャンネル1〜3に接続
- ELシールドをArduino UNOに装着
- Processing(processing.org)をインストール
- Processing用Arduinoライブラリ(
cc.arduino)を取得し、Processingのスケッチブックフォルダ内librariesに配置 - 添付のProcessingスケッチ(BeatWrite, BeatListener)を開く
- コード内の音楽ファイルパス(
song = minim.loadFile(...))を自分のMP3ファイルに変更 - Processingで「Run」実行、音楽再生とともにELテープが発光
動作原理
- Processing側でMinimライブラリを用いて音声をリアルタイム解析
BeatDetectクラスでキック(低域)、スネア(中域)、ハイハット(高域)のビートを検出- 検出ごとにシリアル通信でArduinoへ信号送信
- Arduino側でELシールドの該当チャンネルをON/OFF制御
コード
BeatWrite(Processing / Java)
import processing.serial.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import cc.arduino.*;
Minim minim;
AudioPlayer song;
BeatDetect beat;
BeatListener bl;
Arduino arduino;
int ledPin = 1; // ELチャンネル1 (キック)
int ledPin2 = 2; // ELチャンネル2 (スネア)
int ledPin3 = 3; // ELチャンネル3 (ハイハット)
float kickSize, snareSize, hatSize;
void setup() {
size(512, 200, P3D);
minim = new Minim(this);
// ポート名は環境に合わせて変更(Windows: "COM3" 等)
arduino = new Arduino(this, "/dev/ttyACM1", 57600);
song = minim.loadFile("/home/paul/Music/dope.mp3", 2048); // ★自分のMP3パスに変更
song.play();
beat = new BeatDetect(song.bufferSize(), song.sampleRate());
beat.setSensitivity(100); // 300ms感度
kickSize = snareSize = hatSize = 16;
bl = new BeatListener(beat, song);
textFont(createFont("Helvetica", 16));
textAlign(CENTER);
arduino.pinMode(ledPin+3, Arduino.OUTPUT);
arduino.pinMode(ledPin2+3, Arduino.OUTPUT);
arduino.pinMode(ledPin3+3, Arduino.OUTPUT);
}
void draw() {
background(0);
fill(255);
if(beat.isKick()) {
arduino.digitalWrite(ledPin+3, Arduino.HIGH);
kickSize = 32;
}
if(beat.isSnare()) {
arduino.digitalWrite(ledPin2+3, Arduino.HIGH);
snareSize = 32;
}
if(beat.isHat()) {
arduino.digitalWrite(ledPin3+3, Arduino.HIGH);
hatSize = 32;
}
// 即座にOFF(点滅効果)
arduino.digitalWrite(ledPin+3, Arduino.LOW);
arduino.digitalWrite(ledPin2+3, Arduino.LOW);
arduino.digitalWrite(ledPin3+3, Arduino.LOW);
textSize(kickSize); text("KICK", width/4, height/2);
textSize(snareSize); text("SNARE", width/2, height/2);
textSize(hatSize); text("HAT", 3*width/4, height/2);
kickSize = constrain(kickSize * 0.95, 16, 32);
snareSize = constrain(snareSize * 0.95, 16, 32);
hatSize = constrain(hatSize * 0.95, 16, 32);
}
void stop() {
song.close();
minim.stop();
super.stop();
}
BeatListener(Processing / Java)
class BeatListener implements AudioListener {
private BeatDetect beat;
private AudioPlayer source;
BeatListener(BeatDetect beat, AudioPlayer source) {
this.source = source;
this.source.addListener(this);
this.beat = beat;
}
void samples(float[] samps) {
beat.detect(source.mix);
}
void samples(float[] sampsL, float[] sampsR) {
beat.detect(source.mix);
}
}
注意点・拡張アイデア
- Arduino側のスケッチは標準の
StandardFirmataまたはそれに準じたものを書き込む必要があります(ProcessingのArduinoライブラリはFirmataプロトコルを使用) - シリアルポート名(
/dev/ttyACM1等)は環境に合わせて変更 - ELテープは高電圧駆動のため、シールドの取り扱いに注意
- FFT解析のバンド分割を調整して、より細かな周波数帯への対応も可能
- 複数のELワイヤーやELパネルを使って立体的な演出にも拡張可
製造プロセス