public float getCurrentLevel() {
        switch (state) {
            case ATTACKING:
                lerpProgression = (System.currentTimeMillis() - triggerTime) / (float) attackDuration;
                if (lerpProgression >= 1) {
                    state = ADSRStates.DECAYING;
                    triggerTime = System.currentTimeMillis();
                    return 1;
                }
                return lerp(0, 1, lerpProgression);

            case DECAYING:
                lerpProgression = (System.currentTimeMillis() - triggerTime) / (float) decayDuration;
                if (lerpProgression >= 1) {
                    state = ADSRStates.SUSTAINING;
                    return sustainLevel;
                }
                return lerp(1, sustainLevel, lerpProgression);

            case SUSTAINING:
                return sustainLevel;

            case RELEASING:
                lerpProgression = (System.currentTimeMillis() - triggerTime) / (float) releaseDuration;
                if (lerpProgression >= 1) {
                    state = ADSRStates.OFF;
                    return 0;
                }
                return lerp(releaseLevel, 0, lerpProgression);

            default:
                return -1;
        }
    }