From f9740cad349961fac05e38338900b81f4d5ddd86 Mon Sep 17 00:00:00 2001 From: Ed Kelly Date: Sun, 10 May 2009 14:42:56 +0000 Subject: Changed behaviour for weightonset svn path=/trunk/externals/ekext/; revision=11313 --- weightonset/help-weightonset.pd | 140 ++++++++++++++++++++------------------- weightonset/weightonset.c | 14 ++-- weightonset/weightonset.pd_linux | Bin 3016 -> 3060 bytes 3 files changed, 82 insertions(+), 72 deletions(-) diff --git a/weightonset/help-weightonset.pd b/weightonset/help-weightonset.pd index 375bacd..99985ac 100644 --- a/weightonset/help-weightonset.pd +++ b/weightonset/help-weightonset.pd @@ -14,21 +14,21 @@ from the FFT; #X connect 2 1 3 1; #X connect 3 0 4 0; #X connect 5 0 3 2; -#X restore 44 418 pd hasc; -#X obj 128 346 bonk~; +#X restore 44 446 pd hasc; +#X obj 128 374 bonk~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-input 106595 float 0; #X coords 0 1 106594 -1 200 51 1; -#X restore 287 309 graph; -#X obj 128 370 t b b; -#X obj 81 506 f; -#X floatatom 96 487 5 0 0 0 - - -; -#X floatatom 168 348 5 0 99 0 - - -; -#X obj 81 526 print end-value; -#X obj 43 324 tabplay~ \$0-input; -#X floatatom 75 354 5 0 100 0 - - -; -#X floatatom 75 396 5 0 0 0 - - -; -#X obj 75 374 * 0.1; +#X restore 287 337 graph; +#X obj 128 398 t b b; +#X obj 81 534 f; +#X floatatom 96 515 5 0 0 0 - - -; +#X floatatom 168 376 5 0 99 0 - - -; +#X obj 81 554 print end-value; +#X obj 43 352 tabplay~ \$0-input; +#X floatatom 75 382 5 0 100 0 - - -; +#X floatatom 75 424 5 0 0 0 - - -; +#X obj 75 402 * 0.1; #N canvas 0 0 450 300 tw 0; #X obj 274 70 inlet; #X msg 274 91 0; @@ -51,12 +51,12 @@ from the FFT; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 8 1 6 0; -#X restore 39 519 pd tw; +#X restore 39 547 pd tw; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hasc 1 float 3; #A 0 0; #X coords 0 511 1 -1 200 51 1; -#X restore 287 380 graph; +#X restore 287 408 graph; #N canvas 0 0 450 300 adapt 0; #X obj 128 44 inlet; #X obj 127 74 / 100; @@ -70,10 +70,10 @@ from the FFT; #X connect 2 1 4 1; #X connect 3 0 4 0; #X connect 4 0 5 0; -#X restore 168 367 pd adapt; -#X floatatom 168 401 5 0 0 1 influence - -; -#X obj 168 308 loadbang; -#X obj 88 276 bng 15 250 50 0 empty empty load 17 7 0 10 -262144 -1 +#X restore 168 395 pd adapt; +#X floatatom 168 429 5 0 0 1 influence - -; +#X obj 168 336 loadbang; +#X obj 88 304 bng 15 250 50 0 empty empty load 17 7 0 10 -262144 -1 -1; #N canvas 211 176 325 300 loadfile 0; #X obj 44 28 openpanel; @@ -106,16 +106,16 @@ from the FFT; #X connect 11 0 0 0; #X connect 13 0 14 0; #X connect 14 0 1 0; -#X restore 88 295 pd loadfile; -#X obj 43 276 bng 12 250 50 0 empty empty play 15 6 0 10 -262144 -1 +#X restore 88 323 pd loadfile; +#X obj 43 304 bng 12 250 50 0 empty empty play 15 6 0 10 -262144 -1 -1; -#X obj 43 291 t b b; +#X obj 43 319 t b b; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-weightonset 1 float 3; #A 0 0; #X coords 0 511 1 -1 200 51 1; -#X restore 287 450 graph; -#X obj 116 407 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +#X restore 287 478 graph; +#X obj 116 435 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -257985 -1; #X text 56 49 The second value is multipled by the value in the second inlet (range 0-1) and added to the first value. Then \, the divider @@ -124,10 +124,10 @@ by this value \, and added to it.; #X text 46 8 This object makes a moving average with successively less important values. The calculation initiates when the object is banged \, and the first value is the most influential.; -#X msg 65 444 1; -#X obj 130 445 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +#X msg 65 472 1; +#X obj 130 473 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 195 500 print data; +#X obj 195 528 print data; #X text 78 161 When the object is banged the right outlet sends a list of all the values that influenced the result since the last bang \, up to a limit of 1024 values.; @@ -163,53 +163,46 @@ up to a limit of 1024 values.; #X text 538 119 V; #X text 531 132 data dump; #X text 537 143 on bang; -#X text 616 389 1: accumulated average (up to 1024 elements); -#X msg 49 354 5; -#X text 212 411 factor; -#X text 202 387 successive; +#X msg 49 382 5; +#X text 212 439 factor; +#X text 202 415 successive; #X text 64 101 The influence of successive values is lessened by the inverse of the factor on the right inlet. So \, a value of 0.2 in the second inlet means that the second value after the bang is 20% as influential as the first \, and the third value is 20% of 20% (4%) as influential as the first.; -#X floatatom 195 437 5 0 10 1 attack - -; +#X floatatom 195 465 5 0 10 1 attack - -; #X text 509 200 influence factor = 0 : 1st float output only; #X text 510 188 attack length = 0 \,; #X text 535 166 EXAMPLES:; #X text 520 226 attack length = 0 \,; #X text 519 238 influence factor = 1: successive values are; -#X text 232 447 phase; -#X text 232 461 0-100; +#X text 232 475 phase; +#X text 232 489 0-100; #X text 508 252 equally influential to the total \, but the list; #X text 492 31 successive influence factor (0-1); #X text 538 58 V; #X text 538 54 |; -#X text 525 43 attack phase (1-100+); #X text 514 265 grows longer as the numbers are added. Therefore; #X text 506 278 the output responds less and less to input values. ; #X text 513 291 This is an accumulating average between bangs.; #X text 511 313 attack length = 0 \,; #X text 634 366 (w) = weightings (influence values); -#X text 509 405 the output is onset-weighted e.g. the most influential +#X text 509 393 the output is onset-weighted e.g. the most influential values are at the start of the series.; -#X text 700 462 ^; -#X text 699 466 |; -#X text 699 475 |; -#X text 760 462 ^; -#X text 759 466 |; -#X text 759 475 |; -#X text 824 462 ^; -#X text 823 466 |; -#X text 823 475 |; +#X text 699 462 ^; +#X text 698 466 |; +#X text 698 475 |; +#X text 769 462 ^; +#X text 768 466 |; +#X text 768 475 |; +#X text 832 462 ^; +#X text 831 466 |; +#X text 831 475 |; #X text 680 501 of successive inputs; -#X text 622 513 1: accumulated average (up to 1024 elements); #X text 656 490 (w) = weightings (influence values); -#X text 515 529 the output is onset-weighted e.g. the most influential -values are at the start of the series.; #X text 517 437 attack length = 3 \,; -#X text 513 451 influence factor = 0.5: v1 w 0.25 \, v2 w 0.5 \, v3 -w 0.75 \, v4 w 1 \, v5 w 0.5 \, v6 w 0.25...; #X text 509 327 influence factor = 0.5: v1 w 1 \, v2 w 0.5 \, v3 w 0.25 \, v4 w 0.125; #X text 86 200 If the attack phase is greater than 0 \, the values @@ -217,15 +210,28 @@ become successively more influential to the weighted average \, until the number of values is equal to the attack+1. The next value after the attack phase is the most influential \, then the influence factor kicks in and successive values become less influential.; -#X text 552 73 creation args: influence factor \, attack; -#X obj 96 467 weightonset 0.8 0; -#X obj 10 361 dac~; -#X msg 168 328 80; +#X text 557 71 creation args: influence factor \, attack; +#X obj 96 495 weightonset 0.8 0; +#X obj 10 381 dac~; +#X msg 168 356 80; +#X text 513 451 influence factor = 0.5: v1 w 0.125 \, v2 w 0.25 \, +v3 w 0.5 \, v4 w 1 \, v5 w 0.5 \, v6 w 0.25...; +#X text 525 43 attack phase (0-100+); +#X obj 664 183 weightonset 0 0; +#X obj 666 222 weightonset 1 0; +#X obj 674 312 weightonset 0.5 0; +#X obj 676 434 weightonset 0.5 3; +#X text 509 517 the output is onset-weighted e.g. the most influential +values are at the start of the series \, after the attack phase in +which the values become successively more influential.; +#X text 99 269 The weightings of values during the attack phase is +the reverse of successive weightings after the attack:; +#X text 226 294 weighting = influence pow(attack - index); #X connect 0 0 12 0; -#X connect 0 0 103 0; +#X connect 0 0 98 0; #X connect 1 0 3 0; #X connect 3 0 22 0; -#X connect 3 0 103 0; +#X connect 3 0 98 0; #X connect 3 1 4 0; #X connect 4 0 7 0; #X connect 5 0 4 1; @@ -233,23 +239,23 @@ kicks in and successive values become less influential.; #X connect 6 0 14 0; #X connect 8 0 0 0; #X connect 8 0 1 0; -#X connect 8 0 104 0; -#X connect 8 0 104 1; +#X connect 8 0 99 0; +#X connect 8 0 99 1; #X connect 9 0 11 0; #X connect 10 0 0 1; #X connect 11 0 10 0; #X connect 14 0 15 0; -#X connect 14 0 103 1; -#X connect 16 0 105 0; -#X connect 16 0 62 0; +#X connect 14 0 98 1; +#X connect 16 0 100 0; +#X connect 16 0 61 0; #X connect 17 0 18 0; #X connect 19 0 20 0; #X connect 20 0 8 0; #X connect 20 1 12 2; -#X connect 25 0 103 0; -#X connect 26 0 103 0; -#X connect 62 0 9 0; -#X connect 66 0 103 2; -#X connect 103 0 5 0; -#X connect 103 1 27 0; -#X connect 105 0 6 0; +#X connect 25 0 98 0; +#X connect 26 0 98 0; +#X connect 61 0 9 0; +#X connect 65 0 98 2; +#X connect 98 0 5 0; +#X connect 98 1 27 0; +#X connect 100 0 6 0; diff --git a/weightonset/weightonset.c b/weightonset/weightonset.c index 0117b84..44265a2 100644 --- a/weightonset/weightonset.c +++ b/weightonset/weightonset.c @@ -25,11 +25,15 @@ void weightonset_float (t_weightonset *x, t_floatarg fin) SETFLOAT(&x->x_datachunk.data[len], fin); if(x->length < x->attack) { - x->increment = 1 / (x->attack + 1); - x->accumulator += fin*(x->length + 1)*x->increment; -// x->increment*len substitutes for the divider -// during the attack phase - x->divaccum += x->increment*(x->length + 1); + int i; + float weight = 1; + x->increment = x->length - x->attack; + for(i=0;iincrement;i++) + { + weight = weight*x->multiplier; + } + x->accumulator += fin*weight; + x->divaccum += weight; x->weighted = x->accumulator / x->divaccum; outlet_float(x->waverage, x->weighted); } diff --git a/weightonset/weightonset.pd_linux b/weightonset/weightonset.pd_linux index ec673ec..ef37524 100755 Binary files a/weightonset/weightonset.pd_linux and b/weightonset/weightonset.pd_linux differ -- cgit v1.2.1