Modulate one waveform/track with another (FM synthesis)

I would like to add to the wish list, a plugin, that can modulate one waveform/track with another to achieve FM synthesis. If you look at the thread below, Steve says that the only way this can be done is to put one waveform on the left channel and the other on the right, and combine them to a single stereo track.
https://forum.audacityteam.org/t/modulating-one-track-with-another-fm-synthesis/19789/2
I’m not talking about just a ring mod, I’m talking about actual sample based FM synthesis.

I agree with him :smiley:
Make a stereo track with the wave to be modulated as the lower track and the modulation wave in the upper track. Typically the upper track would have a very low frequency waveform. If you’re clear about how to do that, the next bit is easy.

Select the stereo track and from the Effect menu select “Nyquist Prompt”.
In the text box of the Nyquist Prompt, copy and paste this code:

(defun fm (s-in)
   (let* ((s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (map (integrate (db-to-linear (aref s-in 0)))))
      (snd-resamplev (aref s-in 1) *sound-srate* map)))

(fm s)

Then press the OK button.

Note that because FM can create frequencies that are twice as high as the source waves, aliasing distortion could occur if the source audio contained frequencies above 1.4 of the sample rate. For best results with this plug-in the audio track should have a sample rate of 96 kHz.
To change the sample rate of a track, use “Resample…” from the “Tracks” menu.

Note 2: Use the latest version of Audacity with this effect (currently 1.3.13).

Note 3: I’ve only tested this on short samples. Long tracks are likely to be slow and as it is little tested I can’t guarantee that it won’t crash Audacity.

I’ll be interested to hear how you get on with it.

It’s possible to use that FM code to change intonation in speech …

Make an in-sync copy of a track, filter out say some the high frequencies, rectify then low-pass to create a control track which is used to FM the original track.

It would be possible to exaggerate or attenuate the original intonation by this method.
( i.e. frequency range compression or expansion, analogous to dynamic range compression or expansion).

Hi,

I’m interested in this approach to producing FM (specifically using it to produce pure tones for a PhD project). I’m having trouble setting up the stereo file with both waves as you describe above…any advice on how to do this? I can manage to export both waves, but it seems to mix both into a single mono track when I do. Appreciate any pointers you have. Thanks!

  1. Isolate the source audio onto a mono track. (In my rework of Trebor’s example, the phrase “Your gateway to adventure!”)
  2. Generate the modulating track: Track → New; Generate → Tone → Sine, 15Hz, Amplitude 0.8, 3.1 seconds
  3. Move this track above the source (grab and drag)
  4. Select the top track (if you just dragged it, it’s already selected), then using this track’s menu, select “Make Stereo Track” (this combines it with the track below it).
  5. Effect → Nyquist Prompt, paste Steve’s code, and press OK.

I found Trevor’s example to be a bit too subtle, so here’s the same thing with the above-mentioned 15Hz modulation:

Just to clarify: Click on the name of the track name to make the track drop-down menu appear.

Thanks for the help on this guys! I’ve managed to get the tracks set up correctly (a 15Hz sine wave with 0.5 amplitude as the modulating wave; a 600Hz sine wave with 0.2 amplitude as wave to be modulated). When I run Steve’s code through the Nyquist prompt it returns an error message: ‘Nyquist did not return audio’. I’ve had a look at the debug option, which seems to be showing a series of error messages…any ideas what might be the problem? Cheers!

Did you combine the two mono tracks into one stereo track?

If you did and you are still having problems:
First check that you copied the code exactly (code is unforgiving of any errors),
If there is still a problem, please copy / paste the code that you are using in your reply, and copy / paste the error message from the debug window.

Yes, combined both tracks into a single stereo track, with the modulating signal above the signal to be modulated. Copied and pasted the code into the Nyquist Prompt, exactly as is above:

(defun fm (s-in)
(let* ((s-in (lowpass8 s-in (* 0.2 sound-srate)))
(s-in (lowpass8 s-in (* 0.2 sound-srate)))
(map (integrate (db-to-linear (aref s-in 0)))))
(snd-resamplev (aref s-in 1) sound-srate map)))

(fm s)

And then clicked Ok.

It spits out a very long error message:

error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
1> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
2> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
3> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
4> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
5> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
6> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
7> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
8> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
9> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
10> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
11> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
12> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
13> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
14> error: unbound function - S-IN
if continued: try evaluating symbol again
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
15> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
16> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
17> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
18> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
19> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
20> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
21> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
22> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
23> error: illegal character - -62
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
24> error: illegal character - -96
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
25> error: unbound function - MAP
if continued: try evaluating symbol again
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
26> error: misplaced right paren
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
27> error: illegal character - -62
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
28> error: illegal character - -96
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
29> error: illegal character - -62
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
30> error: illegal character - -96
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
31> error: illegal character - -62
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
32> error: illegal character - -96
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
33> error: unbound variable - S-IN
if continued: try evaluating symbol again
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
34> error: misplaced right paren
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
35> error: misplaced right paren
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
36> error: unbound function - FM
if continued: try evaluating symbol again
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc78>
Arguments:
  #<File-Stream: #1ac66bc>
  #)
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac66bc>
  #(
Function: #<Subr-(null): #2a8cc90>
Arguments:
  #<File-Stream: #1ac671c>
  #(
37> 36> 35> 34> 33> 32> 31> 30> 29> 28> 27> 26> 25> 24> 23> 22> 21> 20> 19> 18> 17> 16> 15> 14> 13> 12> 11> 10> 9> 8> 7> 6> 5> 4> 3> 2> 1>

(Sorry for posting in its sprawling entirety…!)

Not sure if there are any other solutions…could it be something to do with both inputs being sinusoidal? I also have the sampling rate set to 44.1 KHz, not sure if this would make a difference?

Many thanks!

Which exact version of Audacity are you using (look in “Help > About Audacity” for the full 3 part number)

Hi Steve,

thank you for sharing your code. While your FM/AM Generators in your other thread
(AM and FM Tone Generators)
worked well on my Audacity V 2.1.2 (Mac), the code in this thread doesn´t seem to work on my side.
It doesn´t return an error message like with Monsieur Carey, instead nothing happens. When debugging the code, it returns the same error log as Monsieur Carery posted.
Any clue?

Are you referring to this code: Modulate one waveform/track with another (FM synthesis) - #2 by steve
if so, ensure that the “Use legacy (version 3) syntax” checkbox is selected.

Looks this code is broken or too old? I test also both, “version 3” checkbox on and off.

error: bad argument type - #<Sound: #230dc98>
Function: #<Subr-AREF: #5b0bd58>
Arguments:
#<Sound: #230dc98>
0
Function: #<FSubr-LET*: #5b0acb8>
Arguments:
((S-IN (LOWPASS8 S-IN (* 0.2 SOUND-SRATE))) (S-IN (LOWPASS8 S-IN (* 0.2 SOUND-SRATE))) (MAP (INTEGRATE (DB-TO-LINEAR (AREF S-IN 0)))))
(SND-RESAMPLEV (AREF S-IN 1) SOUND-SRATE MAP)
Function: #<Closure-FM: #5b07b38>
Arguments:
#<Sound: #230ec38>
1>

Audacity windows 2.3.0, code is too old version?

Original idea good, two waveform. Originally, I try use base frecuency, eg. 440 Hz sinewave. Using other track is modulating wave. Eg. triangle: with triangle value “0” frecuency is 440 Hz, and eg. 0,5 freq is 660 Hz and full 1 it is 880 Hz, eg. I check other plugins, but it is “too ready”, only “slides and values, and user can do nothing”.

So, this plugin looks ok, but code is too old present version Audacity. Must I download any older Audacity? (2019 now, insteat it any 2011 Audacity?)

Which code?

If you are referring to this code:

(defun fm (s-in)
   (let* ((s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (map (integrate (db-to-linear (aref s-in 0)))))
      (snd-resamplev (aref s-in 1) *sound-srate* map)))

(fm s)

from this post: Modulate one waveform/track with another (FM synthesis) - #2 by steve
please read the instructions in that post.

Hi,

(defun fm (s-in)
(let* ((s-in (lowpass8 s-in (* 0.2 sound-srate)))
(s-in (lowpass8 s-in (* 0.2 sound-srate)))
(map (integrate (db-to-linear (aref s-in 0)))))
(snd-resamplev (aref s-in 1) sound-srate map)))

(fm s)

Now looks this work.

I try read nyquit-manual, but it not tell exact answer. This code work, but it destroy both original sounds.

1, how this code adjust “create new track for result” or “do not destroy modulator signal”. As you know, “base freq” is not interesting- it is eg. any sine wave and we know it is just it known freq. So this we can overwrite. But it original sound track? How we can “protect it”?

2, in this code, how I can adjust deviation? “0.2” to any other? Eg. "I take base freq 1 kHz sine wave. WHen input signal is “0” output freq is, of course, 1 kHz. But how we can adjust eg. “when input signal is 1.0, output signal freq is eg. 2 kHz”? Plz notify- I see this script make just it I want. “base freq” is eg. 1 Khz sine. “input signal” is it signal who modulate it. I try use it input signal “as potentiometer”. (Just this I dont make but first I take 440 Hz base freq… and then I build my own signal… and result is “mary has a little lam…”)

Nyquist cannot create new tracks in Audacity. If you need to retain the original track(s), duplicate them first (select the track then “Ctrl+D”), then apply the effect to the duplicate.

“0.2” in this code is multiplied by the track’s sample rate. So, for example, if the track sample rate is 96000, then 0.2 x 96000 = 19200.
This figure is then used by a low pass filter, so that the frequencies being processed will be restricted, with a filter frequency of 19.2 kHz.

As explained in the post (Modulate one waveform/track with another (FM synthesis) - #2 by steve), FM modulation can create frequencies that are twice as high as the source waves. It is therefore necessary to limit the input frequencies to ensure that the generated FM signal does not exceed half the sample rate of the track’s sample rate.

In short, the “0.2” should not be modified.


Please read this post: Modulate one waveform/track with another (FM synthesis) - #2 by steve I believe it has the answers to your questions.

Looks more like this “defun” is “defunct”. I tried this and it just throws an error.
I try to run this with the two-channel stereo track selected, as instructed in previous posts.

unfortunately I’ll have to resort to Python to process this audio :frowning:



error: In LOWPASS8, 1st argument (snd) must be a sound or multichannel sound, got 0.25, a FLONUM
Function: #<Subr-ERROR: #0000024EE579FDE8>
Arguments:
  "In LOWPASS8, 1st argument (snd) must be a sound or multichannel sound, got 0.25, a FLONUM"
Function: #<FSubr-LET: #0000024EE579B3D8>
Arguments:
  ((TYPES-STRING (NY:TYPE-LIST-AS-STRING (FIRST TYP) MULTI)))
  (ERROR (STRCAT "In " SRC "," (INDEX-TO-STRING INDEX) " argument" (IF (SECOND TYP) (STRCAT " (" (SECOND TYP) ")") "") (IF (EQ (CHAR TYPES-STRING 0) #\i) " must be an " " must be a ") TYPES-STRING ", got " (PARAM-TO-STRING VAL) (IF SECOND-VAL (STRCAT ", and" (PARAM-TO-STRING VAL2)) "")))
Function: #<Closure-NY:ERROR: #0000024EE56E9F38>
Arguments:
  "LOWPASS8"
  1
  ((SOUND) "snd")
  0.25
  T
Function: #<FSubr-COND: #0000024EE579FED8>
Arguments:
  ((ARRAYP A) (SETF NEWLEN (LENGTH A)) (NY:TYPECHECK (AND LEN (/= LEN NEWLEN)) (ERROR (STRCAT "In " SRC ", two arguments are multichannels of differing length, got " (PARAM-TO-STRING PREV) ", and " (PARAM-TO-STRING A)))) (DOTIMES (I NEWLEN) (SETF CHAN (AREF A I)) (COND ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP CHAN))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP CHAN))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP CHAN))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP CHAN) (> CHAN 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP CHAN) (> CHAN 0)) (NULL CHAN)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP CHAN) (>= CHAN 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP CHAN))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP CHAN))) ((AND (EQ NONSND (QUOTE NULL)) (NULL CHAN))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP CHAN) (NULL CHAN)))) (T (NY:ERROR SRC INDEX TYP A T)))) (SETF PREV A) (SETF LEN NEWLEN))
  ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP A)))
  ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP A)))
  ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP A)))
  ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP A) (>= A 0)))
  ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP A) (> A 0)) (NULL A))))
  ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP A) (>= A 0)))
  ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP A)))
  ((AND (EQ NONSND (QUOTE STRING)) (STRINGP A)))
  ((AND (EQ NONSND (QUOTE NULL)) (NULL A)))
  ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP A) (NULL A))))
  (T (NY:ERROR SRC INDEX TYP A T))
