gen~ woes (history/sah)
Hi
I am using a gen algorithm to generate a mutable ramp, with a built in phase offset of 50% of ramp size. To avoid spikes/clicks when I vary the ramp duration I have added a history/sah pair but this doesn't solve my spikes/clicks issue. The unshifted ramp is clean, the shifted ramp dirty. can someone assist please?
Please find a simple patch below:
This seems to take care of it. You might want to up the minimum frequency requirement in the clamp so you don't get stuck on a really long, low frequency for a long time...
Perversely, the solution was to sah the main oscillator, not the slave.
It does indeed Peter; again, many thanks. As I am restricting the duration to c. 1000/10-200 Hz, and the interonset to >=0, could I just set the clamp to that range?
I had tried various values and routing of the sah/history and trigger-source.I did notice, in my original above, that changing the sah trigger threshold had some strange results. Therefore, can I ask why history ---> == 0 ---> sah0.5 works "better"?
I can now surge ahead with what I promise will be a very VERY flexible and clean granular stretch/playback/synthesis tool.
Brendan
The problem with your original is that you had a threshold of 0, which a phasor will never go below. (I think it has to go below the threshold, not just to it)
I like to use 0.5 when I'm triggering SAH with binary values. I avoid phasor -> sah 0.001 because I like to time it more precisely to the start of the cycle. My preferred means is delta -> abs -> > 0.5, but it seemed like overkill since we can guarantee that the frequency will be positive.
update:
Your sah method works well, but a problem persists: thanks to your input I have successfully set up a sah inside gen to pass the size value out at the end of an entire single ramp, but sah-ing this signal for the shifted version continues to prove a headache. No matter which sah method I use, or whence I derive the control signal, the shifted window continues to exhibit spikes. Again, the simple patch below describes the the 3 steps I've taken to get from no spikes, to independent pitch/size, to spikes returning:
Brendan
ps
it should be pointed out that the reason I need to use sah is to avoid not only spikes, but also to "hide" unwanted pitch variation during changes to ramp size; I'm going for completely independent grain size and pitch......
I was a bit confused what the goal was; having independent control of the period between grains doesn't seem to match up with having grains 50% out of phase; see the waveforms here:
... sorry, posted too soon, didn't finish what I was trying to say...
If the goal is that grains always smoothly overlap at 50% phase, then the period between grains will always be grainsize/2. Which can make the patch design a lot simpler I think.
But maybe I've misunderstood the goal. You said you wanted a granulator with independent pitch & grain size; this can be done without needing the 50% overlap mechanics....
There are a few granulation/shifting/stretching patches in the gen examples folder, which show a few different techniques. There can be more.
Hi Graham
thanks for taking the time to respond to this question, and you're quite right, some clarification is needed:
[1] 50%phase offset should be immutable, irrespective of mute duration, therefore;
[2] delay offset is a function of size;
[3] gen sampling/holding of size signal is required so it can be passed back out to the first multiplier (ramp*size[via sah]=no pitch variation)
I have also restated and simplified this question, here:
https://cycling74.com/forums/gen-issue-clarified-and-restated
ps
the single issue, as I see it, lies here. I'm just waiting for someone to say "if you don't know how to use gen~ then don't use it!!!!"
My single question is, how can I correctly sample and hold the size value for the shifted window, so there are no discontinuity clicks/spikes in the offset window. No such discontinuities appear in the non-shifted window.
Best regards
Brendan
thread has moved here:
Uh, I'm going to reply here because the other thread seems to have a different tangent...
I'm on the cellphone so I can't post a patcher, but the simplest sample/hold is a [?] and [history] pair. Hook the out of the history to the last input of the [?]. Hook the out of the [?] to the in of the [history]. Hook whatever source to sample to the middle inlet of [?]. Hook your trigger condition up to the first input of [?].
E.g. the trigger condition could be when the ramp phase is >= the ramp length. If the trigger for the sample & hold is further down the signal flow, you'll need to add another history to handle this feedback.
There should also be a way to do this without needing to use a delay, but it might mean re-thinking the ramps in terms of sample counters rather than phasors.
Also take a look again at some of the slicer / pitch-shifter / chopper etc. examples in the gen examples folder; I know that some of them also do smooth parameter updates.
Hi Graham
yes, I've been browsing the gen examples you cite and the pitchshifter has a nice phase-modulation algorithm I've been trying emulate.
A contributory factor in my struggles with this is that I've tried to get very smooth grains (using phase-mod, size/freq mod, fixed phase-shift) in a strictly monophonic grain player, with the intention of polyphon-izing it later. What I'm doing now is fixing such parameters and then randomizing them in a polyphonic version.
Thanks again for your help
Brendan
Hi.It's a very old problem isn't it. This could help:
And I welcome comment for a future toolbox contribution.