// Path: core/src/com/gdx/musicevents/effects/Effect.java
// public interface Effect {
//     public void update(float dt);
//     public boolean isDone();
// }
// 
// Path: core/src/com/gdx/musicevents/effects/FadeIn.java
// public class FadeIn implements StartEffect {
//     protected transient float originalVolume;
//     protected final float totalTime;
//     protected transient float elapsedTime = 0;
//     protected final float offset;
//     protected transient float elapsedOffset;
//     protected transient boolean started = false;
// 
//     protected transient MusicState nextState;
//     protected transient MusicState previousState;
// 
//     public FadeIn() {
//         this(0, 0);
// 
//     }
// 
//     public FadeIn(float offset, float totalTime) {
//         this.offset = offset;
//         this.totalTime = totalTime;
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//         this.previousState = previousState;
//     }
//     
//     @Override
//     public void beginStart() {
//         this.originalVolume = nextState.getVolume();
//         this.elapsedTime = 0;
//         this.elapsedOffset = 0;
//         nextState.setVolume(0);
//         nextState.play();
// 
//         started = true;
// 
//     }
// 
//     @Override
//     public void update(float dt) {
// 
//         if (elapsedOffset < offset) {
//             elapsedOffset += dt;
//         } else {
//             elapsedTime += dt;
// 
//             if (isDone()) {
//                 endStart();
//             } else {
//                 nextState.setVolume(originalVolume * (elapsedTime) / totalTime);
//             }
//         }
//     }
// 
//     @Override
//     public void endStart() {
//         Gdx.app.debug("FadeIn", "Stop");
//     }
// 
//     @Override
//     public boolean isDone() {
//         return elapsedTime >= totalTime;
//     }
// 
//     @Override
//     public String toString() {
//         return "Fade in " + nextState;
//     }
// }
// 
// Path: core/src/com/gdx/musicevents/effects/FadeOut.java
// public class FadeOut implements StopEffect {
//     protected transient float originalVolume;
//     protected final float totalTime;
//     protected transient float elapsedTime = 0;
//     protected final float offset;
//     protected transient float elapsedOffset;
//     protected transient boolean started = false;
// 
//     protected transient MusicState nextState;
//     protected transient MusicState previousState;
// 
//     public FadeOut() {
//         this(0, 0);
//     }
// 
//     public FadeOut(float offset, float totalTime) {
//         this.offset = offset;
//         this.totalTime = totalTime;
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//         this.previousState = previousState;
//     }
//     @Override
//     public void beginStop() {
//         this.originalVolume = nextState.getVolume();
//         this.elapsedTime = 0;
//         this.elapsedOffset = 0;
// 
//         started = true;
//     }
// 
//     @Override
//     public void update(float dt) {
//         if (elapsedOffset < offset) {
//             elapsedOffset += dt;
//         } else {
//             elapsedTime += dt;
//             if (isDone()) {
//                 endStop();
//             } else {
//                 nextState.setVolume(
//                         originalVolume * (totalTime - elapsedTime) / totalTime);
//                 Gdx.app.debug("FadeOut", "Volume: " + nextState.getVolume());
//             }
//         }
//     }
// 
//     @Override
//     public void endStop() {
//         Gdx.app.debug("FadeOut", "Stop " + previousState.toString());
//         nextState.setVolume(originalVolume);
//         nextState.stop();
//     }
// 
//     @Override
//     public boolean isDone() {
//         return elapsedTime >= totalTime;
//     }
// 
//     
//     @Override
//     public String toString() {
//         return "Fading out " + nextState;
//     }
// }
// 
// Path: core/src/com/gdx/musicevents/effects/Play.java
// public class Play implements StartEffect {
// 
//     
//     private MusicState nextState;
//     
//     public Play() {
//     }
// 
//     @Override
//     public void beginStart() {
//         nextState.play();
//         nextState.setVolume(1);
//     }
// 
//     @Override
//     public void endStart() {
//     }
// 
//     @Override
//     public void update(float dt) {
//     }
// 
//     @Override
//     public boolean isDone() {
//         return true;
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//     }
// }
// 
// Path: core/src/com/gdx/musicevents/effects/Stop.java
// public class Stop implements StopEffect {
//     private MusicState nextState;
// 
//     public Stop() {
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//     }
//     
//     @Override
//     public void beginStop() {
//         nextState.stop();
//     }
// 
//     @Override
//     public void endStop() {
// 
//     }
// 
//     @Override
//     public void update(float dt) {
//     }
// 
//     @Override
//     public boolean isDone() {
//         return true;
//     }
// }


import com.gdx.musicevents.effects.Effect;
import com.gdx.musicevents.effects.FadeIn;
import com.gdx.musicevents.effects.FadeOut;
import com.gdx.musicevents.effects.Play;
import com.gdx.musicevents.effects.Stop;
package com.gdx.musicevents.tool.transitions;


public class EffectDecorator {
    String name;
    Effect effect;

    public EffectDecorator(String name, Effect effect) {
        this.name = name;
        this.effect = effect;
    }

    @Override
    public String toString() {
        return name + "(" + getEffectName(effect) + ")";
    }

