SerumのWavetable作成手法

少し長くなってしまったので目次

  • FormulaによるWavatable生成
  • 取り込みによるWavetable作成
    • 波形表示ウィンドウへのドラッグ
    • Indexへのドラッグ
  • Indexへのドラッグをシビアにやるなら
    • 1周期ごとに切り取る
    • すり替えによるスライス
    • 正確にIndexするために元音は低い音程で鳴らす
    • IcarusのWavetableをSerumに移植するには
  • 冒険
    • 和音のWavetable登録
    • ノイズのWavetable登録

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

UVI Falcon Wavetable [WaveList]
UVI Falcon Wavetable [WaveList]

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作成について。

Serumでの波形インポート
Serumでの波形インポート
Serumでの波形インポート
Serumでの波形インポート

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

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

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

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

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

ちなみにUVI FalconのWaveTableはFalcon Factory.ufsの中に格納されてる気配で、簡単にはエディットできなそう。
Wavetableを自作できるのは、あとはLogicのRetroSynthくらいかな…。

1周期ごとに切り取る

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

スナップでのゼロクロス指定
スナップでのゼロクロス指定

邪魔になりそうな、左端(パンの耳とでも言っておきましょう)を切り落としておきます。画面の横ズームはなるべく大きく表示させたほうがやりやすいでしょう。

左端のパンの耳を切り落としておく
左端のパンの耳を切り落としておく

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

Optionを押しながらハサミで切る (animation gif)
Optionを押しながらハサミで切る (animation gif)

あとは、Logicのブラウザでオーディオリージョンのリストを表示させて、shift+Uでよけいなリージョンを消し、使うリージョン群を別名で保存(書き出す)します。
最後にこのオーディオファイル群をSerumのWavetable編集画面のindexリスト部分にまとめてドラッグしてくると、こんな感じにきれいに波形が0から始まる形でWavetableを構築することができます。
先ほど上に載せた「ゼロクロスがズレていっちゃう」データと元は同じ波形データなんですけど、比べてどうです? こっちのほうがちゃんとしていそうでしょ。

きれいに切り出したオーディオファイル群を読み込んだ場合 (animation gif)
きれいに切り出したオーディオファイル群を読み込んだ場合 (animation gif)

すり替えによるスライス

こういう面倒そうなケースでは
こういう面倒そうなケースでは
同じ音程のサイン波など別途書き出して(phaseモードをsoftにするほうがよい)
同じ音程のサイン波など別途書き出して(phaseモードをsoftにするほうがよい)
書き出したサイン波を切り出したあと一旦このプロジェクトを閉じてファイル名を入れ替える
書き出したサイン波を切り出したあと一旦このプロジェクトを閉じてファイル名を入れ替える
きちんと自力で切った'てい'になる
きちんと自力で切った’てい’になる

高周波な倍音が強くてスライス箇所を定めづらい場合は、基音と同じサイン波なり三角波なりのオーディオデータを作成して一旦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オクターブ下げることで雰囲気が出ました。
AbsynthのWaveTableの在り方に近いかもしれません。
ただこれ、ループでグリッチ乗りやすいのと、最小公倍数がどうしても大きくなってしまってサンプリングレートが低くなりがちなのが残念なところです。

ノイズのWaveTable登録

ノイズとはランダムな発音を指すのでWaveTableには不向き…と思い込んでいたら、PlogueのTableWarp2というプラグインでそれがなされていました。

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

音程1周期のサンプル数って、

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

ってとこだと思うんで、キリのいい数字は出てこない(試算したもの→ 1周期のサンプル数試算 – Google スプレッドシート)。
その辺踏まえてSerum側でも1セント単位でピッチの補正を加えてくれるのですが、それでも取り込む波形の1周期がIndexに完全に一致することはほぼありません。
結果、取り込んだあとIndexを動かすとこういう風にゼロクロスの位置がズレていくように見えるんですよね。

indexを動かしていく様子(animation gif)
indexを動かしていく様子(animation gif)

これは仕組み上しかたなくて、「なんとなくWavetable作ってみた!」ってんならこれでいい。
問題があるとすればIndexの継ぎ目にグリッチが発生して、ノイジーに聞こえるってこと。
どうしてもそれを回避したいなら、放り込む元波形データの1周期ずつをキレイに切って書き出して、それらをまとめてIndexの欄にドラッグしてやるしかありません。
上の例のようなわかりやすい波形なら頑張れば人力でも切り出せるのだけど、倍音が多くて複雑な波形だと、作業してるうちにどこが1周期のはじめだかわからなくなります。
1周期の切り出しポイントが間違っていたとき何が起きるかというと、鳴らしてみたときにIndexの境目で音量が萎んだりIndex切替時に不規則な揺れが発生します。つまりかっこ悪い。

作業上の理想は、それ向けに自動で波形を切り出してくれるソフトを使うことなのだけども、まあ見かけた記憶ありません。
じゃあ、しょうがない。ちょっとだけ工夫して人力でもラクに切り出してやりましょう。

✎参考

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

Show “Makou Serum Presets”