Haruo Yamashita since 9,Feb,2015
外装は木製で、右にアクリル製の透明アームが付いたボリューム、左には二つのスイッチとスピーカが表に出ています。 中は、マイコン(AVR328P)を単4電池3本で動かせています。
上は基本回路図で、セラロックとイヤホン/外部出力部は省略しています。 アームのついたボリュームは、その電圧をマイコンのADCで読み込み、発音用のNoteKeyとビブラート用のVibKeyは、入力につなげています。 出力は、二つのLEDとスピーカですが、工夫したのはスピーカを低抵抗(33Ω)でマイコンのPWM出力で直接ドライブしていることです。
・アンプ無し ふたつのPWMポートを差動で使って、BTLフィルタレスD級駆動を実現
・音色には本物のテルミンに近い波形を搭載。
・Note Keyを押すだけで音が出る。
→ ポルタメントを生かした演奏が可能で、音を切ることもできる。
・Note Keyをタップするとピッチホールドが働く。
→ ポルタメントなしの離散音階による演奏も可能。
・Note Keyをタップすると自動ピッチクオンタイズが働く。
→ アームの位置が不正確でも正確な音階が出せる。
・Vib Keyによりアームを揺すらなくてもビブラートが掛けられる。
・Vib Keyを押し続けると、テルミン風の自然なビブラートが自動で掛かる。
・ソフトでアンチログを構成しているので、トーンサークルは等間隔
・ボリュームのリニアリティをキャリブレーションしているので、トーンサークルに合わせるだけで正確な音階が出る。
・トーンサークル、3オクターブから4.5,6、7.5オクターブ版が選べる。
・リバーブ(エコー)効果が掛けられる。(強/弱 2段階)
・正弦波(sin ) 高調波を含まないソフトな音色
・鋸歯状波(saw tooth) 奇偶すべての高調波を豊富に含む弦楽系の音色
・方形波(square) 奇数次高調波のみを含む、木管系の音色
・ソロ(solo ) アンサンブル無しの単音
→ シンプルな表現に適します
・ユニゾン(unison ) 少しディチューンした同ピッチの3音アンサンブル
→ 高調波の多い波形ではコーラス効果により分厚い音に変わります。
・パワーコード(power code ) 5度音程(ドとソのような)の2音の和音
→ メジャーにもマイナーにも使えるロックの定番コード
・オルガン(organ ) オクターブ上下の同ピッチの音を控えめに合成
→ 高調波の少ない正弦波やテルミン形で用いるとあのハモンドトーンの雰囲気が得られます。
・強弱2段階は変わらないが、アンサンブル効果でソロてユニゾンとだけ併用できます。 理由は後で説明します。
テルミンは、正確な音高を出すのが難しい反面、連続音階を自由に操れるためポルタメントとビブラートの表現力が高く、人が歌うのに最も近い微妙な表現ができる稀有な楽器です。
日本は、テルミンやマトリョミン(マトリョシカ型テルミンで、独奏楽器テルミンと異なり聴診器を使って自分の音をモニタする合奏楽器)がテルミン教室として習い事として成り立っているため、世界一多くの演奏者がいます。
それでも大変演奏が難しい楽器であることは間違いありません。特に体を動かすことができない点がつらいようです。
有名なオンドマルトーノはテルミンに鍵盤のようなものを付けより楽器らしくしたもので、少しでも演奏を容易にしようという試みです。 今では博物館でしか見ることができない楽器で私も触ったことはありません。
私はアナログ・シンセの魅力の一つが、鍵盤を使った離散音階の楽器であるのにかかわらずポルタメントがかけられる点にあると思っています。 それと対極にあるのが、ポルタメントをベースとするテルミンやオンドマルトーノではないでしょうか。
以前から、ボリュームにアーム付け鍵盤状の絵を書いたトーンサークルに合わせて演奏すれば、超シンプルで演奏も容易な電子楽器ができるんじゃないかと思っていました。 イメージとしては555発信器の時定数の抵抗をボリュームに変えたような感じですが、ガジェットとしては簡単でおもしろそうですが、素晴らしい楽器になるとは思えず作って見るには至りませんでした。
仕事の関係で子供にものづくりの楽しさを教える教材を考えることになり、とりあえずこのアイデアを試作してみました。(写真)
C-MOS555特有のデューティ50%の発振回路を使うと、発振周波数が抵抗値の逆数に比例するため、うまい具合にトーンサークルの間隔がギターのフレット間隔と相似形になります。 もちろんピアノのように等間隔の方がより良いが、周波数に比例するよりずっとまし!! で、それなりに良い感じです。 しかし実際やってみると安物のボリューム(もちろんB型です)のリニアリティはメタメタで、一品一品周波数を測定しながら目盛を打たねばならず、トーンサークルを前もって作っておくことはできないことがわかり断念していました。
その後、マイコンを使ってボリュームの抵抗値変化をキャリブレーションしたら、あらかじめ用意したトーンサークルが使えることに気づき、マイコン版を開発することにしました。 小学生でも作れるものにしたかったので、できるだけ部品点数の少ないものを模索し、現在の形になりました。
マイコンそのものは昔から(昔は)色々触っていましたが、AVRは今回が初めてなので、取っつきやすさからArduinoで開発を始めました。
最初は子供向けの教材からスタートしたので、そこそこの音が出れば良いと思っていたのですが、一度音が出だすと、アナログと異なりデジタル特有の音の汚さが気になります。(アナログでの揺らぎ歪みは楽器の味になりますが、デジタル的な濁りは只々汚いのみ)
原因を説明するため、まずアームテルミンの発音構成を説明します。 AVRにはATmega328を用いArduino UNOと同じ16MHzのクロック、PWMは8bitで最高速(16MHz/256 = 62.5KHz -> 16μsec)で動作させます。 また波形の出力は、32μsec周期(31.25KHz)のタイマー割り込み処理で行っています。
実はこのPWMや割り込みの周期には何の問題く、音が濁る原因はDDS で波形テーブルの引き方にあります。
波形テーブルは振幅が8bit精度で256エントリ、テーブルを引くポインタは整数部が8bitで小数部も8bitですが、これについてもほぼ問題ないと思います。
問題はふたつあって、
①テーブルを間引いて引いている。
→ 間引き間隔が広くなる、高音部では折り返しによる差音(ラジオのビートのような例のアレ)が発生する。
高調波の多い波形を使うと、高調波それぞれに対して差音が発生するため聞くに堪えない。 低音部では目立たない。
②テーブルをポインタの整数部で引いている。
→ 波形の時間軸がポインタの整数部に丸められるため、ジッタがでて音が揺らぎ濁る。
(平均的な発音周波数そのものはポインタさえ小数部も含めて加算しておれば大丈夫です。) 高音部は目立たない。
原因は、①②の処理のやり方にあります。
① 間引くためには、間引く周波数の半分以下の周波数に波形テーブルを帯域制限しなければならないのですが、この帯域制限フィルタはタイマー割り込みの中で処理するのはAVRの処理速度では困難です。 元々帯域制限されている正弦波ではこの差音は発生しませんので、正弦波しか使わないのなら気にしなくてかまいません。
② ポインタの小数部による波形の位置が反映されないのが原因なので、波形の小数部の位置を補間するか、整数部に対応するテーブルのエントリを大きくしなければなりません。 ①より軽いとはいえ、割り込みでできることは限りがあり困難でした。 (3音出す方を優先したからでもありますが)
①については、波形テーブルを帯域制限した波形テーブルを事前に複数用意するしかないと考え実験しましたが、オクターブ毎に切り替えたとしても、つなぎ目で波形の切り替わりによるノイズが気になりました。 連続音階の楽器なのでちょうど切り替わるところでとどまると切り替えノイズが出続けるためNGでした。 半オクターブ毎に切り替えると大分ましですが、テーブル数が増えすぎます。(ひとつのテーブルサイズを小さくできたら良いのですが、②の点でそれも無理)
現在採っているのは、半オクターブで切り替えるLUTを3つだけ(現在演奏している音域分とその上下の音域分)用意する方式で、現在演奏している音域に応じて裏で帯域制限を行いLUTを作り直しています。 また、アップ方向への切り替えとダウン方向への切り替えが連続しないように、切り替え点にヒステリシスを設けています。
②については、テーブルサイズを小さくしなくて済んだため、良しとしています。
このような検討をしていると、音についてはいかにアナログ処理に分があるかを実感します。
★ここで紹介した発音のアルゴリズムは、新バージョンではかなり変更しています。(そのうち追加します)
ダイナミックスピーカを駆動するには、通常PWM出力にLPFを掛けてアナログ信号に変換し、低電圧動作のアンプで駆動するのが一般的です。 下手にトランジスタのエミッタホロワを用いた電流ブーストを用いると、低電圧では歪みが増えてしまいます。
今回、AVRの出力ピンが意外とドライブ能力があることを知り、無理を覚悟でPWM信号で直接スピーカを駆動してみたところ、歪みが少なく(PWMの方が振幅歪みは起こりにくい)きれいな音がでたので、この方向で検討しました。
PWMに限らず単電源のオーディオ出力は、DC成分のオフセットが乗っているため、DCカットのために大きなコンデンサが必要です。これについては、お決まりのBTL接続(逆相の2つの出力間にスピーカを接ぐと同相のDC成分はキャンセルされる)により解決できます。 実装としては、PWM出力(Ach)に加えて反転出力に設定した2本目のPWM出力(Bch)を使い、これらの間にスピーカを接続すると(A-B)の電流が流れることになります。(下図の上側の波形を参照)
さらに、今回キャリアが62.5KHzと高いのでLCフィルタも無しにしても音質上の課題も無いことも分かりました。ここまでは良かったのですが、通常のオーディオアンプのBTL接続と違ってPWMのBTL接続(A-B)では、無音状態でもデューティ50%のPWMのキャリア電流がフルパワーでスピーカに流れ、短時間で電池が空になりました。(このとき初めて、LCフィルタは高周波のキャリア電流を減らす目的があることに気づきました)
重張るLCフィルタを入れるくらいならアナログアンプを使おうかとも思いましたが、キャリア電流を流さない方法に気づきました。
上記逆相のPWM信号のペアは、DC成分は同相、オーディオ信号とキャリアは逆相になっているので、キャリアの電流が常に流れます。 今回使用したPWM信号のペアは、DC成分の同相、オーディオ信号の逆相は変わりませんが、キャリアを同相にしたことが違います。 こうすることによりキャリア電流が全く流れ無くなったので、LCフィルタは不要になりました。 (できてからこんな素晴らしい技術が世の中に無いわけは無いと思い調べてみたところやはりありました。MAXIM社からフィルタレスD級アンプのICが売られていました。アナログコンパレータでこれを実現するのは難しそうですが、マイコンではタイマーペリフェラルの設定だけでできてしまいます。)
結果的にはへたに低電圧用アンプを使うよりも歪みの少ない良い音が得られたと思います。
8Ωのスピーカでは、数10Ωの抵抗を直列に入れる必要がありますが、32Ωのスピーカが入手できれば本当に直結でき、ロス無く大きな音が出せます。
アームテルミンをマイコンを使う方式に軌道修正した最大要因は、ボリュームのリニアリティーのばらつきが大きく、これをキャリブレーションして線形化し、あらかじめ用意した均等なトーンサークルを使えるようにするためでした。
またキャリブレーションにより、トーンサークルが示す半音の範囲が実際の音高と正確に一致させることができますので、初心者でもトーンサークルにアームをちゃんと合わせばちゃんとした音階が出ることが期待できます。
発音部は、C2(音階の国際名称でちなみに88鍵ピアノの最低音のドがC1)からピアノと同程度の発音範囲があります。 トーンサークルの扇方の角度は270度とし、上半分が切りの良いオクターブ数で割り切れるものを採用しました。最も音域の狭いものが3オクターブ版(子供の教育用)、次が4.5オクターブ版(演奏しやすい)、6オクターブ版(なんとか演奏できる)、7.5オクターブ版(効果音用)です。7.5オクターブといえば88鍵のピアノ相当です。
なぜ、こんなトーンサークルに多くの種類にどうして対応できるのか不思議に思われるでしょうが、ここで行うキャリブレーションというのは、単にボリュームの抵抗値と回転角の関係を直線化するというよりは、トーンサークルのC(ド)の位置と抵抗値の関係を覚え込ませて滑らかに補間する働きをします。 例えば、4.5オクターブ版トーンサークルには、5個のCが有りますので、この5つの位置を教えることになります。
実際にはさらに自由な設定ができるように、6つのCを教えます。 最初が、C2(65.4Hz),次がC3(130.8Hz)で6つめがC7(2093Hz)になります。 ただ、4.5オクターブ版にはそんな広い音域は不要なので、その中で使いたい4.5オクターブが指定できます。 私は、C3から使うのが好きなので、最初のC2はトーンサークルの左方向の欄外に設定する(捨てることになる)。次のC3から鍵盤上のCの位置に設定していきます。この辺りの様子は動画で確認できます。 動画では4.5オクタープで調律していますが、どのトーンサークルにも適用できます。
アームテルミンは連続音階なので、設定するときはトーンサークルのCの鍵盤の範囲の真ん中にしてください。
子供の教育用の3オクターブ・トーンサークルは、Cの場所にキャリブレーションで合わせる位置に丸印を点けています。
AVRのADCは10bit で普通は十分なのですが、アームテルミンのアーム用ADCとしては不足気味です。(特に広いオクターブをカバーしようとすると、12bitが欲しくなります)
この精度不足がどこに影響するかというと、
①ポルタメントがアナログ的な連続変化に聞こえず、安っぽいパラパラ感がでる。
②トーンサークルの真ん中にアームを合わせても正確な音高にならない。
の2点です。
ADCの精度が10bit なのは現実なので、正味の12bit 精度に拡張するのは不可能ですが、適用条件を絞れば精度拡大が可能です。(画像処理で使われる超解像や階調拡大などで)
①はアームを動かしているときだけ気になる症状であり、②はアームを静止しているときだけ分かる症状であることに着目して、次のアルゴリズムを組み込みました。
<①の対策>
ポルタメント中は、滑らかさは重要ですが逆に少々のピッチ変化のずれは分からないので、小数点以下に2bit 拡張したIIRローパスフィルタを用いて、アームの変化については12bit 精度の滑らかな変化を実現しました。アナログテルミンに近い滑らかなポルタメントが得られるようになりました。
<②の対策>
アームを静止しているときは正確な音階(ピッチ)が得たいものと判断し、小数点以下に2bit 拡張した上で自動ピッチクオンタイズをかけるようにしました。 具体的には、半音を1とすると、N-0.5 ~ N+0.5 の範囲にあれば、N に引き込みます。 これにより、12bit 精度で正しい音高が得られます。
ただ演奏表現上、故意にずらしたいことも有るので、ピッチクオンタイズの引き込み具合は時間とともに減少するようにしました。 演奏者が音高を耳で聞いて所望のピッチに調整することのできない音の出始めは、ピッチクオンタイズによって正確なピッチに引き込み、フィードバックができる時間経過とともに演奏者のアーム位置を反映するようにしています。
このアルゴリズムにより、スマホのタップのようにキーをたたくように演奏すれば、アームの位置の少々の誤差にかかわらず、鍵盤楽器のような正確な平均律スケールが演奏可能になりました。
ATmega328 はRAMが2KBしか無く、波形テーブルと変数・スタックなどであまり空きはありません。 その中でリバーブを実現しています。(このアイデアは以前から持っていたので、今回初めて実装しました)
かなり派手なエコーを掛けるために、最大0.64秒のディレイを用いています。
普通のやり方なら、サンプリングレート今回は、32μsecなので0.64sec/32μsec = 20(KB)のメモリが必要になります。さらにこの処理をタイマー割込の中でしないといけないので処理速度的にも難しくなりますね。
今回採用したアイデアは、3音を発音できることを活かしたものです。 実は、発音した波形をサウンドとして遅延しているのでは無く、発音タイミングを遅延して同じ波形の音を別オシレータで発音しているのです。 ソロの場合は、1音を主発音、残り2音を遅延させて発音しており、ユニゾンの場合は、2音を主発音、1音を遅延発音させています。
この方式で遅延させるのは、ピッチデータだけではなくエンベロープデータも遅延させることが必要になりますが、その変わりサンプリングレートを下げられるのでRAM消費は少なくなります。