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 d7a2663fe9022555d5720efd7b433189b4d445d0..b54079b8e799e072c95b4bbfec191f6a56bdc233 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 086f8ede86bdb9f9e313bd74c541223dfb43bd82..3923a9e07e8f171ce6b4c2ea714d6ed273136694 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 3c7e49855c636f54ebf577814245059aa478524d..b86b6751aa985583cbb1a7c6a38642cff624df06 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 0000000000000000000000000000000000000000..effbc279899291ec7edb57cea9b6c2b018a686ea --- /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); + } + +}