2020/03/17

指数曲線のエンベロープ


指数曲線のエンベロープを読む (github.io)

シンセサイザでよく使われている指数曲線のエンベロープについてまとめました。

アタック時間が短いときのプチノイズの低減方法は効果はありますが、かなり適当です。記事中の実装と同じエンベロープを使っている IterativeSinCluster の出力に +80 dB くらいの極端なハイシェルフフィルタをかけるとノイズが完全に消えてはいないことが確認できます。

画像は指数曲線の ADSR エンベロープがリリースの途中でトリガされたときのテスト結果です。

直線の ADSR エンベロープ

直線の ADSR エンベロープを読む (github.io)

直線の ADSR エンベロープについてまとめました。

紹介している実装は CubicPadSynth で使っているものを元にしています。場当たり的に実装してひどいことになってしまった SyncSawSynth のエンベロープからかなり改善しました。

2020/03/16

オーディオプラグインの UI から入力された値の補間


オーディオプラグインの UI から入力された値の補間を読む (github.io)

VST 3 や LV2 で UI から入力されたパラメータをオーディオバッファ内で補間する方法についてまとめました。

ユーザから指定された時間に応じて線形補間するだけなのですが、バージョンの古い SevenDelay などでは補間した値がパラメータの範囲を超えることによって音が止まるというバグ(修正済み)の原因になっていたので、この機会に見直してより安全で速い実装に置き換えました。

2020/03/05

CubicPadSynth


ダウンロードとマニュアル (github.io)
ソースコード (github.com)

CubicPadSynth は PADsynth algorithm を使ったウェーブテーブル方式のシンセサイザです。極端に低い音でも滑らかになるようにバイキュービック補間を使っています。 LFO の波形はおおまかに手書きできます。

MIDI ノート番号の範囲と 20 kHz までのピッチベンドをカバーできるように 136 のウェーブテーブルを内部的に保持しているのですが、これが原因でとても重たいです。 1 つのテーブルは長さ 2^18 サンプルで型が float なので、 136 * 2^18 * 4 / 1024^2 = 136 MiB のメモリを使います。また、マニュアルのページからダウンロードできるバイナリは GitHub Actions でビルドしていますが、私の環境ではローカルでビルドしたバイナリよりもなぜか遅かったです。

2020/01/25

EsPhaser


ダウンロードとマニュアル (github.io)
ソースコード (github.com)

EsPhaser は 4096 の 2 次 Thiran オールパスフィルタと 16 の LFO を備えたフェイザです。 CPU を大きく消費するので使用時は注意してください。

これだけたくさんのオールパスをつなぐと、フェイザというよりディレイに近い音が出ます。 1 つのオールパスで 2 サンプルのディレイが生じるので、サンプリング周波数が 48000 Hz のときは 2 * 4096 / 48000 0.17 秒ほどのディレイがフィードバックで生じるはずです。

2020/01/17

EnvelopedSine

ダウンロードとマニュアル (github.io)
ソースコード (github.com)

EnvelopedSine は 1 つのノートごとに 64 のサイン波を計算する加算合成シンセサイザです。 IterativeSinCluster との違いは、サイン波ごとに独立した AD 音量エンベロープと tanh サチュレータがついていることです。

思っていたよりも作れる音の種類が限られていたのでフェイザとユニゾンをつけてごまかしました。サチュレーションはエイリアシングノイズが出たので、オシレータの周波数が高いときはオフになるようにしています。

このシンセで使ったアルゴリズムはドラムのばちの音を作るときに使える感じがします。

2019/12/12

IterativeSinCluster

ダウンロードとマニュアル (github.io)
ソースコード (github.com)

IterativeSinCluster は 1 つのノートごとに 512 のサイン波を計算する加算合成シンセサイザです。

sin の計算方法は Martin Vicanek さんによる A New Recursive Quadrature Oscillator の appendix で紹介されていた biquad oscillator を使いました。このアルゴリズムは周波数が変更されないときに限って高速に sin を計算できます。

これだけ多くのサイン波を足し合わせたら色々な音が出るだろうと思っていたのですが、わりと似たような音しか出ないシンセになりました。適当に Gain, Semi, Milli と Overtone を動かして Random->To Pitch を9 時くらいにするとそれっぽい音が出ます。

コーラスは FDNCymbal のトレモロを 3 つ並列につないでいます。

2019/11/30

TrapezoidSynth


ダウンロードとマニュアル (github.io)
ソースコード (github.com)

TrapezoidSynth は PTR 台形オシレータを使ったモノシンセです。台形の斜辺の傾きを変えることで、三角波と矩形波に近い波形を出力できます。

 PTR 台形オシレータは PTR の次数とノイズが乗らない音程の上限との間でトレードオフがあります。どちらにしてもオーバーサンプリングしないと 20000 Hz 以下でノイズが乗ってしまうので、いまいちなアルゴリズムです。

PTR 台形オシレータのアルゴリズムの説明 (github.io)

バージョン 0.1.0 ではアルゴリズムの実装に間違いがあったのでノイズが乗っています。 バージョン 0.1.1 で間違いを修正しました。

2019/11/02

FDNCymbal のプラグイン版


ダウンロードとマニュアル (github.io)
ソースコード (github.com)

前に作った FDNCymbal を VST3 と LV2 プラグインにしました。 WaveCymbal よりはシンバルに近い音が出ます。

2019/10/28

WaveCymbal のプラグイン版


ダウンロードとマニュアル (github.io)
ソースコード (github.com)

前に作った WaveCymbal を VST3 と LV2 プラグインにしました。相変わらずシンバルのような音は出ません。

GitHub Actions を使って macOS ビルドも追加しました。ただし mac を持っていないのでテストできていません。問題を見つけたときは GitHub のリポジトリまで報告をお願いします。

WaveCymbal ではシンバルを上から見て同心円状に切った各部を Karplus-Strong の弦で近似しています。そして同心円状の金属の切れ端を 1 次元の波のシミュレーションでつないでいます。さらにハイハットのような音を出すために複数枚のシンバルを用意してぶつけています。次の図はシンバル 1 枚分のモデルを表しています。 nCymbal の値を 1 にしたときに相当します。


2019/10/02

SyncSawSynth


ダウンロードとマニュアル (github.io)
ソースコード (github.com)

SyncSawSynth は 0 から 10 次までの PTR オシレータで鋸歯波をばりばり鳴らせる VST3 のシンセサイザです。

10 次の PTR は明らかに耳でわかるノイズが乗ります。 5 次くらいのほうがノイズが少ないように聞こえます。周波数変調をかけるときは加わったノイズが面白い味になるので全部まとめて使えるようにしました。

追記 2019-10-17: バージョン 0.1.1 で double 型の PTR オシレータを追加しました。 SyncType で Order 10 double を選べばエイリアシングノイズがかなり減ります。

フィルタは RBJ の biquad を使いました。今のところ係数を更新する式の sin と cos の計算がボトルネックになっています。