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