Function: #<FSubr-DOLIST: #0000024EE57A1738>
Arguments:
  (A ARGS)
  (SETF TYP (CAR TYPES) TYPES (CDR TYPES))
  (IF (> (LENGTH ARGS) 1) (SETF INDEX (1+ INDEX)))
  (SETF NONSND (CAAR TYP))
  (COND ((ARRAYP A) (SETF NEWLEN (LENGTH A)) (NY:TYPECHECK (AND LEN (/= LEN NEWLEN)) (ERROR (STRCAT "In " SRC ", two arguments are multichannels of differing length, got " (PARAM-TO-STRING PREV) ", and " (PARAM-TO-STRING A)))) (DOTIMES (I NEWLEN) (SETF CHAN (AREF A I)) (COND ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP CHAN))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP CHAN))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP CHAN))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP CHAN) (> CHAN 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP CHAN) (> CHAN 0)) (NULL CHAN)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP CHAN) (>= CHAN 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP CHAN))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP CHAN))) ((AND (EQ NONSND (QUOTE NULL)) (NULL CHAN))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP CHAN) (NULL CHAN)))) (T (NY:ERROR SRC INDEX TYP A T)))) (SETF PREV A) (SETF LEN NEWLEN)) ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP A))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP A))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP A))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP A) (> A 0)) (NULL A)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP A))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP A))) ((AND (EQ NONSND (QUOTE NULL)) (NULL A))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP A) (NULL A)))) (T (NY:ERROR SRC INDEX TYP A T)))
