| @@ -33,11 +33,11 @@ void tDelay_initToPool (tDelay* const dl, uint32_t delay, uint32_t maxDelay · 32 unmodified lines |
| 33 | 33 | { |
| 34 | 34 | _tMempool* m = *mp; |
| 35 | 35 | _tDelay* d = *dl = (_tDelay*) mpool_alloc(sizeof(_tDelay), m); |
| 36 | | − |
| 36 | + |
| 37 | 37 | d->maxDelay = maxDelay; |
| 38 | | − |
| 38 | + |
| 39 | 39 | d->delay = delay; |
| 40 | | − |
| 40 | + |
| 41 | 41 | d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, m); |
| 42 | 42 | |
| 43 | 43 | d->inPoint = 0; |
| @@ -72,49 +72,49 @@ void tDelay_clear(tDelay* const dl) · 28 unmodified lines |
| 72 | 72 | float tDelay_tick (tDelay* const dl, float input) |
| 73 | 73 | { |
| 74 | 74 | _tDelay* d = *dl; |
| 75 | | − |
| 75 | + |
| 76 | 76 | // Input |
| 77 | 77 | d->lastIn = input; |
| 78 | 78 | d->buff[d->inPoint] = input * d->gain; |
| 79 | 79 | if (++(d->inPoint) == d->maxDelay) d->inPoint = 0; |
| 80 | | − |
| 80 | + |
| 81 | 81 | // Output |
| 82 | 82 | d->lastOut = d->buff[d->outPoint]; |
| 83 | 83 | if (++(d->outPoint) == d->maxDelay) d->outPoint = 0; |
| 84 | | − |
| 84 | + |
| 85 | 85 | return d->lastOut; |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | 88 | int tDelay_setDelay (tDelay* const dl, uint32_t delay) |
| 89 | 89 | { |
| 90 | 90 | _tDelay* d = *dl; |
| 91 | | − |
| 91 | + |
| 92 | 92 | d->delay = LEAF_clip(0.0f, delay, d->maxDelay); |
| 93 | | − |
| 93 | + |
| 94 | 94 | // read chases write |
| 95 | 95 | if ( d->inPoint >= delay ) d->outPoint = d->inPoint - d->delay; |
| 96 | 96 | else d->outPoint = d->maxDelay + d->inPoint - d->delay; |
| 97 | | − |
| 97 | + |
| 98 | 98 | return 0; |
| 99 | 99 | } |
| 100 | 100 | |
| 101 | 101 | float tDelay_tapOut (tDelay* const dl, uint32_t tapDelay) |
| 102 | 102 | { |
| 103 | 103 | _tDelay* d = *dl; |
| 104 | | − |
| 104 | + |
| 105 | 105 | int32_t tap = d->inPoint - tapDelay - 1; |
| 106 | | − |
| 106 | + |
| 107 | 107 | // Check for wraparound. |
| 108 | 108 | while ( tap < 0 ) tap += d->maxDelay; |
| 109 | | − |
| 109 | + |
| 110 | 110 | return d->buff[tap]; |
| 111 | | − |
| 111 | + |
| 112 | 112 | } |
| 113 | 113 | |
| 114 | 114 | void tDelay_tapIn (tDelay* const dl, float value, uint32_t tapDelay) |
| 115 | 115 | { |
| 116 | 116 | _tDelay* d = *dl; |
| 117 | | − |
| 117 | + |
| 118 | 118 | int32_t tap = d->inPoint - tapDelay - 1; |
| 119 | 119 | |
| 120 | 120 | // Check for wraparound. |
| @@ -181,17 +181,17 @@ void tLinearDelay_initToPool (tLinearDelay* const dl, float delay, uint32_t · 60 unmodified lines |
| 181 | 181 | { |
| 182 | 182 | _tMempool* m = *mp; |
| 183 | 183 | _tLinearDelay* d = *dl = (_tLinearDelay*) mpool_alloc(sizeof(_tLinearDelay), m); |
| 184 | | − |
| 184 | + |
| 185 | 185 | d->maxDelay = maxDelay; |
| 186 | | − |
| 186 | + |
| 187 | 187 | if (delay > maxDelay) d->delay = maxDelay; |
| 188 | 188 | else if (delay < 0.0f) d->delay = 0.0f; |
| 189 | 189 | else d->delay = delay; |
| 190 | | − |
| 190 | + |
| 191 | 191 | d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, m); |
| 192 | | − |
| 192 | + |
| 193 | 193 | d->gain = 1.0f; |
| 194 | | − |
| 194 | + |
| 195 | 195 | d->lastIn = 0.0f; |
| 196 | 196 | d->lastOut = 0.0f; |
| 197 | 197 | |
| @@ -222,9 +222,9 @@ void tLinearDelay_clear(tLinearDelay* const dl) · 24 unmodified lines |
| 222 | 222 | float tLinearDelay_tick (tLinearDelay* const dl, float input) |
| 223 | 223 | { |
| 224 | 224 | _tLinearDelay* d = *dl; |
| 225 | | − |
| 225 | + |
| 226 | 226 | d->buff[d->inPoint] = input * d->gain; |
| 227 | | − |
| 227 | + |
| 228 | 228 | // Increment input pointer modulo length. |
| 229 | 229 | if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0; |
| 230 | 230 | |
| @@ -239,14 +239,14 @@ float tLinearDelay_tick (tLinearDelay* const dl, float input) · 8 unmodified lines |
| 239 | 239 | |
| 240 | 240 | // Increment output pointer modulo length |
| 241 | 241 | if ( (++d->outPoint) >= d->maxDelay ) d->outPoint = 0; |
| 242 | | − |
| 242 | + |
| 243 | 243 | return d->lastOut; |
| 244 | 244 | } |
| 245 | 245 | |
| 246 | 246 | void tLinearDelay_tickIn (tLinearDelay* const dl, float input) |
| 247 | 247 | { |
| 248 | 248 | _tLinearDelay* d = *dl; |
| 249 | | − |
| 249 | + |
| 250 | 250 | d->buff[d->inPoint] = input * d->gain; |
| 251 | 251 | |
| 252 | 252 | // Increment input pointer modulo length. |
| @@ -256,7 +256,7 @@ void tLinearDelay_tickIn (tLinearDelay* const dl, float input) · 3 unmodified lines |
| 256 | 256 | float tLinearDelay_tickOut (tLinearDelay* const dl) |
| 257 | 257 | { |
| 258 | 258 | _tLinearDelay* d = *dl; |
| 259 | | − |
| 259 | + |
| 260 | 260 | uint32_t idx = (uint32_t) d->outPoint; |
| 261 | 261 | // First 1/2 of interpolation |
| 262 | 262 | d->lastOut = d->buff[idx] * d->omAlpha; |
| @@ -275,53 +275,53 @@ float tLinearDelay_tickOut (tLinearDelay* const dl) · 12 unmodified lines |
| 275 | 275 | int tLinearDelay_setDelay (tLinearDelay* const dl, float delay) |
| 276 | 276 | { |
| 277 | 277 | _tLinearDelay* d = *dl; |
| 278 | | − |
| 278 | + |
| 279 | 279 | d->delay = LEAF_clip(0.0f, delay, d->maxDelay); |
| 280 | | − |
| 280 | + |
| 281 | 281 | float outPointer = d->inPoint - d->delay; |
| 282 | | − |
| 282 | + |
| 283 | 283 | while ( outPointer < 0 ) |
| 284 | 284 | outPointer += d->maxDelay; // modulo maximum length |
| 285 | | − |
| 285 | + |
| 286 | 286 | d->outPoint = (uint32_t) outPointer; // integer part |
| 287 | | − |
| 287 | + |
| 288 | 288 | d->alpha = outPointer - d->outPoint; // fractional part |
| 289 | 289 | d->omAlpha = 1.0f - d->alpha; |
| 290 | | − |
| 290 | + |
| 291 | 291 | if ( d->outPoint == d->maxDelay ) d->outPoint = 0; |
| 292 | | − |
| 292 | + |
| 293 | 293 | return 0; |
| 294 | 294 | } |
| 295 | 295 | |
| 296 | 296 | float tLinearDelay_tapOut (tLinearDelay* const dl, uint32_t tapDelay) |
| 297 | 297 | { |
| 298 | 298 | _tLinearDelay* d = *dl; |
| 299 | | − |
| 299 | + |
| 300 | 300 | uint32_t tap = d->inPoint - tapDelay - 1; |
| 301 | 301 | // Check for wraparound. |
| 302 | 302 | while ( tap < 0 ) tap += d->maxDelay; |
| 303 | | − |
| 303 | + |
| 304 | 304 | return d->buff[tap]; |
| 305 | 305 | } |
| 306 | 306 | |
| 307 | 307 | void tLinearDelay_tapIn (tLinearDelay* const dl, float value, uint32_t tapDelay) |
| 308 | 308 | { |
| 309 | 309 | _tLinearDelay* d = *dl; |
| 310 | | − |
| 310 | + |
| 311 | 311 | uint32_t tap = d->inPoint - tapDelay - 1; |
| 312 | | − |
| 312 | + |
| 313 | 313 | // Check for wraparound. |
| 314 | 314 | while ( tap < 0 ) tap += d->maxDelay; |
| 315 | | − |
| 315 | + |
| 316 | 316 | d->buff[tap] = value; |
| 317 | 317 | } |
| 318 | 318 | |
| 319 | 319 | float tLinearDelay_addTo (tLinearDelay* const dl, float value, uint32_t tapDelay) |
| 320 | 320 | { |
| 321 | 321 | _tLinearDelay* d = *dl; |
| 322 | | − |
| 322 | + |
| 323 | 323 | int32_t tap = d->inPoint - tapDelay - 1; |
| 324 | | − |
| 324 | + |
| 325 | 325 | // Check for wraparound. |
| 326 | 326 | while ( tap < 0 ) tap += d->maxDelay; |
| 327 | 327 | |
| @@ -579,15 +579,15 @@ void tAllpassDelay_initToPool (tAllpassDelay* const dl, float delay, uint32_ · 251 unmodified lines |
| 579 | 579 | { |
| 580 | 580 | _tMempool* m = *mp; |
| 581 | 581 | _tAllpassDelay* d = *dl = (_tAllpassDelay*) mpool_alloc(sizeof(_tAllpassDelay), m); |
| 582 | | − |
| 582 | + |
| 583 | 583 | d->maxDelay = maxDelay; |
| 584 | | − |
| 584 | + |
| 585 | 585 | if (delay > maxDelay) d->delay = maxDelay; |
| 586 | 586 | else if (delay < 0.0f) d->delay = 0.0f; |
| 587 | 587 | else d->delay = delay; |
| 588 | | − |
| 588 | + |
| 589 | 589 | d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, m); |
| 590 | | − |
| 590 | + |
| 591 | 591 | d->gain = 1.0f; |
| 592 | 592 | |
| 593 | 593 | d->lastIn = 0.0f; |
| @@ -622,43 +622,43 @@ void tAllpassDelay_clear(tAllpassDelay* const dl) · 28 unmodified lines |
| 622 | 622 | float tAllpassDelay_tick (tAllpassDelay* const dl, float input) |
| 623 | 623 | { |
| 624 | 624 | _tAllpassDelay* d = *dl; |
| 625 | | − |
| 625 | + |
| 626 | 626 | d->buff[d->inPoint] = input * d->gain; |
| 627 | | − |
| 627 | + |
| 628 | 628 | // Increment input pointer modulo length. |
| 629 | 629 | if ( ++(d->inPoint) >= d->maxDelay ) d->inPoint = 0; |
| 630 | | − |
| 630 | + |
| 631 | 631 | // Do allpass interpolation delay. |
| 632 | 632 | float out = d->lastOut * -d->coeff; |
| 633 | 633 | out += d->apInput + ( d->coeff * d->buff[d->outPoint] ); |
| 634 | 634 | d->lastOut = out; |
| 635 | | − |
| 635 | + |
| 636 | 636 | // Save allpass input |
| 637 | 637 | d->apInput = d->buff[d->outPoint]; |
| 638 | | − |
| 638 | + |
| 639 | 639 | // Increment output pointer modulo length. |
| 640 | 640 | if (++(d->outPoint) >= d->maxDelay ) d->outPoint = 0; |
| 641 | | − |
| 641 | + |
| 642 | 642 | return d->lastOut; |
| 643 | 643 | } |
| 644 | 644 | |
| 645 | 645 | int tAllpassDelay_setDelay (tAllpassDelay* const dl, float delay) |
| 646 | 646 | { |
| 647 | 647 | _tAllpassDelay* d = *dl; |
| 648 | | − |
| 648 | + |
| 649 | 649 | d->delay = LEAF_clip(0.5f, delay, d->maxDelay); |
| 650 | | − |
| 650 | + |
| 651 | 651 | // outPoint chases inPoint |
| 652 | 652 | float outPointer = (float)d->inPoint - d->delay + 1.0f; |
| 653 | | − |
| 653 | + |
| 654 | 654 | while ( outPointer < 0 ) outPointer += d->maxDelay; // mod max length |
| 655 | | − |
| 655 | + |
| 656 | 656 | d->outPoint = (uint32_t) outPointer; // integer part |
| 657 | | − |
| 657 | + |
| 658 | 658 | if ( d->outPoint >= d->maxDelay ) d->outPoint = 0; |
| 659 | | − |
| 659 | + |
| 660 | 660 | d->alpha = 1.0f + (float)d->outPoint - outPointer; // fractional part |
| 661 | | − |
| 661 | + |
| 662 | 662 | if ( d->alpha < 0.5f ) |
| 663 | 663 | { |
| 664 | 664 | // The optimal range for alpha is about 0.5 - 1.5 in order to |
| @@ -670,46 +670,46 @@ int tAllpassDelay_setDelay (tAllpassDelay* const dl, float delay) · 5 unmodified lines |
| 670 | 670 | |
| 671 | 671 | d->alpha += 1.0f; |
| 672 | 672 | } |
| 673 | | − |
| 673 | + |
| 674 | 674 | d->coeff = (1.0f - d->alpha) / (1.0f + d->alpha); // coefficient for allpass |
| 675 | | − |
| 675 | + |
| 676 | 676 | return 0; |
| 677 | 677 | } |
| 678 | 678 | |
| 679 | 679 | float tAllpassDelay_tapOut (tAllpassDelay* const dl, uint32_t tapDelay) |
| 680 | 680 | { |
| 681 | 681 | _tAllpassDelay* d = *dl; |
| 682 | | − |
| 682 | + |
| 683 | 683 | int32_t tap = d->inPoint - tapDelay - 1; |
| 684 | | − |
| 684 | + |
| 685 | 685 | // Check for wraparound. |
| 686 | 686 | while ( tap < 0 ) tap += d->maxDelay; |
| 687 | | − |
| 687 | + |
| 688 | 688 | return d->buff[tap]; |
| 689 | | − |
| 689 | + |
| 690 | 690 | } |
| 691 | 691 | |
| 692 | 692 | void tAllpassDelay_tapIn (tAllpassDelay* const dl, float value, uint32_t tapDelay) |
| 693 | 693 | { |
| 694 | 694 | _tAllpassDelay* d = *dl; |
| 695 | | − |
| 695 | + |
| 696 | 696 | int32_t tap = d->inPoint - tapDelay - 1; |
| 697 | | − |
| 697 | + |
| 698 | 698 | // Check for wraparound. |
| 699 | 699 | while ( tap < 0 ) tap += d->maxDelay; |
| 700 | | − |
| 700 | + |
| 701 | 701 | d->buff[tap] = value; |
| 702 | 702 | } |
| 703 | 703 | |
| 704 | 704 | float tAllpassDelay_addTo (tAllpassDelay* const dl, float value, uint32_t tapDelay) |
| 705 | 705 | { |
| 706 | 706 | _tAllpassDelay* d = *dl; |
| 707 | | − |
| 707 | + |
| 708 | 708 | int32_t tap = d->inPoint - tapDelay - 1; |
| 709 | | − |
| 709 | + |
| 710 | 710 | // Check for wraparound. |
| 711 | 711 | while ( tap < 0 ) tap += d->maxDelay; |
| 712 | | − |
| 712 | + |
| 713 | 713 | return (d->buff[tap] += value); |
| 714 | 714 | } |
| 715 | 715 | |
| @@ -759,20 +759,20 @@ void tTapeDelay_initToPool (tTapeDelay* const dl, float delay, uint32_t maxD · 43 unmodified lines |
| 759 | 759 | { |
| 760 | 760 | _tMempool* m = *mp; |
| 761 | 761 | _tTapeDelay* d = *dl = (_tTapeDelay*) mpool_alloc(sizeof(_tTapeDelay), m); |
| 762 | | − |
| 762 | + |
| 763 | 763 | d->maxDelay = maxDelay; |
| 764 | | − |
| 764 | + |
| 765 | 765 | d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, m); |
| 766 | | − |
| 766 | + |
| 767 | 767 | d->gain = 1.0f; |
| 768 | | − |
| 768 | + |
| 769 | 769 | d->lastIn = 0.0f; |
| 770 | 770 | d->lastOut = 0.0f; |
| 771 | | − |
| 771 | + |
| 772 | 772 | d->idx = 0.0f; |
| 773 | 773 | d->inc = 1.0f; |
| 774 | 774 | d->inPoint = 0; |
| 775 | | − |
| 775 | + |
| 776 | 776 | tTapeDelay_setDelay(dl, delay); |
| 777 | 777 | } |
| 778 | 778 | |
| @@ -780,7 +780,7 @@ void tTapeDelay_freeFromPool(tTapeDelay* const dl, tMempool* const mp) · 1 unmodified line |
| 780 | 780 | { |
| 781 | 781 | _tMempool* m = *mp; |
| 782 | 782 | _tTapeDelay* d = *dl; |
| 783 | | − |
| 783 | + |
| 784 | 784 | mpool_free((char*)d->buff, m); |
| 785 | 785 | mpool_free((char*)d, m); |
| 786 | 786 | } |
| @@ -799,28 +799,28 @@ void tTapeDelay_clear(tTapeDelay* const dl) · 12 unmodified lines |
| 799 | 799 | float tTapeDelay_tick (tTapeDelay* const dl, float input) |
| 800 | 800 | { |
| 801 | 801 | _tTapeDelay* d = *dl; |
| 802 | | − |
| 802 | + |
| 803 | 803 | d->buff[d->inPoint] = input * d->gain; |
| 804 | | − |
| 804 | + |
| 805 | 805 | // Increment input pointer modulo length. |
| 806 | 806 | if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0; |
| 807 | 807 | |
| 808 | 808 | int idx = (int) d->idx; |
| 809 | 809 | float alpha = d->idx - idx; |
| 810 | | − |
| 810 | + |
| 811 | 811 | d->lastOut = LEAF_interpolate_hermite_x (d->buff[((idx - 1) + d->maxDelay) % d->maxDelay], |
| 812 | 812 | d->buff[idx], |
| 813 | 813 | d->buff[(idx + 1) % d->maxDelay], |
| 814 | 814 | d->buff[(idx + 2) % d->maxDelay], |
| 815 | 815 | alpha); |
| 816 | | − |
| 816 | + |
| 817 | 817 | float diff = (d->inPoint - d->idx); |
| 818 | 818 | while (diff < 0.f) diff += d->maxDelay; |
| 819 | | − |
| 819 | + |
| 820 | 820 | d->inc = 1.0f + (diff - d->delay) / d->delay; //* SMOOTH_FACTOR; |
| 821 | 821 | |
| 822 | 822 | d->idx += d->inc; |
| 823 | | − |
| 823 | + |
| 824 | 824 | if (d->idx >= d->maxDelay) d->idx = 0.0f; |
| 825 | 825 | |
| 826 | 826 | if (d->lastOut) |
| @@ -851,30 +851,30 @@ void tTapeDelay_setDelay (tTapeDelay* const dl, float delay) · 24 unmodified lines |
| 851 | 851 | float tTapeDelay_tapOut (tTapeDelay* const dl, float tapDelay) |
| 852 | 852 | { |
| 853 | 853 | _tTapeDelay* d = *dl; |
| 854 | | − |
| 854 | + |
| 855 | 855 | float tap = (float) d->inPoint - tapDelay - 1.f; |
| 856 | | − |
| 856 | + |
| 857 | 857 | // Check for wraparound. |
| 858 | 858 | while ( tap < 0.f ) tap += (float)d->maxDelay; |
| 859 | | − |
| 859 | + |
| 860 | 860 | int idx = (int) tap; |
| 861 | | − |
| 861 | + |
| 862 | 862 | float alpha = tap - idx; |
| 863 | | − |
| 863 | + |
| 864 | 864 | float samp = LEAF_interpolate_hermite_x (d->buff[((idx - 1) + d->maxDelay) % d->maxDelay], |
| 865 | 865 | d->buff[idx], |
| 866 | 866 | d->buff[(idx + 1) % d->maxDelay], |
| 867 | 867 | d->buff[(idx + 2) % d->maxDelay], |
| 868 | 868 | alpha); |
| 869 | | − |
| 869 | + |
| 870 | 870 | return samp; |
| 871 | | − |
| 871 | + |
| 872 | 872 | } |
| 873 | 873 | |
| 874 | 874 | void tTapeDelay_tapIn (tTapeDelay* const dl, float value, uint32_t tapDelay) |
| 875 | 875 | { |
| 876 | 876 | _tTapeDelay* d = *dl; |
| 877 | | − |
| 877 | + |
| 878 | 878 | int32_t tap = d->inPoint - tapDelay - 1; |
| 879 | 879 | |
| 880 | 880 | // Check for wraparound. |