音が出る喜び。ちゃぶ台音楽 其の三

ちゃぶ台の相棒、Ganさん。千石空房の前にて

 2008年の夏に始まったイベント。。若干のブランクをおいた2回目には参加できなかったのだけど、3回目には参加させていただいた。都合2回目。
仮面ライダーのコスプレで、変身ベルトから出る効果音や、サンプラーを使って小気味の良いラップを聞かせてもらったり、東京と大阪とでは100Vの音程が違うとか、もう、すごい事になっている。ここでは、音が出る/音を出すことがそれだけで喜びなのだ。特に、米本さんの公開実験(パフォーマンス)のビデオ公開されている。必見かもしれない。
うんうん。僕もそう。ちゃぶ台音楽の大きな楽しみはここだろうと思う。
一方、「音なんか、出て当たりめーなんだよ、出るように作ってんだから...」音が出たーから、その音を、手作り電子楽器の音を、「音楽」へ昇華させていくのが、僕と相棒のGanさんがちゃぶ台で狙っているポイント。多分に実験的な要素も多くて、ちゃぶ台でなきゃできない事という自覚はある事は白状しておくけどね。
パフォーマンスが終わったあと、集まった皆と、手作り電子楽器を肴に雑談するのが楽しい。そんなイベントに出演してきた

弁慶氏のノイズジェネレーター

僕らの出番の後、ちゃぶ台の上に、木でできた箱を並べる男が居た。弁慶さんだ。一つづつ出してはちゃぶ台の上に並べてケーブルで接続していく、それだけで楽しそうだ。いろいろなメカを紹介しながら、数曲演奏されたのだけど、其の中にノイズマシンがあった。ファミコンなどに内蔵されているPSG音源に附属のノイズ部分だけを取り出したようなものらしい。出力は、デジタルのオン/オフの2値なのだけど、そのオンオフのタイミングがランダムになるので、出てくる音には基音はおろか、倍音成分もめちゃくちゃになり、音程を感じることのできない音が出る。要するに、ノイズ。ジャーっという音。
ちなみに、ランダムトーンというメカもご披露されたのだけど、これも、あまりに音程の変化のタイミングが早くなってしまうと、音程が消えてノイズに聞こえた。理屈としては理解してたはずなんだけど、実際に音を聞いたのは初めてだったかもしれない、貴重な経験だった。
話を戻すと、ランダムにオンオフを繰り返すことでジャーっというノイズを発生させるのだけど、このノイズの出力に、Dフリップ-フロップというロジック素子に通し、これを別クロックで駆動することで、オリジナルのノイズを2値でサンプルアンドホールドする。このクロックのスピードを変える事でノイズの音程(?)を変化させるというメカだった。
話を伺ううちに、これは、ソフトウエアだけで比較的に実現できそうだと直感した。

純アナログでノイズを作る

アナログ版ノイズジェネレーター
アナログ版ノイズジェネレーター
右が、アナログ的にノイズを発生させる回路。トランジスタに注目。コレクタがどこにもつながって無いし、大体、NPNトランジスタのエミッタが電源方向に...。普通に動かない回路のように見えるけど、これは、トランジスタをわざと逆接することでノイズを発生させ、そのノイズを凶悪な増幅率で増幅してノイズとする回路。ツエナーダイオードも逆に接続するとノイズが出るらしい。
この用途に1度でも使ったトランジスタは、普通には動かなくなる。ようするに壊れる。しかも、1本づつノイズの出る量が違う。100倍にすれば、十分な場合もあれば1000倍にしても、まだ足りないことすらある。どんだけ出てくるか、わから無いノイズをノイズとして使えるように、増幅が必要。
たとえオペアンプを使ったとしても、凶悪な増幅率は、F特が悪くなるし、発振とか、ろくなことは無いので、そんなに上げないようにする。1000倍程度が限度。それ以上の増幅率が必要なら、100倍を2段数を重ねて1万倍にするほうがトラブルに悩まされなくて済む。
やってみなきゃわからないし、やったが最後、そのトランジスタはそれ以外には使えなくなってしまう回路....ちと苦手なのだ。一寸のトランジスタにも、5分のタマシーなのだ。(ケチなんじゃないぞ!)その筋では、ノイズを発生させるために、最適と評価されてるトランジスタもあるらしい。なんか、本来の使い方じゃないところで評価されるってのもどーなんだろね。
このあたりに、日本のサラリーマンの悲哀にも似た何かを感じてしまうセンスこそが、ロックなのだよ。ロックの原動力なのだよ。音楽のタマシーなのだよ。(ホントかよ!それって、どっちかっちゅーと演歌だろうとか言う突っ込みは激しく却下!)

