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]
という感じ。
マニュアルに載っている関数、定数、変数や論理演算子も転載しておきます。
Name | Arguments | Explanation |
---|---|---|
sin | 1 | sine function |
cos | 1 | cosine function |
tan | 1 | tangens function |
asin | 1 | arcus sine function |
acos | 1 | arcus cosine function |
atan | 1 | arcus tangens function |
sinh | 1 | hyperbolic sine function |
cosh | 1 | hyperbolic cosine |
tanh | 1 | hyperbolic tangens function |
asinh | 1 | hyperbolic arcus sine function |
acosh | 1 | hyperbolic arcus tangens function |
atanh | 1 | hyperbolic arcur tangens function |
log2 | 1 | logarithm to the base 2 |
log10 | 1 | logarithm to the base 10 |
log | 1 | logarithm to the base 10 |
ln | 1 | logarithm to base e (2.71828…) |
exp | 1 | e raised to the power of x |
sqrt | 1 | square root of a value |
sign | 1 | sign function -1 if x<0; 1 if x>0 |
rint | 1 | round to nearest integer |
abs | 1 | absolute value |
min | var. | min of all arguments |
max | var. | max of all arguments |
sum | var. | sum of all arguments |
avg | var. | mean value of all arguments |
Operator | Meaning | Priority |
---|---|---|
&& | logical and | 1 |
|| | logical or | 2 |
<= | less or equal | 4 |
>= | greater or equal | 4 |
!= | not equal | 4 |
== | equal | 4 |
> | greater than | 4 |
< | less than | 4 |
+ | addition | 5 |
– | subtraction | 5 |
* | multiplication | 6 |
/ | division | 6 |
^ | raise x to the power of y | 7 |
Name | Explanation |
---|---|
pi | pi (3.141592658979323846264338) |
e | e (2.718281828182818281828) |
w | current time-value getting plotted, from 0.0 to 1.0 same as (x+1)/2 |
x | current time-value getting plotted, from -1.0 to 1.0 |
y | current table number, from 0.0 to 1.0 *See Below |
z | current table number, from -1.0 to 1.0 *See Below equivalent: (y*2)-1 |
q | When 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. ** |
in | the current (“old”) visible waveform value of the plotting table (changes to each old table, if using ‘y’ or ‘z’ which plots all tables) |
sel | Similar to “in”, but only the currently selected wavetable (does not change to each table, uses the selected table when processing the formula begins). |
rand | a 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オシレーターに登録できるともっといいんですけどねえ。
ザクザク作ってみたものをGumroadで販売しています。