解説/アルゴリズム
const f0: number = 440;
const samplingRate: number = 44100;
const duration: number = 2;
const len: number = samplingRate * duration;
const amp: number = 1;
const audioContext: AudioContext = new AudioContext();
const buffer: AudioBuffer = audioContext.createBuffer(1, len, samplingRate);
const array: Float32Array = buffer.getChannelData(0);
for (let i: number = 0; i < len; i++) {
array[i] = generateSample(i);
}
function generateSample(i: number): number {
return amp * Math.sin((i * f0 * Math.PI * 2) / samplingRate);
}
const src: AudioBufferSourceNode = audioContext.createBufferSource();
src.buffer = buffer;
src.connect(audioContext.destination);
src.start();
- 周波数
- 1 秒間あたりの振動数。
- この値で、音の高さ(ドレミ…)が決まる。
- 標本化周波数
- 1 秒間に何回値を取り出すかの数。
- 人間の耳だと 1 秒間に 20,000 回の振動数があれば十分で、標本化定理から 2 倍以上である 44,100 を指定している。
- サンプリング数
- 標本化周波数が 1 秒間に値を取り出す回数なので、それに実際の音の長さを掛けたものがサンプリング数になる。
- 振幅
- サイン波の振動を拡縮させるもので、音の大きさを表す。