First time here? Check out the FAQ!
x

Why do sounds with different synthesis engines locked to a single value for BPM fall out of sync?

+1 vote
572 views
I've been messing around for a day or two trying to figure out how to keep a collection of complex sounds/timelines fom eventually falling out of sync, but have been completely unsuccessful.

The main issue seems to be with BPM driven Choppers vs. Samples/Oscillators triggered by BPM. Choppers stay insync with each others. Samples/Oscillators stay in sync with each other. But BPM driven Choppers do NOT stay in sync with Samples/Oscillators triggered by the same BPM. They will eventually (over several minutes) fall badly out of sync.

This happens but when all sounds are combined into a big complex sound ... or when placed in a timeline.

Is there a mathematical explanation? Is there a fix?
asked Dec 22, 2017 in Sound Design by mark-phillips (Practitioner) (990 points)

2 Answers

+1 vote
Some general guidelines for sync:

• Use a shared "master clock". In this case, that would mean to use the exact same expression (or PulseTrain) for all Sounds. If they are at multiple or submultiples of each other, it is more accurate to use the form:

1 bpm: !BPM triggerEvery: <Multiple>

than it is to use (1 bpm: !BPM / <Multiple>)

• Enter the clock expression directly in the parameter field that depends on it, not via a SoundToGlobalController

• If you run into a situation where the clocks seem to be drifting over a long period of time, send a periodic resync to the Sounds.

Suspect that the issue in this particular case is that the Chopper does not have a Trigger field so it can't take the exact same expression as the Oscillators and Samples have.
answered Dec 22, 2017 by ssc (Savant) (126,300 points)
I always entered the the clock expression directly in the parameter field and I was always using as close to the same expression/multiple as possible given the difference between the Chopper and the other sounds. I found that it didn't matter whether I used the multiple (say "4" for conceptual 16th-notes) or 1. The results were the same.

"Suspect that the issue in this particular case is that the Chopper does not have a Trigger field so it can't take the exact same expression as the Oscillators and Samples have."

I'm sure this is the case. Is there any fix for that? How would I go about accomplishing a resynch in the Chopper modules?
How is it that using the same expression in all sounds constitutes using a shared master clock?

Is it because something happens when the sound is compiled that optimises together all expressions that are identical?

Or is it because every expression is evaluated once every millisecond so identical expressions would always produce exactly the same results?

In the modular synth world I would make a master clock signal and wire that in to  every module that needs it so it has been natural for me to create clock signals using SoundToGlobalControllers but you're suggesting this is not a good idea.
Better yet, use a TransformEventValue to rewrite every occurrence of the "clock" in your Sound to a single, centralized EventExpression. That's the closest analogy to wiring every module up to the same master clock.
+2 votes

Here is an alternative form for the Chopper (using an Oscillator as the chop envelope so you can Reset its phase once per beat). This form has the advantage that you can use the exact same bpm: expression in the Reset and in the Gate fields of your other Samples and Oscillators. There are also some examples in the file using the Morph1dOscillator as the envelope so you can select a new envelope or smoothly morph from one envelope to another while the chopper is playing.

answered Dec 22, 2017 by ssc (Savant) (126,300 points)
Cool... That helps. Replaced 4 Choppers from prototype with an "oscillator" having a Glottal wavetable and my original sound as an envelope. It's still going ... locked in sync for 20 min. so far. More than I'll ever need.  ;-)
...