Function: #<FSubr-LET: #0000024EE579B3D8>
Arguments:
  (CHAN LEN NEWLEN RESULT PREV TYP (INDEX 0) NONSND)
  (DOLIST (A ARGS) (SETF TYP (CAR TYPES) TYPES (CDR TYPES)) (IF (> (LENGTH ARGS) 1) (SETF INDEX (1+ INDEX))) (SETF NONSND (CAAR TYP)) (COND ((ARRAYP A) (SETF NEWLEN (LENGTH A)) (NY:TYPECHECK (AND LEN (/= LEN NEWLEN)) (ERROR (STRCAT "In " SRC ", two arguments are multichannels of differing length, got " (PARAM-TO-STRING PREV) ", and " (PARAM-TO-STRING A)))) (DOTIMES (I NEWLEN) (SETF CHAN (AREF A I)) (COND ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP CHAN))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP CHAN))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP CHAN))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP CHAN) (> CHAN 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP CHAN) (> CHAN 0)) (NULL CHAN)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP CHAN) (>= CHAN 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP CHAN))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP CHAN))) ((AND (EQ NONSND (QUOTE NULL)) (NULL CHAN))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP CHAN) (NULL CHAN)))) (T (NY:ERROR SRC INDEX TYP A T)))) (SETF PREV A) (SETF LEN NEWLEN)) ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP A))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP A))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP A))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP A) (> A 0)) (NULL A)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP A))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP A))) ((AND (EQ NONSND (QUOTE NULL)) (NULL A))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP A) (NULL A)))) (T (NY:ERROR SRC INDEX TYP A T))))
  (COND (LEN (SETF RESULT (MAKE-ARRAY LEN)) (DOTIMES (I LEN) (SETF (AREF RESULT I) (APPLY FN (MAPCAR (FUNCTION (LAMBDA (A) (COND ((ARRAYP A) (AREF A I)) (T A)))) ARGS)))) RESULT) (T (APPLY FN ARGS)))
