Faustのメモ2
Faust syntaxについて
ところどころ訳しながらメモ
Faustのステートメントには
・メタデータ宣言
・ファイルのインポート
・定義
・ドキュメント
がある。
メタデータ
メタデータを使うと言語の一部ではない要素をFaustに追加できる。
ex) 名前や作者など
グローバルメタデータ
関数メタデータ
UIメタデータ
等がある。
グローバルメタデータ
declare name "MyProgram";
declare author "MySelf";
declare copyright "MyCompany";
declare version "1.00";
declare license "BSD";
など
関数メタデータ
特定の機能に関連付けることが出来る。
declare add author "John Doe"
add = +;
標準メタデータ
色々な標準グローバルメタデータがある。
Importsはライブラリなどをインポートする。
import("stdfaust.lib");
のように使う。
関数などの定義
a =1;
b(x)= 10*log10(x); //関数
b =\(x).(10*log10(x)); //こう書いても同じ ラムダ抽象化というらしい
のように書く。
並列で同じパターン繰り返されるような場合は
duplicate(1,x) = x;
duplicate(n,x) = x, duplicate(n-1,x);
のように書くことで表現できる。
import("stdfaust.lib");
duplicate(1,x) = x;
duplicate(n,x) = x, duplicate(n-1,x);
process = duplicate(5,no.noise);
5つの並列ノイズ生成となる。
Faustはブロック図をベースとする言語
ブロック図の組み合わせのための記号は以下の5つ
recursion (~),
parallel (,),
sequential (:),
split (<:),
merge (:>).
y(x)=y(x-1)+1
process = _~+(1);
parは反復して並列に生成する。
import("stdfaust.lib");
freq = hslider("freq",440,50,3000,0.01);
gain = hslider("gain",1,0,1,0.01);
gate = button("gate");
envelope = gain*gate : si.smoo;
nHarmonics = 4;
process = par(i,nHarmonics,os.osc(freq*(i+1))) :> /(nHarmonics)*envelope;
parによる加算合成
seqは直列、sumは加算、prodは乗算
Faustではコア構文に加えて中置記法、前置記法などが使える。
1サンプル遅らせるには「'」を使う。
process = _'; // 入力を1サンプル遅らせる。
process = _''; // 入力を2サンプル遅らせる。
サンプル数で指定するには[@]をつかう。
process = @(10); // 入力を10サンプル遅らせる
process = @(100); // 入力を100サンプル遅らせる。
論理 | & xor < などの記号を使うことで条件分岐できる
真なら1 偽なら0 なので結果に数字を掛けたりすることで任意の値を出力できる。
process = _ <: <(0.5)*10 | >(0.7) <: >(0.4)| <(0.4);
上だと最初の条件判断で0.5より小さいなら10となる。
selectorを使うことで選択できる
import("stdfaust.lib");
s = nentry("Selector",0,0,1,1) : int;
sig = os.osc(40),os.sawtooth(40) : select2(s);
process = sig;
>>これらすべてにもかかわらず、ファウストにはいくつかの制限があります。たとえば、FFT、畳み込みなどのマルチレートを必要とするアルゴリズムを効率的に実装することはできません。この問題を回避するための秘訣はありますが、それが大きな問題であることを十分に認識しています。可能な限り一生懸命取り組んでいます。
ライブラリからいくつか
sec2samp(d) : _
秒単位の期間をサンプル数に変換します
midikey2hz(mk) : _
MIDIキー番号をHz単位の周波数に変換します(MIDIキー69 = A440)。
_ : line(n) : _ // n:次の値に到達するためのサンプル数
'n'サンプルで次の値に到達するための線形ランプ。
tempo(t) : _
BPMのテンポをいくつかのサンプルに変換します。
if(cond, then, else) : _
if-then-elseはselect2で実装されています。
オシレータ
oscsin(freq) : _
サイン波
oscp(freq,phase) : _
位相制御できるサイン波
phasor(tablesize,freq) : _
phasor
エンベロープ
ar(at,rt,t) : _
AR(アタック、リリース)エンベロープジェネレーター(パーカッションエンベロープの作成に便利)。
at:アタック
rt:リリース
t: トリガー t>0でアタック t=0でリリース
asr(at,sl,rt,t) : _
ASR(Attack、Sustain、Release)エンベロープジェネレーター。
at:アタック
sl: サステインレベル[0~1]
rt:リリース
t: トリガー t>0でアタック t=0でリリース
adsr(at,dt,sl,rt,gate) : _
ADSR(Attack、Decay、Sustain、Release)エンベロープジェネレーター。
at:アタック
dr:ディケイ
sl: サステインレベル[0~1]
rt:リリース
gate: トリガー gate>0でアタック gate=0でリリース
フィルタ
_ : resonlp(fc,Q,gain) : _
_ : resonhp(fc,Q,gain) : _
_ : resonbp(fc,Q,gain) : _
シンプルなレゾナントローパス、ハイパス、バンドパスフィルタ
よろしければサポートお願いします!