みさご解体新書

12平均律音階

解説/アルゴリズム

const f0: number = 523.25; // 周波数
const samplingRate: number = 44100; // 標本化周波数
const duration: number = 1.0; // 音データの長さ
const len: number = samplingRate * duration; // サンプリング数
const amp: number = 1; // 振幅
const maxScale: number = 12; // 音階
const ratio: number = 1.0595; // 次の音の高さへの比率

const audioContext: AudioContext = new AudioContext();
const buffer: AudioBuffer = audioContext.createBuffer(
  1,
  len * maxScale,
  samplingRate
);
const array: Float32Array = buffer.getChannelData(0);
for (let i: number = 0; i < maxScale; i++) {
  for (let j: number = 0; j < len; j++) {
    const index: number = i * len + j;
    array[index] = generateSample(index, i);
  }
}

function generateSample(i: number, scale: number): number {
  const f: number = f0 * Math.pow(ratio, scale);
  return amp * Math.sin((i * f * Math.PI * 2) / samplingRate);
}

const src: AudioBufferSourceNode = audioContext.createBufferSource();
src.buffer = buffer;
src.connect(audioContext.destination);

document.addEventListener("DOMContentLoaded", () => {
  const button = document.createElement("button");
  button.textContent = "再生する";
  button.addEventListener("click", () => {
    src.start();
  });
  document.body.appendChild(button);
});

12 平均律音階は、1 オクターブあたり 12 個の音の高さから構成される。

音名 音名(ドレミ) Hz
C5 523.25
C#5 ド# 554.37
D5 587.33
D#5 レ# 622.25
E5 659.26
F5 ファ 698.46
F#5 ファ# 739.99
G5 783.99
G#5 ソ# 830.61
A5 880.00
A#5 ラ# 932.33
B5 987.77