Function: #<Closure-MULTICHAN-EXPAND-NEW: #0000024EE5768140>
Arguments:
  "LOWPASS8"
  #<Closure-NYQ:LOWPASS2: #0000024EE66F89B0>
  (((SOUND) "snd") ((POSITIVE) "hz") ((POSITIVE) "q") ((STRING) "source"))
  0.25
  8820
  0.576222
  "LOWPASS8"
Function: #<Subr-APPLY: #0000024EE579D610>
Arguments:
  MULTICHAN-EXPAND-NEW
  ("LOWPASS8" #<Closure-NYQ:LOWPASS2: #0000024EE66F89B0> (((SOUND) "snd") ((POSITIVE) "hz") ((POSITIVE) "q") ((STRING) "source")) 0.25 8820 0.576222 "LOWPASS8")
Function: #<FSubr-IF: #0000024EE57A2620>
Arguments:
  (STRINGP (FIRST ARGS))
  (APPLY (QUOTE MULTICHAN-EXPAND-NEW) ARGS)
  (APPLY (QUOTE MULTICHAN-EXPAND-OLD) ARGS)
Function: #<Closure-MULTICHAN-EXPAND: #0000024EE576CED0>
Arguments:
  "LOWPASS8"
  #<Closure-NYQ:LOWPASS2: #0000024EE66F89B0>
  (((SOUND) "snd") ((POSITIVE) "hz") ((POSITIVE) "q") ((STRING) "source"))
  0.25
  8820
  0.576222
  "LOWPASS8"
Function: #<Closure-LOWPASS2: #0000024EE66F9A00>
Arguments:
  0.25
  8820
  0.576222
  "LOWPASS8"
Function: #<Closure-LOWPASS8: #0000024EE56F5EE0>
Arguments:
  0.25
  8820
Function: #<FSubr-LET*: #0000024EE579F530>
Arguments:
  ((S-IN (LOWPASS8 S-IN (* 0.2 *SOUND-SRATE*))) (S-IN (LOWPASS8 S-IN (* 0.2 *SOUND-SRATE*))) (MAP (INTEGRATE (DB-TO-LINEAR (AREF S-IN 0)))))
  (SND-RESAMPLEV (AREF S-IN 1) *SOUND-SRATE* MAP)
Function: #<Closure-FM: #0000024EE5898888>
Arguments:
  0.25
1>

The problem is “S”.

A long time ago, Audacity used the symbol “S” to pass the selected audio to Nyquist. That was not very nice because “S” is also defined in Nyquist as 0.25. This was changed so that Audacity now uses the variable TRACK to pass the selected audio to Nyquist.

Two possible solutions when working with extremely old Nyquist code:

  1. Wherever the symbol “S” is used to pass the selected audio, replace “S” with “TRACK”.
    Example old code:
(defun fm (s-in)
   (let* ((s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (map (integrate (db-to-linear (aref s-in 0)))))
      (snd-resamplev (aref s-in 1) *sound-srate* map)))

(fm s)

Example new code:

(defun fm (s-in)
   (let* ((s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (map (integrate (db-to-linear (aref s-in 0)))))
      (snd-resamplev (aref s-in 1) *sound-srate* map)))

(fm *track*)
  1. Include the “;version 1” header to tell Nyquist that it is ancient code:
    Example with ;version 1 header:
;version 1

(defun fm (s-in)
   (let* ((s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (s-in (lowpass8 s-in (* 0.2 *sound-srate*)))
         (map (integrate (db-to-linear (aref s-in 0)))))
      (snd-resamplev (aref s-in 1) *sound-srate* map)))

(fm s)

(Note that in these examples, the selection must be a stereo track)

Hi,
I’m using Audacity 3.0.5 and I followed the above instructions. Nothing happened, so I hit the Debug button. Below is the contents of the pop-up. Any idea what’s wrong?
Thanks

error: In LOWPASS8, 1st argument (snd) must be a sound or multichannel sound, got 0.25, a FLONUM
Function: #<Subr-ERROR: #0000026F994FB668>
Arguments:
  "In LOWPASS8, 1st argument (snd) must be a sound or multichannel sound, got 0.25, a FLONUM"
Function: #<FSubr-LET: #0000026F994F6C58>
Arguments:
  ((TYPES-STRING (NY:TYPE-LIST-AS-STRING (FIRST TYP) MULTI)))
  (ERROR (STRCAT "In " SRC "," (INDEX-TO-STRING INDEX) " argument" (IF (SECOND TYP) (STRCAT " (" (SECOND TYP) ")") "") (IF (EQ (CHAR TYPES-STRING 0) #\i) " must be an " " must be a ") TYPES-STRING ", got " (PARAM-TO-STRING VAL) (IF SECOND-VAL (STRCAT ", and" (PARAM-TO-STRING VAL2)) "")))
Function: #<Closure-NY:ERROR: #0000026F92F640E8>
Arguments:
  "LOWPASS8"
  1
  ((SOUND) "snd")
  0.25
  T
Function: #<FSubr-COND: #0000026F994FB758>
Arguments:
  ((ARRAYP A) (SETF NEWLEN (LENGTH A)) (NY:TYPECHECK (AND LEN (/= LEN NEWLEN)) (ERROR (STRCAT "In " SRC ", two arguments are multichannels of differing length, got " (PARAM-TO-STRING PREV) ", and " (PARAM-TO-STRING A)))) (DOTIMES (I NEWLEN) (SETF CHAN (AREF A I)) (COND ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP CHAN))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP CHAN))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP CHAN))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP CHAN) (> CHAN 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP CHAN) (> CHAN 0)) (NULL CHAN)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP CHAN) (>= CHAN 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP CHAN))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP CHAN))) ((AND (EQ NONSND (QUOTE NULL)) (NULL CHAN))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP CHAN) (NULL CHAN)))) (T (NY:ERROR SRC INDEX TYP A T)))) (SETF PREV A) (SETF LEN NEWLEN))
  ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP A)))
  ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP A)))
  ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP A)))
  ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP A) (>= A 0)))
  ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP A) (> A 0)) (NULL A))))
  ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP A) (>= A 0)))
  ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP A)))
  ((AND (EQ NONSND (QUOTE STRING)) (STRINGP A)))
  ((AND (EQ NONSND (QUOTE NULL)) (NULL A)))
  ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP A) (NULL A))))
  (T (NY:ERROR SRC INDEX TYP A T))
