64 lines
1.5 KiB
TypeScript
64 lines
1.5 KiB
TypeScript
import { AudioDocument } from "@suaveplan/audio-core";
|
|
|
|
export function buildSineDoc(
|
|
freq: number,
|
|
sampleRate: number,
|
|
durationSamples: number,
|
|
channels = 1
|
|
): AudioDocument {
|
|
const data: Float32Array[] = [];
|
|
for (let c = 0; c < channels; c++) {
|
|
const arr = new Float32Array(durationSamples);
|
|
for (let i = 0; i < durationSamples; i++) {
|
|
arr[i] = Math.sin((2 * Math.PI * freq * i) / sampleRate);
|
|
}
|
|
data.push(arr);
|
|
}
|
|
const doc = new AudioDocument({
|
|
sampleRate,
|
|
channels,
|
|
sourceLength: 0,
|
|
});
|
|
doc.push(data);
|
|
return doc;
|
|
}
|
|
|
|
export function buildSilentDoc(
|
|
sampleRate: number,
|
|
durationSamples: number,
|
|
channels = 1
|
|
): AudioDocument {
|
|
const data: Float32Array[] = [];
|
|
for (let c = 0; c < channels; c++) {
|
|
data.push(new Float32Array(durationSamples));
|
|
}
|
|
const doc = new AudioDocument({
|
|
sampleRate,
|
|
channels,
|
|
sourceLength: 0,
|
|
});
|
|
doc.push(data);
|
|
return doc;
|
|
}
|
|
|
|
export function buildChordDoc(
|
|
pitches: number[],
|
|
sampleRate: number,
|
|
durationSamples: number
|
|
): AudioDocument {
|
|
const arr = new Float32Array(durationSamples);
|
|
for (let i = 0; i < durationSamples; i++) {
|
|
let s = 0;
|
|
for (const f of pitches)
|
|
s += Math.sin((2 * Math.PI * f * i) / sampleRate);
|
|
arr[i] = s / pitches.length;
|
|
}
|
|
const doc = new AudioDocument({
|
|
sampleRate,
|
|
channels: 1,
|
|
sourceLength: 0,
|
|
});
|
|
doc.push([arr]);
|
|
return doc;
|
|
}
|