Merge branch 'main' into multichannel_audio

This commit is contained in:
Felix Roos 2023-11-25 16:19:44 +01:00
commit 7c3dbac083
18 changed files with 319 additions and 123 deletions

View file

@ -4,7 +4,7 @@ import { getAudioContext } from './superdough.mjs';
let noiseCache = {};
// lazy generates noise buffers and keeps them forever
function getNoiseBuffer(type) {
function getNoiseBuffer(type, density) {
const ac = getAudioContext();
if (noiseCache[type]) {
return noiseCache[type];
@ -34,17 +34,26 @@ function getNoiseBuffer(type) {
output[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;
output[i] *= 0.11;
b6 = white * 0.115926;
} else if (type === 'crackle') {
const probability = density * 0.01;
if (Math.random() < probability) {
output[i] = Math.random() * 2 - 1;
} else {
output[i] = 0;
}
}
}
noiseCache[type] = noiseBuffer;
// Prevent caching to randomize crackles
if (type !== 'crackle') noiseCache[type] = noiseBuffer;
return noiseBuffer;
}
// expects one of noises as type
export function getNoiseOscillator(type = 'white', t) {
export function getNoiseOscillator(type = 'white', t, density = 0.02) {
const ac = getAudioContext();
const o = ac.createBufferSource();
o.buffer = getNoiseBuffer(type);
o.buffer = getNoiseBuffer(type, density);
o.loop = true;
o.start(t);
return {

View file

@ -262,6 +262,7 @@ export const superdough = async (value, deadline, hapDuration) => {
source,
gain = 0.8,
postgain = 1,
density = 0.03,
// filters
ftype = '12db',
fanchor = 0.5,

View file

@ -22,7 +22,7 @@ const fm = (osc, harmonicityRatio, modulationIndex, wave = 'sine') => {
};
const waveforms = ['sine', 'square', 'triangle', 'sawtooth'];
const noises = ['pink', 'white', 'brown'];
const noises = ['pink', 'white', 'brown', 'crackle'];
export function registerSynthSounds() {
[...waveforms, ...noises].forEach((s) => {
@ -36,7 +36,8 @@ export function registerSynthSounds() {
if (waveforms.includes(s)) {
sound = getOscillator(s, t, value);
} else {
sound = getNoiseOscillator(s, t);
let { density } = value;
sound = getNoiseOscillator(s, t, density);
}
let { node: o, stop, triggerRelease } = sound;