diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index ec44e8af7..03a4c3da8 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -613,7 +613,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // Kabelsalat if (fx.workletSrc !== undefined) { - const workletNode = getWorklet(ac, 'generic-processor', {}); + const workletNode = getWorklet(ac, 'generic-processor', {}, { outputChannelCount: [2] }); chain.connect(workletNode); const workletSrc = fx.workletSrc .replace(/\bpat\[(\d+)\]/g, (_, i) => fx.workletInputs[i]) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 6969ee2c3..26a0fa668 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1540,12 +1540,20 @@ class GenericProcessor extends AudioWorkletProcessor { this.gateNode?.setValue(0); this.gateEnded = true; } - const outL = outputs[0][0]; - const outR = outputs[0][1] ?? outputs[0][0]; + const output = outputs[0]; + const outL = output[0]; + const outR = output[1]; for (let n = 0; n < blockSize; n++) { this.genSample(this.playPos, this.nodes, input ? input[n] : 0, this.registers, this.outputs, this.sources); - outL[n] = this.outputs[0]; - outR[n] = this.outputs[1]; + const left = this.outputs[0]; + const right = this.outputs[1]; + // Spread to stereo if possible; else mixdown to mono + if (outR) { + outL[n] = left; + outR[n] = right; + } else { + outL[n] = 0.5 * (left + right); + } this.playPos += 1 / sampleRate; } return true;