2017/08/17

FaustからLV2プラグインにコンパイル

初めてのFaustで作ったsaw.dspをLV2プラグインにコンパイルしてCarlaで呼び出します。

MIDIノート対応とメタデータの追加

MIDIノートへの対応とメタデータの追加を行うためsaw.dspを修正します。
メタデータの追加は declare で行います。 declare name の指定がなければコンパイル後のプラグイン名はファイル名と同じsawとなります。
declare nvoice で最大同時発音数を指定することでMIDIノートを受け取れるようになります。nvoiceの指定がなければエフェクトとしてコンパイルされます。
freq、gain、gateという名前のコントロールを定義することでMIDIノートの音程、ベロシティ、ノートオン/ノートオフをFaust側で扱えるようになります。以下の例の freqとgainの値はGenerating a MIDI Synthesizer for PDの例の値に合わせています。
// メタデータ。
declare name "Saw Synth";
declare author "Uhhyou";
declare version "1.0.0";
declare license "MIT";
declare description "A simple sawtooth synthesizer.";

// declare nvoicesがあればinstrument、なければエフェクトとしてコンパイルされる。
declare nvoices "16";

import("stdfaust.lib");

// freq, gain, gateを定義してMIDIノートを扱う。
amp = hslider("amp", 0.5, 0.0, 1.0, 0.01);
pan = hslider("pan", 0.5, 0.0, 1.0, 0.01);
freq = hslider("freq", 440, 20, 20000, 1);
gain = hslider("gain", 0.1, 0, 1, 0.01);
gate = button("gate");

ampAttack = hslider("amp attack", 0.7, 0.0, 1.0, 0.001);
ampRelease = hslider("amp release", 0.8, 0.0, 1.0, 0.001);

cutoff = hslider("cutoff", 0.5, 0.0, 1.0, 0.01) : ba.lin2LogGain * 980 + 20;
resonance = hslider("resonance", 0.2, 0.01, 1.0, 0.01) : ba.lin2LogGain * 100;
filterAttack = hslider("filter attack", 0.25, 0.0, 1.0, 0.001);
filterRelease = hslider("filter release", 0.9, 0.0, 1.0, 0.001);
filterEnvAmount = hslider("filter envelope amount", 0.7, 0.0, 1.0, 0.01)
  : ba.lin2LogGain * 980 + 20;

filterEnv = en.ar(filterAttack, filterRelease, gate);
filter = fi.resonlp(
  cutoff + filterEnvAmount * filterEnv,
  resonance,
  1);

ampEnv = en.ar(ampAttack, ampRelease, gate);
osc(f) = os.sawtooth(f)
  + os.sawtooth(f * (1.0 + 0.1 * no.pink_noise));
chord(numHarmo) = sum(i, numHarmo, osc((i + no.noise) * freq / numHarmo))
  / numHarmo;
process = chord(7) * amp * gain : filter : sp.panner(pan);

LV2プラグインへのコンパイルとインストール

LV2プラグインのインストールディレクトリは$LV2_PATHで指定されています。
$ echo $LV2_PATH
/home/<user_name>/.lv2:/usr/lib/lv2:/usr/local/lib/lv2
faust2lv2でLV2プラグインにコンパイルして~/.lv2にインストールします。
$ faust2lv2 saw.dsp
$ cp -r saw.lv2/ ~/.lv2/
lv2lsでインストールが成功しているか確認します。
$ lv2ls
...
https://faustlv2.bitbucket.io/saw
...

動作確認

以前インストールしたCarlaで動作確認を行います。
Carlaを起動してCtrl+Aでプラグイン追加ウィンドウが開きます。今回作ったプラグインはSaw Synthという名前になっているので探して追加します。次にPatchbayを開いてSaw Synthのoutをsystemのplaybackに接続します。接続後にSaw Synthのevents-inを選択した状態で、Patchbayの画面下にある鍵盤を左クリックして音がなれば成功です。Saw Synthのパラメータの変更はRackから行うことができます。