audacia/nyquist/upic.sal

54 lines
1.3 KiB
Plaintext

;; upic.sal -- play upic data
;;
define function upic(data)
begin
if data then
;; use reverse to make a copy of data since sort is destructive
return upic-curve(sort(reverse(data), quote(upic-compare)))
else
return s-rest()
end
define function upic-compare(a, b)
return third(a) < third(b)
define function upic-curve(data)
begin
with curve = first(data),
waveform = first(curve),
envelope = second(curve),
points = cddr(curve),
from-time = first(points),
to-time = nth(length(points) - 2, points),
dur = to-time - from-time,
next = rest(data),
next-start, snd
;; shift curve to start at t = 0
loop
with relpoints
while points
set relpoints @= first(points) - from-time
set relpoints @= second(points)
set points = cddr(points)
finally set points = cdr(reverse(relpoints))
end
set snd = hzosc(pwlv-list(points), symbol-value(waveform)) *
(funcall(envelope) ~ dur)
if next then
begin
set next-start = third(first(next))
;; display "curve", from-time, dur
set snd = seq(set-logical-stop(snd, next-start - from-time),
upic-curve(next))
end
return snd
end
define function upic-env()
return env(0.01, 0.01, 0.01, 1, 1, 1)