
GNU OctaveでWavetableを作成する方法 Part1(初歩)
数値解析を目的したプログラミング言語のOctaveを利用して、簡単にWavetableを作成する方法を紹介します。作成した波形はSerumやAbleton Wavetableなどのオーディオインポート可能なウェーブテーブルシンセ、またはサンプラーで使用できます。
Octaveのリンク
注意
Octaveのスクリプトファイルは必ず英語表記のディレクトリに保存してください。日本語表記のフォルダに入れると、ファイルが開きません。
例
C:\user\Octave\wavetable
パッケージのインストールと使用方法
Octaveには複数のスクリプトがまとまったパッケージというものがあります。今回は、二つのパッケージをインストールします。今回の例では使用しませんが、インストールしといてください。
Signalとltfatという二つのパッケージをインストールします。Signalは音声信号処理のパッケージです。ノコギリ波や矩形波を使用できるようになります。ltfatは周波数解析のパッケージです。波形をノーマライズできる関数が含まれています。パッケージはOctaveのウェブサイトからでもダウンロードできますが、ネットに繋がった状態なら、Octaveを起動して、下記を実行すれば自動的にダウンロードとインストールされます。
pkg install -forge signal
pkg install -forge ltfat

赤く囲った所を押すとファイルの保存と実行ができます。
・Signal
・Ltfat
その他のパッケージ
https://octave.sourceforge.io/packages.php
パッケージを使用するには、pkg loadでパッケージをロードする必要があります。
pkg load signal
pkg load ltfat
これでパッケージは使用可能です。
サイン波の作成方法
初歩として一周期のサイン波(正弦波)を作成する方法を紹介します。
ファイルの名前、サンプリング周波数、波形の長さを設定します。
clear;
pkg load signal
pkg load ltfat
rootname = 'sine'; %文字列はシングルクォーテーションで定義。
extension = '.wav'; %文字列はシングルクォーテーションで定義。
FS = 44100; %サンプリング周波数 44.1khz
wl = 2048; %波形の長さ 2048sample(Serum対応)
rootnameはファイル名で、extensionはファイルの拡張子でwavに設定しています。Octaveでは、aifファイルは書き出せません。
FSはサンプリング周波数で、利用するシンセのフォーマットに合わせて変更してください。wlは波形の長さです。プラグインのWavetableシンセサイザーはワンフレームが2048サンプルの波形に対応しています。Ableton Wavetableで使用する場合は1024サンプルに設定してください。
Octaveでは行末に「 ;」を付けないとコマンドウィンドウに計算結果が出力されます。ループ処理をするときに、「 ;」を付けておかないと延々と計算結果がコマンドウィンドウに流れることになるので気を付けてください。
単一周期のサイン波
sinwave = sin(linspace(0, 2 *pi, wl+1)) ;
sinwave = sinwave(1:wl); %2048sampleまでを取得
サイン波を生成するにはsin(サイン関数)を使用します。
サイン関数の中に、linspaceという線形に配置されたベクトルを作成する関数を配置することで一周期のサイン波が作成されます。Wavetableを作成する際、linspaceは頻繁に使用する関数です。
上記のスクリプトの場合、0から2πの長さの間に2049個のサンプルを等間隔に作成します。
πは180度なので、2πで360度の一周期となります。サンプルの長さがwl+1と1サンプル追加されているのは、一周期(先端のゼロから末端のゼロ)の波形を作成するからです。しかし、オーディオとしてループすると、末端のサンプルは余分なので、sinwave(1 : wl)で波形の1から2048サンプルまでを取得して、末端の1サンプルを除去しました。
非常に分かりやすいsin関数の解説


最後にファイルをエクスポートします。
filename = [rootname, extension];
audiowrite(filename,sinwave, FS, 'BitsPerSample' , 32);
audiowrite(filename,sinwave, FS, 'BitsPerSample' , 32);
audiowriteはファイル名、出力する波形、サンプリング周波数、ビットの順に打ち込んでください。ビットの数値は8, 16 ,32と変更可能です。
clear;
pkg load signal
pkg load ltfat
rootname = 'sine';
extension = '.wav';
FS = 44100;
wl = 2048;
sinwave = sin(linspace(0, 2 *pi, wl+1)) ;
sinwave = sinwave(1:wl);
filename = [rootname, extension];
audiowrite(filename,sinwave, FS, 'BitsPerSample' , 32);
振幅の変更
振幅を変更するには、波形に対して乗算すればできます。
amp = 0.5;
sinwave = amp * sin(linspace(0, 2 *pi, wl+1)) ;
上記では, 0.5を乗算しています。これで、波形の振幅は半分となります。

周期の変更
周期を変更するには、周期の長さに対して乗算すればできます。周期が変更されることで、音の高さを変更できます。ただし、Wavetableは周期波形なので、整数倍を乗算しなければなりません。
ot = 2; %第2倍音
sinwave = sin(linspace(0, ot * 2 *pi, wl+1)) ;
ot * 2 * pi の otの部分に整数を代入してください。上記では2を代入しているので、2周期のサイン波が作成できます。すなわち、基本周波数の2倍高いサイン波ができます。

位相の変更方法
位相の変更は下記を参考に
phase = pi/2;
sinwave = sin(phase + linspace(0, 2 *pi, wl+1)) ;
π/2(4分の1の周期)の長さをを加算することで波形を25%シフトさせています。π(周期の半分)を足すことで、50%シフトします。3/2*πを足すことで75%シフトし、2*πを足すことで100%シフトします。


また、減算をすれば波形は後ろの方向にシフトします。
位相についての分かりやすい解説
波形の加算合成
今までの知識を利用し、加算合成波形を作成します。
加算合成は複数の異なる周期のサイン波を足し合わせることで音色を作成する合成方式です。

sinwave1 = sin(linspace(0, 2 *pi, wl+1)) ;
sinwave2 = sin(0.2*pi+linspace(0, 5* 2 *pi, wl+1));
sinwave3 = sin(0.4*pi+linspace(0, 3* 2 *pi, wl+1));
additive = (sinwave1 + sinwave2 + sinwave3)/3 ; %3で割る
additive = additive(1:wl+1);

今回は、基礎的な単一周期の波形作成方法を紹介しました。
次回はsignalパッケージに含まれるノコギリ波関数と矩形波関数を使用し、本格的なWavetableの作成について紹介します。
次の章へ
Octaveの基礎知識
また、OctaveはMatlabという有料のソフトウェアとも互換性があるので、Matlabのチュートリアルも参考になります。