温かみがあって太いサウンドが魅力的なアナログシンセサイザー。
古き良き時代の音は現代の音楽シーンでも人気が高く、当時のアナログシンセサイザーはソフトウェアとしてはもちろんのこと、ハードウェアとしても復刻版が続々と発売されています。
今回は、MIDI で操作できるアナログモデリングシンセを Arduino と音響合成ライブラリの Mozzi を使ってなるべく安く、すっごく適当に作ってみようと思います。
参考 Mozzi | audio synthesis library for Arduino
目次
用意するもの
外出自粛中ということでなるべく自宅にあるものやゴミを使っていきますが、いくつかのアイテムは近所の 100 円ショップ (セリア) で購入しました。
Arduino Uno
マイコンボードの Arduino Uno を使用しますが、Uno じゃなくても大丈夫だと思います。
写真の Arduino Uno はジャンク屋さんで 200 円ほどで購入したものですが、低価格な Arduino Uno の互換品でも問題ありません。
ちなみに、大人の科学の Japanino だとスペック不足でスケッチが書き込めませんでした。
木製トレイロング
セリアで購入した木箱です。
タカチの YM ケースのようなアルミ素材だとクールな感じになると思うのですが、木材だと手作り感が出ますし 100 円なので失敗を恐れなくて済みます。
アナログな温かみを出していきたいので、なるべく汚れた雰囲気の木目のものを選んでみました。
お名前スタンプ
自由な文字列のスタンプを作れる「お名前スタンプ」という商品、これもセリアで購入しました。
スタンプのゴムの部分がアルファベットのすべてのパターンになっていて、ハサミで切って組み合わせることで文字列をスタンプできる仕組みです。
ゴム部とホルダー部は別々の商品なので、それぞれ 100 円です。
スタンプ台
これもセリアの商品です。
ハンドメイドのコーナーには様々な色のスタンプ台がありましたが、サイズが小さかったので文房具コーナーで普通のスタンプ台を購入しました。
適当に木箱にスタンプするだけなので、若干にじみますが水性で大丈夫だと思います。
購入したものは以上です。
ここから先の電子工作に必要な道具および部品は家にあるものやゴミから引っぺがしたものなどを使用しますが、普通に購入しても数百円ぐらいなものばかりですのでご安心ください。
仕様を考える
Arduino Uno には A0 から A5 の 6 個のアナログ入力、D0 ~ D13 までの 14 個のデジタル入出力があります。
オン・オフなスイッチはデジタル入力で行けますが、アナログシンセサイザーのノブの多くはアナログ入力ですから、どうにかして 6 個に厳選する必要があります。
Minimoog のような 3 オシレーターにして太いサウンドを鳴らしたいところですが、ノブの数や性能を考慮するとちょっと厳しそうです。
KORG モノフォニック アナログ シンセサイザー monologue BK モノローグ ブラック 25鍵 16ステップシーケンサー オシロスコープ搭載 電池駆動 軽量 持ち運びに最適
KORG(コルグ)
Amazon で探す
楽天市場で探す
KORG のアナログシンセサイザー monologue は 2 オシレーターですが、ノブの数も少なくシンプルな構造になっているので、これをお手本にしながらさらにシンプルな仕様を考えてみました。
-
オシレーター × 2 (ノコギリ波、矩形波)
VCO1 は波形選択 (D2) のみ、VCO2 は波形選択 (D3)、オクターブ調整 (A0)、ピッチ調整 (A1) で複雑な音を作れるようにします。
タクトスイッチやロータリースイッチを使えば 3 種類以上の波形を切り替えることもできるはずですが、今回はトグルスイッチを使うのでオン・オフで 2 種類の波形しか選択できません。
-
ローパスフィルター
カットオフ周波数 (A2) とレゾナンス (A3) の調整はアナログシンセサイザーでは必須なので、ここはケチらず 2 つのノブを割り当てます。
-
ADSR エンベロープ
ノブの数が足りないのでアタック (A4) とディケイ (A5) のみを搭載し、サステインは 3 分の 1 ぐらいの固定値、リリースはディケイと兼用します。
それだけだとつまらないので、タイプ (D4) を切り替えることで ADSR のターゲットを「VCA と VCF」または「VCF のみ」に変更できるようにしてみます。
-
最大 4 音ポリフォニック
ポリフォニック (D5) でモノ・ポリを切り替えられるようにします。
性能上の都合により、ポリの場合は VCO2 のみで、なおかつローパスフィルターを使用せずに動作するようにします。
外枠を作る
Arduino を使った工作は、プログラムを書いてブレッドボードでテストを繰り返し、きちんと動作するようになってから外枠を製作するのが一般的な手順だと思います。
でも、ブレッドボードでうまく動作したら満足して終了してしまいがちなので、モチベーションを維持するためにも今回は外枠から作っていきたいと思います。
木箱に穴をあける
セリアの木箱の底は薄っぺらいのでキリやミニ四駆のピンバイスなどで簡単に穴があきますが、反対側のベニヤが剥がれそうになるので少し注意してください。
トグルスイッチ × 4、可変抵抗 × 6 で計 10 個、穴をあけました。
ノブを取り付ける
木箱の穴にスイッチとノブを取り付けていきます。
スイッチはトグルスイッチ、ノブはボリューム用の可変抵抗を使用しましたが、どんなスイッチでも可変抵抗でも構いません。
これはたまたま材料箱の中にあった 10k A カーブの可変抵抗ですが、抵抗値やカーブは適当です。
片方だけ壊れた 2 連ボリュームとか壊れたラジカセから取り外した B カーブなどを 6 個、寄せ集めました。
オクターブやピッチなどを均等に調整したい場合は B カーブのほうが使いやすそうですが、ADSR の調整などは A カーブでも割と気になりません。
トグルスイッチも手元の材料から用意しましたが、タクトスイッチなどでも構いません。
これが 4 個必要なのですが、手元に同じデザインのものが見つからず、それぞれデザインが異なっていますが気にしない方向で。
タクトスイッチとオン・オフの LED とかで実装しても面白そうです。
そして最重要アイテム、ノブです。
アナログシンセサイザーの音質の 8 割はノブの品質で決まります。というのは冗談ですが、高品質なシンセのノブってカッコイイですよね。
サトーパーツのメタルツマミ、アルミ削り出し品 (K-29) を用意しましたが 1 個 400 円もしますので、きっと良い音が出るはずです。
木箱にトグルスイッチと可変抵抗、ノブを取り付けてみます。
中身が空っぽのセリアの 100 円の木箱ですが、ノブなどを取り付けることでどことなく年代物の木材のような重厚感が出てきました。
スタンプを押す
お名前スタンプを使ってトグルスイッチやノブの名前を木箱に書き込みます。
この商品、アルファベットの A や E は 2、3 個付いているのですが、N や T は 1 個しか付いていないので、例えば RESONANCE (N が 2 回) や ATTACK (T が 2 回) は分割してスタンプしなければなりません。
写真のように 1 単語を 2 度に分けてスタンプした箇所はガタガタになっていますが、きちんとしたい場合はお名前スタンプを 2 つ購入しましょう。
MIDI 入力端子を作る
外枠はほぼ完成したので内部の制作に入りますが、プログラムを書くのは面倒くさいので後回しにして電子工作をしていきます。
Arduino を使うので複雑な電子工作は必要ありませんが、MIDI キーボードで操作するためには入力端子が必要です。
パソコンで操作するだけであれば USB で接続した Arduino を MIDI デバイスとして扱うこともできるので、スケッチの変更は必要ですがこの手順は省略できます。
MIDI 信号を受信する方法
MIDI ケーブルのピンアサイン
MIDI ケーブルのピンアサインは図のようになっており、5 つのピンをすべて使う機器もありますが、一般的に使われているのは 2、4、5 ピンのみです。
TX は文字どおりシリアル通信のデータが送信されるピンなので、これを Arduino の RX 端子に接続すれば良さそうに思えます。
試しに TX と GND のみを Arduino に接続すると動作したのですが、実はこれ、直結してはいけません。
MIDI 機器の接続はデバイス間で電気的に絶縁することになっており、絶縁の仕組みは受信側で用意する必要があります。
というのも、キーボードやシーケンサーなどの送信側と Arduino などの受信側が電気的につながっていると片方の機器で問題が発生した場合に、もう片方の機器にも動作不良や破損などの影響を及ぼしてしまう恐れがあるためです。
そこで登場するのがフォトカプラ (TLP552 など) という部品です。
TOSHIBA TLP552(F)(5個セット)
東芝(TOSHIBA)
Amazon で探す
楽天市場で探す
フォトカプラは光で接続されているため、出力側と入力側は電気的に絶縁された状態になります。
光で接続と言っても構造は単純で、光をあてると導通するフォトトランジスタ (またはフォトレジスタ) と LED で構成されており、送信側が HIGH を送信するたびに LED が点灯し、受信側は勝手に導通するので間接的に HIGH を受信できるというわけです。
フォトカプラを探す
そんなフォトカプラですが、もちろん手元にありません。
ちょっと高価なので今回のような遊びのために購入するのは気が引けますし、商品が届くのを待っている間にモチベーションは低下してしまいます。
意気消沈してなんとなく Wikipedia でフォトカプラを調べていたところ、スイッチング電源にも使われているという情報がありました。
そこで、以前にファミコンの AC アダプターを修理したとき使った、壊れた 5V のアダプターをゴミ箱から発掘してきました。
早速分解してみたところ、何やらそれっぽいものが乗っかっています。(青いコンデンサの下側)
参考 ファミコンの AC アダプタ HVC-002 を修理する
817B と記載された部品です。
データシートによると、これは確かにフォトカプラだったのですが、アナログ出力タイプのものでした。
MIDI 信号の伝達にはデジタル出力タイプのものが推奨されており、アナログ出力タイプのものだと遅延やノイズによって正常に通信できないらしいのです。
しかし、せっかっく見つけたフォトカプラですから、モノは試しということで簡単な回路を組んで MIDI キーボードと接続してみたところ、なんと通信できるではありませんか。
ワーイ!と喜んだのもつかの間。
MIDI キーボード (YAMAHA CBX-K1) では操作できたものの、パソコンを使って USB-MIDI インターフェイス (YAMAHA UX16) で接続すると、ウンともスンとも言いません。
どうやらアナログ出力タイプの遅延やノイズが影響しているようです。
カレントミラー回路を追加する
ネットで調べてみたところ、やはり 817 系のフォトカプラでは動作しない例も多いようですが、カレントミラー回路を追加することでデジタル出力タイプの性能に近づけることができるという情報がありました。
ただ、私の環境ではネットで調べた回路そのままだと動作しなかったので、今回使用した部品でうまく動いた回路図を掲載しておきます。
オシロスコープを持っていないので詳細なデータは分からないのですが、感覚としては、アナログ出力タイプのフォトカプラも品質が様々なので、微妙なスペック不足でもまったく通信できなくなったりしそうな気はします。
MIDI 入力用のケーブルを作る
MIDI を受信する仕組みはできましたが、次の問題は MIDI ケーブルを接続する端子です。
MIDI 入力の端子は普通にパーツショップなどに行けば置いてあるのですが、そんなものは購入せずなんとかして用意します。
持ってきたのは壊れた ATX 電源に付いていたペリフェラル端子 (メス) です。
なんとなく MIDI ケーブルのピンの太さにこれがフィットしそうな気がします。
ペリフェラル端子はピンセットや細い棒などで引っかかりの部分を押してやると意外と簡単に外すことができます。
MIDI ケーブルの 5V と TX に接続するので、5V が赤、TX が黄色ということで赤と黄の 2 本を取り外しました。
取り外すときに押し込んだ引っかかりの部分ですが、グイっと内側に押し込んでおけばピンに刺したときに外れにくくなります。
金具の部分は熱収縮チューブやビニールテープを軽く巻き付けて絶縁しておきます。
これで MIDI ケーブルを接続する部分は完成ですが、安全かつ簡単に済ませたい場合は Amazon などでも DIN コネクタを購入することができます。
Arduino に配線する
それでは Arduino に部品を配線していきます。
配線材も普通に買うと意外とお金がかかりますから、100 円ショップにおいてある LAN ケーブルを使います。
LAN ケーブルの中には 8 本の配線がはいっているので、若干、細くて固めなので加工と配線しづらいという問題はありますが、それを我慢すれば断然お得です。
置いたときに少し角度が付くように、木箱の後方には 100 円ショップの木製食器立てから棒切れを拝借してきて木工用ボンドで貼り付けました。
4 隅のゴム足も当然、100 円ショップで購入したクッションゴムです。
可変抵抗 × 6
可変抵抗は Arduino のアナログ入力 A0 から A5 と、Arduino の電源 5V、GND に配線します。
可変抵抗に接続する 5V と GND の位置が逆になると Arduino の analogRead も逆になるので、接続方法で対応するかスケッチで対応する必要があります。
トグルスイッチ × 4
トグルスイッチは Arduino のデジタル入出力 D2 から D5 と、Arduino の電源 5V に配線します。
それだけだとオフのときにも微妙に電圧がかかってオンとオフの間でプルプルしてしまうので、オフのときにプルダウン抵抗 (10k) で GND に落ちるようにします。
ちなみに Arduino 1.0.1 以降ですと pinMode で INPUT_PULLUP を指定して内部のプルアップ抵抗を使うことで部品 (10k) を節約することもできます。(その場合、スケッチで HIGH と LOW を入れ替えます)
MIDI 入力端子
MIDI 入力は先ほど製作したフォトカプラ回路の送信側に MIDI ケーブルの 5V (4 番ピン) と TX (5 番ピン) を、受信側に Arduino の 5V と RX と GND を接続します。
フォトカプラを使用せず、MIDI ケーブルの TX と GND を直接 Arduino の RX と GND に接続しても動作することはすると思いますが、故障や事故の恐れがありますからご注意ください。
フォトカプラが搭載された MIDI インターフェイスシールドも販売されていますので、実装が面倒な場合はそういった商品を使うと安全で簡単です。
音声出力端子
音声は Arduino の D9 ピンから出力されますので、壊れても良いヘッドホンやアンプなどを接続してください。
高周波ノイズ対策
音声出力端子にアンプやスピーカーを接続するだけでも音は出ますが、Mozzi の仕様上、高周波のノイズが発生することがあるようです。
Mozzi の Wiki サイトで高周波ノイズの対策として HIFI モードを使う方法やノッチフィルターを組み込む方法などが紹介されていました。
参考 Output circuits, filters, amplifiers, etc. (* this has content) · sensorium/Mozzi Wiki
しかしながら、どの方法が良いのか分からなかったので実際に回路を作ってアナライザーで確認してみることにしました。
ホワイトノイズ
普通のホワイトノイズ
まず、基準としてパソコン用の音楽制作ソフト「FL Studio」に付属している「3x Osc」というシンセを使って鳴らしたホワイトノイズの波形です。
すべての周波数において同じぐらいの音量のノイズが生成されていることが分かります。
Image-Line Software FL STUDIO 20 Signature EDM向け音楽制作用DAW Mac/Windows対応【国内正規品】
Image Line
Amazon で探す
楽天市場で探す
STANDARD モード
Mozzi の STANDARD モードで鳴らしたホワイトノイズです。
STANDARD モードは 16,384 Hz までしか対応していないのですが、まさにその 16,384 Hz 付近で高周波ノイズが発生しているようです。
STANDARD モード + ローパスフィルター + ノッチフィルター
Mozzi の Wiki サイトで推奨されているローパスフィルターとノッチフィルターを組み合わせる方法を試してみました。
高周波ノイズは残っているものの、ノイズの音量はずいぶん下がりました。
STANDARD_PLUS モード
現時点では、Mozzi は STANDARD_PLUS モードがデフォルトとなっているようです。
ノッチフィルターまで作ったものの、この波形を見る限り、どうやら STANDARD_PLUS モードではすでに高周波ノイズ対策が組み込まれているようです。
STANDARD モードより Arduino のスペックが必要となりますが、単純な音の処理であればデフォルトの STANDARD_PLUS モードを使っておけば問題なさそうです。
HIFI モード
念のため HIFI モードでも確認してみました。
HIFI モードでも高周波ノイズは発生していないようですが、STANDARD_PLUS モードよりもさらに Arduino のスペックが必要なのと、出力の回路が少々面倒なので注意が必要です。
無音のときのノイズ
ホワイトノイズを鳴らしたときのノイズは STANDARD_PLUS モードを使うことで改善されるようですが、無音のときにノイズが発生しているようなので調査してみました。
上の図は STANDARD_PLUS モードで無音のときの出力を、録音側の入力ゲインを上げて収録したものですが、音量を下げてもちょっと気になるレベルでシャーとかシュワワといったノイズが聞こえます。
ローパスフィルター
特に高音域でのノイズが耳障りなので出力にローパスフィルターを組み込んでみました。
カットオフ周波数の計算は以下のサイトを使わせていただきました。
単純なローパスフィルターですが、結果は非常に良好で、高音域における目立ったノイズはほぼ聞こえなくなりました。
そういうわけで、最終的には STANDARD_PLUS モード + ローパスフィルターという組み合わせを採用することにしました。
プログラムを書き込む
Mozzi は 2017 年のプレリリース版 1.0.3rc6 では音が途切れたりすることがあったので、master のほうから最新のソースを使わせていただきました。
Mozzi は最近でも開発が行われているようで、実際に使ってみた感じだと最新のソースのほうが性能が向上しているっぽいです。
MIDI インターフェイスとのやり取りは Arduino MIDI Library を使わせていただきました。
さて、問題のプログラムの部分です。
Arduino を使ったおもちゃのシンセということで Ardumorg という名前を付けてみましたが、もちろん Moog や Korg とは何の関係もありません。
Arduino Uno/*
* Ardumorg.ino
*
* Copyright (c) desktopmusik. All Rights Reserved.
*
* Ardumorg is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
*
*/
#include <MIDI.h>
#include <MozziGuts.h>
#include <Oscil.h>
#include <tables/saw8192_int8.h>
#include <tables/smoothsquare8192_int8.h>
#include <mozzi_midi.h>
#include <ADSR.h>
#include <LowPassFilter.h>
MIDI_CREATE_DEFAULT_INSTANCE();
#define CONTROL_RATE 64
#define NUM_VOICES 4
#define OSC_NUM_CELLS 8192
struct Voice {
Oscil<OSC_NUM_CELLS, AUDIO_RATE> osc1;
Oscil<OSC_NUM_CELLS, AUDIO_RATE> osc2;
ADSR <CONTROL_RATE, AUDIO_RATE> env;
byte note = 0;
};
Voice voices[NUM_VOICES];
ADSR <CONTROL_RATE, AUDIO_RATE> env;
LowPassFilter lpf;
bool wave1 = false;
bool wave2 = false;
bool poly = false;
byte prev = 0;
byte step = 0;
#define LED 13
#define MIDI_CHANNEL 1
void HandleNoteOn(byte channel, byte note, byte velocity) {
if (channel == MIDI_CHANNEL && velocity > 0) {
byte n = 0;
if (!poly) {
if (voices[0].note > 0) {
for (byte i = NUM_VOICES - 1; i > 0; i--) {
voices[i].note = voices[i - 1].note;
}
prev = voices[0].note;
voices[0].note = note;
step = 0;
return;
}
} else {
for (byte i = 0; i < NUM_VOICES; i++) {
if (voices[i].note == 0) {
n = i;
}
}
}
voices[n].env.noteOff();
env.noteOff();
voices[n].note = note;
voices[n].env.noteOn();
env.noteOn();
prev = 0;
step = 0;
digitalWrite(LED, HIGH);
}
}
void HandleNoteOff(byte channel, byte note, byte velocity) {
if (channel == MIDI_CHANNEL) {
if (!poly && voices[0].note == note) {
byte held = 0;
for (byte i = NUM_VOICES - 1; i > 0; i--) {
if (voices[i].note > 0) {
held = i;
}
}
if (held > 0) {
prev = voices[0].note;
voices[0].note = voices[held].note;
voices[held].note = 0;
voices[held].env.noteOff();
step = 0;
} else {
prev = 0;
voices[0].note = 0;
voices[0].env.noteOff();
env.noteOff();
digitalWrite(LED, LOW);
}
} else {
byte a = 0;
for (byte i = 0; i < NUM_VOICES; i++) {
if (voices[i].note == note) {
voices[i].note = 0;
voices[i].env.noteOff();
}
a += voices[i].note;
}
if (a == 0) {
env.noteOff();
digitalWrite(LED, LOW);
}
}
}
}
void setup() {
pinMode(LED, OUTPUT);
MIDI.setHandleNoteOn(HandleNoteOn);
MIDI.setHandleNoteOff(HandleNoteOff);
for (byte i = 0; i < NUM_VOICES; i++) {
voices[i].osc1.setTable(SMOOTHSQUARE8192_DATA);
voices[i].osc2.setTable(SMOOTHSQUARE8192_DATA);
voices[i].osc1.setFreq(440);
voices[i].osc2.setFreq(440);
voices[i].env.setADLevels(255, 255);
voices[i].note = 0;
}
lpf.setCutoffFreq(255);
lpf.setResonance(0);
MIDI.begin(MIDI_CHANNEL_OMNI);
startMozzi(CONTROL_RATE);
}
void updateControl(){
bool w1 = digitalRead(2) == HIGH;
int octave = map(mozziAnalogRead(A0), 0, 1023, -1, 3) * 12;
float pitch = (float)map(mozziAnalogRead(A1), 0, 1023, -1200, 1200) / 100;
bool w2 = digitalRead(3) == HIGH;
int cutoff = map(mozziAnalogRead(A2), 0, 1023, 0, 255);
int resonance = map(mozziAnalogRead(A3), 0, 1023, 0, 255);
bool type = digitalRead(4) == HIGH;
int attack = map(mozziAnalogRead(A4), 0, 1023, 2, 20000);
int decay = map(mozziAnalogRead(A5), 0, 1023, 2, 20000);
poly = digitalRead(5) == HIGH;
if (w1 != wave1) {
if (w1) {
for (byte i = 0; i < NUM_VOICES; i++) {
voices[i].osc1.setTable(SAW8192_DATA);
}
} else {
for (byte i = 0; i < NUM_VOICES; i++) {
voices[i].osc1.setTable(SMOOTHSQUARE8192_DATA);
}
}
wave1 = w1;
}
if (w2 != wave2) {
if (w2) {
for (byte i = 0; i < NUM_VOICES; i++) {
voices[i].osc2.setTable(SAW8192_DATA);
}
} else {
for (byte i = 0; i < NUM_VOICES; i++) {
voices[i].osc2.setTable(SMOOTHSQUARE8192_DATA);
}
}
wave2 = w2;
}
if (poly) {
for (byte i = 0; i < NUM_VOICES; i++) {
if (voices[i].note > 0) {
voices[i].osc2.setFreq(mtof(float(voices[i].note + octave + pitch)));
}
if (type) {
voices[i].env.setADLevels(255, 255);
voices[i].env.setTimes(attack, 0, 65535, decay);
} else {
voices[i].env.setADLevels(255, 128);
voices[i].env.setTimes(attack, decay, 65535, decay);
}
voices[i].env.update();
}
} else {
if (voices[0].note > 0) {
float freq1 = mtof(float(voices[0].note));
float freq2 = mtof(float(voices[0].note + octave + pitch));
if (!type && prev > 0 && step < 10) {
float f1 = mtof(float(prev));
float f2 = mtof(float(prev + octave + pitch));
freq1 = f1 + step * (freq1 - f1) / 10;
freq2 = f2 + step * (freq2 - f2) / 10;
step++;
}
voices[0].osc1.setFreq(freq1);
voices[0].osc2.setFreq(freq2);
}
if (type) {
voices[0].env.setTimes(attack, 0, 65535, decay);
env.setADLevels(cutoff, cutoff);
env.setTimes(attack, 0, 65535, decay);
} else {
voices[0].env.setTimes(30, 0, 65535, 30);
env.setADLevels(cutoff, cutoff / 3);
env.setTimes(attack, decay, 65535, 30);
}
voices[0].env.update();
env.update();
lpf.setResonance(resonance);
}
}
int updateAudio(){
if (poly) {
int out = 0;
for (int i = 0; i < NUM_VOICES; i++) {
out += (voices[i].env.next() * voices[i].osc2.next()) >> 8;
}
return (int)out >> 3;
} else {
lpf.setCutoffFreq(env.next());
return (int)(voices[0].env.next() * lpf.next(voices[0].osc1.next() + voices[0].osc2.next() >> 3)) >> 8;
}
}
void loop() {
MIDI.read();
audioHook();
}
適当に作ったプログラムですから Arduino のスペックによっては動作しないかもしれませんし、使い方によっては問題が発生するかもしれませんがご容赦ください。
あと、Arduino にプログラムを書き込むときは Arduino の RX 端子に MIDI 入力を接続したままだとエラーが発生するようなのでご注意ください。
Ardumorg のソースコードは Mozzi にならって CC BY-NC-SA 4.0 ライセンスにしてみましたが、このソースコードを使用して損害が生じた場合、私は一切の責任は負いません。という免責事項を添えておきます。
最後の仕上げ
無事、プログラムの書き込みが終わったらほぼ完成なのですが、最後にちょっとしたカスタマイズをしてみようと思います。
LED を取り付ける
MIDI 信号を受信できているのかどうか分かりづらかったのと見た目の面白さのため、右下に LED を追加して D13 に接続してノートのオン・オフで切り替わるようにしてみました。
ノブとトグルスイッチを Arduino の A0 ~ A5、D2 ~ D5 に割り当て、LED は Arduino Uno の基板に搭載されている LED と連動するように D13 に割り当てました。
スケッチを書き換えればノートのオン・オフ以外の用途にも使えそうなので、木箱の文字はそのまま「LED」としました。
裏蓋を付ける
そのままでは裏面が丸見えで恥ずかしいので、セリアで購入した布地のマットのようなものを切り取って裏蓋として取り付けました。
裏蓋は柔らかい材質なので電源は AC アダプターや USB ケーブルを直接 Arduino に接続して、隙間から引き出すかたちにしました。
音声出力端子や DC ジャックは、木箱の背面に穴をあけて取り付けたかったのですが、木箱が厚すぎて無理だったので、写真の右上あたりの場所にホットボンドで固定して黒っぽいテープを貼り付けてごまかしました。
完成
以上で完成です。
音声出力端子に壊れても良いアンプなどを接続し、MIDI 入力用の 2 本の線に MIDI キーボードやシーケンサーを接続します。
あとは、9V の AC アダプターか USB ケーブルを接続してやれば動くはずですが、手順どおりに作ったけど音がでない!というかたもいらっしゃると思います。
そんなときは MIDI 入力やフィルター回路を取り外して、単純な回路に変更してから一つづつ試してみると解決の糸口が見つかるかもしれません。
遊んでみる
せっかく作ったので遊んでみましょう。実際に音を出して遊んでみた動画を作成してみたので、ご興味があるかたは見てみてくださいね。
無駄にオープニングのロゴなんかも作っちゃって気合が入っていますが、なげやりの動画の再生数は平均 50 ぐらいで、しかもほぼ自分が再生しているだけなので何の意味もありません。
結論
今回は室内で遊ぶというテーマのもと、押し入れのダンボール箱に入っているジャンク品の残骸やゴミなどを再利用してみましたが、実際に音が出たときはちょっと感動しました。
コアの部分は Arduino Uno を使いましたが、それでも自分で作ったオブジェクトから音が出るというのは嬉しいものだなぁと思いました。
どちらかというと「なんで音が出ないんですか!」と苦しんでいる時間帯のほうが多かったような気もしますが…。
それではみなさん、アレに負けないようくれぐれもご健康にはお気を付けいただき、何か元気が出ることをやって室内で楽しく過ごしましょう!