1 /*
2     SuperCollider real time audio synthesis system
3     Copyright (c) 2002 James McCartney. All rights reserved.
4     http://www.audiosynth.com
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
19 */
20 
21 #pragma once
22 
23 #include "PyrObject.h"
24 #include "GC.h"
25 
26 #define UNROLL 1
27 
28 enum {
29     kSignalRate = 0, // index of rate slot
30     kSignalNextNode
31 };
32 
33 PyrObject* newPyrSignal(VMGlobals* g, long size);
34 
35 #define UNROLL8_CODE(size, var, stmt)                                                                                  \
36     {                                                                                                                  \
37         int tempi, tempend;                                                                                            \
38         tempend = size >> 3;                                                                                           \
39         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
40             stmt;                                                                                                      \
41             stmt;                                                                                                      \
42             stmt;                                                                                                      \
43             stmt;                                                                                                      \
44             stmt;                                                                                                      \
45             stmt;                                                                                                      \
46             stmt;                                                                                                      \
47             stmt;                                                                                                      \
48         }                                                                                                              \
49         tempend = size & 7;                                                                                            \
50         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
51             stmt;                                                                                                      \
52         }                                                                                                              \
53     }
54 
55 #define UNROLL4_CODE(size, var, stmt)                                                                                  \
56     {                                                                                                                  \
57         int tempi, tempend;                                                                                            \
58         tempend = size >> 2;                                                                                           \
59         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
60             stmt;                                                                                                      \
61             stmt;                                                                                                      \
62             stmt;                                                                                                      \
63             stmt;                                                                                                      \
64         }                                                                                                              \
65         tempend = size & 3;                                                                                            \
66         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
67             stmt;                                                                                                      \
68         }                                                                                                              \
69     }
70 
71 #define FILTER_LOOP(size, var, stmt, stmt2)                                                                            \
72     {                                                                                                                  \
73         int tempi, tempend;                                                                                            \
74         tempend = size >> 2;                                                                                           \
75         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
76             stmt;                                                                                                      \
77             stmt;                                                                                                      \
78             stmt;                                                                                                      \
79             stmt;                                                                                                      \
80             stmt2;                                                                                                     \
81         }                                                                                                              \
82         tempend = size & 3;                                                                                            \
83         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
84             stmt;                                                                                                      \
85         }                                                                                                              \
86     }
87 
88 #define UNROLL1_CODE(size, var, stmt)                                                                                  \
89     {                                                                                                                  \
90         int tempi, tempend;                                                                                            \
91         tempend = size;                                                                                                \
92         for (tempi = 0; tempi < tempend; ++tempi) {                                                                    \
93             stmt;                                                                                                      \
94         }                                                                                                              \
95     }
96 
97 
98 #if UNROLL == 8
99 #    define UNROLL_CODE UNROLL8_CODE
100 #elif UNROLL == 4
101 #    define UNROLL_CODE UNROLL4_CODE
102 #else
103 #    define UNROLL_CODE UNROLL1_CODE
104 #endif
105 
106 #if 0
107 
108 #    define BINOP_LOOP1(OP)
109 #    define BINOP_LOOP2(STMT1, STMT2, STMT3)
110 
111 #else
112 
113 #    define BINOP_LOOP1(OP)                                                                                            \
114         float *a, *b, *c, *endptr;                                                                                     \
115         PyrObject* outc;                                                                                               \
116         long size;                                                                                                     \
117         a = (float*)(ina->slots) - 1;                                                                                  \
118         b = (float*)(inb->slots) - 1;                                                                                  \
119         size = sc_min(ina->size, inb->size);                                                                           \
120         outc = newPyrSignal(g, size);                                                                                  \
121         c = (float*)(outc->slots) - 1;                                                                                 \
122         endptr = c + size;                                                                                             \
123         switch (size & 3) {                                                                                            \
124             while (c < endptr) {                                                                                       \
125                 *++c = *++a OP * ++b;                                                                                  \
126             case 3:                                                                                                    \
127                 *++c = *++a OP * ++b;                                                                                  \
128             case 2:                                                                                                    \
129                 *++c = *++a OP * ++b;                                                                                  \
130             case 1:                                                                                                    \
131                 *++c = *++a OP * ++b;                                                                                  \
132             case 0:;                                                                                                   \
133             }                                                                                                          \
134         }                                                                                                              \
135         return outc;
136 
137 
138 #    define BINOP_LOOP2(STMT1)                                                                                         \
139         float *a, *b, *c, *endptr;                                                                                     \
140         PyrObject* outc;                                                                                               \
141         long size;                                                                                                     \
142         a = (float*)(ina->slots) - 1;                                                                                  \
143         b = (float*)(inb->slots) - 1;                                                                                  \
144         size = sc_min(ina->size, inb->size);                                                                           \
145         outc = newPyrSignal(g, size);                                                                                  \
146         c = (float*)(outc->slots) - 1;                                                                                 \
147         endptr = c + size;                                                                                             \
148         switch (size & 3) {                                                                                            \
149             while (c < endptr) {                                                                                       \
150                 STMT1;                                                                                                 \
151             case 3:                                                                                                    \
152                 STMT1;                                                                                                 \
153             case 2:                                                                                                    \
154                 STMT1;                                                                                                 \
155             case 1:                                                                                                    \
156                 STMT1;                                                                                                 \
157             case 0:;                                                                                                   \
158             }                                                                                                          \
159         }                                                                                                              \
160         return outc;
161 
162 #endif
163 
164 /*
165     compound formulas :
166     amclip	out = B<=0 ? 0 : A*B;		// two quadrant amplitude modulation
167     ring1	out = A*(B+1) = A*B + A;	// amplitude modulation of a by b.
168     ring2	out = A*B + A + B;			// ring modulation plus both original signals
169     ring3	out = A*A*B;				// ring modulation variant
170     ring4	out = A*A*B - A*B*B;		// ring modulation variant
171     difsqr	out = A*A - B*B;			// difference of squares
172     sumsqr	out = A*A + B*B;			// sum of squares
173     sqrdif	out = (A - B)^2				// square of the difference = a^2 + b^2 - 2ab
174     sqrsum	out = (A + B)^2				// square of the sum        = a^2 + b^2 + 2ab
175 */
176 
177 void signal_init_globs();
178 PyrObject* signal_fill(PyrObject* outSignal, float inValue);
179 PyrObject* signal_scale(PyrObject* outSignal, float inValue);
180 PyrObject* signal_offset(PyrObject* outSignal, float inValue);
181 PyrObject* signal_scale_offset(PyrObject* outSignal, float mul, float add);
182 PyrObject* signal_mix(PyrObject* ina, PyrObject* inb, float start, float end, float slopeFactor);
183 PyrObject* signal_add_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
184 PyrObject* signal_sub_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
185 PyrObject* signal_mul_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
186 PyrObject* signal_mul_ds_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
187 PyrObject* signal_add_ds_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
188 PyrObject* signal_sub_ds_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
189 PyrObject* signal_ring1_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
190 PyrObject* signal_ring2_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
191 PyrObject* signal_ring3_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
192 PyrObject* signal_ring4_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
193 PyrObject* signal_thresh_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
194 PyrObject* signal_amclip_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
195 PyrObject* signal_div_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
196 PyrObject* signal_difsqr_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
197 PyrObject* signal_sumsqr_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
198 PyrObject* signal_sqrsum_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
199 PyrObject* signal_sqrdif_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
200 PyrObject* signal_add_xf(VMGlobals* g, PyrObject* ina, float inb);
201 PyrObject* signal_sub_xf(VMGlobals* g, PyrObject* ina, float inb);
202 PyrObject* signal_mul_xf(VMGlobals* g, PyrObject* ina, float inb);
203 PyrObject* signal_ring1_xf(VMGlobals* g, PyrObject* ina, float inb);
204 PyrObject* signal_ring2_xf(VMGlobals* g, PyrObject* ina, float inb);
205 PyrObject* signal_ring3_xf(VMGlobals* g, PyrObject* ina, float inb);
206 PyrObject* signal_ring4_xf(VMGlobals* g, PyrObject* ina, float inb);
207 PyrObject* signal_thresh_xf(VMGlobals* g, PyrObject* ina, float inb);
208 PyrObject* signal_amclip_xf(VMGlobals* g, PyrObject* ina, float inb);
209 PyrObject* signal_div_xf(VMGlobals* g, PyrObject* ina, float inb);
210 PyrObject* signal_difsqr_xf(VMGlobals* g, PyrObject* ina, float inb);
211 PyrObject* signal_sumsqr_xf(VMGlobals* g, PyrObject* ina, float inb);
212 PyrObject* signal_sqrsum_xf(VMGlobals* g, PyrObject* ina, float inb);
213 PyrObject* signal_sqrdif_xf(VMGlobals* g, PyrObject* ina, float inb);
214 PyrObject* signal_ring1_fx(VMGlobals* g, float ina, PyrObject* inb);
215 PyrObject* signal_ring2_fx(VMGlobals* g, float ina, PyrObject* inb);
216 PyrObject* signal_ring3_fx(VMGlobals* g, float ina, PyrObject* inb);
217 PyrObject* signal_ring4_fx(VMGlobals* g, float ina, PyrObject* inb);
218 PyrObject* signal_thresh_fx(VMGlobals* g, float ina, PyrObject* inb);
219 PyrObject* signal_amclip_fx(VMGlobals* g, float ina, PyrObject* inb);
220 PyrObject* signal_sub_fx(VMGlobals* g, float ina, PyrObject* inb);
221 PyrObject* signal_div_fx(VMGlobals* g, float ina, PyrObject* inb);
222 PyrObject* signal_difsqr_fx(VMGlobals* g, float ina, PyrObject* inb);
223 PyrObject* signal_sumsqr_fx(VMGlobals* g, float ina, PyrObject* inb);
224 PyrObject* signal_sqrsum_fx(VMGlobals* g, float ina, PyrObject* inb);
225 PyrObject* signal_sqrdif_fx(VMGlobals* g, float ina, PyrObject* inb);
226 PyrObject* signal_min_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
227 PyrObject* signal_max_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
228 PyrObject* signal_min_xf(VMGlobals* g, PyrObject* ina, float inb);
229 PyrObject* signal_max_xf(VMGlobals* g, PyrObject* ina, float inb);
230 PyrObject* signal_invert(VMGlobals* g, PyrObject* inPyrSignal);
231 PyrObject* signal_recip(VMGlobals* g, PyrObject* inPyrSignal);
232 PyrObject* signal_squared(VMGlobals* g, PyrObject* inPyrSignal);
233 PyrObject* signal_cubed(VMGlobals* g, PyrObject* inPyrSignal);
234 PyrObject* signal_abs(VMGlobals* g, PyrObject* inPyrSignal);
235 PyrObject* signal_sign(VMGlobals* g, PyrObject* inPyrSignal);
236 PyrObject* signal_negative(VMGlobals* g, PyrObject* inPyrSignal);
237 PyrObject* signal_positive(VMGlobals* g, PyrObject* inPyrSignal);
238 PyrObject* signal_strictly_positive(VMGlobals* g, PyrObject* inPyrSignal);
239 PyrObject* signal_nyqring(VMGlobals* g, PyrObject* inPyrSignal);
240 PyrObject* signal_clip_f(VMGlobals* g, PyrObject* inPyrSignal, float lo, float hi);
241 PyrObject* signal_clip_f_ds(PyrObject* inPyrSignal, float lo, float hi);
242 PyrObject* signal_clip_x(VMGlobals* g, PyrObject* ina, PyrObject* inb, PyrObject* inc);
243 PyrObject* signal_wrap_f(VMGlobals* g, PyrObject* inPyrSignal, float lo, float hi);
244 PyrObject* signal_wrap_x(VMGlobals* g, PyrObject* ina, PyrObject* inb, PyrObject* inc);
245 PyrObject* signal_fold_f(VMGlobals* g, PyrObject* inPyrSignal, float lo, float hi);
246 PyrObject* signal_fold_x(VMGlobals* g, PyrObject* ina, PyrObject* inb, PyrObject* inc);
247 PyrObject* signal_log(VMGlobals* g, PyrObject* inPyrSignal);
248 PyrObject* signal_log2(VMGlobals* g, PyrObject* inPyrSignal);
249 PyrObject* signal_log10(VMGlobals* g, PyrObject* inPyrSignal);
250 PyrObject* signal_sin(VMGlobals* g, PyrObject* inPyrSignal);
251 PyrObject* signal_cos(VMGlobals* g, PyrObject* inPyrSignal);
252 PyrObject* signal_tan(VMGlobals* g, PyrObject* inPyrSignal);
253 PyrObject* signal_sinh(VMGlobals* g, PyrObject* inPyrSignal);
254 PyrObject* signal_cosh(VMGlobals* g, PyrObject* inPyrSignal);
255 PyrObject* signal_tanh(VMGlobals* g, PyrObject* inPyrSignal);
256 PyrObject* signal_asin(VMGlobals* g, PyrObject* inPyrSignal);
257 PyrObject* signal_acos(VMGlobals* g, PyrObject* inPyrSignal);
258 PyrObject* signal_atan(VMGlobals* g, PyrObject* inPyrSignal);
259 PyrObject* signal_exp(VMGlobals* g, PyrObject* inPyrSignal);
260 PyrObject* signal_sqrt(VMGlobals* g, PyrObject* inPyrSignal);
261 PyrObject* signal_distort(VMGlobals* g, PyrObject* inPyrSignal);
262 PyrObject* signal_distortneg(VMGlobals* g, PyrObject* inPyrSignal);
263 PyrObject* signal_softclip(VMGlobals* g, PyrObject* inPyrSignal);
264 PyrObject* signal_softclipneg(VMGlobals* g, PyrObject* inPyrSignal);
265 PyrObject* signal_fsin(VMGlobals* g, PyrObject* inPyrSignal);
266 PyrObject* signal_poly3(VMGlobals* g, PyrObject* inPyrSignal, float a, float b, float c);
267 PyrObject* signal_poly3r(VMGlobals* g, PyrObject* inPyrSignal, float a1, float a2, float b1, float b2, float c1,
268                          float c2, float slopeFactor);
269 PyrObject* signal_integrate(VMGlobals* g, PyrObject* inPyrSignal, float* ioSum);
270 PyrObject* signal_leakdc(VMGlobals* g, PyrObject* inPyrSignal, float* ioDC, float leakFactor);
271 PyrObject* signal_ampflw1(VMGlobals* g, PyrObject* inPyrSignal, float* ioAmp, float leak1);
272 PyrObject* signal_ampflw2(VMGlobals* g, PyrObject* inPyrSignal, float* ioAmp, float leak1);
273 PyrObject* signal_differentiate(VMGlobals* g, PyrObject* inPyrSignal, float* ioPrev);
274 PyrObject* signal_rotate(VMGlobals* g, PyrObject* ina, int rot);
275 PyrObject* signal_reverse_ds(PyrObject* ina);
276 PyrObject* signal_cat(VMGlobals* g, PyrObject* ina, PyrObject* inb);
277 PyrObject* signal_insert(VMGlobals* g, PyrObject* ina, PyrObject* inb, long index);
278 PyrObject* signal_overdub(VMGlobals* g, PyrObject* ina, PyrObject* inb, long index);
279 PyrObject* signal_overwrite(VMGlobals* g, PyrObject* ina, PyrObject* inb, long index);
280 PyrObject* signal_cat3(VMGlobals* g, PyrObject* ina, PyrObject* inb, PyrObject* inc);
281 PyrObject* signal_linen(VMGlobals* g, PyrObject* ina, long atk, long dcy, float amp);
282 PyrObject* signal_linen2(VMGlobals* g, PyrObject* ina, long atk, long dcy, float amp, float midamp);
283 PyrObject* signal_writesplice(VMGlobals* g, PyrObject* outc, PyrObject* ina, PyrObject* inb, long indexc, long indexa,
284                               long indexb, long fadelen, float midamp);
285 PyrObject* signal_splice(VMGlobals* g, PyrObject* ina, PyrObject* inb, long indexa, long indexb, long fadelen,
286                          float midamp);
287 
288 PyrObject* signal_invert_ds(PyrObject* inPyrSignal);
289 PyrObject* signal_recip_ds(PyrObject* inPyrSignal);
290 PyrObject* signal_squared_ds(PyrObject* inPyrSignal);
291 PyrObject* signal_cubed_ds(PyrObject* inPyrSignal);
292 PyrObject* signal_abs_ds(PyrObject* inPyrSignal);
293 PyrObject* signal_sign_ds(PyrObject* inPyrSignal);
294 PyrObject* signal_negative_ds(PyrObject* inPyrSignal);
295 PyrObject* signal_positive_ds(PyrObject* inPyrSignal);
296 PyrObject* signal_strictly_positive_ds(PyrObject* inPyrSignal);
297 PyrObject* signal_nyqring_ds(PyrObject* inPyrSignal);
298 
299 PyrObject* signal_clipneg_ds(PyrObject* inPyrSignal);
300 PyrObject* signal_distort_ds(PyrObject* inPyrSignal);
301 PyrObject* signal_distortneg_ds(PyrObject* inPyrSignal);
302 PyrObject* signal_softclip_ds(PyrObject* inPyrSignal);
303 PyrObject* signal_softclipneg_ds(PyrObject* inPyrSignal);
304 PyrObject* signal_fsin_ds(PyrObject* inPyrSignal);
305 
306 PyrObject* signal_log_ds(PyrObject* inPyrSignal);
307 PyrObject* signal_log2_ds(PyrObject* inPyrSignal);
308 PyrObject* signal_log10_ds(PyrObject* inPyrSignal);
309 PyrObject* signal_sin_ds(PyrObject* inPyrSignal);
310 PyrObject* signal_cos_ds(PyrObject* inPyrSignal);
311 PyrObject* signal_tan_ds(PyrObject* inPyrSignal);
312 PyrObject* signal_sinh_ds(PyrObject* inPyrSignal);
313 PyrObject* signal_cosh_ds(PyrObject* inPyrSignal);
314 PyrObject* signal_tanh_ds(PyrObject* inPyrSignal);
315 PyrObject* signal_asin_ds(PyrObject* inPyrSignal);
316 PyrObject* signal_acos_ds(PyrObject* inPyrSignal);
317 PyrObject* signal_atan_ds(PyrObject* inPyrSignal);
318 PyrObject* signal_exp_ds(PyrObject* inPyrSignal);
319 PyrObject* signal_sqrt_ds(PyrObject* inPyrSignal);
320 
321 float signal_findpeak(PyrObject* inPyrSignal);
322 PyrObject* signal_normalize(PyrObject* inPyrSignal);
323 PyrObject* signal_normalize_transfer_fn(PyrObject* inPyrSignal);
324 float signal_integral(PyrObject* inPyrSignal);
325 PyrObject* signal_combself(VMGlobals* g, PyrObject* ina, long rot);
326 PyrObject* signal_bilinen(VMGlobals* g, PyrObject* ina, long atk, long dcy, float amp, float midamp);
327 PyrObject* signal_lace2(VMGlobals* g, PyrObject* ina, PyrObject* inb);
328 void signal_unlace2(VMGlobals* g, PyrObject* ina, PyrObject** outb, PyrObject** outc);
329 void signal_convolve(VMGlobals* g, PyrObject* ina, PyrObject* ir, PyrObject* previn, long* ppos);
330 PyrObject* signal_thumbnail(VMGlobals* g, PyrObject* ina, long startpos, long length, int binsize);
331 
332 PyrObject* signal_scaleneg_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
333 PyrObject* signal_scaleneg_xf(VMGlobals* g, PyrObject* ina, float inb);
334 PyrObject* signal_scaleneg_fx(VMGlobals* g, float ina, PyrObject* inb);
335 
336 PyrObject* signal_clip2_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
337 PyrObject* signal_clip2_xf(VMGlobals* g, PyrObject* ina, float inb);
338 PyrObject* signal_clip2_fx(VMGlobals* g, float ina, PyrObject* inb);
339 
340 PyrObject* signal_fold2_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
341 PyrObject* signal_fold2_xf(VMGlobals* g, PyrObject* ina, float inb);
342 PyrObject* signal_fold2_fx(VMGlobals* g, float ina, PyrObject* inb);
343 
344 PyrObject* signal_wrap2_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
345 PyrObject* signal_wrap2_xf(VMGlobals* g, PyrObject* ina, float inb);
346 PyrObject* signal_wrap2_fx(VMGlobals* g, float ina, PyrObject* inb);
347 
348 PyrObject* signal_excess_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
349 PyrObject* signal_excess_xf(VMGlobals* g, PyrObject* ina, float inb);
350 PyrObject* signal_excess_fx(VMGlobals* g, float ina, PyrObject* inb);
351 
352 PyrObject* signal_absdif_fx(VMGlobals* g, float ina, PyrObject* inb);
353 PyrObject* signal_absdif_xf(VMGlobals* g, PyrObject* ina, float inb);
354 PyrObject* signal_absdif_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
355 
356 bool signal_equal_xf(VMGlobals* g, PyrObject* ina, float inb);
357 bool signal_equal_xx(VMGlobals* g, PyrObject* ina, PyrObject* inb);
358 
359 void signal_get_bounds(PyrObject* ina, float* ominval, float* omaxval);
360 
361 void signal_smooth_ds(PyrObject* inPyrSignal);
362 void signal_hanning_ds(PyrObject* inPyrSignal);
363 void signal_welch_ds(PyrObject* inPyrSignal);
364 void signal_parzen_ds(PyrObject* inPyrSignal);
365 
366 PyrObject* signal_normalize_range(PyrObject* ina, long start, long end);
367 PyrObject* signal_zero_range(PyrObject* ina, long start, long end);
368 PyrObject* signal_invert_range(PyrObject* ina, long start, long end);
369 PyrObject* signal_reverse_range(PyrObject* ina, long start, long end);
370 PyrObject* signal_fade_in(PyrObject* ina, long start, long end);
371 PyrObject* signal_fade_out(PyrObject* ina, long start, long end);
372 PyrObject* signal_abs_range(PyrObject* ina, long start, long end);
373 PyrObject* signal_squared_range(PyrObject* ina, long start, long end);
374 PyrObject* signal_cubed_range(PyrObject* ina, long start, long end);
375 PyrObject* signal_distort_range(PyrObject* ina, long start, long end);
376 
377 PyrObject* signal_fade_range(PyrObject* ina, long start, long end, float lvl0, float lvl1);
378