~適当な工作情報を投げるブログ

ゲーム、音楽なども作ってるよ~



テスラコイルの「MIDIインタラプタ」 について

 こんにちは、かもめ(Hkat)です。

今回、テスラコイルで音楽を鳴らすのに使われるMIDI インタラプタ」について思ったことをまとめようと思いまして。

 

というのも、私自身、国内テスラコイルのメイカーさん達とは結構疎縁でして、完全我流でやってきたために認識の齟齬があったりするようなんですね。

まぁ自分なりにどんな感じで作ってきたかというのをまとめて、ここに置いておこう思った次第です。

 

テスラコイルが音楽を奏でられる原理

 まずは、テスラコイルが音楽(音階)を奏でられる原理を説明します。

テスラコイルは、実は連続した放電を出せる時間が非常に短い装置です。

(長い時間連続放電を出せるテスラコイルも作れはするけど、強力なパワーデバイスが必要だったり…^^;)

大体、連続で出せる放電の時間は 数us(マイクロ秒)~数ms(ミリ秒) 程度です。

この非常に短い放電を高速で繰り返すことで、「音」として認識できるようになるのです。

1回数usの「パチッ」という放電を1秒間に440回繰り返せば ラ (A4) の音に、1047回繰り返せば ド (C6) の音に聞こえるというワケです。

 

f:id:Kamomesan:20201006154529p:plain

テスラコイルの放電は連続に見えて連続ではない

 

MIDI とはなにか

 

 では、テスラコイルを使って音楽を鳴らそうと思ったとき、鍵盤(キーボード)やパソコンを接続したくなります。

マイコンに音楽のデータを書いておいて鳴らすのもアリですが、それだと音楽を変える度にプログラムを書き換えないといけなくなりますね…。

ここで登場するのがMIDI(Musical Instrument Digital Interface)  です。

字のごとく、楽器を制御するデジタル信号の規格になりまして、31.25kbps の非同期シリアル通信です。

イメージ的には、「ドの音をならせ」「ドの音を止めろ」「音色を変えろ」「リバーブをこれくらいかけろ」などという命令の信号です。

(専門的に言うとNote ON, Note OFF, ProgramChange, SysExなど)

では、このMIDIを使うと何が良いのか。

 

f:id:Kamomesan:20201006161036p:plain

MIDIは電子楽器に特化した通信規格

 

 まず、世に広く浸透している規格なので、MIDI規格に準じているデバイスならばどのメーカーのキーボードやソフト(DAWなど)を使っても互換があるという点です。

YAMAHAのキーボードも、Rolandのキーボードも、EnsoniqのキーボードもMIDI端子が生えているキーボードならすべて同じ信号が出ます。

キーボードやパソコンを入れ替えても全く同じ動作が期待できるということです。

 

 次に、回路が簡単にできること。

MIDI自体は単純な非同期シリアル通信ですから、送信(TX)と受信(RX)の2本とGND線の計3本があれば通信が可能です。

受信のみ必要なデバイスなら、送信(TX)線を省くこともできます。

 

f:id:Kamomesan:20201006161956p:plain

MIDIはとても簡易な規格

 

特殊なシリアル通信ではないため、ArduinoPICマイコン, STMマイコンなどほぼ全てのマイコンで対応可能です。

大抵シリアル通信に必要なFIFOやデキュー操作はマイコンがハードで勝手にやってくれますので、コード自体は1~5行程度でMIDI信号の送受信ができます。

 

MIDI インタラプタとは

 キーボードやパソコンから出力されるMIDI信号は単なる命令を示すシリアル信号ですから、これを直接テスラコイルに接続してもちゃんと音はなりません。

MIDI信号を受信し、1回「パチッ」の放電のタイミング信号を作ってやるのが「MIDIインタラプタ」になります。

たとえば「ラ(A4)の音をならせ」というMIDI信号を受信したら440Hzのパルスを生成し、「ラ(A4)の音をとめろ」というMIDI信号を受信したらパルスの出力を止める、という動作をします。

