aboutsummaryrefslogtreecommitdiffstats
path: root/maximilian.cpp
diff options
context:
space:
mode:
authorMichael ZbyszyƄski <github@mikezed.com>2018-01-22 13:20:35 +0000
committerGitHub <noreply@github.com>2018-01-22 13:20:35 +0000
commitcc721886b84190dd6354f0f40e054bfb6826926b (patch)
tree5f181bd283258bfce8f7d764c83678b1b9a6c1b7 /maximilian.cpp
parent22c4e36d58eb7f2aecf03fb8da7a07211b76432f (diff)
parent9ea34d071a26e00c0d271c5c6dd8916b940c3ba1 (diff)
Merge pull request #60 from JamesFrink/master
Add maxiFractionalDelay
Diffstat (limited to 'maximilian.cpp')
-rw-r--r--maximilian.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/maximilian.cpp b/maximilian.cpp
index 18d3051..41ce498 100644
--- a/maximilian.cpp
+++ b/maximilian.cpp
@@ -617,6 +617,41 @@ double maxiDelayline::dl(double input, int size, double feedback, int position)
}
+maxiFractionalDelay::maxiFractionalDelay ( void ) {
+ memset( memory, 0, delaySize*sizeof (double) );
+}
+
+double maxiFractionalDelay::dl ( double sig, double delayTime, double feedback )
+{
+ // Set delay time
+ delayTime = fmin(fabs(delayTime), delaySize);
+ int32_t delay = delayTime; // Truncated
+ double fractAmount = delayTime - delay; // Fractional remainder
+ double truncAmount = 1.0f - fractAmount; // Inverse fractional remainder
+
+ // Update read pointer
+ readPointer = writePointer - delay;
+ if (readPointer < 0)
+ readPointer += delaySize;
+
+ int readPointerFractPart = readPointer-1;
+ if (readPointerFractPart < 0)
+ readPointerFractPart += delaySize;
+
+ // Get interpolated sample
+ double y = memory[readPointer] * truncAmount + memory[readPointerFractPart] * fractAmount;
+
+ // Write new sample
+ memory[writePointer] = y * feedback + sig;
+
+ // Increment write pointer
+ if (++writePointer >= delaySize)
+ writePointer -= delaySize;
+ return y;
+
+}
+
+
//I particularly like these. cutoff between 0 and 1
double maxiFilter::lopass(double input, double cutoff) {
output=outputs[0] + cutoff*(input-outputs[0]);