``````

In [2]:

import numpy
import matplotlib.pyplot as plt
%matplotlib inline
import math
#from ipywidgets import interact, interactive, fixed, interact_manual
#import ipywidgets as widgets

``````
``````

In [3]:

t1 = numpy.linspace(start=0.0, stop=1.0, num=201)

``````
``````

In [4]:

# FIXME: this is now relative, maybe make it absolute
ad = 0.05   # attack/decay (the not active part)

def envelope(v, ctrl):
p0 = None
p1 = None
if ctrl < 0.5:
# Determine active segment and define control points
# static attack segment
p0 = (0.0, 0.0)
else:
c = ctrl * 2.0
if v < xc:
p1 = (xc, c)
else:
p0 = (xc, c)
p1 = (1.0, 0.0)
else:
# Determine active segment and define control points
c = (ctrl - 0.5) * 2.0
if v < xc:
p0 = (0.0, 0.0)
p1 = (xc, 1.0 - c)
else:
p0 = (xc, 1.0 - c)
else:
# static decay segment
p1 = (1.0, 0.0)

# The segment range we interpolate
pd = (p1[0]-p0[0], p1[1]-p0[1])
# 0.0 ... 1.0 the value 'v' is on the segment
pct = 0.0
if pd[0] > 0.0:
pct = (v - p0[0]) / pd[0]
v = p0[1] + (pct * pd[1])
return v

v_envelope = numpy.vectorize(envelope, excluded=['ctrl'])

# https://github.com/jupyter-widgets/ipywidgets/issues/1718
#env = interact(v_envelope, v=fixed(t1), ctrl=(0.0,1.0,0.05))

env_0_0 = v_envelope(t1, 0.0)
env_0_1 = v_envelope(t1, 0.1)
env_0_2 = v_envelope(t1, 0.2)
env_0_3 = v_envelope(t1, 0.3)
env_0_4 = v_envelope(t1, 0.4)
env_0_5 = v_envelope(t1, 0.5)
env_0_6 = v_envelope(t1, 0.6)
env_0_7 = v_envelope(t1, 0.7)
env_0_8 = v_envelope(t1, 0.8)
env_0_9 = v_envelope(t1, 0.9)
env_1_0 = v_envelope(t1, 1.0)

``````
``````

In [8]:

plt.figure(figsize=(100, 40))
#plt.plot(t1)
plt.plot(env_0_0)
plt.plot(env_0_1)
plt.plot(env_0_2)
plt.plot(env_0_3)
plt.plot(env_0_4)
plt.plot(env_0_5)
plt.show()

``````
``````

``````
``````

In [7]:

plt.figure(figsize=(100, 40))
#plt.plot(t1)
plt.plot(env_0_5)
plt.plot(env_0_6)
plt.plot(env_0_7)
plt.plot(env_0_8)
plt.plot(env_0_9)
plt.plot(env_1_0)
plt.show()

``````
``````

``````
``````

In [ ]:

``````