class library: DUGen - the server now handles audio-rate inputs correctly
[supercollider.git] / SCClassLibrary / Common / Audio / Demand.sc
blob88e9cea29695ff1b94fb77e9bc1d75a3a65b7ac0
1 Demand : MultiOutUGen {
2         *ar { arg trig, reset, demandUGens;
3                 ^this.multiNewList(['audio', trig, reset] ++ demandUGens.asArray)
4         }
5         *kr { arg trig, reset, demandUGens;
6                 ^this.multiNewList(['control', trig, reset] ++ demandUGens.asArray)
7         }
8         init { arg ... argInputs;
9                 inputs = argInputs;
10                 ^this.initOutputs(inputs.size - 2, rate)
11         }
12         checkInputs { ^this.checkSameRateAsFirstInput }
15 Duty : UGen {
17         *ar { arg dur = 1.0, reset = 0.0, level = 1.0, doneAction = 0;
18                 ^this.multiNew('audio', dur, reset, doneAction, level)
19         }
20         *kr { arg dur = 1.0, reset = 0.0, level = 1.0, doneAction = 0;
21                 ^this.multiNew('control', dur, reset, doneAction, level)
22         }
23         checkInputs {
24                 ^if(inputs.at(0).rate === \demand) {
25                         if (inputs.at(1).rate !== \demand and: { inputs.at(1).rate !== \scalar } and:
26                                 { inputs.at(1).rate !== rate }) {
27                                 ("reset input is not" + rate + "rate: " + inputs.at(1) + inputs.at(1).rate);
28                         }
29                 } {
30                         this.checkValidInputs
31                 }
32         }
35 TDuty : Duty {
36         *ar { arg dur = 1.0, reset = 0.0, level = 1.0, doneAction = 0, gapFirst = 0;
37                 ^this.multiNew('audio', dur, reset, doneAction, level, gapFirst)
38         }
39         *kr { arg dur = 1.0, reset = 0.0, level = 1.0, doneAction = 0, gapFirst = 0;
40                 ^this.multiNew('control', dur, reset, doneAction, level, gapFirst)
41         }
44 // old version with gap first
45 TDuty_old  {
46         *ar { arg dur = 1.0, reset = 0.0, level = 1.0, doneAction = 0;
47                 ^TDuty.ar(dur, reset, level, doneAction, 1)
48         }
49         *kr { arg dur = 1.0, reset = 0.0, level = 1.0, doneAction = 0;
50                 ^TDuty.kr(dur, reset, level, doneAction, 1)
51         }
54 DemandEnvGen : UGen {
56         *kr { arg level, dur, shape = 1, curve = 0, gate = 1.0, reset = 1.0,
57                                 levelScale = 1.0, levelBias = 0.0, timeScale = 1.0, doneAction=0;
58                 ^this.multiNew('control', level, dur, shape, curve, gate, reset,
59                                 levelScale, levelBias, timeScale, doneAction)
60         }
61         *ar { arg level, dur, shape = 1, curve = 0, gate = 1.0, reset = 1.0,
62                                 levelScale = 1.0, levelBias = 0.0, timeScale = 1.0, doneAction=0;
63                                         if(gate.rate === 'audio' or: { reset.rate === 'audio' }) {
64                                                 if(gate.rate !== 'audio') { gate = K2A.ar(gate) };
65                                                 if(reset.rate !== 'audio') { reset = K2A.ar(reset) };
66                                         };
67                 ^this.multiNew('audio', level, dur, shape, curve, gate, reset,
68                                 levelScale, levelBias, timeScale, doneAction)
69         }
72 DUGen : UGen {
73         // some n-ary op special cases
74         linlin { arg inMin, inMax, outMin, outMax, clip=\minmax;
75                 ^((this.prune(inMin, inMax, clip)-inMin)/(inMax-inMin) * (outMax-outMin) + outMin);
76         }
78         linexp { arg inMin, inMax, outMin, outMax, clip=\minmax;
79                 ^(pow(outMax/outMin, (this-inMin)/(inMax-inMin)) * outMin)
80                 .prune(outMin, outMax, clip);
81         }
83         explin { arg inMin, inMax, outMin, outMax, clip=\minmax;
84                 ^(log(this.prune(inMin, inMax, clip)/inMin))
85                 / (log(inMax/inMin)) * (outMax-outMin) + outMin
86         }
88         expexp { arg inMin, inMax, outMin, outMax, clip=\minmax;
89                 ^pow(outMax/outMin, log(this.prune(inMin, inMax, clip/inMin) / log(inMax/inMin)) * outMin)
90         }
93 Dseries : DUGen {
94         *new { arg start = 1, step = 1, length = inf;
95                 ^this.multiNew('demand', length, start, step)
96         }
99 Dgeom : DUGen {
100         *new { arg start = 1, grow = 2, length = inf;
101                 ^this.multiNew('demand', length, start, grow)
102         }
105 Dbufrd : DUGen {
106         *new { arg bufnum = 0, phase = 0.0, loop = 1.0;
107                 ^this.multiNew('demand', bufnum, phase, loop)
108         }
111 Dbufwr : DUGen {
112         *new { arg input = 0.0, bufnum = 0, phase = 0.0, loop = 1.0;
113                 ^this.multiNew('demand', bufnum, phase, input, loop)
114         }
117 ListDUGen : DUGen {
118         *new { arg list, repeats = 1;
119                 ^this.multiNewList(['demand', repeats] ++ list)
120         }
123 Dseq : ListDUGen {}
124 Dser : ListDUGen {}
125 Dshuf : ListDUGen {}
126 Drand : ListDUGen {}
127 Dxrand : ListDUGen {}
129 Dwrand : DUGen {
130         *new { arg list, weights, repeats = 1;
131                 var size = list.size;
132                 weights = weights.extend(size, 0.0);
133                 ^this.multiNewList(['demand', repeats, size] ++ weights ++ list)
134         }
137 Dswitch1 : DUGen {
138         *new { arg list, index;
139                 ^this.multiNewList(['demand', index] ++ list)
140         }
143 Dswitch : Dswitch1 {}
145 Dwhite : DUGen {
146         *new { arg lo = 0.0, hi = 1.0, length = inf;
147                 ^this.multiNew('demand', length, lo, hi)
148         }
151 Diwhite : Dwhite {}
153 Dbrown : DUGen {
154         *new { arg lo = 0.0, hi = 1.0, step = 0.01, length = inf;
155                 ^this.multiNew('demand', length, lo, hi, step)
156         }
159 Dibrown : Dbrown {}
161 Dstutter : DUGen {
162         *new { arg n, in;
163                 ^this.multiNew('demand', n, in)
164         }
167 Donce : DUGen {
168         *new { arg in;
169                 ^this.multiNew('demand', in)
170         }
173 Dreset : DUGen {
174         *new { arg in, reset = 0.0;
175                 ^this.multiNew('demand', in, reset)
176         }
179 Dpoll : DUGen {
180         *new { arg in, label, run = 1, trigid = -1;
181                 ^this.multiNew('demand', in, label, run, trigid)
182         }
184         *new1 { arg rate, in, label, run, trigid;
185                 label = label ?? { "DemandUGen(%)".format(in.class) };
186                 label = label.ascii;
187                 ^super.new.rate_(rate).addToSynth.init(*[in, trigid, run, label.size] ++ label);
188         }
191 // behave as identical in multiple uses
193 Dunique : UGen {
194         var <>source, stutter, numUses;
196         *new { arg source;
197                 ^super.new.source_(source).init
198         }
200         init {
201                 numUses = 0;
202                 stutter = Dstutter(1, source);
203         }
205         asUGenInput {
206                 numUses = numUses + 1;
207                 stutter.inputs[0] = numUses;
208                 ^stutter
209         }