現在位置 : ホーム > JSS Project > #007

数式シンセ + キーボード演奏 + スケール + WAV出力

Formula

識別子: ph, t, sr, pi, e
関数: sin cos tan asin acos atan exp log pow sqrt abs sign floor ceil round min max tanh
ビット演算: i32 u32 band bor bxor bnot shl shr ushr rol ror。非有限値は0。

Partials (ratio amp)

1行=「ratio amp」。ratioは周波数比(inharmonicも入力可:2.7, 3/2, 2^(19/12)など)。ampは振幅。#や//コメントOK。
また、Partials波形で「Sine(純サイン)」を選択すると、Formulaは無効化します。

波形(先頭50ms)

スペクトル(dB)

Scale

基準キー a
行ごとに p/q(純正比)or 小数=セント。最後の行が周期。1/1 は自動追加。
キー割当:a=0、q=+5、1=+10、z=-5(そこから右に +1 ずつ)。

Scale Table

# Ratio Cents

WAV Export

Generateで式を確定後、指定の度数・長さで単音をレンダリングしてWAV保存します。クリック回避のためフェードイン/アウトを自動付与。

⚠注意

このJSでは波形生成時に音量超過などに対する安全処理を行っていますが、
それを以て『数式それ自体の安全性』は保障しません。
Max8・PureData・その他のプログラム上で数式から音色を生成する場合は、
機器や聴覚への安全のため、必ずリミッターなどの処理を施してください。


Hints:演算子・関数の要点とおすすめ波形

基本演算子(連続系・滑らか)
  • + 加算、- 減算、* 乗算、/ 除算、% 余り(位相ラップ等に応用可)
  • pow(x,y) べき乗、sqrt(x) 平方根、abs(x) 絶対値
  • exp(x)log(x)(自然対数)、min/maxfloor/ceil/round
  • 三角関数sin cos tan asin acos atantanh(ソフトクリップ用途に最適)
  • 位相は ph ∈ [0,1)、角周波は 2*pi*ph
ビット演算(i32/u32/band/bor/bxor/bnot/shl/shr/ushr/rol/ror)(離散・荒さを出す)
  • 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版:そのままコピペOK)

ここでの「式」は 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↑で折り目が増え、硬く派手になる
  • 高域が強いので、まずGain低め+Safety=soft推奨

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

  • 倍音が多い(矩形/のこぎり/ビット/フォールド系)ほど耳に刺さりやすい → まずGain低め
  • virtSR を 6000〜12000 に下げるとサンプル&ホールド感が出てローファイになる(ビット系と相性◎)。
  • 公開用途では、スピーカー/聴覚保護のため外部リミッタ相当の運用を推奨(OS/ブラウザの音量も含めて)。