diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 8f202579d..2f6ad487c 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -963,6 +963,60 @@ export const { delaytime, delayt, dt } = registerControl('delaytime', 'delayt', * */ export const { lock } = registerControl('lock'); + + +/** + * Sets the level of the delay signal. + * + * When using mininotation, you can also optionally add the 'delaytime' and 'delayfeedback' parameter, + * separated by ':'. + * + * + * @name shimmer + * @param {number | Pattern} level between 0 and 1 + * @example + * s("bd bd").shimmer("<0 .25 .5 1>") + * @example + * s("bd bd").shimmer("0.65:0.25:0.9 0.65:0.125:0.7") + * + */ +export const { shimmer } = registerControl(['shimmer', 'delaytime', 'delayfeedback']); + + +/** + * Sets mix of the chorus effect + * + * When using mininotation, you can also optionally add the 'delaytime' and 'delayfeedback' parameter, + * separated by ':'. + * + * + * @name chorus + * @param {number | Pattern} level between 0 and 1 + * @example + * + */ +export const { chorus } = registerControl(['chorus', 'chorusdepth', 'chorusspeed']); + +/** + * Sets depth of modulation + * + * @name chorus + * @param {number | Pattern} depth between 0 and 1 + * @example + * + */ +export const { chorusdepth } = registerControl(['chorusdepth']); + +/** + * Sets depth of modulation + * + * @name chorusspeed + * @param {number | Pattern} frequency + * @example + * + */ +export const { chorusspeed } = registerControl(['chorusspeed'], 'chorusfreq'); + /** * Set detune for stacked voices of supported oscillators * diff --git a/packages/core/util.mjs b/packages/core/util.mjs index bc8440570..6a7484d81 100644 --- a/packages/core/util.mjs +++ b/packages/core/util.mjs @@ -373,7 +373,7 @@ export class ClockCollator { getTargetClockTime = getUnixTimeSeconds, weight = 16, offsetDelta = 0.005, - checkAfterTime = 2, + checkAfterTime = 0.5, resetAfterTime = 8, }) { this.offsetTime; @@ -417,6 +417,7 @@ export class ClockCollator { this.offsetTime = rollingOffsetTime; } } + return this.offsetTime; } diff --git a/packages/osc/osc.mjs b/packages/osc/osc.mjs index 4b9ab14e7..b8843be39 100644 --- a/packages/osc/osc.mjs +++ b/packages/osc/osc.mjs @@ -50,6 +50,12 @@ export function parseControlsFromHap(hap, cps) { } controls.bank && (controls.s = controls.bank + controls.s); controls.roomsize && (controls.size = parseNumeral(controls.roomsize)); + if (controls.sustain != null) { + controls.hold = controls.sustain; + delete controls.sustain; + } + + // speed adjustment for CPS is handled on the DSP side in superdirt and pattern side in Strudel, // so we need to undo the adjustment before sending the message to superdirt. controls.unit === 'c' && controls.speed != null && (controls.speed = controls.speed / cps); @@ -64,7 +70,6 @@ export async function oscTrigger(t_deprecate, hap, currentTime, cps = 1, targetT const osc = await connect(); const controls = parseControlsFromHap(hap, cps); const keyvals = Object.entries(controls).flat(); - const ts = Math.round(collator.calculateTimestamp(currentTime, targetTime) * 1000); const message = new OSC.Message('/dirt/play', ...keyvals); const bundle = new OSC.Bundle([message], ts);