デジタルで作るノイズ

digital版ノイズジェネレーター
digital版ノイズジェネレーター
一方、デジタルで作るノイズは、クリーン。5Vppが約束されてる。欠点は、ランダムじゃないこと。人の耳で聞く分にはノイズ以外のものにはきこえないんだけど、実は本当の意味のノイズとは違う物が出ている。デジタルと言うかマイコンは、言うまでもなく、計算機。残念ながら、偶然とか、なんとなくとかを計算で出すことはできない。あらかじめ仕込んではあるんだけど、どうにも予想しづらい順番で数列(データ)が、出ているのだ。そういう数列を比較的ローコストで実現するアルゴリズムとして「擬似雑音系列」(pseudonoise sequence)というものがある。シフトレジスタに、タップを付けて、出力とそのタップのデータの排他的論理和をそのタップの部分に挟み込むという物。いや、心配しなくてもいい。僕もきちんと理屈が分かっているわけではない。ないが、自分自身を書き換えながらループするシカケで、同じパターンに戻るのに時間を稼ぐには、そのシフトレジスタのビット数を増やせばいいらしいぐらいは分かる。
利用できる形で供給された情報はおいしく使わせていただく。其の分こういう形でフィードバックすればいいのかなと。
どちらにせよ、さっきと同じパターンが必ず出てくる、完全なランダムではないのだけど、それが現れるまでにそれなりに時間がかかるので、人の耳にはその周期性を聞き取ることができず、結果としてノイズに聞こえるという仕掛けだ。
アナログシンセの工作に積極的にデジタル要素を挟み込むプロジェクトをいくつも進めてらっしゃるChuckさん(メインのブログは、こちら)が、最初にこのアルゴリズムをAVRに実装された。 当時はAVRの8pinのマイコンがクロックを内蔵していなかったので、ソレをもっていたPICに移植という経緯だ。さらに、後日、RJBさんが、僕のpARMを追試くださったときに、プラスアルファの機能として、ファームウエアの中に、同様のアルゴリズムをC言語で実装された、ノイズジェネレーターが搭載された。
コレをもとに、たまたま実験していた、Tiny13AのADCのデータの取り出しの習作のソフトに、RJBさんのノイズ発生部分をのせてみた。弁慶さんのオリジナルの回路を拝見した訳ではないのだけど、お話を伺っただけで、TTLが数個の回路になりそうだなぁという印象を受けた。でも、ソフトで実現すれば、こんな小さなマイコンで1発で実装で来ちゃう。「なんか騙されて無いか?!」見たいなつもりで、ChipTrickと命名した。出てくる音は、ChipTuneっぽいノイズだし。

実装と評価

デジタルノイズジェネレーター
デジタルノイズジェネレーターPCB例

組み立ては、ホボワンチップ。写真の最初の版は、電源のパスコンさえなかった。本当のワンチップ。ある意味挑戦。というか、ナニに対してケンカを売っているんだろう、と自問した。いや、コレギターアンプに接続して使うかも。出力、カップリングして無い。ギターアンプの古いマーシャルの真空管の奴とか、なんと、入力のカップリングのCが無かったりする。グリッドがプラス3Vになると、コッチに電流流れてきちゃう。mtm04でデモをするのに、ギターアンプを持っていくつもり。手作りのチャンプ。こいつの入力も、カップリングのCが無かった。落ちてこないはずの天井が落ちてくる瞬間はあるのだ。
挑戦とか気取ってないで、ちゃんと愛をもって組み立てようかな。いや、愛がすべてとは言わないよ、ちびっとのお金と、カップリングのCは必要なんだよ、死なないために。
とはいえ、蛇の目基板、タクトスイッチ、ボリューム、電池ホルダー、ジャック、ケースなど、実装部品ばかり。電池と出力ジャック以外のコンポーネントは全部、蛇の目基板の上に載せてしまった。バラック(ケースに入れずに、ホボむき出し状態)でも音を出して遊べる。
このプロトタイプでは、手持ちのプラスチック軸のVRを使ったが、勢いアマって、つまみをひねりすぎると軸がむしれる。いや、これ、面白すぎ(自分で言うな!)て本気でつまみを廻したくなる。はまったやつは本気でむしると思う。金属のちゃんとしたVRを使うか、基板から外してちゃんとケースにつけるほうがいい。

