mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-24 20:18:34 +00:00
Merge pull request #806 from Bubobubobubobubo/noises
New noise type: "crackle"
This commit is contained in:
commit
c606f86e9d
@ -1214,6 +1214,16 @@ const generic_params = [
|
|||||||
* @name waveloss
|
* @name waveloss
|
||||||
*/
|
*/
|
||||||
['waveloss'],
|
['waveloss'],
|
||||||
|
/*
|
||||||
|
* Noise crackle density
|
||||||
|
*
|
||||||
|
* @name density
|
||||||
|
* @param {number | Pattern} density between 0 and x
|
||||||
|
* @example
|
||||||
|
* s("crackle*4").density("<0.01 0.04 0.2 0.5>".slow(4))
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
['density'],
|
||||||
// TODO: midi effects?
|
// TODO: midi effects?
|
||||||
['dur'],
|
['dur'],
|
||||||
// ['modwheel'],
|
// ['modwheel'],
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { getAudioContext } from './superdough.mjs';
|
|||||||
let noiseCache = {};
|
let noiseCache = {};
|
||||||
|
|
||||||
// lazy generates noise buffers and keeps them forever
|
// lazy generates noise buffers and keeps them forever
|
||||||
function getNoiseBuffer(type) {
|
function getNoiseBuffer(type, density) {
|
||||||
const ac = getAudioContext();
|
const ac = getAudioContext();
|
||||||
if (noiseCache[type]) {
|
if (noiseCache[type]) {
|
||||||
return 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] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;
|
||||||
output[i] *= 0.11;
|
output[i] *= 0.11;
|
||||||
b6 = white * 0.115926;
|
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;
|
return noiseBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// expects one of noises as type
|
// 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 ac = getAudioContext();
|
||||||
const o = ac.createBufferSource();
|
const o = ac.createBufferSource();
|
||||||
o.buffer = getNoiseBuffer(type);
|
o.buffer = getNoiseBuffer(type, density);
|
||||||
o.loop = true;
|
o.loop = true;
|
||||||
o.start(t);
|
o.start(t);
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -241,6 +241,7 @@ export const superdough = async (value, deadline, hapDuration) => {
|
|||||||
source,
|
source,
|
||||||
gain = 0.8,
|
gain = 0.8,
|
||||||
postgain = 1,
|
postgain = 1,
|
||||||
|
density = 0.03,
|
||||||
// filters
|
// filters
|
||||||
ftype = '12db',
|
ftype = '12db',
|
||||||
fanchor = 0.5,
|
fanchor = 0.5,
|
||||||
|
|||||||
@ -22,7 +22,7 @@ const fm = (osc, harmonicityRatio, modulationIndex, wave = 'sine') => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const waveforms = ['sine', 'square', 'triangle', 'sawtooth'];
|
const waveforms = ['sine', 'square', 'triangle', 'sawtooth'];
|
||||||
const noises = ['pink', 'white', 'brown'];
|
const noises = ['pink', 'white', 'brown', 'crackle'];
|
||||||
|
|
||||||
export function registerSynthSounds() {
|
export function registerSynthSounds() {
|
||||||
[...waveforms, ...noises].forEach((s) => {
|
[...waveforms, ...noises].forEach((s) => {
|
||||||
@ -36,7 +36,8 @@ export function registerSynthSounds() {
|
|||||||
if (waveforms.includes(s)) {
|
if (waveforms.includes(s)) {
|
||||||
sound = getOscillator(s, t, value);
|
sound = getOscillator(s, t, value);
|
||||||
} else {
|
} else {
|
||||||
sound = getNoiseOscillator(s, t);
|
let { density } = value;
|
||||||
|
sound = getNoiseOscillator(s, t, density);
|
||||||
}
|
}
|
||||||
|
|
||||||
let { node: o, stop, triggerRelease } = sound;
|
let { node: o, stop, triggerRelease } = sound;
|
||||||
|
|||||||
@ -42,6 +42,10 @@ Some amount of pink noise can also be added to any oscillator by using the `nois
|
|||||||
|
|
||||||
<MiniRepl client:idle tune={`note("c3").noise("<0.1 0.25 0.5>").scope()`} />
|
<MiniRepl client:idle tune={`note("c3").noise("<0.1 0.25 0.5>").scope()`} />
|
||||||
|
|
||||||
|
You can also use the `crackle` type to play some subtle noise crackles. You can control noise amount by using the `density` parameter:
|
||||||
|
|
||||||
|
<MiniRepl client:idle tune={`s("crackle*4").density("<0.01 0.04 0.2 0.5>".slow(4)).scope()`} />
|
||||||
|
|
||||||
### Additive Synthesis
|
### Additive Synthesis
|
||||||
|
|
||||||
To tame the harsh sound of the basic waveforms, we can set the `n` control to limit the overtones of the waveform:
|
To tame the harsh sound of the basic waveforms, we can set the `n` control to limit the overtones of the waveform:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user