(defun write-note (path period repeats &optional (rampinc 1)
                  &aux (half-period (ash period -1))
                       (vals (list (1+ 127) (1- 127)))) "
write-note
args:
       path - suitable for #'open .. :append / :create
       period - one wavelength in samples
       repeats - number of periods to write
       rampinc - ramp on ramp off increment.
rampinc is arbitrarily *0.5'ed at rampoff time.
aucat doesn't kerchunk at the end, mpv does. ???
"
(with-open-file
 (out path :direction :output
  :if-exists :append :if-does-not-exist :create)

 (loop
  initially (loop for len below half-period by rampinc do
             (loop for val in vals do
              (loop repeat len do (write-byte val out))))

  repeat repeats do
  (loop for val in vals do
   (loop repeat half-period do (write-byte val out)))

  finally (loop for len downfrom half-period
           by (* 0.5 rampinc) to 0 do ;_;
           (loop for val in vals do
            (loop repeat len do (write-byte val out)))))))

(defparameter *day* 1)

(defun %d (&optional (no *day*) (pad 3)) "
%d
Hypothetical day to string thing.
"
(format nil "~v,'0d" pad no))

(defun mpvit (&optional (path nil)) "
raw mpv from lisp util.
raw, 1c, u8, 44.1k
args:
       path - suitable for ~a as mpv's target.
"
(uiop:Run-program
 (format nil
"mpv --demuxer=rawaudio ~
    --demuxer-rawaudio-channels=1 ~
    --demuxer-rawaudio-format=u8 ~
    --demuxer-rawaudio-rate=44100 ~
    ~a" path)
  :output t :error t))

(defun eg ()
(loop for n downfrom 100 to 70 by 5
 for times = (+ 50 (random 100))
 do (write-note "a.raw" n times 0.5))
(mpvit "a.raw"))