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