【Serum】 Wavetable作成手法

Serum 謹製の WaveTable って大量にインストールされているけど、音色のリストって潤沢になればなるほど探したり辿ったりするのが面倒くさくなったり聞かないとわからなかったりで、時間かかって萎えちゃいますね。
UVI Falconのようなウォーターフォール式のグラフィックの表示を希望。

FormulaによるWavatable生成

Serumの謹製 WaveTableはMacだと下記のディレクトリに保管されていて、マニュアルもその一つ上の階層にあります。

/Library/Audio/Presets/Xfer Records/Serum Presets/Tables

また Systemのフォルダには WaveTable生成用の formula(式)がまとまっていて、たとえば…

[sin(x*pi)+(0.16*(sin(2*x*pi)+sin(3*x*pi)+sin(4*x*pi)))][Organ-ish]
[0.95-sqrt(acos(pi*x*(y-1)))][acCOSting]

という感じ。
マニュアルに載っている関数、定数、変数や論理演算子も転載しておきます。

NameArgumentsExplanation
sin1sine function
cos1cosine function
tan1tangens function
asin1arcus sine function
acos1arcus cosine function
atan1arcus tangens function
sinh1hyperbolic sine function
cosh1hyperbolic cosine
tanh1hyperbolic tangens function
asinh1hyperbolic arcus sine function
acosh1hyperbolic arcus tangens function
atanh1hyperbolic arcur tangens function
log21logarithm to the base 2
log101logarithm to the base 10
log1logarithm to the base 10
ln1logarithm to base e (2.71828…)
exp1e raised to the power of x
sqrt1square root of a value
sign1sign function -1 if x<0; 1 if x>0
rint1round to nearest integer
abs1absolute value
minvar.min of all arguments
maxvar.max of all arguments
sumvar.sum of all arguments
avgvar.mean value of all arguments
OperatorMeaningPriority
&&logical and1
||logical or2
<=less or equal4
>=greater or equal4
!=not equal4
==equal4
>greater than4
<less than4
+addition5
subtraction5
*multiplication6
/division6
^raise x to the power of y7
NameExplanation
pipi (3.141592658979323846264338)
ee (2.718281828182818281828)
wcurrent time-value getting plotted, from 0.0 to 1.0 same as (x+1)/2
xcurrent time-value getting plotted, from -1.0 to 1.0
ycurrent table number, from 0.0 to 1.0 *See Below
zcurrent table number, from -1.0 to 1.0 *See Below equivalent: (y*2)-1
qWhen a ‘q’ is preset in the formula, the function plots to the FFT bins instead of plotting the to the waveform display. q iterates from 1 to 512 for the respective harmonics/bins. **
inthe current (“old”) visible waveform value of the plotting table (changes to each old table, if using ‘y’ or ‘z’ which plots all tables)
selSimilar to “in”, but only the currently selected wavetable (does not change to each table, uses the selected table when processing the formula begins).
randa random number from -1.0 to 1.0, stays the same for all tables (precalculated for every time position).

取り込みによるWavetable作成

波形インポートによるWavetable作成について。

波形表示ウィンドウへのドラッグ

メイン画面またはWavetable編集画面の波形表示ウィンドウにオーディオファイルをドラッグしてくるとオリジナルのWavetableが生成されます。
フロッピーボタンをクリックして保存。index数次第でファイルサイズの多寡が定まります。

fixed frame sizeでのimportが推奨されています。
このとき、formula入力画面にオーディオファイルのルートノート(C1とかA0とか)を入力しておくのも大事。ルートノートってのは元となるオーディオサンプルの音程のことで、サンプラーでよく使われる用語です。ルートノートを指定しておくと、その音程に対応する1周期分のサンプル数(≒時間)をもとにオーディオサンプルを分析してくれます。
このサンプル数はSerum自身が44.1kHzを前提として計算しており、ぶっ込むオーディオファイルも44.1kHzで用意するのが妥当です。

Indexへのドラッグをシビアにやるなら

WaveTable編集画面下部のIndex欄(波形が横並びにズラッと配置されている部分)にオーディオファイル群をドラッグしてくると、順にIndexに登録してくれます。
元のオーディオファイルを1周期分で切り出しておくと非常に良好な状態でIndex化されます(次の項で例を示します)。

1周期ごとに切り取るには?

オーディオデータをLogic上でスライスしちゃうことが可能です。
まずはメインウィンドウのスナップメニューでスナップ単位を「サンプル」にし、ゼロクロッシングでのスナップもOnにしておきます。

次に波形データで左端を切り落としておきます(なぜこの手順が必要かはいずれわかります)。画面の横ズームはなるべく大きく表示させたほうがやりやすいでしょう。

1周期になるような場所を厳密に選んで、optionを押しながらハサミで切り、リージョン群を大量に生成します。
これによって、ほぼ同じ長さのオーディオリージョンがゼロクロス位置で裁断されるように切られます。
ちょっとでも場所がズレていると、どこかのリージョンから裁断位置がおかしくなってしまうので、ズーム表示を活用して精密に切るべし(下図参照)。

