@classmethod
def adsr(cls, attack_length, attack_level, decay_length, sustain_level,
    sustain_length, release_length, attack_shape=None, decay_shape=None,
    release_shape=None):
    """
        Construct a standard attack/decay/sustain/release envelope
        :param attack_length: rise time
        :param attack_level: level reached after attack before decay
        :param decay_length: length of decay portion of the curve
        :param sustain_level: sustain level reached after decay and before release
        :param sustain_length: length of sustain portion of curve
        :param release_length: release time
        :param attack_shape: sets curve shape for attack portion of the curve
        :param decay_shape: sets curve shape for decay portion of the curve
        :param release_shape: sets curve shape for release portion of the curve
        :return: an Envelope constructed accordingly
       """
    curve_shapes = (None if attack_shape is decay_shape is release_shape is
        None else (0 if attack_shape is None else attack_shape, 0 if 
        decay_shape is None else decay_shape, 0, 0 if release_shape is None
         else release_shape))
    return cls.from_levels_and_durations((0, attack_level, sustain_level,
        sustain_level, 0), (attack_length, decay_length, sustain_length,
        release_length), curve_shapes=curve_shapes)
