aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--externals/grill/xsample/pd/xgroove~.pd296
-rw-r--r--externals/grill/xsample/source/groove.cpp239
-rw-r--r--externals/grill/xsample/source/main.h6
3 files changed, 310 insertions, 231 deletions
diff --git a/externals/grill/xsample/pd/xgroove~.pd b/externals/grill/xsample/pd/xgroove~.pd
index 012dcb92..b2b84517 100644
--- a/externals/grill/xsample/pd/xgroove~.pd
+++ b/externals/grill/xsample/pd/xgroove~.pd
@@ -1,6 +1,6 @@
-#N canvas 92 110 847 566 12;
+#N canvas 92 110 891 610 12;
#X obj 258 240 hsl 128 15 0.001 3 1 1 empty empty empty 20 8 0 8 -225271
--1 -1 3400 1;
+-1 -1 8500 1;
#X floatatom 255 261 8 0 0 0 - - -;
#X floatatom 275 312 8 0 0 0 - - -;
#X floatatom 350 312 8 0 0 0 - - -;
@@ -8,84 +8,81 @@
#X floatatom 348 372 8 0 0 0 - - -;
#X obj 275 419 loadbang;
#X obj 274 445 metro 30;
-#X obj 250 470 snapshot~;
-#X floatatom 250 494 8 0 0 0 - - -;
+#X obj 275 471 snapshot~;
+#X floatatom 275 495 8 0 0 0 - - -;
#X msg 258 82 loop \$1;
#X obj 159 27 bng 15 250 50 0 empty empty empty 20 8 0 8 -258699 -1
-1;
#X msg 158 47 stop;
#N canvas 0 0 450 300 graph7 0;
#X array buf 300 float 1;
-#A 0 0.841115 0.9094 0.95923 0.989636 0.999991 0.990063 0.960094 0.910649
-0.842757 0.757796 0.65746 0.543816 0.419143 0.285978 0.147021 0.00508036
--0.136962 -0.276228 -0.409895 -0.535265 -0.649771 -0.751121 -0.83725
--0.906401 -0.957205 -0.988587 -0.999947 -0.991051 -0.962051 -0.913577
--0.846573 -0.762418 -0.662823 -0.549777 -0.425604 -0.292801 -0.154064
--0.0122066 0.129898 0.269372 0.403387 0.529223 0.644347 0.746395 0.833328
-0.903378 0.955105 0.987498 0.99986 0.991967 0.963983 0.91644 0.850346
-0.767009 0.668129 0.555721 0.432034 0.299602 0.161097 0.0193266 -0.122836
--0.262506 -0.396859 -0.523173 -0.638875 -0.741645 -0.82937 -0.900294
--0.952984 -0.986339 -0.999729 -0.992844 -0.965842 -0.919283 -0.854067
--0.771564 -0.673418 -0.561622 -0.438457 -0.306392 -0.168126 -0.0264512
-0.115759 0.255627 0.390308 0.517083 0.633384 0.736837 0.825374 0.89717
-0.95079 0.985156 0.999531 0.993672 0.967666 0.922048 0.857765 0.776069
-0.678665 0.567504 0.444838 0.313167 0.175141 0.0335691 -0.108684 -0.248732
--0.383745 -0.510974 -0.627851 -0.732014 -0.821324 -0.894008 -0.948562
--0.983895 -0.999309 -0.994439 -0.96944 -0.924788 -0.861391 -0.780556
--0.683878 -0.573355 -0.451214 -0.319922 -0.182154 -0.0406903 0.101596
-0.241826 0.37715 0.504839 0.62229 0.727131 0.81725 0.890784 0.946286
-0.982602 0.999003 0.99518 0.971156 0.927473 0.864993 0.784974 0.689065
-0.579174 0.457555 0.326665 0.189149 0.047805 -0.0945095 -0.234908 -0.370551
--0.498674 -0.616703 -0.722227 -0.813114 -0.887541 -0.943952 -0.981256
--0.998669 -0.995836 -0.972845 -0.93011 -0.868543 -0.789377 -0.694202
--0.584975 -0.463879 -0.333389 -0.196144 -0.0549212 0.0874133 0.227976
-0.363918 0.492493 0.611072 0.717282 0.80895 0.88422 0.941593 0.979852
-0.998275 0.996467 0.974453 0.932714 0.872048 0.793723 0.699318 0.590728
-0.47018 0.340094 0.20312 0.0620311 -0.0803164 -0.221037 -0.357277 -0.486275
--0.605431 -0.712297 -0.804743 -0.880878 -0.939154 -0.97842 -0.99783
--0.997035 -0.976038 -0.935246 -0.875523 -0.798037 -0.704388 -0.596471
--0.476452 -0.346789 -0.210093 -0.0691412 0.0732124 0.21408 0.350613
-0.480039 0.599733 0.707289 0.800488 0.87748 0.936691 0.976908 0.997349
-0.997554 0.977556 0.937754 0.87893 0.802314 0.709426 0.602164 0.482708
-0.353456 0.217051 0.0762439 -0.0661074 -0.207122 -0.343933 -0.473779
--0.594024 -0.702224 -0.796211 -0.87404 -0.934169 -0.975372 -0.996792
--0.998035 -0.979032 -0.940196 -0.882319 -0.806539 -0.714434 -0.60784
--0.48893 -0.36012 -0.224 -0.0833475 0.0589955 0.200142 0.337238 0.467489
-0.588274 0.69714 0.791867 0.870566 0.931602 0.973768 0.996211 0.998443
-0.980464 0.9426 0.885637 0.810741 0.719392 0.613481 0.495132 0.366748
-0.230939 0.0904412 -0.0518851 -0.193161 -0.33052 -0.461188 -0.582499
--0.692013 -0.787507 -0.867028 -0.928998 -0.972125 -0.995556 -0.998827
--0.98183 -0.944959 -0.888927 -0.81488 -0.724336 -0.619089 -0.501311
--0.373371;
+#A 0 0.665266 0.658123 0.65098 0.643838 0.636695 0.629552 0.622409
+0.615266 0.611933 0.6086 0.605266 0.601933 0.5986 0.595266 0.591933
+0.5886 0.585266 0.581933 0.5786 0.575266 0.571933 0.5686 0.565266 0.561933
+0.5586 0.555266 0.551933 0.5486 0.545266 0.541933 0.5386 0.535266 0.531933
+0.5286 0.525266 0.521933 0.5186 0.515267 0.512236 0.509206 0.506176
+0.503145 0.500115 0.497085 0.494054 0.491024 0.487994 0.484964 0.481933
+0.478903 0.475873 0.472842 0.469812 0.466782 0.463751 0.460721 0.457691
+0.454661 0.45163 0.4486 0.44557 0.442539 0.439509 0.436479 0.433448
+0.430418 0.427388 0.424358 0.421327 0.418297 0.415267 0.408449 0.401631
+0.394812 0.387994 0.381176 0.374358 0.36754 0.360722 0.353903 0.347085
+0.340267 0.333449 0.326631 0.319813 0.312994 0.306176 0.299358 0.29254
+0.285722 0.278903 0.272085 0.265267 0.260823 0.256378 0.251934 0.247489
+0.243045 0.238601 0.234156 0.229712 0.225267 0.220823 0.216378 0.211934
+0.20749 0.203045 0.198601 0.194156 0.189712 0.185267 0.180601 0.175934
+0.171267 0.166601 0.161934 0.157267 0.152601 0.147934 0.143267 0.138601
+0.133934 0.129267 0.124601 0.104601 0.104601 0.104601 0.104601 0.104601
+0.0846011 0.0846011 0.0846011 0.0646012 0.0579345 0.0512679 0.0446012
+0.0446012 0.0446012 0.0306011 0.0259344 0.0212678 0.0166011 0.0119345
+0.00726783 0.00260118 -0.00206548 -0.00673213 -0.0113988 -0.0160654
+-0.0207321 -0.0253987 -0.0300654 -0.034732 -0.0408859 -0.0470397 -0.0531935
+-0.0593474 -0.0655012 -0.071655 -0.0778088 -0.0839627 -0.0901165 -0.0962703
+-0.102424 -0.108578 -0.114732 -0.118232 -0.121732 -0.125232 -0.128732
+-0.132232 -0.135732 -0.139232 -0.142732 -0.146232 -0.149732 -0.153232
+-0.156732 -0.160232 -0.163732 -0.167232 -0.170732 -0.174232 -0.177732
+-0.181232 -0.184732 -0.188065 -0.191398 -0.194732 -0.198065 -0.201398
+-0.204732 -0.208065 -0.211398 -0.214731 -0.218065 -0.221398 -0.224731
+-0.228065 -0.231398 -0.234731 -0.238898 -0.243065 -0.247231 -0.251398
+-0.255565 -0.259731 -0.263898 -0.268065 -0.272231 -0.276398 -0.280565
+-0.284731 -0.290731 -0.296731 -0.302731 -0.308731 -0.314731 -0.319398
+-0.324065 -0.328731 -0.333398 -0.338064 -0.342731 -0.347398 -0.352064
+-0.356731 -0.356731 -0.364731 -0.372731 -0.380731 -0.388731 -0.396731
+-0.401437 -0.406143 -0.410848 -0.415554 -0.42026 -0.424966 -0.429672
+-0.434378 -0.439084 -0.44379 -0.448495 -0.453201 -0.457907 -0.462613
+-0.467319 -0.472025 -0.476731 -0.483397 -0.490064 -0.496731 -0.501731
+-0.50673 -0.51173 -0.51673 -0.52173 -0.52673 -0.53173 -0.53673 -0.54173
+-0.546731 -0.552064 -0.557397 -0.562731 -0.568064 -0.573397 -0.57873
+-0.584064 -0.589397 -0.59473 -0.600064 -0.605397 -0.61073 -0.616064
+-0.621397 -0.62673 -0.62673 -0.62673 -0.62673 -0.62673 -0.62673 -0.62673
+-0.62673 -0.63298 -0.63923 -0.64548 -0.65173 -0.65798 -0.66423 -0.67048
+-0.67673 -0.68073 -0.68473 -0.68873 -0.69273 -0.72673 -0.72673 -0.74673
+;
#X coords 0 1 299 -1 300 200 1;
#X restore 521 23 graph;
-#X obj 144 486 dac~;
-#X msg 157 86 reset;
+#X obj 171 574 dac~;
+#X msg 155 88 reset;
#X text 290 292 min/max points;
#X text 289 390 min/max points;
-#X text 323 494 position;
+#X text 348 495 position;
#X text 181 24 start;
#X text 198 45 stop;
#X msg 156 113 help;
#X text 416 234 speed;
#X text 337 254 (float or signal);
-#X obj 656 365 table buf2;
-#X floatatom 519 380 8 0 0 0 - - -;
-#X obj 519 353 soundfiler;
-#X msg 158 172 set buf2;
+#X msg 156 169 set buf2;
#X msg 157 144 set buf;
#X msg 372 82 interp \$1;
#X msg 240 312 all;
#X obj 191 344 xgroove~ buf;
#X text 255 10 looping mode;
#X text 370 9 interpolation;
-#X msg 10 149 pos 100;
-#X msg 25 180 pos 200;
-#X obj 152 447 *~;
-#X msg 10 105 xzone \$1;
-#X obj 13 62 hsl 128 15 0 300 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 1;
-#X floatatom 10 83 5 0 0 0 - - -;
+#X msg 11 114 pos 100;
+#X msg 31 138 pos 200;
+#X obj 172 384 *~;
+#X msg 13 359 xzone \$1;
+#X obj 16 321 hsl 128 15 0 300 0 0 empty empty empty -2 -6 0 8 -262131
+-1 -1 1500 1;
+#X floatatom 13 339 5 0 0 0 - - -;
#X obj 258 32 vdl 15 0 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1
0;
#X text 277 29 once;
@@ -96,10 +93,6 @@
#X text 391 28 none;
#X text 391 44 linear;
#X text 391 60 4-point;
-#X obj 520 299 openpanel;
-#X msg 521 326 read -resize \$1 buf2;
-#X obj 521 275 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
#X obj 256 134 vdl 15 0 0 4 empty empty empty 0 -6 0 8 -262144 -1 -1
0;
#X text 255 113 units;
@@ -116,11 +109,11 @@
#X text 383 163 buffer;
#X text 383 178 loop;
#X text 383 131 units in buffer;
-#X obj 524 440 osc~ 1000;
-#X obj 524 498 tabwrite~ buf;
-#X obj 536 467 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+#X obj 646 475 osc~ 1000;
+#X obj 646 533 tabwrite~ buf;
+#X obj 658 502 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
-#X msg 557 468 stop;
+#X msg 679 503 stop;
#X obj 319 343 print A;
#X msg 131 213 getattributes;
#X msg 177 248 getmax;
@@ -158,54 +151,129 @@
#X connect 11 0 13 0;
#X connect 12 0 0 0;
#X connect 13 0 0 0;
-#X restore 19 287 pd ramp;
-#X obj 46 230 loadbang;
-#X msg 46 255 10;
+#X restore 20 252 pd ramp;
+#X obj 49 199 loadbang;
+#X msg 49 224 10;
+#N canvas 0 0 450 300 graph2 0;
+#X array buf2 300 float 1;
+#A 0 0.0542877 0.0528716 0.0514554 0.0499469 0.0483065 0.0467235 0.0453892
+0.0444954 0.0441347 0.0441533 0.0443594 0.0445614 0.0446597 0.045062
+0.0455113 0.045605 0.0449404 0.043072 0.0400357 0.0364854 0.0330926
+0.0305273 0.0289475 0.0279315 0.027211 0.0265175 0.0256073 0.024616
+0.0236247 0.0226334 0.0216421 0.0206508 0.0196594 0.0186681 0.0176768
+0.0166855 0.0156941 0.0147029 0.0137115 0.0127203 0.0117289 0.0107376
+0.00974629 0.008755 0.00776365 0.0067723 0.00578102 0.00478967 0.00379839
+0.00280704 0.00181576 0.000824409 -0.000166872 -0.00115822 -0.0021495
+-0.00314085 -0.00413213 -0.00512348 -0.00611476 -0.00710611 -0.00809747
+-0.00908875 -0.0100801 -0.0110714 -0.0120627 -0.013054 -0.0140453 -0.0150366
+-0.0160279 -0.0170192 -0.0180106 -0.0190019 -0.0199932 -0.0209845 -0.0219759
+-0.0229672 -0.0239585 -0.0249498 -0.0259411 -0.0269325 -0.0279237 -0.0289151
+-0.0299064 -0.0308783 -0.0318198 -0.032773 -0.0337804 -0.034885 -0.0361087
+-0.0374184 -0.0387711 -0.0401239 -0.0414409 -0.0427481 -0.0440554 -0.0453626
+-0.0466698 -0.047977 -0.0492843 -0.0505914 -0.0518987 -0.0532059 -0.0545132
+-0.0558204 -0.0571277 -0.058435 -0.0597422 -0.0610494 -0.0623566 -0.0636639
+-0.064971 -0.0662783 -0.0675855 -0.0688928 -0.0701999 -0.0715072 -0.0728144
+-0.0741216 -0.0754288 -0.0767361 -0.0780434 -0.0793506 -0.0806578 -0.0819651
+-0.0832723 -0.0845795 -0.0858868 -0.087194 -0.0885012 -0.0898084 -0.0911157
+-0.0924229 -0.0937301 -0.0950373 -0.0963446 -0.0976517 -0.098959 -0.100266
+-0.101573 -0.102881 -0.104188 -0.105495 -0.106802 -0.10811 -0.109438
+-0.110829 -0.112215 -0.113519 -0.114664 -0.115596 -0.116359 -0.117031
+-0.117687 -0.118401 -0.119144 -0.119888 -0.120631 -0.121374 -0.122118
+-0.122861 -0.123605 -0.124348 -0.125092 -0.125835 -0.126579 -0.127322
+-0.128066 -0.128809 -0.129553 -0.130296 -0.13104 -0.131783 -0.132527
+-0.13327 -0.134014 -0.134757 -0.135501 -0.136244 -0.136988 -0.137731
+-0.138475 -0.139218 -0.139962 -0.140705 -0.141449 -0.142192 -0.142936
+-0.143679 -0.144423 -0.145166 -0.14591 -0.146653 -0.147397 -0.14814
+-0.148884 -0.149627 -0.150371 -0.151114 -0.151858 -0.152601 -0.153345
+-0.154088 -0.154832 -0.155575 -0.156319 -0.157062 -0.157806 -0.158549
+-0.159292 -0.160036 -0.160779 -0.161523 -0.162266 -0.16301 -0.163753
+-0.164497 -0.16524 -0.165984 -0.166727 -0.167471 -0.168214 -0.168958
+-0.169701 -0.170445 -0.171188 -0.171932 -0.172675 -0.173419 -0.174162
+-0.174906 -0.175649 -0.176393 -0.177136 -0.17788 -0.178623 -0.179367
+-0.18011 -0.180854 -0.181598 -0.182346 -0.183095 -0.18384 -0.184575
+-0.185297 -0.186007 -0.186711 -0.187414 -0.188119 -0.188827 -0.189535
+-0.190243 -0.190951 -0.191659 -0.192367 -0.193076 -0.193784 -0.194492
+-0.1952 -0.195908 -0.196616 -0.197324 -0.198032 -0.19874 -0.199448
+-0.200156 -0.200864 -0.201572 -0.20228 -0.202989 -0.203697 -0.204405
+-0.205113 -0.205821 -0.206529 -0.207237 -0.207945 -0.208653 -0.209361
+-0.210069 -0.210777 -0.211485 -0.212193 -0.212901 -0.213609 -0.214317
+-0.215026 -0.215734 -0.216442 -0.21715 -0.217859 -0.218567 -0.219275
+-0.219983 -0.220691 -0.221399 -0.222107 -0.222815 -0.223523 -0.224231
+-0.224939;
+#X coords 0 1 299 -1 300 140 1;
+#X restore 521 232 graph;
+#X obj 228 516 tabwrite~ buf2;
+#X obj 211 483 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 15 421 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262131
+-1 -1 0 1;
+#X msg 12 397 0.5;
+#X obj 172 548 *~;
+#X obj 228 553 hsl 128 15 0.0001 1 1 0 empty empty empty -2 -6 0 8
+-261689 -1 -1 8800 1;
+#X obj 226 573 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0
+10 -261689 -1 -1 0.059109 256;
+#X msg 12 440 xshape 2 \$1;
+#X msg 11 564 xfade \$1;
+#X obj 10 499 vdl 15 0 0 4 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X text 9 480 loop zone mode;
+#X text 29 498 keep loop pos;
+#X text 29 514 keep loop length;
+#X text 29 530 keep fade length;
+#X text 29 545 inside loop;
#X connect 0 0 1 0;
-#X connect 1 0 31 0;
-#X connect 2 0 31 1;
-#X connect 3 0 31 2;
+#X connect 1 0 28 0;
+#X connect 2 0 28 1;
+#X connect 3 0 28 2;
#X connect 6 0 7 0;
#X connect 7 0 8 0;
+#X connect 7 0 71 0;
#X connect 8 0 9 0;
-#X connect 10 0 31 0;
-#X connect 11 0 31 0;
-#X connect 12 0 31 0;
-#X connect 15 0 31 0;
-#X connect 21 0 31 0;
-#X connect 26 0 25 0;
-#X connect 27 0 31 0;
-#X connect 28 0 31 0;
-#X connect 29 0 31 0;
-#X connect 30 0 31 0;
-#X connect 31 0 36 1;
-#X connect 31 1 8 0;
-#X connect 31 2 4 0;
-#X connect 31 3 5 0;
-#X connect 31 5 69 0;
-#X connect 34 0 73 0;
-#X connect 35 0 73 0;
-#X connect 36 0 14 0;
-#X connect 36 0 14 1;
-#X connect 37 0 31 0;
-#X connect 38 0 39 0;
-#X connect 39 0 37 0;
-#X connect 40 0 10 0;
-#X connect 44 0 29 0;
-#X connect 48 0 49 0;
-#X connect 49 0 26 0;
-#X connect 50 0 48 0;
-#X connect 51 0 53 0;
-#X connect 53 0 31 0;
-#X connect 54 0 56 0;
-#X connect 56 0 31 0;
-#X connect 65 0 66 0;
-#X connect 67 0 66 0;
-#X connect 68 0 66 0;
-#X connect 70 0 31 0;
-#X connect 71 0 31 0;
-#X connect 72 0 31 0;
-#X connect 73 0 36 0;
-#X connect 73 1 31 0;
-#X connect 74 0 75 0;
-#X connect 75 0 73 1;
+#X connect 10 0 28 0;
+#X connect 11 0 28 0;
+#X connect 12 0 28 0;
+#X connect 15 0 28 0;
+#X connect 21 0 28 0;
+#X connect 24 0 28 0;
+#X connect 25 0 28 0;
+#X connect 26 0 28 0;
+#X connect 27 0 28 0;
+#X connect 28 0 33 1;
+#X connect 28 0 71 0;
+#X connect 28 1 8 0;
+#X connect 28 2 4 0;
+#X connect 28 3 5 0;
+#X connect 28 5 63 0;
+#X connect 31 0 67 0;
+#X connect 32 0 67 0;
+#X connect 33 0 75 0;
+#X connect 34 0 28 0;
+#X connect 35 0 36 0;
+#X connect 36 0 34 0;
+#X connect 37 0 10 0;
+#X connect 41 0 26 0;
+#X connect 45 0 47 0;
+#X connect 47 0 28 0;
+#X connect 48 0 50 0;
+#X connect 50 0 28 0;
+#X connect 59 0 60 0;
+#X connect 61 0 60 0;
+#X connect 62 0 60 0;
+#X connect 64 0 28 0;
+#X connect 65 0 28 0;
+#X connect 66 0 28 0;
+#X connect 67 0 33 0;
+#X connect 67 1 28 0;
+#X connect 68 0 69 0;
+#X connect 69 0 67 1;
+#X connect 72 0 71 0;
+#X connect 73 0 78 0;
+#X connect 74 0 73 0;
+#X connect 75 0 14 0;
+#X connect 75 0 14 1;
+#X connect 76 0 75 1;
+#X connect 76 0 77 0;
+#X connect 78 0 28 0;
+#X connect 79 0 28 0;
+#X connect 80 0 79 0;
diff --git a/externals/grill/xsample/source/groove.cpp b/externals/grill/xsample/source/groove.cpp
index dc268e91..0da9087c 100644
--- a/externals/grill/xsample/source/groove.cpp
+++ b/externals/grill/xsample/source/groove.cpp
@@ -43,20 +43,26 @@ public:
virtual V m_all();
virtual V m_min(F mn);
virtual V m_max(F mx);
-
+
+ V ms_xfade(I xf);
+
V ms_xzone(F xz);
- V mg_xzone(F &xz);
- V m_xsymm(F xz);
+ V mg_xzone(F &xz) { xz = _xzone*s2u; }
+
V m_xshape(I argc = 0,const t_atom *argv = NULL);
inline V ms_xshape(const AtomList &ret) { m_xshape(ret.Count(),ret.Atoms()); }
V mg_xshape(AtomList &ret) const;
- V m_xkeep(BL k);
enum xs_loop {
xsl__ = -1, // don't change
xsl_once = 0,xsl_loop,xsl_bidir
};
-
+
+ enum xs_fade {
+ xsf__ = -1, // don't change
+ xsf_keeplooppos = 0,xsf_keeplooplen,xsf_keepfade,xsf_inside
+ };
+
V m_loop(xs_loop lp = xsl__);
protected:
@@ -65,12 +71,12 @@ protected:
D curpos; // in samples
I bidir;
- F _xzone,xzone,xsymm;
+ F _xzone,xzone;
L znsmin,znsmax;
+ xs_fade xfade;
I xshape;
F xshparam;
D znmin,znmax;
- BL xkeep;
S **znbuf;
S *znpos,*znmul,*znidx;
I pblksz;
@@ -129,13 +135,11 @@ private:
FLEXT_CALLBACK_F(m_max)
FLEXT_CALLBACK(m_all)
+ FLEXT_CALLSET_I(ms_xfade)
+ FLEXT_ATTRGET_I(xfade)
FLEXT_CALLSET_F(ms_xzone)
FLEXT_CALLGET_F(mg_xzone)
- FLEXT_CALLSET_F(m_xsymm)
- FLEXT_ATTRGET_F(xsymm)
FLEXT_CALLVAR_V(mg_xshape,ms_xshape)
- FLEXT_CALLSET_B(m_xkeep)
- FLEXT_ATTRGET_B(xkeep)
FLEXT_CALLVAR_F(mg_pos,m_pos)
FLEXT_CALLSET_F(m_min)
@@ -163,16 +167,15 @@ V xgroove::setup(t_classid c)
FLEXT_CADDATTR_VAR_E(c,"loop",loopmode,m_loop);
+ FLEXT_CADDATTR_VAR(c,"xfade",xfade,ms_xfade);
FLEXT_CADDATTR_VAR(c,"xzone",mg_xzone,ms_xzone);
- FLEXT_CADDATTR_VAR(c,"xsymm",xsymm,m_xsymm);
FLEXT_CADDATTR_VAR(c,"xshape",mg_xshape,ms_xshape);
- FLEXT_CADDATTR_VAR(c,"xkeep",xkeep,m_xkeep);
}
xgroove::xgroove(I argc,const t_atom *argv):
loopmode(xsl_loop),curpos(0),
- _xzone(0),xzone(0),xsymm(0.5),xkeep(false),pblksz(0),
- xshape(0),xshparam(1),
+ _xzone(0),xzone(0),pblksz(0),
+ xfade(xsf_keeplooppos),xshape(0),xshparam(1),
znbuf(NULL),znmul(NULL),znidx(NULL),znpos(NULL),
bidir(1)
{
@@ -216,24 +219,26 @@ xgroove::xgroove(I argc,const t_atom *argv):
AddOutFloat("Ending point (rounded to frame)"); // play max
AddOutBang("Bang on loop end/rollover"); // loop bang
+ // don't know vector size yet -> wait for m_dsp
znbuf = new S *[outchns];
- for(I i = 0; i < outchns; ++i) znbuf[i] = new S[0];
- znpos = new S[0]; // don't know vector size yet -> wait for m_dsp
- znidx = new S[0];
+ for(I i = 0; i < outchns; ++i) znbuf[i] = NULL;
+ znpos = NULL;
+ znidx = NULL;
znmul = new S[XZONE_TABLE+1];
+
m_xshape();
}
xgroove::~xgroove()
{
if(znbuf) {
- for(I i = 0; i < outchns; ++i) delete[] znbuf[i];
+ for(I i = 0; i < outchns; ++i) if(znbuf[i]) delete[] znbuf[i];
delete[] znbuf;
}
- if(znmul) delete[] znmul;
if(znpos) delete[] znpos;
if(znidx) delete[] znidx;
+ delete[] znmul;
}
BL xgroove::Init()
@@ -259,7 +264,8 @@ V xgroove::m_min(F mn)
{
xsample::m_min(mn);
m_pos(curpos*s2u);
- do_xzone();
+// do_xzone();
+ s_dsp();
outputmin();
}
@@ -267,7 +273,8 @@ V xgroove::m_max(F mx)
{
xsample::m_max(mx);
m_pos(curpos*s2u);
- do_xzone();
+// do_xzone();
+ s_dsp();
outputmax();
}
@@ -279,7 +286,8 @@ V xgroove::m_pos(F pos)
V xgroove::m_all()
{
xsample::m_all();
- do_xzone();
+// do_xzone();
+ s_dsp();
outputmin();
outputmax();
}
@@ -291,6 +299,13 @@ BL xgroove::m_reset()
return xsample::m_reset();
}
+V xgroove::ms_xfade(I xf)
+{
+ xfade = (xs_fade)xf;
+ // do_xzone();
+ s_dsp();
+}
+
V xgroove::ms_xzone(F xz)
{
bufchk();
@@ -299,24 +314,6 @@ V xgroove::ms_xzone(F xz)
s_dsp();
}
-V xgroove::mg_xzone(F &xz)
-{
- xz = _xzone*s2u;
-}
-
-V xgroove::m_xsymm(F xs)
-{
- if(xs < 0)
- xsymm = -1;
- else if(xs <= 1)
- xsymm = xs;
- else {
- post("%s - xsymm value out of range - set to center (0.5)",thisName());
- xsymm = 0.5;
- }
- do_xzone();
-}
-
V xgroove::m_xshape(I argc,const t_atom *argv)
{
const F pi = 3.14159265358979f;
@@ -360,61 +357,77 @@ V xgroove::mg_xshape(AtomList &ret) const
}
-V xgroove::m_xkeep(BL k)
-{
- xkeep = k;
- do_xzone();
-}
-
V xgroove::do_xzone()
{
if(!s2u) return; // this can happen if DSP is off
xzone = _xzone; // make a copy for changing it
- znsmin = curmin,znsmax = curmax;
- I plen = znsmax-znsmin; //curlen;
- if(xsymm < 0) {
- // crossfade zone is inside the loop (-> loop is shorter than nominal!)
- if(xzone >= plen) xzone = plen-1;
- znmin = znsmin+xzone,znmax = znsmax-xzone;
+ if(xfade == xsf_inside) { // fade zone goes inside the loop -> loop gets shorter
+ const L maxfd = (curmax-curmin)/2;
+ if(xzone > maxfd) xzone = maxfd;
+
+ znsmin = curmin,znsmax = curmax;
}
- else {
- // desired crossfade points
- znmin = znsmin+xzone*xsymm,znmax = znsmax+xzone*(xsymm-1);
- // extra space at beginning and end
- D o1 = znmin-xzone,o2 = buf->Frames()-(znmax+xzone);
-
- if(o1 < 0 || o2 < 0) { // or (o1*o2 < 0)
- if(o1+o2 < 0) {
- // must reduce crossfade/loop length
- if(!xkeep) {
- // prefer preservation of cross-fade length
- if(xzone*2 >= plen) // have to reduce cross-fade length
- xzone = plen/2;
- znmin = xzone,znmax = buf->Frames()-xzone;
- }
- else {
- // prefer preservation of loop length
- znmin += o1,znmax -= o2;
- xzone = (buf->Frames()-(znmax-znmin))/2;
- }
- znsmin = 0,znsmax = buf->Frames();
- }
- else if(o1 < 0) {
- // min point is out of bounds (but enough space for mere shift)
- I i1 = (I)o1;
- znsmin -= i1,znsmax -= i1;
- znmin = znsmin+xzone*xsymm,znmax = znsmax+xzone*(xsymm-1);
- }
- else /* o2 < 0 */ {
- // max point is out of bounds (but enough space for mere shift)
- I i2 = (I)o2;
- znsmin += i2,znsmax += i2;
- znmin = znsmin+xzone*xsymm,znmax = znsmax+xzone*(xsymm-1);
- }
+ else if(xfade == xsf_keepfade) {
+ // try to keep fade zone
+ // shifting of loop bounds may happen
+
+ // restrict xzone to half of buffer
+ const L maxfd = buf->Frames()/2;
+ if(xzone > maxfd) xzone = maxfd;
+
+ znsmin = curmin-xzone/2;
+ znsmax = curmax+xzone/2;
+
+ // check buffer limits and shift bounds if necessary
+ if(znsmin < 0) {
+ znsmax -= znsmin;
+ znsmin = 0;
+ }
+ if(znsmax > buf->Frames())
+ znsmax = buf->Frames();
+ }
+ else if(xfade == xsf_keeplooplen) {
+ // try to keep loop length
+ // shifting of loop bounds may happen
+
+ const L maxfd = buf->Frames()-(curmax-curmin);
+ if(xzone > maxfd) xzone = maxfd;
+
+ znsmin = curmin-xzone/2;
+ znsmax = curmax+xzone/2;
+
+ // check buffer limits and shift bounds if necessary
+ // both cases can't happen because of xzone having been limited above
+ if(znsmin < 0) {
+ znsmax -= znsmin;
+ znsmin = 0;
+ }
+ else if(znsmax > buf->Frames()) {
+ znsmin -= znsmax-buf->Frames();
+ znsmax = buf->Frames();
+ }
+ }
+ else if(xfade == xsf_keeplooppos) {
+ // try to keep loop position and length
+
+ znsmin = curmin-xzone/2;
+ znsmax = curmax+xzone/2;
+
+ L ovr = znsmax-buf->Frames();
+ if(-znsmin > ovr) ovr = -znsmin;
+ if(ovr > 0) {
+ znsmin += ovr;
+ znsmax -= ovr;
+ xzone -= ovr*2;
}
}
+
+ znmin = znsmin+xzone;
+ znmax = znsmax-xzone;
+
+ FLEXT_ASSERT(znsmin <= znsmax && (znsmax-znsmin) >= xzone*2);
}
V xgroove::m_loop(xs_loop lp)
@@ -442,7 +455,7 @@ V xgroove::s_pos_once(I n,S *const *invecs,S *const *outvecs)
S *pos = outvecs[outchns];
BL lpbang = false;
- const D smin = curmin,smax = curmax,plen = smax-smin; //curlen;
+ const D smin = curmin,smax = curmax,plen = smax-smin;
if(buf && plen > 0) {
register D o = curpos;
@@ -450,7 +463,7 @@ V xgroove::s_pos_once(I n,S *const *invecs,S *const *outvecs)
for(I i = 0; i < n; ++i) {
const S spd = speed[i]; // must be first because the vector is reused for output!
- if(o >= smax) { o = smax; lpbang = true; }
+ if(!(o < smax)) { o = smax; lpbang = true; }
else if(o < smin) { o = smin; lpbang = true; }
pos[i] = o;
@@ -476,13 +489,13 @@ V xgroove::s_pos_c_once(I n,S *const *invecs,S *const *outvecs)
S *pos = outvecs[outchns];
BL lpbang = false;
- const D smin = curmin,smax = curmax,plen = smax-smin; //curlen;
+ const D smin = curmin,smax = curmax,plen = smax-smin;
if(buf && plen > 0) {
register D o = curpos;
for(I i = 0; i < n; ++i) {
- if(o >= smax) { o = smax; lpbang = true; }
+ if(!(o < smax)) { o = smax; lpbang = true; }
else if(o < smin) { o = smin; lpbang = true; }
pos[i] = o;
@@ -522,7 +535,7 @@ V xgroove::s_pos_loop(I n,S *const *invecs,S *const *outvecs)
vec_dst(speed,GetPrefetchConstant(1,n>>2,0),0);
#endif
- const D smin = curmin,smax = curmax,plen = smax-smin; //curlen;
+ const D smin = curmin,smax = curmax,plen = smax-smin;
if(buf && plen > 0) {
register D o = curpos;
@@ -567,7 +580,7 @@ V xgroove::s_pos_c_loop(I n,S *const *invecs,S *const *outvecs)
S *pos = outvecs[outchns];
BL lpbang = false;
- const D smin = curmin,smax = curmax,plen = smax-smin; //curlen;
+ const D smin = curmin,smax = curmax,plen = smax-smin;
if(buf && plen > 0) {
register D o = curpos;
@@ -615,11 +628,13 @@ V xgroove::s_pos_loopzn(I n,S *const *invecs,S *const *outvecs)
S *pos = outvecs[outchns];
BL lpbang = false;
+ FLEXT_ASSERT(xzone);
+
const F xz = xzone,xf = (F)XZONE_TABLE/xz;
- const D lmin = znmin,lmax = znmax,lsh = lmax+xz-lmin;
+ const D lmin = znmin,lmax = znmax,lsh = lmax-lmin+xz;
// adapt the playing bounds to the current cross-fade zone
- const I smin = znsmin,smax = znsmax,plen = smax-smin; //curlen;
+ const L smin = znsmin,smax = znsmax,plen = smax-smin;
if(buf && plen > 0) {
BL inzn = false;
@@ -629,7 +644,7 @@ V xgroove::s_pos_loopzn(I n,S *const *invecs,S *const *outvecs)
// \TODO: exploit relationships: smin <= lmin, smax >= lmax
// normalize offset
- if(o >= smax) {
+ if(!(o < smax)) {
o = fmod(o-smin,plen)+smin;
lpbang = true;
}
@@ -638,20 +653,15 @@ V xgroove::s_pos_loopzn(I n,S *const *invecs,S *const *outvecs)
lpbang = true;
}
- // now: smin <= o < smax
-
if(o >= lmax) {
// in late cross-fade zone
+ o -= lsh;
+ }
- // shift it into early zone
- o -= lsh;
- }
-
- // now: lmin-xz <= o < lmax
-
+ // now: smin <= o < smax
if(o < lmin) {
// in early cross-fade zone
- register F inp = xz-(F)(lmin-o); // 0 <= inp < xz
+ register F inp = xz+(F)(o-lmin); // 0 <= inp < xz
znidx[i] = inp*xf;
znpos[i] = lmax+inp;
inzn = true;
@@ -707,7 +717,7 @@ V xgroove::s_pos_bidir(I n,S *const *invecs,S *const *outvecs)
S *pos = outvecs[outchns];
BL lpbang = false;
- const I smin = curmin,smax = curmax,plen = smax-smin; //curlen;
+ const I smin = curmin,smax = curmax,plen = smax-smin;
if(buf && plen > 0) {
register D o = curpos;
@@ -717,7 +727,7 @@ V xgroove::s_pos_bidir(I n,S *const *invecs,S *const *outvecs)
const S spd = speed[i]; // must be first because the vector is reused for output!
// normalize offset
- if(o >= smax) {
+ if(!(o < smax)) {
o = smax-fmod(o-smin,plen); // mirror the position at smax
bd = -bd;
lpbang = true;
@@ -752,25 +762,26 @@ V xgroove::s_dsp()
switch(loopmode) {
case xsl_once: SETSIGFUN(posfun,SIGFUN(s_pos_once)); break;
case xsl_loop:
- if(_xzone > 0) {
- // xzone might not be set yet (is done in do_xzone() )
+ // xzone might not be set yet (is done in do_xzone() )
+ do_xzone(); // recalculate (s2u may have been 0 before)
+ if(xzone > 0) {
const I blksz = Blocksize();
if(pblksz != blksz) {
for(I o = 0; o < outchns; ++o) {
- delete[] znbuf[o];
+ if(znbuf[o]) delete[] znbuf[o];
znbuf[o] = new S[blksz];
}
- delete[] znpos; znpos = new S[blksz];
- delete[] znidx; znidx = new S[blksz];
+ if(znpos) delete[] znpos;
+ znpos = new S[blksz];
+ if(znidx) delete[] znidx;
+ znidx = new S[blksz];
pblksz = blksz;
}
- do_xzone(); // recalculate (s2u may have been 0 before)
-
SETSIGFUN(posfun,SIGFUN(s_pos_loopzn));
// linear interpolation should be just ok for fade zone, no?
diff --git a/externals/grill/xsample/source/main.h b/externals/grill/xsample/source/main.h
index 15dee169..f19dce45 100644
--- a/externals/grill/xsample/source/main.h
+++ b/externals/grill/xsample/source/main.h
@@ -12,7 +12,7 @@ WARRANTIES, see the file, "license.txt," in this distribution.
#define __XSAMPLE_H
-#define XSAMPLE_VERSION "0.3.0pre18"
+#define XSAMPLE_VERSION "0.3.0pre19"
#define FLEXT_ATTRIBUTES 1
@@ -113,7 +113,7 @@ public:
enum xs_intp {
xsi__ = -1, // don't change
- xsi_none = 0,xsi_4p,xsi_lin
+ xsi_none = 0,xsi_lin,xsi_4p
};
enum xs_sclmd {
@@ -146,7 +146,7 @@ protected:
xs_unit unitmode; //iunitmode,ounitmode;
xs_sclmd sclmode; //isclmode,osclmode;
- I curmin,curmax; //,curlen; // in samples
+ L curmin,curmax; //,curlen; // in samples
I sclmin; // in samples
F sclmul;
F s2u; // sample to unit conversion factor