デジタルノイズジェネレーター
デジタルノイズジェネレーター。電池2本がちょっとお気に入り

電源も単三電池2本(実測9mA程度)だし、MTM04には間に合わないけど、この規模、初心者にお勧めの工作にできそうだ。チャンスがあれば、キット化してみようかと言う気もする。
このプロジェクトオリジナルのアイディアは弁慶さんだし、ソフトウエアは、RJBさんのものを使わせていただいて殆どオリジナルの部分は無い。(ADコンバーターからのデータの取り出し方の部分はちょっとこだわったかなーとかぐらい?!)踊りなが鳴らせる筺体に入れる、と言う部分が僕のアイディア。まあ、そんなプロジェクトもありかなと。
ケースの加工は、気合が入った。てか、気合入れたのはここだけかも。この手の楽器類、VR類の配線が大変なのだ。すっきりやるには、かなりの美意識が要求される。何度屋っても綺麗にいかない。VR類の配線をビニール線を使わずに、PCBにVRを乗せてしまうことで、綺麗すっきりいく。ただ、部品がPCBのどこにあるのかきちっと図面を作ってケース加工しないと、悲しい事になる。お菓子の空き箱に、図面を貼り付けてカッターで切り抜き、コレでどうだ?とか、何度か位置決めを繰り返して最終的にはキモ小さめに開けて置き現物をあてて、ヤスリで修正する。

denhaさんのブログのこちらのエントリー、「スーツケースシンセ完成!」にパネル加工テクニックが紹介されており、 参考になったー。
ソフトウエアは必要最小限しか書かなかった。普通は、スイッチの入力に関してはチャタリングを外す処理を追加するんだけど、これは、チャタリングもコミで聴かせるメカとか言いつつ何の処理もしてない。ボタンが同時に押されてるときは、低いほうが優先。このプロジェクトを追試するとき、機能アップのためのアイディアをいくつか上げておく。
たとえば.....
  • ボタンが同時に押されたとき、後から押されたピッチへスイープする。
  • ボタンが同時に押されたとき、暴力的なビブラートが掛かる。
  • リリース(ボタンを離したとき、徐々に音が消えていく)スイッチをつける。
特に最後のは、センターオフのスイッチでショート、ロング、無しが選べるとか。出力は、0Vから3V弱のパルスなので、トランジスタ1発のスイッチングで、実現できそうだ。 演奏性に関しては、音量のつまみは欲しいかもしれない。10kをボリュームに差し替えるとか。

改造

ChipTrickのデモ(youtube)

音が出たーで終わってはいけない。そんな気がして、ソフトウエアを見直してみた。

このソフトの基本タイミングは2種類ある。ADCがツマミの状態を取り出すところは、ADCの変換にかかる時間は一定なのを利用している。
システムクロックは、内蔵のRC発振の9.6MHz。これを1/128に周分したクロック(75Hz)で、ADコンバーターを動かす。ADコンバーターは、最初の1回以降は、13クロックで1変換が終わり、これをネタに割り込みを掛ける。 データを欲しいチャンネルをセットし、AD変換スタートすることで、また、必ず戻ってくる。75kHzの1/13で5.7kとなる。これが、ADCの変換終了割り込みを使った基本タイミング。170us程度。