和音を鳴らしたければ、「ラ(A4)の音をならせ」「ド(C6)の音をならせ」という命令を受け取って 440Hzのパルスと1047回のパルスを同時に出力することになります。

 

f:id:Kamomesan:20201006162926p:plain

MIDIインタラプタとは

簡単に言えば、MIDIインタラプタとは「パルスのみ対応のMIDI音源です。

 

 テスラコイルでは、一回「パチッ」の放電の時間を調整することもできます。

この放電時間を、テスラ界隈の人たちはよく「ON時間」と表現します。

MIDIインタラプタの作り方によっては、このON時間を調節するボリュームがついていて、手元でON時間の調整をしたりします。

ON時間によって放電音も変わってくるので、好みにより調整しますが、あまりON時間を長くしすぎるとテスラコイルが耐えられず壊れてしまいます。

 

f:id:Kamomesan:20201006163542p:plain

インタラプタのON時間

 

そのため、MIDIインタラプタが暴走したりして「ずっとON信号」が出たりしたら危険なので、テスラコイル側の回路で「ON時間制限回路」という保護回路をつけたりします。

このON時間制限回路は、一定時間以上のパルスが入力されたら強制的にテスラコイルの動作をストップさせる回路です。

単純なCR回路で構成する人もいれば、単安定マルチバイブレータ回路を入れる人もいます。

 

MIDIインタラプタと通信

 各装置をつなぐケーブルは [PC-MIDIインタラプタ] 間と [MIDIインタラプタ-テスラコイル] 間にあります。

ここで注意したいのは、テスラコイルがばらまく強烈な電磁ノイズ」です。

テスラコイルは放電を出すという性質上、非常に強力な高周波電界を周囲に生成します。

そのため、周囲のパソコンなどの電子機器はたびたび暴走し、フリーズしたり勝手に動いたりします。

特にパソコンにテスラコイルを接続してDAWから音楽を鳴らす場合は、DAWを動かすPCや、USB-MIDI変換器, MIDIインタラプタが電磁ノイズに曝されがちです。

 

 電磁ノイズへの対策として一番簡単なのは、テスラコイルからPCなどの機器を遠ざけることです。

ケーブルを十分に伸ばすことができれば十分有効な策です。

また、テスラコイル自体を金属製のかご(ファラデーケージ)で囲ってしまうことです。

電磁ノイズをそもそも外に出さないようにするので、これも効果が期待できます。

 

 私がよくとる手段としては、「各通信を光で行う」ことです。

PCとMIDIインタラプタの通信には、USB-MIDI変換器やUSBケーブルなど、電気的なケーブルが、さらにMIDIインタラプタとテスラコイルの通信にはBNCコネクタの同軸ケーブルがよく使用されます。

この構成では、各装置がテスラコイルと電気的に接続されているため、どうしても電磁ノイズの影響を受けやすくなります。

そこで、光ファイバーを使用して電気的に絶縁して通信すれば、ケーブルに乗る電気ノイズ、電磁ノイズの影響もさけられるというワケです。

光ファイバーは電気ケーブルよりも信号減衰という観点から引き伸ばしやすいので、テスラコイルと各装置の距離もとりやすくなります。

 

f:id:Kamomesan:20201006164305p:plain

光ケーブルによる電気的絶縁

 

 また、別の手段として特に電磁ノイズの影響を受けやすい(経験上)「USB-MIDI変換器」を取り除くという試みもしました。

MIDIインタラプタ自体にUSB-MIDI変換器の機能を持たせようということになります。

これは個人的にかなり成功した試みだと思っていまして、以前当ブログにも掲載したMIDIインタラプタがそれにあたります。

最近のマイコンにはUSB Device Classをサポートする物が多いので、マイコンとPCをUSBケーブルで接続するとMIDIバイスのように見える仕掛けというものを比較的簡単に作れるようになりました。(とはいっても、レジスタ直叩きとかは要るけどねー)

