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 |