のこぎり波は三角波と似ていますが最初と最後が急になっています。0地点でいきなり最大音量になります。ここは矩形波と似ています。しかしそのあとは1周期ずっと減少し続け1周が終わるところで最小音量になります。直線的に音量が変わるところは三角波に似ています。その後次の周期に入った瞬間にまた最大音量になるという繰り返しです。
Javaで三角波のWavファイルを作成する
Javaで矩形波のオシレーターを作る
Javaでサイン波のオシレーターを作成する
のこぎり波のグラフ
グラフでみればイメージがつくと思います。

音量を決めるロジック
パターン分けがないので三角波より簡単です。
| x | 音量 | 式 |
|---|---|---|
| 0から1まで | 1から-1まで減少 | (0.5 – x) * 2 |
Javaで記述すると以下のようになります。
double point = (0.5 - x) * 2.0;
のこぎり波のオシレーターのコード
三角波と同様に矩形波のオシレーターをコピーして少し変えて作りました。
package mocha.sound;
public class SawOscillator implements Oscillatable {
double t;
double delta_t;
public SawOscillator(double sample_rate) {
t = 1.0 / sample_rate;
delta_t = 0;
}
@Override
public double read(double freq, double volume) {
double x = delta_t - Math.floor(delta_t);
double point = (0.5 - x) * 2.0;
delta_t += freq * t;
return point * volume;
}
}
実行処理もクラス名の書き換えだけです。
SampleWav ss = new SampleWav(new SawOscillator(SAMPLE_RATE), 440, 3);
AudioSystem.write(
new AudioInputStream(ss, ss.getFormat(), ss.length()),
AudioFileFormat.Type.WAVE, new File("/Users/myaccount/mywork/saw_440.wav"));
実行結果
実行した結果は以下の通りです。サイズ節約のためwavファイルはmp3に変換してあります。
三角波より少し硬い音になっています。以下参考のための三角波です。
また矩形波とも聴き比べてください。以下参考のための矩形波です。