Function: #<FSubr-DOLIST: #0000026F994FCFB8>
Arguments:
  (A ARGS)
  (SETF TYP (CAR TYPES) TYPES (CDR TYPES))
  (IF (> (LENGTH ARGS) 1) (SETF INDEX (1+ INDEX)))
  (SETF NONSND (CAAR TYP))
  (COND ((ARRAYP A) (SETF NEWLEN (LENGTH A)) (NY:TYPECHECK (AND LEN (/= LEN NEWLEN)) (ERROR (STRCAT "In " SRC ", two arguments are multichannels of differing length, got " (PARAM-TO-STRING PREV) ", and " (PARAM-TO-STRING A)))) (DOTIMES (I NEWLEN) (SETF CHAN (AREF A I)) (COND ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP CHAN))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP CHAN))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP CHAN))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP CHAN) (> CHAN 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP CHAN) (> CHAN 0)) (NULL CHAN)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP CHAN) (>= CHAN 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP CHAN))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP CHAN))) ((AND (EQ NONSND (QUOTE NULL)) (NULL CHAN))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP CHAN) (NULL CHAN)))) (T (NY:ERROR SRC INDEX TYP A T)))) (SETF PREV A) (SETF LEN NEWLEN)) ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP A))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP A))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP A))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP A) (> A 0)) (NULL A)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP A))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP A))) ((AND (EQ NONSND (QUOTE NULL)) (NULL A))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP A) (NULL A)))) (T (NY:ERROR SRC INDEX TYP A T)))
