; Imitation of the Casio CZ-series synthesizer's ; "Resonance" waveforms using a synced ; phasor to read a sinusoid table. The jumps ; at the sync points are smoothed by multiplying ; with a windowing function controlled by the ; master phasor. ; Based on information from the Wikipedia article ; on phase distortion: ; http://en.wikipedia.org/wiki/Phase_distortion_synthesis ; by Anthony Kozar ; http://www.anthonykozar.net/ ; Sawtooth Resonance waveform. ; Smoothing function is just the inverted ; master phasor. ; The Wikipedia article shows an inverted cosine as the ; stored waveform, which implies that it must be ; unipolar for the smoothing to work. I have ; substituted a sine wave in the first phrase to ; keep the output bipolar. The second phrase ; demonstrates the much "rezzier" sound of the ; bipolar cosine due to discontinuities. instr 1 ifreq = cpspch(p4) initReson = p5 itable = p6 imaxamp = 10000 anosync init 0.0 kslavecps line ifreq * initReson, p3, ifreq amaster, async syncphasor ifreq, anosync ; pair of phasors aslave, async2 syncphasor kslavecps, async ; slave synced to master aosc tablei aslave, itable, 1 ; use slave phasor to read a (co)sine table aout = aosc * (1.0 - amaster) ; inverted master smoothes jumps adeclick linseg 0.0, 0.05, 1.0, p3 - 0.1, 1.0, 0.05, 0.0 out aout * adeclick * imaxamp endin ; Triangle or Trapezoidal Resonance waveform. ; Uses a second table to change the shape of ; the smoothing function. (This is my best ; guess so far as to how these worked). ; The cosine table works fine with the triangular ; smoothing but we once again need to use a sine ; table with the trapezoidal smoothing. ; (It might be interesting to be able to vary the ; "width" of the trapezoid. This could be done ; with the pdhalf opcode). instr 2 ifreq = cpspch(p4) initReson = p5 itable = p6 ismoothtbl = p7 imaxamp = 10000 anosync init 0.0 kslavecps line ifreq * initReson, p3, ifreq amaster, async syncphasor ifreq, anosync ; pair of phasors aslave, async2 syncphasor kslavecps, async ; slave synced to master aosc tablei aslave, itable, 1 ; use slave phasor to read a (co)sine table asmooth tablei amaster, ismoothtbl, 1 ; use master phasor to read smoothing table aout = aosc * asmooth adeclick linseg 0.0, 0.05, 1.0, p3 - 0.1, 1.0, 0.05, 0.0 out aout * adeclick * imaxamp endin f1 0 16385 10 1 f3 0 16385 9 1 1 270 ; inverted cosine f5 0 4097 7 0.0 2048 1.0 2049 0.0 ; unipolar triangle f6 0 4097 7 1.0 2048 1.0 2049 0.0 ; "trapezoid" ; Sawtooth resonance with a sine table i1 0 1 7.00 5.0 1 i. + 0.5 7.02 4.0 i. + . 7.05 3.0 i. + . 7.07 2.0 i. + . 7.09 1.0 i. + 2 7.06 12.0 f0 6 s ; Sawtooth resonance with a cosine table i1 0 1 7.00 5.0 3 i. + 0.5 7.02 4.0 i. + . 7.05 3.0 i. + . 7.07 2.0 i. + . 7.09 1.0 i. + 2 7.06 12.0 f0 6 s ; Triangle resonance with a cosine table i2 0 1 7.00 5.0 3 5 i. + 0.5 7.02 4.0 i. + . 7.05 3.0 i. + . 7.07 2.0 i. + . 7.09 1.0 i. + 2 7.06 12.0 f0 6 s ; Trapezoidal resonance with a sine table i2 0 1 7.00 5.0 1 6 i. + 0.5 7.02 4.0 i. + . 7.05 3.0 i. + . 7.07 2.0 i. + . 7.09 1.0 i. + 2 7.06 12.0 e