diff --git a/src/main/java/sh/ball/audio/effect/BulgeEffect.java b/src/main/java/sh/ball/audio/effect/BulgeEffect.java new file mode 100644 index 0000000..bbeb3d3 --- /dev/null +++ b/src/main/java/sh/ball/audio/effect/BulgeEffect.java @@ -0,0 +1,24 @@ +package sh.ball.audio.effect; + +import sh.ball.shapes.Vector2; + +public class BulgeEffect implements SettableEffect { + + private double bulge = 0.1; + + @Override + public Vector2 apply(int count, Vector2 vector) { + double translatedBulge = -bulge + 1; + + double r = vector.magnitude(); + double theta = Math.atan2(vector.y, vector.x); + double rn = Math.pow(r, translatedBulge); + + return new Vector2(rn * Math.cos(theta), rn * Math.sin(theta)); + } + + @Override + public void setValue(double value) { + this.bulge = value; + } +} diff --git a/src/main/java/sh/ball/audio/effect/EffectType.java b/src/main/java/sh/ball/audio/effect/EffectType.java index 48d37ae..e3322bc 100644 --- a/src/main/java/sh/ball/audio/effect/EffectType.java +++ b/src/main/java/sh/ball/audio/effect/EffectType.java @@ -31,7 +31,8 @@ public enum EffectType { LUA_D(-1), LUA_E(-1), DELAY_DECAY(101), - DELAY_ECHO_LENGTH(-1),; + DELAY_ECHO_LENGTH(-1), + BULGE(53); public final int precedence; diff --git a/src/main/java/sh/ball/gui/controller/EffectsController.java b/src/main/java/sh/ball/gui/controller/EffectsController.java index a8bae90..9832e88 100644 --- a/src/main/java/sh/ball/gui/controller/EffectsController.java +++ b/src/main/java/sh/ball/gui/controller/EffectsController.java @@ -23,7 +23,6 @@ import sh.ball.parser.lua.LuaExecutor; import sh.ball.shapes.Shape; import sh.ball.shapes.Vector2; -import java.awt.*; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.*; @@ -94,6 +93,8 @@ public class EffectsController implements Initializable, SubController { @FXML private EffectComponentGroup delayDecay; @FXML + private EffectComponentGroup bulge; + @FXML private TextField translationXTextField; @FXML private TextField translationYTextField; @@ -204,6 +205,7 @@ public class EffectsController implements Initializable, SubController { backingMidi.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, new ConsumerEffect(audioPlayer::setBackingMidiVolume))); delayDecay.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, delayEffect)); delayEchoLength.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, new ConsumerEffect((value) -> delayEffect.setEchoLength(value)))); + bulge.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, new BulgeEffect())); effects().forEach(effect -> { effect.setEffectUpdater(this::updateEffect); @@ -298,7 +300,8 @@ public class EffectsController implements Initializable, SubController { rotateSpeed, backingMidi, delayDecay, - delayEchoLength + delayEchoLength, + bulge ); } diff --git a/src/main/java/sh/ball/shapes/Vector2.java b/src/main/java/sh/ball/shapes/Vector2.java index dbdfdf9..af709e4 100644 --- a/src/main/java/sh/ball/shapes/Vector2.java +++ b/src/main/java/sh/ball/shapes/Vector2.java @@ -113,4 +113,8 @@ public final class Vector2 extends Shape { ", y=" + y + '}'; } + + public double magnitude() { + return Math.sqrt(x * x + y * y); + } } diff --git a/src/main/resources/fxml/effects.fxml b/src/main/resources/fxml/effects.fxml index 268d76f..952334f 100644 --- a/src/main/resources/fxml/effects.fxml +++ b/src/main/resources/fxml/effects.fxml @@ -13,7 +13,7 @@ - + @@ -135,11 +135,12 @@ + -