Function: #<FSubr-LET: #0000026F994F6C58>
Arguments:
  (CHAN LEN NEWLEN RESULT PREV TYP (INDEX 0) NONSND)
  (DOLIST (A ARGS) (SETF TYP (CAR TYPES) TYPES (CDR TYPES)) (IF (> (LENGTH ARGS) 1) (SETF INDEX (1+ INDEX))) (SETF NONSND (CAAR TYP)) (COND ((ARRAYP A) (SETF NEWLEN (LENGTH A)) (NY:TYPECHECK (AND LEN (/= LEN NEWLEN)) (ERROR (STRCAT "In " SRC ", two arguments are multichannels of differing length, got " (PARAM-TO-STRING PREV) ", and " (PARAM-TO-STRING A)))) (DOTIMES (I NEWLEN) (SETF CHAN (AREF A I)) (COND ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP CHAN))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP CHAN))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP CHAN))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP CHAN) (> CHAN 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP CHAN) (> CHAN 0)) (NULL CHAN)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP CHAN) (>= CHAN 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP CHAN))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP CHAN))) ((AND (EQ NONSND (QUOTE NULL)) (NULL CHAN))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP CHAN) (NULL CHAN)))) (T (NY:ERROR SRC INDEX TYP A T)))) (SETF PREV A) (SETF LEN NEWLEN)) ((AND (EQ NONSND (QUOTE NUMBER)) (NUMBERP A))) ((AND (MEMBER (QUOTE SOUND) (CAR TYP)) (SOUNDP A))) ((AND (EQ NONSND (QUOTE STEP)) (NUMBERP A))) ((AND (EQ NONSND (QUOTE POSITIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE POSITIVE-OR-NULL)) (OR (AND (NUMBERP A) (> A 0)) (NULL A)))) ((AND (EQ NONSND (QUOTE NONNEGATIVE)) (NUMBERP A) (>= A 0))) ((AND (EQ NONSND (QUOTE INTEGER)) (INTEGERP A))) ((AND (EQ NONSND (QUOTE STRING)) (STRINGP A))) ((AND (EQ NONSND (QUOTE NULL)) (NULL A))) ((AND (EQ NONSND (QUOTE INT-OR-NULL)) (OR (INTEGERP A) (NULL A)))) (T (NY:ERROR SRC INDEX TYP A T))))
  (COND (LEN (SETF RESULT (MAKE-ARRAY LEN)) (DOTIMES (I LEN) (SETF (AREF RESULT I) (APPLY FN (MAPCAR (FUNCTION (LAMBDA (A) (COND ((ARRAYP A) (AREF A I)) (T A)))) ARGS)))) RESULT) (T (APPLY FN ARGS)))
