見出し画像

モジュラーシンセとシフトレジスタ

この記事では、シフトレジスタについて、モジュラーシンセへの応用という視点から、動作原理の説明をします。

シフトレジスタを使ったシンセモジュール

Doepfer A-117 Digital Noise / Random Clock / 808 Sound Source
Doepfer A-149-1 Quantized/Stored Random Voltages
Music Thing Modular/Turing Machine
After Later Audio Benjolin V2
等があります。Turing Machineは実機がなくてもVCV Rackで動作確認が可能です。

シフトレジスタとは

シフトレジスタは、簡単に言えば、非常にミニマムなメモリーです。Turing MachineのLEDは、シフトレジスタの内容を表示していると考えられ、仕組みを理解するのに役立つので、以下、このモジュールをベースに説明します。

Turing Machineの中央ツマミを右一杯に回すと、固定されたシーケンスでループします。LENGTHを8にセットして、LEDの光り方をよく見ると、例えば次のように光っているのがわかります(光っているLEDを○で示します)。

↓ ●●●●○●●●
↓ ●●●●●○●●
↓ ●●●●●●○●
↓ ●●●●●●●○
↓ ○●●●●●●●
↓ ●○●●●●●●
↓ ●●○●●●●●

この場合、シフトレジスタは次のようなものと考えることができます。
・シフトレジスタは8個の並んだ「箱」(ビット)を持つ
・それぞれの箱には、0または1の値が格納される
・各箱に格納された値に応じて、対応する8個のLEDが点滅する(値が1の時に点灯)
・Clock毎に、各箱に格納された値が右の箱に移動(右シフト)する
・一番右端の箱(第1ビット)の値は、一番左端の箱(第8ビット)にシフトする

シフトレジスタからの数値の生成

シフトレジスタの各箱に入っている0, 1の値を並べると、2進数で表現された数値として見ることができます。これを10進数に換算すると、以下のようになります。

↓ ●●●●○●●● 2進数: 00001000 => 10進数: 8
↓ ●●●●●○●● 2進数: 00000100 => 10進数: 4
↓ ●●●●●●○● 2進数: 00000010 => 10進数: 2
↓ ●●●●●●●○ 2進数: 00000001 => 10進数: 1
↓ ○●●●●●●● 2進数: 10000000 => 10進数: 128
↓ ●○●●●●●● 2進数: 01000000 => 10進数: 64
↓ ●●○●●●●● 2進数: 00100000 => 10進数: 32
↓ ●●●○●●●● 2進数: 00010000 => 10進数: 16
↓ 始めに戻る

上記の例は、LEDが1個だけ光るパターンですが、もし8個全てのLEDが光っている場合、2進数: 11111111 => 10進数: 255 という数字が表現されます。全部のLEDが消えていたら、2進数: 00000000 => 10進数: 0です。つまり、8個の「箱」がある(8ビット)シフトレジスタの場合、0 〜 255の整数値を表現することができます(2の8乗 -1 = 255)。

Turing MachineのLENGTHは、シフトレジスタのビット数を設定していると考えられ、16にセットした場合は、 0 〜 65535の整数値を表現できることになります(2の16乗 -1 = 65535)。ただしLEDは8個しかないので、16個のビットの半分だけが表示されることになります。

ランダムネスの導入

前述の例では、固定されたの8個の値がループするだけですが、シフトするビット値を操作することで、ランダムな値が出力されるようになります。このようなシフトレジスタを線形帰還シフトレジスタ(linear feedback shift register, LFSR)と呼びます。Wikiには、フィボナッチ LFSR、ガロア LFSR等が記載されています。

スクリーンショット 2021-07-16 1.50.58

フィボナッチ LFSR等の出力は完全にランダムになります。一方、Turing Machineでは、ランダムネスの度合いがコントロールできるので、フィボナッチ LFSR等とは異なる方法を採用しているようです。本記事では、モジュールの内部解析まではしないので、これ以上の深掘りはしません。

シフトレジスタからの出力

シフトレジスタの値を出力する場合、2つの方法が考えられます。いずれの場合も、Clock毎に更新(シフト)された値が出力されます。

a) シフトレジスタが表現する数値(8ビットなら0 〜 255の整数)を、適当なCVに変換して出力する(例: 0 〜 255の値を0V 〜 +5Vにマッピングする)
出力波形は、Clockでサンプル&ホールドされたようなものになります。Turing MachineのSCALEツマミとOUT端子は、このタイプの出力と思われます。

b) シフトレジスタの特定のビットの値(0または1)を取り出し、適当なCVに変換して出力する(例: 一番右端の第1ビットを取り出し、0なら0V、1なら+5Vとする)
出力波形は、PWMがかかった矩形波になります。A-117のDNG / RND CLK端子は、このタイプの出力と思われます。

例えば、8ビットのシフトレジスタの値が以下のようにループしている場合、

↓ ○●●○○●○○ 2進数: 10011011 = 10進数: 155
↓ ○○●●○○●○ 2進数: 11001101 = 10進数: 205
↓ ○○○●●○○● 2進数: 11100110 = 10進数: 230
↓ ●○○○●●○○ 2進数: 01110011 = 10進数: 115
↓ ○●○○○●●○ 2進数: 10111001 = 10進数: 185
↓ ○○●○○○●● 2進数: 11011100 = 10進数: 220
↓ ●○○●○○○● 2進数: 01101110 = 10進数: 110
↓ ●●○○●○○○ 2進数: 00110111 = 10進数: 55
↓ 始めに戻る

出力波形は以下のようになります。8個の固定された値のループになるので、Clockの周波数に準じたピッチを持ちます。
上:a)のタイプの出力
  8個の数値のループ
  155 => 205 => 230 => 115 => 185 =>220 => 110 =>55
下:b)のタイプの出力
  第1ビットの値のループ
  1 => 1 => 0 => 1 => 1 => 0 => 0 => 1

画像2

Turing Machineのような、ランダムネスが調整可能なモジュールでは、Clockの周波数に準じたピッチ感のあるノイズから、ピッチのない完全なノイズまで出力できます。ここは各モジュールの設計によって特性が出るところです。

下図は、第1ビットの値を第8ビットにシフトする際に、一定の確率でビット反転する方法で、ランダムネスを導入した場合の波形です。周期性を持ちながら、波形が少しずつ崩れていくのがわかります。

画像3

まとめ

2進数に馴染みのない方には、説明がわかりにくかったかもしれません。
動作原理を知らなくても、シフトレジスタのモジュールを使う上では何も困らないのですが、原理の理解を通して、発展的な使用の一助になれば幸いです。
続編として「Csoundでシフトレジスタ」を予定しています。

追記

記事の初回公開後の調査で、Turing Machineでは、第1ビットをシフトする際にそのビットを反転する確率をコントロールすることで、ランダムネスを導入していることが分かりました。参考資料を以下に挙げます。

Ornament & Crime
User manual
日本語マニュアル
 CopierMaschine、Quantermainの項に記載があります。


Version history
v1.0 : 2021/08/15公開
v2.0 : 2021/08/18公開



この記事が気に入ったらサポートをしてみませんか?