This script generates a frequency modulated signal. The modulation values change independently by using different Duty.kr generators.

(
{
  r=Duty.kr(Dseq([0.25,0.5], inf),0,Dseq([
    48.midicps, 60.midicps,48.midicps, 60.midicps,48.midicps, 60.midicps,
    48.midicps, 60.midicps,48.midicps, 60.midicps,48.midicps, 60.midicps,
    48.midicps, 60.midicps,48.midicps, 60.midicps,48.midicps, 60.midicps,
    48.midicps, 60.midicps,48.midicps, 60.midicps,48.midicps, 60.midicps,
    60.midicps, 60.midicps,60.midicps, 67.midicps,67.midicps, 67.midicps,
    60.midicps, 60.midicps,60.midicps, 67.midicps,67.midicps, 67.midicps,
    72.midicps, 72.midicps,72.midicps, 67.midicps,67.midicps, 67.midicps,
    72.midicps, 72.midicps,72.midicps, 67.midicps,67.midicps, 67.midicps,
  ], inf));
  f=Duty.kr(Dseq([0.5,0.25, 0.125], inf),0,Dseq([
    48.midicps, 36.midicps, 50.midicps, 36.midicps, 51.midicps, 55.midicps,
    48.midicps, 36.midicps, 50.midicps, 36.midicps, 51.midicps, 55.midicps,
    48.midicps, 36.midicps, 50.midicps, 36.midicps, 51.midicps, 55.midicps,
    48.midicps, 36.midicps, 50.midicps, 36.midicps, 51.midicps, 55.midicps,
    56.midicps, 36.midicps, 56.midicps, 36.midicps, 58.midicps, 60.midicps,
    56.midicps, 36.midicps, 56.midicps, 36.midicps, 58.midicps, 60.midicps,
    56.midicps, 36.midicps, 56.midicps, 36.midicps, 58.midicps, 60.midicps,
    56.midicps, 36.midicps, 56.midicps, 36.midicps, 58.midicps, 60.midicps,
  ], inf));
  g=Duty.kr(Dseq([0.25,0.125,0.125,0.5], inf),0,Dseq([0.1,0.2,0.1], inf));

  Pan2.ar(
    FreeVerb.ar(
      CombC.ar(
        LeakDC.ar(
          SinOsc.ar(r * BPF.ar(
            SinOsc.ar([f.lag(g), f.lag(g)+LFNoise0.ar(10,5)], SinOsc.ar(r)),
            r * SinOsc.ar(0.1,0,6,10),0.05, 30), 
            mul:1
          )
        ),
        0.75,
        0.75,
        4
      )
      ,0.1,0.9,0.1
    )
  );
}.play
)

Used in: