I suspect I should provide an example. Here's a working SynthDef that Tom wrote most of:

  foo :: SynthDef '["gate"]
  foo = sd (1 :: I "gate") $ do
    e <- adsrGen 1 1 0.5 1
      (Curve_Curve $ 0)
      (gate_ (V::V "gate"))
    s <- e ~* sinOsc (freq_ (500 ~+ (100 ~* e)))
    out 0 [s,s]

And here's a use of it, which also works:

  test pauseLength = doScheduledIn 0.1 $ test' pauseLength
  test' pauseLength = do
    s <- synth foo () -- Start the ADSR envelope. By default gate=1.
    wait 2

    set s (0 :: I "gate") -- Trigger the R phase.
    wait pauseLength
    -- The next "gate" signal will only retrigger the AD phase if
    -- the R phase is allowed to progress for something like a millisecond.
    -- (To see this, try running `test 0.01` vs. `test 0.0001`.)

    set s (1 :: I "gate") -- Maybe retrigger the AD phase.
    wait 2

    free s

Thus by dancing the right dance with its "gate" input, we can get an adsrGen to retrigger. I'm hoping there's a similar way to get the percGen to retrigger, but with only one message instead of two.

On Sun, Jul 8, 2018 at 2:20 PM Jeffrey Brown <jeffbrown.the@gmail.com> wrote:
I spoke a little too soon. I am able to retrigger a "sustainning" envelope like ADSR or ASR, but only awkwardly.

Those envelopes take a "gate" argument. (I'm taking these terms from the SuperCollider built-in documentation.) When "gate" is positive, the envelope is "open", which means that it will not progress past the sustain portion of the curve. When the gate signal becomes zero, the gate is "closed", and will move from sustain to release.

I can't retrigger an open envelope. I've got to close it by sending a gate=0 signal, and then wait about a milisecond, before sending a gate=1 signal to open it again. This has the desired effect: The envelope value rises again as in the attack phase, before the release phase reaches zero.

So I was hoping to be able to do something similar with the "fixed-length" envelopes like Env.perc (Vivid's percGen) or Env.linen (Vivid's linen). In the SC documentation for Env, it describes the gate parameter in the following way: "If the Env is fixed-length (e.g. Env.linen, Env.perc), the gate argument is used as a simple trigger. If it is an sustaining envelope (e.g. Env.adsr, Env.asr), the envelope is held open until the gate becomes 0 ..." That led me to think maybe I can send gate=1 repeatedly to a percGen in order to retrigger it before it has gone to zero.

But percGen has no gate argument!

Am I trying to do something that's possible?


On Sat, Jul 7, 2018 at 11:15 PM Jeffrey Brown <jeffbrown.the@gmail.com> wrote:
Solved!

On Sat, Jul 7, 2018 at 6:43 PM Jeffrey Brown <jeffbrown.the@gmail.com> wrote:
This is awesome!

What if the voice persisted and you needed to retrigger the envelope later? I'm imagining a resonating guitar string: It's continuously making sound, but every now and then the player strikes it again. Or someone playing monophonic slide violin: They might want to play an F# for a while, then slide into an A. Or a didgeridoo: The sound is in a steady state, then the player makes a "pew" noise, and then the didge settles back into another (usually the same) steady state. 

In the first case there's an amplitude envelope that's (probably) in its decay portion when it is retriggered. In the second there's a frequency envelope that's (probably) reached its sustain portion when it is retriggered to go to a new frequency.

This might dovetail with an earlier question about sending strings to synths. The synth needs to react not to a parameter change that persists, but rather to a momentary instruction -- something like what the Max/MSP community calls a "bang".

Actually in the slide violin case the synth would also receive a new frequency value. And I can imagine writing a synth that has a rule like "when the frequency changes, slide into it logarithmically over the course of 100 ms". So maybe you wouldn't need bang-like messages in some cases. But in the case of re-striking a resonating guitar string, or making a "pew" sound into a didge, it might be that none of the steady-state parameters needs changing; the envelope just needs to be re-triggered.

Expressible?

On Sat, Jul 7, 2018 at 12:36 AM <amindfv@gmail.com> wrote:
I unfortunately need to log out but here's something to get you started:

foo = sd (1 :: I "gate") $ do
   e <- adsrGen 0.2 0.1 0.6 0.7 (Curve_Curve (-4)) (gate_ (V::V "gate"))
   s <- e ~* sinOsc (freq_ $ midiCPS 50)
   out 0 [s,s]

main = do
   s <- synth foo ()
   wait 1
   release s

El 6 jul 2018, a las 23:03, Jeffrey Brown <jeffbrown.the@gmail.com> escribió:

So far I'm able from Vivid to create continuously-running signal architectures and change their parameters over time. Next I want to create a "snare" (some noise with a brief amplitude envelope) and a "kick" (a sine wave with a quickly descending frequency).

Is there an idiom for that?


--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github   
_______________________________________________
Livecode mailing list -- livecode@we.lurk.org
To unsubscribe send an email to livecode-leave@we.lurk.org
_______________________________________________
Livecode mailing list -- livecode@we.lurk.org
To unsubscribe send an email to livecode-leave@we.lurk.org


--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github   


--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github   


--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github   


--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github