あとは、Logicのブラウザでオーディオリージョンのリストを表示させて、shift+Uでよけいなリージョンを消し、使うリージョン群を別名で保存(書き出す)します。この手順をラクにする方法については割愛します。

最後にこのオーディオファイル群をSerumのWavetable編集画面のindexリスト部分にまとめてドラッグしてくると、こんな感じにきれいに波形が0から始まる形でWavetableを構築することができます。
先ほど上に載せた「ゼロクロスがズレていっちゃう」データと元は同じ波形データなんですけど、比べてどうです? こっちのほうがちゃんとしていそうでしょ。

💡 1サイクルとズレ

本来、音程1周期のサンプル数って、割り切れる数字として出てはきません。

(サンプリング周波数)/440×2(音程差)/12

これを踏まえてSerumも1セント単位でピッチの補正を加えてくれてるのですが、それでも完全にピッタリになることはほぼありません。
結果、取り込んだあとIndexを動かすと上の画像の左側のようにゼロクロスの位置がズレていくように見えるんですね。
これは仕組み上しかたない。
ただIndexの継ぎ目にグリッチが発生して、ノイジーに聞こえるのが事実。

理想は、自動で波形を1周期ずつ切り出してくれるソフトがあればなのだけど、見かけた記憶はありません。
その代わり、VitalやIcarusなど別のソフトシンセのWavetable編集機能で加工したものを書き出してSerumに読み込んだり、あるいはSerumの出力波形をSerum自身に再読み込みする機能などを活用したり、Wavetableを生成するソフトを使うなど、プランB,Cがいくつかあります。

すり替えによるスライス

高周波な倍音が強くてスライス箇所を定めづらい場合は、基音と同じサイン波なり三角波なりのオーディオデータを作成して一旦1サイクルごとスライスしたのち(Logicのプロジェクトを閉じて)、スライスすべきオーディオデータとファイル名をすり替えてやることで正確な1サイクルのスライスを得ることができます。

めったにないことですが、取り込む対象の音色を発する音源…これはソフトシンセでもハードシンセでも声でもいいのですが、そのピッチがサイン波側のピッチと完全に一致しないと結局スライス位置がズレます。
Tone2 Icarusはわずか1セントですが他のシンセよりピッチが高いので、この手法で完璧にスライスするには、あらかじめピッチを1セント下げておく必要があります。

💡 正確にIndexするために元音は低い音程で鳴らす

蛇足ながら、豊かな倍音をなるべく正確にオーディオデータとして記録するためには、元の音色をなるべく低い音程で鳴らすべきです。
また低い音程で書き出したほうが圧倒的にオーディオをスライスしやすく、一石二鳥。

💡 IcarusのWavetableをSerumに移植するには

Icarusから書き出したWavetable(serumもそうだがWAVデータになる)をSerumにドラッグしてくる際に、formula欄に2048を指定しておくとよいかと思います。

なお、LogicのRetro SynthのTableはSerumやIcarusと仕組みが違って倍音の分布を検出してからIndexを得る仕組みになっているっぽく、早い話、基音を検出しにくい音色はWavetable化されにくいようです。

いろいろ試してみよう

和音のWaveTable登録

和音で鳴らしたサウンドをWaveTableにimportしてみると、再生音を2オクターブ〜4オクターブ下げることで雰囲気が出ました。
ただこれ、グリッチが乗りやすいのと、1周期分がどうしても大きくなってしまいがちなので、かなりしんどい。
和音であることを保持しつつ周期に対して効率を上げるには、マイクロチューニングに手を出す必要があるなど、あちらを立てればこちらが立たず的なシガラミだらけで、一筋縄にいきません。

ノイズのWaveTable登録

PlogueのTableWarp2ではWavetableでノイズを発生させる仕組みが実装されています。

これを参考にLFOやEGでIndexが切り替わるようにしてノイズを登録したら、難しいけどそれなりな感じでノイズを発音させることもできました。
SerumのNoiseオシレーターに登録できるともっといいんですけどねえ。

KVR Forum: Xfer Serum advanced algorithm tutorial - Instruments Forum
KVR Audio Forum - Xfer Serum advanced algorithm tutorial - Instruments Forum
さまざまな顔を描画できる数式
人工知能的検索エンジン「Wolfram|Alpha」には、著名人の顔を数式を使って曲線で描いたコレクションがある。これらの線画はどのようにして作成されているのだろうか。
Algorithmic symphonies from one line of code -- how and why?
Lately, there has been a lot of experimentation with very short programs that synthesize something that sounds like music. I now want to sha...

ザクザク作ってみたものをGumroadで販売しています。

Makou SerumPresets
https://www.makou.com/wavetable-making-on-serum/