From 4bcd5a3085df22799b9a9d851160a47b522b35d4 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Mon, 30 Nov 2020 20:55:27 +0100
Subject: [PATCH] Add abstract fade controller, rename existing logarithmic
 fade class

---
 .../playpad/pad/content/AudioContent.java     | 10 ++---
 ...{Fade.java => AbstractFadeController.java} | 32 +++------------
 ...egate.java => FadeControllerDelegate.java} |  2 +-
 .../pad/fade/LogarithmicFadeController.java   | 40 +++++++++++++++++++
 4 files changed, 52 insertions(+), 32 deletions(-)
 rename PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/{Fade.java => AbstractFadeController.java} (60%)
 rename PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/{FadeDelegate.java => FadeControllerDelegate.java} (87%)
 create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/LogarithmicFadeController.java

diff --git a/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java b/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java
index d7a2663f..b54079b8 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java
@@ -7,9 +7,9 @@ import de.tobias.playpad.audio.AudioRegistry;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadStatus;
 import de.tobias.playpad.pad.content.play.*;
-import de.tobias.playpad.pad.fade.Fade;
-import de.tobias.playpad.pad.fade.FadeDelegate;
+import de.tobias.playpad.pad.fade.FadeControllerDelegate;
 import de.tobias.playpad.pad.fade.Fadeable;
+import de.tobias.playpad.pad.fade.LogarithmicFadeController;
 import de.tobias.playpad.pad.mediapath.MediaPath;
 import de.tobias.playpad.volume.VolumeManager;
 import javafx.application.Platform;
@@ -24,7 +24,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 
 public class AudioContent extends PadContent implements Pauseable, Durationable, Fadeable,
-		Equalizeable, FadeDelegate, Seekable, SpeedAdjustable {
+		Equalizeable, FadeControllerDelegate, Seekable, SpeedAdjustable {
 
 	private final String type;
 
@@ -36,12 +36,12 @@ public class AudioContent extends PadContent implements Pauseable, Durationable,
 	private final ChangeListener<Number> volumeListener;
 	private final ChangeListener<Number> rateListener;
 
-	private final Fade fade;
+	private final LogarithmicFadeController fade;
 
 	AudioContent(String type, Pad pad) {
 		super(pad);
 		this.type = type;
-		fade = new Fade(this);
+		fade = new LogarithmicFadeController(this);
 
 		// Pad Volume Listener
 		volumeListener = (a, oldValue, newValue) -> updateVolume();
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/Fade.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java
similarity index 60%
rename from PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/Fade.java
rename to PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java
index 086f8ede..3923a9e0 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/Fade.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java
@@ -4,19 +4,14 @@ import javafx.animation.Transition;
 import javafx.util.Duration;
 
 /**
- * Fade utils.
- *
- * @author tobias
- * @since 6.0.0
+ * @since 7.1.0
  */
-public class Fade {
+public abstract class AbstractFadeController {
 
-	private static final double VELOCITY = 1;
-
-	private final FadeDelegate fadeDelegate;
 	private Transition currentFadeTransition;
+	protected final FadeControllerDelegate fadeDelegate;
 
-	public Fade(FadeDelegate fadeDelegate) {
+	public AbstractFadeController(FadeControllerDelegate fadeDelegate) {
 		this.fadeDelegate = fadeDelegate;
 	}
 
@@ -58,15 +53,7 @@ public class Fade {
 
 			@Override
 			protected void interpolate(double frac) {
-				double diff = Math.abs(to - from);
-				if (from < to) { // Fade In
-					double fade = fadeInVolumeMultiplier(frac);
-					fadeDelegate.onFadeLevelChange(from + fade * diff);
-				} else { // Fade Out
-					double fade = fadeOutVolumeMultiplier(frac);
-					double newValue = to + fade * diff;
-					fadeDelegate.onFadeLevelChange(newValue);
-				}
+				AbstractFadeController.this.interpolate(this, frac, from, to);
 			}
 		};
 		currentFadeTransition.setOnFinished(e ->
@@ -79,12 +66,5 @@ public class Fade {
 		currentFadeTransition.play();
 	}
 
-	private double fadeInVolumeMultiplier(double time) {
-		return Math.pow(Math.E, VELOCITY * (time - 1)) * time;
-	}
-
-	private double fadeOutVolumeMultiplier(double time) {
-		return Math.pow(Math.E, -VELOCITY * time) * (1 - time);
-	}
-
+	protected abstract void interpolate(Transition transition, double frac, double from, double to);
 }
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/FadeDelegate.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/FadeControllerDelegate.java
similarity index 87%
rename from PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/FadeDelegate.java
rename to PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/FadeControllerDelegate.java
index 3c7e4985..b86b6751 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/FadeDelegate.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/FadeControllerDelegate.java
@@ -6,7 +6,7 @@ package de.tobias.playpad.pad.fade;
  * @author tobias
  * @since 6.0.0
  */
-public interface FadeDelegate {
+public interface FadeControllerDelegate {
 
 	/**
 	 * If the fade level is changed, the delegate performs this method. The faded object should update.
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/LogarithmicFadeController.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/LogarithmicFadeController.java
new file mode 100644
index 00000000..effbc279
--- /dev/null
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/LogarithmicFadeController.java
@@ -0,0 +1,40 @@
+package de.tobias.playpad.pad.fade;
+
+import javafx.animation.Transition;
+
+/**
+ * A fade controller implementation, that handles fade scala logarithmic for dB.
+ *
+ * @author tobias
+ * @since 6.0.0
+ */
+public class LogarithmicFadeController extends AbstractFadeController {
+
+	private static final double VELOCITY = 1;
+
+	public LogarithmicFadeController(FadeControllerDelegate fadeDelegate) {
+		super(fadeDelegate);
+	}
+
+	@Override
+	protected void interpolate(Transition transition, double frac, double from, double to) {
+		double diff = Math.abs(to - from);
+		if (from < to) { // Fade In
+			double fade = computeFadeInMultiplier(frac);
+			fadeDelegate.onFadeLevelChange(from + fade * diff);
+		} else { // Fade Out
+			double fade = computeFadeOutMultiplier(frac);
+			double newValue = to + fade * diff;
+			fadeDelegate.onFadeLevelChange(newValue);
+		}
+	}
+
+	protected double computeFadeInMultiplier(double frac) {
+		return Math.pow(Math.E, VELOCITY * (frac - 1)) * frac;
+	}
+
+	protected double computeFadeOutMultiplier(double frac) {
+		return Math.pow(Math.E, -VELOCITY * frac) * (1 - frac);
+	}
+
+}
-- 
GitLab