deprecate SCViewHolder-layRight
[supercollider.git] / SCClassLibrary / Common / Collections / Harmonics.sc
blob41db0adb841c22b0d7c600e05b99126866d0407b
1 Harmonics {
2         var <>size;
4         // Harmonics objects are convenient factories for creating Arrays that
5         // are used to fill buffers using the b_gen sine fill commands on the server.
7         *new { arg size = 32;
8                 ^super.newCopyArgs(size)
9         }
11         // decays with frequency
12         decay { arg k = 1;
13                 ^Array.fill(size) {|i| 1.0 / ((i+1) ** k) }
14         }
15         geom { arg k = 1.2;
16                 ^Array.fill(size) {|i| 1.0 / (k ** i) }
17         }
19         // random values
20         rand { arg lo=0.0, hi=1.0;
21                 ^Array.rand(size, lo, hi)
22         }
23         exprand { arg lo=0.01, hi=1.0;
24                 ^Array.exprand(size, lo, hi)
25         }
26         linrand { arg lo=0.0, hi=1.0;
27                 ^Array.linrand(size, lo, hi)
28         }
29         rand2 { arg val=1.0;
30                 ^Array.rand2(size, val)
31         }
32         coin { arg prob = 0.5;
33                 ^Array.fill(size) { if (prob.coin, 1.0, -1.0) }
34         }
36         // other useful shapes
37         formant { arg center=12, width = 3;
38                 var start, end;
39                 start = center - (width/2);
40                 end = center + (width/2);
41                 ^Array.fill(size) {|i|
42                         if (i <= start) { 0.0 } {
43                                 if (i >= end) { 0.0 } {
44                                         hanWindow((i - start) / width);
45                                 }
46                         }
47                 }
48         }
49         teeth { arg spacing = 2, start = 0;
50                 ^Array.fill(size) {|i|
51                         if (i < start) { 0.0 } {
52                                 i = i - start;
53                                 if ((i % spacing) == 0, 1.0, 0.0)
54                         }
55                 }
56         }
57         cutoff { arg n;
58                 ^Array.fill(size) {|i| if (i <= n, 1.0, 0.0) }
59         }
60         shelf { arg start, end, startLevel = 1.0, endLevel = 0.0;
61                 ^Array.fill(size) {|i|
62                         if (i <= start) { startLevel } {
63                                 if (i >= end) { endLevel } {
64                                         ((i - start) / (end - start)) * (endLevel - startLevel) + startLevel;
65                                 }
66                         }
67                 }
68         }
70         sine { arg wavelength=4, iphase=0.5pi, mul=1.0, add=0.0;
71                 ^Array.fill(size) {|i| sin(2pi/wavelength * i + iphase) * mul + add }
72         }
73         pulse { arg wavelength=4, iphase=0, duty = 0.5, mul=1.0, add=0.0;
74                 ^Array.fill(size) {|i| if (((i - iphase) % wavelength) < duty, 1.0, 0.0) * mul + add  }
75         }
77         ramp { arg start=1.0, step;
78                 step = step ? size.reciprocal;
79                 ^Array.series(size, start, step)
80         }