Function: #<Closure-MULTICHAN-EXPAND-NEW: #0000026F989E79C0>
Arguments:
  "LOWPASS8"
  #<Closure-NYQ:LOWPASS2: #0000026F96413EF0>
  (((SOUND) "snd") ((POSITIVE) "hz") ((POSITIVE) "q") ((STRING) "source"))
  0.25
  8820
  0.576222
  "LOWPASS8"
Function: #<Subr-APPLY: #0000026F994F8E90>
Arguments:
  MULTICHAN-EXPAND-NEW
  ("LOWPASS8" #<Closure-NYQ:LOWPASS2: #0000026F96413EF0> (((SOUND) "snd") ((POSITIVE) "hz") ((POSITIVE) "q") ((STRING) "source")) 0.25 8820 0.576222 "LOWPASS8")
Function: #<FSubr-IF: #0000026F994FDEA0>
Arguments:
  (STRINGP (FIRST ARGS))
  (APPLY (QUOTE MULTICHAN-EXPAND-NEW) ARGS)
  (APPLY (QUOTE MULTICHAN-EXPAND-OLD) ARGS)
Function: #<Closure-MULTICHAN-EXPAND: #0000026F989EC750>
Arguments:
  "LOWPASS8"
  #<Closure-NYQ:LOWPASS2: #0000026F96413EF0>
  (((SOUND) "snd") ((POSITIVE) "hz") ((POSITIVE) "q") ((STRING) "source"))
  0.25
  8820
  0.576222
  "LOWPASS8"
Function: #<Closure-LOWPASS2: #0000026F96414F40>
Arguments:
  0.25
  8820
  0.576222
  "LOWPASS8"
Function: #<Closure-LOWPASS8: #0000026F92F70090>
Arguments:
  0.25
  8820
Function: #<FSubr-LET*: #0000026F994FADB0>
Arguments:
  ((S-IN (LOWPASS8 S-IN (* 0.2 *SOUND-SRATE*))) (S-IN (LOWPASS8 S-IN (* 0.2 *SOUND-SRATE*))) (MAP (INTEGRATE (DB-TO-LINEAR (AREF S-IN 0)))))
  (SND-RESAMPLEV (AREF S-IN 1) *SOUND-SRATE* MAP)
Function: #<Closure-FM: #0000026F913C9818>
Arguments:
  0.25
1>

Here’s the clue:

The problem is that the code is very old. By default, Audacity uses “version 4” syntax when interpreting Nyquist code, but that code is using an earlier syntax. Add this line to the top of the script to tell Audacity to use version 3 syntax:

;version 3