    private String getEffectName(Effect effect){
        if(effect instanceof Play){
            return "Play";
// Path: core/src/com/gdx/musicevents/effects/Effect.java
// public interface Effect {
//     public void update(float dt);
//     public boolean isDone();
// }
// 
// Path: core/src/com/gdx/musicevents/effects/FadeIn.java
// public class FadeIn implements StartEffect {
//     protected transient float originalVolume;
//     protected final float totalTime;
//     protected transient float elapsedTime = 0;
//     protected final float offset;
//     protected transient float elapsedOffset;
//     protected transient boolean started = false;
// 
//     protected transient MusicState nextState;
//     protected transient MusicState previousState;
// 
//     public FadeIn() {
//         this(0, 0);
// 
//     }
// 
//     public FadeIn(float offset, float totalTime) {
//         this.offset = offset;
//         this.totalTime = totalTime;
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//         this.previousState = previousState;
//     }
//     
//     @Override
//     public void beginStart() {
//         this.originalVolume = nextState.getVolume();
//         this.elapsedTime = 0;
//         this.elapsedOffset = 0;
//         nextState.setVolume(0);
//         nextState.play();
// 
//         started = true;
// 
//     }
// 
//     @Override
//     public void update(float dt) {
// 
//         if (elapsedOffset < offset) {
//             elapsedOffset += dt;
//         } else {
//             elapsedTime += dt;
// 
//             if (isDone()) {
//                 endStart();
//             } else {
//                 nextState.setVolume(originalVolume * (elapsedTime) / totalTime);
//             }
//         }
//     }
// 
//     @Override
//     public void endStart() {
//         Gdx.app.debug("FadeIn", "Stop");
//     }
// 
//     @Override
//     public boolean isDone() {
//         return elapsedTime >= totalTime;
//     }
// 
//     @Override
//     public String toString() {
//         return "Fade in " + nextState;
//     }
// }
// 
// Path: core/src/com/gdx/musicevents/effects/FadeOut.java
// public class FadeOut implements StopEffect {
//     protected transient float originalVolume;
//     protected final float totalTime;
//     protected transient float elapsedTime = 0;
//     protected final float offset;
//     protected transient float elapsedOffset;
//     protected transient boolean started = false;
// 
//     protected transient MusicState nextState;
//     protected transient MusicState previousState;
// 
//     public FadeOut() {
//         this(0, 0);
//     }
// 
//     public FadeOut(float offset, float totalTime) {
//         this.offset = offset;
//         this.totalTime = totalTime;
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//         this.previousState = previousState;
//     }
//     @Override
//     public void beginStop() {
//         this.originalVolume = nextState.getVolume();
//         this.elapsedTime = 0;
//         this.elapsedOffset = 0;
// 
//         started = true;
//     }
// 
//     @Override
//     public void update(float dt) {
//         if (elapsedOffset < offset) {
//             elapsedOffset += dt;
//         } else {
//             elapsedTime += dt;
//             if (isDone()) {
//                 endStop();
//             } else {
//                 nextState.setVolume(
//                         originalVolume * (totalTime - elapsedTime) / totalTime);
//                 Gdx.app.debug("FadeOut", "Volume: " + nextState.getVolume());
//             }
//         }
//     }
// 
//     @Override
//     public void endStop() {
//         Gdx.app.debug("FadeOut", "Stop " + previousState.toString());
//         nextState.setVolume(originalVolume);
//         nextState.stop();
//     }
// 
//     @Override
//     public boolean isDone() {
//         return elapsedTime >= totalTime;
//     }
// 
//     
//     @Override
//     public String toString() {
//         return "Fading out " + nextState;
//     }
// }
// 
// Path: core/src/com/gdx/musicevents/effects/Play.java
// public class Play implements StartEffect {
// 
//     
//     private MusicState nextState;
//     
//     public Play() {
//     }
// 
//     @Override
//     public void beginStart() {
//         nextState.play();
//         nextState.setVolume(1);
//     }
// 
//     @Override
//     public void endStart() {
//     }
// 
//     @Override
//     public void update(float dt) {
//     }
// 
//     @Override
//     public boolean isDone() {
//         return true;
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//     }
// }
// 
// Path: core/src/com/gdx/musicevents/effects/Stop.java
// public class Stop implements StopEffect {
//     private MusicState nextState;
// 
//     public Stop() {
//     }
// 
//     @Override
//     public void initialize(MusicState nextState, MusicState previousState) {
//         this.nextState = nextState;
//     }
//     
//     @Override
//     public void beginStop() {
//         nextState.stop();
//     }
// 
//     @Override
//     public void endStop() {
// 
//     }
// 
//     @Override
//     public void update(float dt) {
//     }
// 
//     @Override
//     public boolean isDone() {
//         return true;
//     }
// }


// Path: desktop/src/com/gdx/musicevents/tool/transitions/EffectDecorator.java
import com.gdx.musicevents.effects.Effect;
import com.gdx.musicevents.effects.FadeIn;
import com.gdx.musicevents.effects.FadeOut;
import com.gdx.musicevents.effects.Play;
import com.gdx.musicevents.effects.Stop;

package com.gdx.musicevents.tool.transitions;


public class EffectDecorator {
    String name;
    Effect effect;

    public EffectDecorator(String name, Effect effect) {
        this.name = name;
        this.effect = effect;
    }

    @Override
    public String toString() {
        return name + "(" + getEffectName(effect) + ")";
    }

    private String getEffectName(Effect effect){
        if(effect instanceof Play){
            return "Play";
        } else if(effect instanceof Stop){