見出し画像

Csoundでシフトレジスタ&AU/VST plugin化 (3/3)

以前の記事で説明したシフトレジスタをCsoundでプログラミングし、AU/VST plugin化します。

CabbageによるAU/VST plugin化

■Cabbage

CabbageはCsoundのIDEの1つで、Csoundのコーディング環境として使えるだけではなく、Cabbage独自のコードを記述することで、CsoundのコードにGUIを付けることができます。CabbageはJUCE class libraryを使っているので、動作が速く見た目も良いGUIが作成できます。
作成したGUIは、AU/VST/FMOD plugin、VCV Rack moduleにエクスポートできるだけでなく、Standalone applicationとしてもエクスポート可能です(VCV Rackについては機能限定あり)。
なおCabbage for WINDOWSは、64bit版WINDOWSが必要です。

■Pluginの動作条件

Cabbageからエクスポートしたplugin等は、CsoundがインストールされたPCでなければ動作しません(エクスポートしたplugin fileにCsound Libraryは含まれないため)。
Csoundをインストールしていないけれどpluginを試したい、という方には、Cabbageをインストールすることをお勧めします(CabbageのインストーラーでCsoundも同時にインストールすることができます)。

■シフトレジスタのGUI仕様

以下の仕様でGUIを作成します。GUIのグラフィックは自作せず、標準のものを使います。

コントロールするパラメータ

  • ビットシフトのスピード(0〜10,000回/秒: 可聴域をカバー)

  • Bit 0をBit 7にシフトする際にビット反転する確率(0〜1)

  • シフトレジスタのオーディオ出力の切り替え

    • Decimal (シフトレジスタの値を10進数で出力)
      =>Turing Machine風の出力

    • Bit0 (シフトレジスタの値からbit 0の値(0 or 1)だけを取り出し出力)
      =>Doepfer A-117風の出力

GUIに表示するデータ

  • シフトレジスタの現在値

    • 10進数(0〜255)で表示

    • Bit 0〜bit 7の値(0 or 1)を8個のチェックボックスのON/OFFで表示(Turing Machine風のbit表示)

  • オーディオ出力の波形表示

■GUIのコーディング

Cabbageのメニューの File > Examples>Widgets に各widgetの実例があるので、これを参考にコーディングします。各widgetの詳細はCabbage Docsで調べます。
今回使用したwidgetの詳細説明は省略しますが、いくつかポイントを挙げておきます。

  • guiMode("queue")を設定する

  • checkbox widgetは、0が書き込まれればOFF、0以外の値が書き込まれればONとなる

  • オーディオ出力の波形の表示はsignaldisplay widgetで行うが、そのためにはCsound opcodeの'display'で、表示対象のシグナルを出力しておく必要がある

  • 波形の表示を有効にするために、CsOptionsに'--displays'を設定する

■その他のポイント

各bitの値の参照

Csoundには2進数を操作する関数が無いので、自分で計算する必要があります。例えば、シフトレジスタの値kvalからbit 4の値を参照するためには、kvalと16=$${2^4}$$の間でビット演算子'AND'(&)を行います。得られる結果はbit 4=1なら16、bit 4=0なら0です。さらに$${2^4}$$で割れば、bit 4の値が1 or 0で得られます。
checkbox widgetをONにする場合、widgetにセットする値は0以外であればどんな数でも良いので、割り算を省略してANDの結果をそのままセットしています。

cabbageSetValue "bit4", kval&16, kpulse

オーディオ出力のスケーリング

作成したシフトレジスタは8 bitなので、Decimal (10進数)で0〜255の値をとります。またシフトレジスタのbit 0の値は0 or 1です。Csoundのコードで0dbfs = 32768(出力範囲:-32768〜+32768)と設定しているため、シフトレジスタの値をオーディオ出力する際に、以下の換算式でスケーリングしています。

Decimal出力の場合:
(シフトレジスタの値-128)*100    => 出力値は-12800〜12700

Bit 0出力の場合:
シフトレジスタのbit 0の値*25600-12800)    => 出力値は-12800 or 12800

■完成したShift Registerのcsd file

■Pluginとしてエクスポート

CabbageからPluginへのエクスポートは非常に簡単です。VST2であれば File > Export Plugin > VST Export >Export as VST Plugin Synth を選びpluginを保存するだけです。
同じようにAU plugin、VCV Rack、Standalone Application等へのエクスポートが可能です。

■エクスポートしたplugin file

「Pluginの動作条件」に記したとおり、pluginはCsoundがインストールされた環境でのみ動作します(なので、plugin fileを配布する意味があまり無いですが、参考までに、、、)。
各plugin fileは、DAW等が指定するプラグインフォルダに保存します。

Mac版
AU版 :ShiftRegister.component
VST2版:ShiftRegister.vst
VST3版:ShiftRegister.vst3
以下の環境で動作確認済み:
Ableton Live Lite(10.1.40) / macOS Monterey(12.1) / MacBook Pro(Intel)

WINDOWS版
ShiftRegister.csdもplugin fileと同じ場所に保存してください。
VST2版:ShiftRegister.dll
VST3版:ShiftRegister.vst3
以下の環境で動作確認済み:
Ableton Live Lite(11.0.12) / Windows 10 Home (64bit)

Ableton Live LiteでのVST3 plugin使用例

■まとめ

CsoundのコードにCabbageでGUIを付けることで、シフトレジスタを使った市販のモジュールと同様な機能を実現できました。作成したシフトレジスタは、動作原理を解説するためにシンプルな構成にしましたが、これをベースに下記のような拡張が考えられます。

  • シフトレジスタのbit長を可変とする

  • オーディオ出力のスケーリング方法の工夫(指定の音階にマッピングする等)

  • ランダムネスのコントロール方法を変えてみる。フィボナッチ LFSRやガロア LFSRを使い、かつランダムネスをコントロールするにはどうすれば良いか?

  • 全体をUser Defined Opcodes (UDO)にして、1 opcodeとして扱えるようにする

なお、一連の記事を作成するにあたり、Music Thing Modular/Turing Machine や Doepfer A-117 Digital Noise / Random Clock / 808 Sound Source を参考にしましたが、これらのモジュールの電子回路やソースコードの分析はしていません。モジュールの表面的な動作やマニュアルを参考にしました。


Version history
v1.0 : 2022/01/05公開

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