First time here? Check out the FAQ!

Ensuring no clicks with Voice stealing

0 votes
I have a multisample using a Replicator, triggering samples and controlling various parameters using the logic...

((!Gate countTriggersMod: ?NumberVoices) eq: (?VoiceNumber - 1)) sampleAndHold: !Volume

If I have four copies of the sound, and Voice 1 is playing back a sample, I know that if I get back to Voice 1 and the sample hasn't finished playing, I sometimes get clicks triggering the new sample since the sound cuts out wherever it is playing (non-zero).  When voices cycle, is there a way to check for nearest zero-crossing or amplitude >0, and pull-down volume as appropriate on that specific voice?

Release field of Multisample won't exactly work since sample triggering doesn't happen at a regular rate.
I'm strapped on memory, so adding more voices won't solve my issue...
I'm thinking I would need some type of delay to check ?VoiceNumber against its amplitude value before triggering, but I'm having a hard time figuring out how to access any Voice before it triggers the sample...

Thanks for any help.
asked May 1, 2017 in Capytalk & Smalltalk by jonbellona (Adept) (1,300 points)

1 Answer

+1 vote
Best answer

To activate voice-stealing behavior, the value in the Multisample's Gate field should go to a negative number for 5 milliseconds before becoming positive (and gating the sound on).

Here is an example of how to do this. Use the same expression for the Gate on any of the values you want to sample and hold.

answered May 1, 2017 by ssc (Savant) (124,970 points)
selected May 4, 2017 by jonbellona
I think the voicestealing system in Kyma is great. It would be handy to have a Capytalk command that could serve as a short cut...

 example:  (1 repeatingRamp: 20 s) withVoiceStealing
or something along those lines
very good idea!
I just implemented and YES! No more clicks. Understanding the VoiceStealing logic was really helpful, and I think this also addresses some of my other sonic problems involving gates and clicks in the sound output. Many kudos.

For community reference, here's the working VoiceStealing in context with my logic (as initially referenced): (((!Gate countTriggersMod: ?NumberVoices) eq: (?VoiceNumber - 1)) fullRamp: 10 ms) sampleAndHold: !Volume

I second Cristian's request. Easier to remember and recognize in code (withVoiceStealing as opposed to fullRamp: 10ms). For now, onward with the fullRamp!