My one-th lispy gopher show aired! It was scrappy and half the time slot, and I was very slightly going to pieces the hour before I just listened to it in com with everyone else but it happened. One challenge with my show is that I don't use high level software, which bewilders usual advice about what software is easy to use. Well, I'm still relying on ffmpeg but most of that I can replace with my libsndfile lisp post, and the rest should just be using libmp3lame to achieve the right encoding. Here I will document what I worked with this time. In order to make asyncronous shell calls, I used ecl's #'ext:run-program which is like (setq *ext-proc* (nth-value 2 (ext:run-program "./foo.exe" '("--args" "--to" "--foo") :output *standard-output* :wait nil))) The #'nth-value 2 is because the multiple returns of #'ext:run-program are (values two-way-stream status-code ext-process). The interesting thing is :wait nil, which is like adding an & after a command in a shell. So to asyncronously record from my mic, which is snd/1, I can use openbsd aucat(1) (setq *ext-proc* (nth-value 2 (ext:run-program "aucat" '("-f" "snd/1" "-o" "rec.wav") :wait nil))) But I don't really want the external process, I want a way of stopping aucat, so instead I return a closure that terminates the process: (setq *killer* (let ((ext-proc (nth-value 2 (ext:run-program "aucat" ' ("-f" "snd/1" "-o" "out.wav") :wait nil)))) (lambda () (ext:terminate-process ext-proc) (ext:external-process-wait ext-proc)))) So I can end recording with (funcall *killer*) (and the same for playing with aucat(1) -i). Similarly, system sound is the same but my device is snd/mon (see some post I made before). That's about it technically. I put my pre-recorded show together, and converted it to mp3 using ffmpeg, though I can write this out: ```combine.txt file 'foo.wav' file 'bar.wav' ``` ffmpeg -f concat -safe 0 -i combine.txt -c copy cat.wav And lame compression with ffmpeg: ffmpeg -i cat.wav -ar 44100 -b:a 192k cat.mp3 For portability, ecl's #'ext:run-program should be replaced with the compatibility package uiop's #'uiop:run-program, though it's noticeably different. Proximal goals: Figure out live icecast2 streaming so I can sbr and have my hour live. 4-5 more songs to round out the hour. Try and use my sound-playback and rec abilities to form recognisable music. I think it could be fun to just try to recreate small phrases from a track using my lispy libsndfile. Thank you to everyone on anonradio, com, gopher, DJs and miscellaneous other damgud cyberchatters.