MIDIインタラプタをUSBケーブルでPCに接続すると、MIDIインタラプタがDAW上で「MIDI音源モジュール」として認識され、USB-MIDI変換器が不要になります。

USBハブを用いれば1台のPCに大量に接続することも可能です。

 

f:id:Kamomesan:20201006164713p:plain

USB Deviceを実装したインタラプタの接続

 

 しかし、このトポロジーテスラコイル界隈ではあまり流行らないのかなぁとも思いました。

USB-MIDI変換器を用いる場合よりも多くのMCU(マイコン)のハードウェアに対する知識やUSB規格の知識、コーディングスキルが要求されるため、「とりあえずテスラコイルが鳴れば良い」という方にはハードルが高すぎるのだと感じました。

 

 最近は、多少ノイズは我慢してUSB-MIDI変換器を使い、かつMIDIインタラプタ側にMIDIスルー用のコネクタを乗っけてやれば、一つのMIDIバイス(変換器)で複数チャンネルを割り当てられるのでこれでも良いかぁ、とも思ってきています^^;

 

MIDIインタラプタの出力信号

 いままで完全我流でやってきた身として、「そういえば界隈の方たちのテスラコイルとの互換を考えたことは無いなぁ…」と最近思ったのです。

どうやら、一般的に界隈の方のインタラプタ信号は以下のようになっているようです。

 

f:id:Kamomesan:20201006165252p:plain

一般的なインタラプタの出力信号

 

放電タイミングでHIGHになるようなパルステスラコイルに送っているだけです。

これだと確かに回路は簡易になりますし、原理的にもわかりやすいと思います。

最近、こっちの一般方式のインタラプタも作ってみようかと思っています。

 

 では、今まで私が作ったインタラプタの出力信号がどうなっているのかというと、以下のようになっています。

f:id:Kamomesan:20201006165619p:plain

Hkatインタラプタの出力信号

 

放電タイミングでHIGHとLOWが切り替わる信号テスラコイルに送っています。

ではなぜこんな信号にしたのか、という話です。

個人的にMIDIインタラプタに求めているのは「安価なマイコンで多チャンネル、多重奏」を実現することです。

一般方式の信号の場合、どうしても「パルスをONにする操作」と「パルスをOFFにする操作」が必要になります。

NE555などで単安定マルチバイブレータを組んでON時間調整をするという場合でも、そのトリガパルスの生成にはそのような操作は必要です。

コード上では見かけONにする行とOFFにする行が隣り合っていたとしても、バイナリではその間に時間のかかる処理が入ってしまったりしますし、パルスON中にMIDI信号が入力されて割り込みが発生するとON時間も狂います。

割り込みマスクを生成するとしても、結局時間がかかってしまいます。

このような理由により、1パルスあたり生成するのに必要なクロックとプログラムメモリ量が多く、どうしても目的を達成するのが難しいのです。

 

我流の方式では、「GPIOの状態をトグルする操作」だけで済むため、レジスタ操作により1行程度で記述でき、所要クロックも非常に少ないです。

この工夫により、安価なArduino Leonardo (ATmega32U4搭載)でも 「8チャンネル 6和音」などのスペックが叩き出せるわけです。

 

 ただし、この方式では多少回路の工夫が必要です。

我流信号を微分回路で微分し、正負反転回路で負電圧を正にもっていけば、一般方式の信号とおなじになります。

 

f:id:Kamomesan:20201006170126p:plain

Hkatインタラプタ信号の変換

 

ON時間の調整は操作ミスによる故障回避のためテスラコイル側の半固定抵抗でやっているので、インタラプタ、テスラコイル共に追加する部品点数も一般方式と比べてさほど多くありません。

 

まとめ

 結論、個人的にMIDIインタラプタについていろいろ工夫はしてきたけど、結局のところ皆が求めているのは「安定」だということです。

多分、今後も誰かがここらへんの新システムを作っても、結局従来の方式が最強なのかもしれません。

 

では!!