ph, t, sr, pi,
e。sin cos tan asin acos atan exp log pow sqrt abs sign floor ceil round min max tanhi32 u32 band bor bxor bnot shl shr ushr rol ror。非有限値は0。
| # | Ratio | Cents |
|---|
このJSでは波形生成時に音量超過などに対する安全処理を行っていますが、
それを以て『数式それ自体の安全性』は保障しません。
Max8・PureData・その他のプログラム上で数式から音色を生成する場合は、
機器や聴覚への安全のため、必ずリミッターなどの処理を施してください。
+ 加算、- 減算、* 乗算、/ 除算、%
余り(位相ラップ等に応用可)pow(x,y) べき乗、sqrt(x) 平方根、abs(x) 絶対値exp(x)、log(x)(自然対数)、min/max、floor/ceil/round
sin cos tan asin acos atan、tanh(ソフトクリップ用途に最適)ph ∈ [0,1)、角周波は 2*pi*ph。i32(x) 符号付き32bit化、u32(x) 符号なし32bit化。band(a,b) AND、bor(a,b) OR、bxor(a,b)
XOR、bnot(a) NOT。shl/shr/ushr シフト、rol/ror ローテート(ビット巡回)。i32で量子化→ビット操作→/constで -1..1 に戻す。音は荒くローファイになります。
ここでの「式」は DSL です(JavaScriptの let/const/return は使いません)。
x = ... のように変数を定義でき、最後の行が出力になります。
注意:DSLでは ^ は べき乗です。XORは bxor(a,b) を使ってください。
1) サイン(基音)
sin(2*pi*ph)
2) 矩形(奇数次和音:加算合成)
倍音が多いほど明るいが、荒れやすい(Safety=soft推奨)。
(4/pi)*(sin(2*pi*ph) + (1/3)*sin(2*3*pi*ph) + (1/5)*sin(2*5*pi*ph) + (1/7)*sin(2*7*pi*ph) + (1/9)*sin(2*9*pi*ph))
3) のこぎり(帯域制限なし・DCブロック推奨)
2*((ph + 0.5) % 1) - 1
4) 三角(サインから整形)
(2/pi) * asin( sin(2*pi*ph) )
5) PWM(パルス幅:デューティ固定)
( (ph % 1) < 0.3 ? 1 : -1 )
エイリアシングが気になるときは soft 方向に丸める:
tanh(6*( (ph % 1) < 0.3 ? 1 : -1 ))
6) ソフトクリップ・ウェーブシェイパ(滑らかに太く)
tanh(3 * sin(2*pi*ph))
7) リングモジュレーション(倍音の金属感)
sin(2*pi*ph) * sin(2*pi*ph*3.2)
8) 折り返しFMっぽい金属感(変数版:おすすめ)
FM(位相揺れ)+非線形(曲げ)で「グワッ」とした倍音を作る。
x = 2*ph - 1
bend = x*(1 + 0.8*x^2)
fm = sin(2*pi*(ph + 0.12*sin(2*pi*ph*3)))
tanh(2.8*(0.6*bend + 0.7*fm))
0.12(FM深さ)↑で金属感↑、荒れやすさ↑*3(比)を整数で変えるとキャラが変化2.8(ドライブ)↑で歪み/音量↑(Gain注意)9) 簡易ウェーブフォールド(変数版:荒く太い)
折り返しで“折り目”を作る。フィルタやリバーブと相性◎。
x = 2*ph - 1
d = 3.8
f = x*d
fold = abs(((f + 1) % 4) - 2) - 1
tanh(2.4*fold)
d↑で折り目が増え、硬く派手になる10) ビットクラッシュ(量子化ノイズ:変数版)
サインを段階化してザラつきを付加。qを下げるほど粗い。
q = 64
s = sin(2*pi*ph)
u = (s + 1)*0.5
st = i32(u*q)/q
tanh(2*(st*2 - 1))
11) XORシンセ(デジタル荒れ:変数版)
phを整数空間に拡大してからXOR。virtSRを下げると“ローファイ感”が増える。
p = i32(ph*65536)
y = bxor(p, p*7)
m = band(y, 65535)
tanh(1.6*(m/32768 - 1))
12) ローテート混ぜ(さらに様子のおかしい倍音)
回転(rol/ror)をXORに混ぜると“変な規則性”が出る。
p = i32(ph*65536)
r = bxor(rol(p, 5), ror(p, 3))
m = band(r, 65535)
tanh(1.4*(m/32768 - 1))
13) ステップ波(サンプル&ホールド風)
floor(ph*8) / 4 - 1(8段ステップ)
14) ハードクリップ(どんな式にも後段で)
max(-1, min(1, YOUR_EXPR))
15) DCオフセット除去について
のこぎり等はDC成分が出やすいのでDCブロックON推奨。できるだけ正負対称の式だと安定します。
16) Polygonal Synthesis(基本:x成分)
“正n角形を回転してサンプリングする”系のポリゴン波形。nが小さいほど角ばり、上げるほどサインに近づきます。
※分母が0付近になると発散するので eps でクランプしています。
phi = 2*pi*ph
n = 4 # 3=三角, 4=四角, 5=五角...(非整数もOK)
T = 0.10 # teeth(頂点オフセット):0〜0.4くらいから
Phi = 0 # 回転(位相オフセット)
m = ((phi*n)/(2*pi)) % 1
den = cos((2*pi/n)*m - (pi/n) + T)
eps = 1e-4
den2 = sign(den) * max(abs(den), eps)
p = cos(pi/n) / den2
x = cos(phi + Phi) * p
tanh(1.2*x)
n:形状(角の数)。小さいほど硬い倍音/大きいほど滑らか。T:頂点のクセ。上げるほど“歯”っぽいキャラが出ます。Phi:回転。倍音のバランスが変わります。17) Polygonal(Continuous order:非整数n)
nを非整数にすると、角の数が“連続的に変形”して独特の動きが出ます。
phi = 2*pi*ph
n = 3.6
T = 0.25
Phi = 0
m = ((phi*n)/(2*pi)) % 1
den = cos((2*pi/n)*m - (pi/n) + T)
eps = 1e-4
p = cos(pi/n) / (sign(den) * max(abs(den), eps))
x = cos(phi + Phi) * p
tanh(1.0*x)
18) Polygonal(x/y混ぜ:2D感を足す)
x成分とy成分(90°ずれ)を混ぜて、少し“立体感”のある倍音バランスに。
phi = 2*pi*ph
n = 5.4
T = 0.10
Phi = 0.35
m = ((phi*n)/(2*pi)) % 1
den = cos((2*pi/n)*m - (pi/n) + T)
eps = 1e-4
p = cos(pi/n) / (sign(den) * max(abs(den), eps))
x = cos(phi + Phi) * p
y = sin(phi + Phi) * p
tanh(1.1*(0.8*x + 0.2*y))
Polygonal Tips
・eps を小さくしすぎると急に大音量になりやすいので注意(まずGain低め推奨)。
・T はラジアン相当のオフセットです。0.1〜0.3あたりから試すのが安定。
・高域が強くなりがちなので、Safety=soft の相性が良いです。
実用Tips