This implements a FIR lowpass filter by delaying 16 copies of the audio by varying amounts, and setting their volumes based on the cutoff frequency using sinc() Move your mouse left and right to change the cutoff frequency. Music is Crab Rave by Noisestorm This requires 16 (N_TAPS) copies of the sound file to work (as scratch won't let you play the same sound multiple times concurrently otherwise). Luckily, since they are all the same, they all have the same MD5 hash, so only one copy will be loaded from the server, and your browser will use cached copies for the rest. Unfortunately however, scratch will still make a separate raw sample array even for identical sounds with the same asset ID, so it uses quite a bit of ram (perhaps someone could fix this) Each sound copy is delayed by setting the pitch to something, and then setting it back to zero after one frame. I have not bothered to do the calculations to get the cutoff frequency in hz. I need to come up with a more sophisticated normalization method because the one I tried doesn't really work well, I guess because it ignore interference. I should base it off of the calculated frequency response I guess. (or maybe it just gets really quiet when you set the cutoff low because it's not a very sharp filter, in which case I wouldn't want to normalize it) If you want to change the delay terms dynamically for some reason you should get rid of the delay (0) block and just have it update the pitch effect every frame This is capable of more complex filters than just a simple low pass. It should be possible to do some kind of HRTF (head related transfer function) processing with this to get more accurate 3D sound. You could use this in a game to muffle the sound when the player is underwater (although maybe use less taps so it is less resource intensive) I got the idea for this while looking at _krokobil's 3D Stereo Audio project: https://scratch.mit.edu/projects/1225165156