シフトレジスタの回転のタイミングはTiny13にはひとつしかないタイマーをCTCモードで使う。最初の版では、だいたい60kHzぐらいが基本周期で、ADCで得た数値と比較して所定の時間が来たら1パルス出すかどうかを判定。
基本タイミングは、60kHz、16us程度、一番早いとき、ADCの出力するデータ、0から255までのうち、255の時が、60kHz(16uS)、次に早いのが254で、32us。もうこれ以上無いぐらいに乱暴なアルゴリズム。だって、早く音をききたかったんだもーん。聞いた感じで一番早い周波数を、60kとかまで上げないと低い音がちゃんとで無い状態。
ツマミの2時から1時ぐらいのときが、(ADCの数値が128ぐらいから、168ぐらいのときが、470Hz-372Hzぐらいになって、なんか、音程が分かるような気がする部分として聞こえるはず。あとは、低すぎでなんかだわかんなかったり、高すぎでシューシュー言うばっかりでよくわかんないところということだ。
何の根拠もなく、聴感だけで適当に、決めたのだけど、実際操作してみると、指の微妙な動きで、微妙なシュワシュワが表現できて、これはこれで結構十分。デモのビデオではこの状態で動いている。おいしい音が出る範囲が、実は結構狭くて、狙いの音色をだすのに、何度も微妙につまみをいじってるところが見るポイント。

さて、タケダノヲトのコンテキストで見てみると、アナログメカをデジタル化するメリットの大きなポイントは、ボリュームのカーブをVRを選ばずに、自由にツマミのまわし具合のカーブを変化させられるところかもしれない。実際の操作にあわせてのパラメーターの設定は大事な工程とはいえ、今回のソフト、あまりに乱暴すぎ、ちょっと考えてみる。

たとえば、20Hzから20kヘルツ、1000倍違う周波数を、256ステップでリニアに変わるように検討しなおしてみる。これで、ノイズを鳴らしてみて、きれいに聞こえるかどうかはまた、別ね。聞いてみて評価しなきゃいけない。

サンプル&ホールドで、ランダム音程とか鳴らすとき、サンプルするLFOの周波数、倍にしないとタイミングが半分に聞こえるという経験から、ここはノイズも、設定周波数の半波形分で検討してみる。20Hzの倍は(半波形)は、25mS、20kHzは25uS。基本タイミングを、25uSにするなら、カウントアップの最大値は、240。
分母を1000とすれば、1000/1000の時が最高速。分子がADCの出力にしたがって、徐々に小さくなっていくようにする。ADCの出力は、0~255だから、4、これが256倍で、1024なので、ちょいと、チョンボ。(最低周波数がちょっと落ちる感じ?)要するに、1回のタイミングごとに、ADCの値を4倍した数字づつ、足して1024を超えたら、狙いのタイミング。超えた誤差を集積して(1024を引く)次の足し算をする。

int freqency(unsigned char fc)
{
	static int current_e = 1024/2;		//増分の集積クリア。

	current_e += (unsigned int)(fc*4);	//増分の集積
	if (current_e >= 1024){			//分母を超えたかどうか
		current_e -= 1024 ;		//はみ出した誤差分を次のステップに送る
		retun 1;
	}
	return 0;
}

基本タイミングでこの関数を呼び出すと、設定のタイミングかどうかを判断するという関数。fcの値が0のときとか、実装にはもうちょい工夫が必要そうだけど。
これで、リニアに周波数が変わるので、一定角度で1オクターブづつ変化するように、指数変換したテーブルを作ってみたら、256段階のうち60ステップは1。要するに、1/4ぐらいは最低の周波数のまま変わらないのだ。デジタルの悲しさ。解像度の低さー。高い周波数のほうは自然に上がっていく感じがいいのだけど、どうも貧乏性がうずく。
20Hz周辺は低すぎて、バリバリ言うだけで使いにくい。測定器としてではなく、楽器的な視線で見直してみると100Hzぐらいからで十分な雰囲気だ。さっくりと前提条件の変更。 100Hzから20kに変更して、テーブルを作り直してみる。 100倍なのだけど、計算を単純にするべく128倍というか、20kの1/128が最低周波数になるという発想。

ここでは、エクセルを使って、必要なデータを作る。まず、指数変換数の結果出るはずの最大/最小の値の対数を得て、これがリニアに変わる数列を作り、コレを指数関数を通して狙いのカーブの数字を得る。指数と対数を得るとき、底を一致させておくのが大事。ここでは、たまたま10にしてある。エクセルの表は、最新のソースに同梱してある。

こちらの版には、ノイズを鳴らす代わりに矩形波を出すようにして、設定周波数が思い通りになっているかをチェックするためのデバッグに使ったソースをコメントアウトして残してある。つまみを廻しながら音程の変化をチェックできるのだけど、なんか、周期的なジッタが、出てこれがエイリアスノイズっぽく聞こえて、コレはコレで、へんな効果音っぽく使えるかもしれないとか思いつつも、ここは、改造は読者の手にゆだね、基本アルゴリズムを分かりやすく提示するに留まろう!とか...手抜きじゃないんだよー!!愛なんだよー、なんちて?!
というか、矩形波を出すモードにすると、低いほうの音程を変化させる仕掛けの解像度が低すぎて、音程がギロギロっと換わっていくのが分かってしまう。このあたり、もう一工夫しないとだめかもしれないと思い始めている。