SerumのWavetable作成手法

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

  • Serum:FormulaによるWavatable生成
  • Serum:取り込みによるWavetable作成
    • 波形表示ウィンドウへのドラッグ
    • Indexへのドラッグ
    • シビアにやるなら
      • 不可避なグリッチには目をつぶる手法
    • 1周期ごとに切り取って書き出す手法
  • 冒険
    • 和音のWavetable登録
    • ノイズのWavetable登録

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

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

Serum : 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).

Serum : 取り込みによるWavetable作成

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

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

メイン画面または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くらいかな…。

シビアにやるなら

●不可避なグリッチには目をつぶる手法

例として、LogicのES1でC0の音程をオーディオに書き出してみます。
そうすると1周期は1348サンプルと表示されます。
1周期をどう見つけるかっていう話、先に書いておくと、見た目が同じ形を探すってだけ。逆に言うと見た目でわかりにくいものは鬼門になります。

1周期を選ぶと右上欄に1348サンプルと表示される
1周期を選ぶと右上欄に1348サンプルと表示される

SerumのWavetable編集画面のformula入力欄に1348と入力すると今度はC0 and 1centsと表示されます。これは「1348ずつ切っていってもズレは生じる」という意味(結論として、ズレの生じない音程は無い)。

読み込んだ様子
読み込んだ様子

書き出したオーディオファイルを1348で切るようにしてSerumに突っ込んでみると、やはりズレます。
ズレても音色に支障なければいいのだけど、Wavetableって結局「このテーブルのこのIndexに記録されてる波形を繰り返し再生する」仕組みなわけで、このテーブルのこのIndexの波形の右端と左端がキレイにつながらないとそこでグリッチが発生してしまうことになります。
一応そのグリッチも周期的に再生されることになる以上”音程”を阻害することにはなりませんが、”音色”に対しては「こんなピリピリした音じゃなかったハズなんだが」って事態を生じてしまいます。

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

ピリピリを軽減させてゆくなら、Wavetable編集画面のProcessメニューからX-Fade Edges (grid size)またはX-Fade Edges (16 samples)を選んで波形の両端をつなぐようにするか、一気にMorphメニューのMorph – SpectralまたはMorph – Spectral (zero fund. phase)またはMorph – Spectral (zero all phase)とすることになります。
これで思い描いた音にならないならば、この手法を諦めて別な方法に頼るしかありません。

●1周期ごとに切り取って書き出す手法

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

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

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

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

1周期になるような場所を厳密に選んで、optionを押しながらハサミで切り、リージョン群を大量に生成します。
ちょっとでも場所がズレていると、どこかのリージョンから裁断位置がおかしくなってしまうので、限りなく慎重に行うべし。

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

あとは、Logicのブラウザでオーディオリージョンのリストを表示させて、shift+Uでよけいなリージョンを消し、使うリージョン群を別名で保存(書き出す)します。
で、最後にこのオーディオファイル群をSerumのWavetable編集画面のindexリスト部分にまとめてドラッグしてくると、こんな感じにきれいに波形が0から始まる形でWavetableを構築することができます。

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

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

いずれにせよ、これらはあくまで参考程度の方法なので、便利なツールが存在する場合はそれに頼るのがいいと思います(見たことはない)。

蛇足ながら、なるべく低い音程で鳴らしたものをSerumに取り込むことにより、正確な波形の形をWavetableに記録できることになります。

冒険

和音のWaveTable登録

実験的に和音で鳴らしたサウンドをWaveTableにimportしてみると、再生音を2オクターブ〜4オクターブ下げることで雰囲気が出ました。
AbsynthのWaveTableの在り方に近いかもしれません。
ただこれ、ループでグリッチ乗りやすいのと、最小公倍数がどうしても大きくなってしまってサンプリングレートが低くなりがちなのが残念なところです。

ノイズのWaveTable登録

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

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

【関連】

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

Show “Makou Serum Presets”