みさご解体新書

サイン波

解説/アルゴリズム

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 秒間に値を取り出す回数なので、それに実際の音の長さを掛けたものがサンプリング数になる。
  • 振幅
    • サイン波の振動を拡縮させるもので、音の大きさを表す。