Auto call functions in kabel; clean up end behavior of worklet; move kabel first in chain; write docstring

This commit is contained in:
Aria 2026-01-08 12:31:26 -06:00
parent fd2ff255e5
commit d4b3a3b972
5 changed files with 81 additions and 14 deletions

View file

@ -610,6 +610,19 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5)
gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future
delaytime = delaytime ?? cycleToSeconds(delaysync, cps);
// Kabelsalat
if (fx.workletSrc !== undefined) {
const workletNode = getWorklet(ac, 'generic-processor', {});
chain.connect(workletNode);
const workletSrc = fx.workletSrc
.replace(/\bpat\[(\d+)\]/g, (_, i) => fx.workletInputs[i])
.replaceAll('sFreq', getFrequencyFromValue(value))
.replaceAll('sGate', `cc('strudel-gate-${chainID}')`);
/* global compileKabel */
const { src, ugens, registers } = compileKabel(workletSrc);
workletNode.port.postMessage({ src, schema: { ugens, registers }, start: t, gateEnd: end, end: endWithRelease });
}
if (fx.stretch !== undefined) {
const phaseVocoder = getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: fx.stretch });
chain.connect(phaseVocoder);
@ -847,17 +860,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5)
filterChain.forEach((f) => chain.connect(f));
chain.audioNodes.push(lfo);
}
if (fx.workletSrc !== undefined) {
const workletNode = getWorklet(ac, 'generic-processor', {});
chain.connect(workletNode);
const workletSrc = fx.workletSrc
.replace(/\bpat\[(\d+)\]/g, (_, i) => fx.workletInputs[i])
.replaceAll('sFreq', getFrequencyFromValue(value))
.replaceAll('sGate', `cc('strudel-gate-${chainID}')`);
/* global compileKabel */
const { src, ugens, registers } = compileKabel(workletSrc);
workletNode.port.postMessage({ src, schema: { ugens, registers }, start: t, end });
}
// delay
if (key !== 'main' && delay > 0 && delaytime > 0 && delayfeedback > 0) {
const dry = gainNode(1);

View file

@ -1496,9 +1496,11 @@ class GenericProcessor extends AudioWorkletProcessor {
src,
schema: { ugens, registers },
start,
gateEnd,
end,
} = event.data;
this.start = start;
this.gateEnd = gateEnd;
this.end = end;
this.registers = new Array(registers).fill(0);
this.src = `o.fill(0); // reset outputs\n${src}`;
@ -1526,7 +1528,10 @@ class GenericProcessor extends AudioWorkletProcessor {
}
process(inputs, outputs) {
const input = inputs[0]?.[0];
if (this.genSample === undefined || currentTime < this.start) {
if (currentTime > this.end) {
return false;
}
else if (this.genSample === undefined || currentTime < this.start) {
// pending
return true;
} else if (input === undefined) {
@ -1535,7 +1540,7 @@ class GenericProcessor extends AudioWorkletProcessor {
return !this.started;
}
this.started = true;
if (!this.gateEnded && currentTime > this.end) {
if (!this.gateEnded && currentTime > this.gateEnd) {
this.gateNode?.setValue(0);
this.gateEnded = true;
}