aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/jsyn/unitgen/LinearRamp.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/jsyn/unitgen/LinearRamp.java')
-rw-r--r--src/com/jsyn/unitgen/LinearRamp.java50
1 files changed, 29 insertions, 21 deletions
diff --git a/src/com/jsyn/unitgen/LinearRamp.java b/src/com/jsyn/unitgen/LinearRamp.java
index 438adf6..cad53d5 100644
--- a/src/com/jsyn/unitgen/LinearRamp.java
+++ b/src/com/jsyn/unitgen/LinearRamp.java
@@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,7 +26,7 @@ import com.jsyn.ports.UnitVariablePort;
* value toward the value of input. An internal phase value will go from 0.0 to 1.0 at a rate
* controlled by time. When the internal phase reaches 1.0, the output will equal input.
* <P>
- *
+ *
* @author (C) 1997 Phil Burk, SoftSynth.com
* @see ExponentialRamp
* @see AsymptoticRamp
@@ -52,33 +52,41 @@ public class LinearRamp extends UnitFilter {
public void generate(int start, int limit) {
double[] outputs = output.getValues();
double currentInput = input.getValues()[0];
- double currentTime = time.getValues()[0];
double currentValue = current.getValue();
- if (currentTime != timeHeld) {
- rate = convertTimeToRate(currentTime);
- timeHeld = currentTime;
- }
-
- /* If input has changed, start new segment */
- if (currentInput != target) /*
- * Equality check is OK because we set them exactly equal below.
- */
+ // If input has changed, start new segment.
+ // Equality check is OK because we set them exactly equal below.
+ if (currentInput != target)
{
source = currentValue;
phase = 0.0;
target = currentInput;
}
- for (int i = start; i < limit; i++) {
- if (phase < 1.0) {
- /* Interpolate current. */
- currentValue = source + (phase * (target - source));
- phase += rate;
- } else {
- currentValue = target;
+ if (currentValue == target) {
+ // at end of ramp
+ for (int i = start; i < limit; i++) {
+ outputs[i] = currentValue;
+ }
+ } else {
+ // in middle of ramp
+ double currentTime = time.getValues()[0];
+ // Has time changed?
+ if (currentTime != timeHeld) {
+ rate = convertTimeToRate(currentTime);
+ timeHeld = currentTime;
+ }
+
+ for (int i = start; i < limit; i++) {
+ if (phase < 1.0) {
+ /* Interpolate current. */
+ currentValue = source + (phase * (target - source));
+ phase += rate;
+ } else {
+ currentValue = target;
+ }
+ outputs[i] = currentValue;
}
- outputs[i] = currentValue;
}
current.setValue(currentValue);