Building a Filter


    Jan 04 2008 | 7:32 pm
    Hello all,
    I'm working through the second volume of Musimathics, by Gareth Loy, and learning quite a lot. I'd like to actually start realizing some of the topics he covers on my own in Max/MSP to help make them more concrete, and I'm having some troubles.
    For instance, I'm now reading about filters, and their supporting mathematics. As a rather simple example, I'd like to build my own lowpass filter in Max/MSP. I know how to implement one through the built in filtering objects in Max/MSP, but building one on my own will give me the opportunity to better understand what's really occuring.
    He gives the equation for a lowpass filter thus:
    y(nT) = x(nT) + x[(n-1)T]
    where y(nT) is the input signal, n is an instantaneous sample, and T is time.
    His explanation of the operation of this filter makes perfect sense, but realizing it in Max/MSP is giving me problems. I'm sure there's a simple answer, but I'm just not getting it.
    How would one realize such an equation? I appreciate your help!
    Thanks,
    Brennon

    • Jan 04 2008 | 7:52 pm
      Hi Brennon,
      Have a look at the bufir~ object. You can build finite response filters with up to 256 points.There is a patch in the examples folder called buffir-eq-help.pat using bufir~
      Here is a patch on convolution I made years ago when I was studying this. You need the lobjects for that.
      have fun
      falk
    • Jan 04 2008 | 7:56 pm
      On Jan 4, 2008, at 11:32 AM, Brennon wrote
      >
      > He gives the equation for a lowpass filter thus:
      >
      > y(nT) = x(nT) + x[(n-1)T]
      >
      > where y(nT) is the input signal, n is an instantaneous sample, and
      > T is time.
      >
      > His explanation of the operation of this filter makes perfect
      > sense, but realizing it in Max/MSP is giving me problems. I'm sure
      > there's a simple answer, but I'm just not getting it.
      Well, you'd want to rearrange this to be in terms of the output signal:
      x(nT) = y(nT) - x[(n-1)T]
      So you subtract a 1 sample delay of the output from the input.
      Unfortunately, you can't get a 1 sample delay in a feedback path in a
      Max patch. You can use comb~ or biquad~ for example, but I don't
      think that's the autodidactic answer you were looking for...
    • Jan 04 2008 | 8:13 pm
      A couple things:
      1) FYI - I recently got an email from Gareth re: the Musimat
      programming language he created to demo the ideas in the books. He
      gave me some detailed info on getting it to run on Intel Macs. I'll
      check with him to make sure it's OK to post the info here, and follow
      up accordingly.
      2) I believe you have the interpretation of the equation slightly
      wrong: y is the output, x is the input. In a nutshell, a given output
      sample y(nT) is produced by averaging the current x(nT) and most
      previous x((n-1)T) inputs. There should, however, be some
      coefficients in there, in this case to multiply each of the two
      inputs by .5 before adding them, in order to average them. That's
      what simple low-pass filtering is, averaging inputs to generate
      outputs. You could achieve this in MSP by using [delay~] set to one
      sample delay, and adding that to the direct signal after multiply the
      delayed and direct signals by .5. This will then give you the
      filtered (averaged) output. It achieves this by simply 'slowing down'
      fast-changing signals (i.e. signals with high-frequency components).
      Hope this helps.
      On Jan 4, 2008, at 12:32 PM, Brennon wrote:
      >
      > Hello all,
      >
      > I'm working through the second volume of Musimathics, by Gareth
      > Loy, and learning quite a lot. I'd like to actually start
      > realizing some of the topics he covers on my own in Max/MSP to help
      > make them more concrete, and I'm having some troubles.
      >
      > For instance, I'm now reading about filters, and their supporting
      > mathematics. As a rather simple example, I'd like to build my own
      > lowpass filter in Max/MSP. I know how to implement one through the
      > built in filtering objects in Max/MSP, but building one on my own
      > will give me the opportunity to better understand what's really
      > occuring.
      >
      > He gives the equation for a lowpass filter thus:
      >
      > y(nT) = x(nT) + x[(n-1)T]
      >
      > where y(nT) is the input signal, n is an instantaneous sample, and
      > T is time.
      >
      > His explanation of the operation of this filter makes perfect
      > sense, but realizing it in Max/MSP is giving me problems. I'm sure
      > there's a simple answer, but I'm just not getting it.
      >
      > How would one realize such an equation? I appreciate your help!
      >
      ----
      Steven M. Miller
      Professor, Contemporary Music Program
      College of Santa Fe
      Home
      SFIFEM
      Atrium Sound Space
      OVOS
      CMP
    • Jan 04 2008 | 8:36 pm
      Quote: Falk wrote on Fri, 04 January 2008 12:52
      ----------------------------------------------------
      > Hi Brennon,
      >
      > Have a look at the bufir~ object. You can build finite response filters with up to 256 points.There is a patch in the examples folder called buffir-eq-help.pat using bufir~
      >
      I'm starting to see how buffir~ might help, but it's abstracted the problem in such a way that I don't really see how such an equation is really operating in the filter. Is there no way to build such a filter out of "rudimentary" objects?
    • Jan 04 2008 | 8:38 pm
      Quote: lists@grahamwakefield wrote on Fri, 04 January 2008 12:56
      ----------------------------------------------------
      > Unfortunately, you can't get a 1 sample delay in a feedback path in a
      > Max patch. You can use comb~ or biquad~ for example, but I don't
      > think that's the autodidactic answer you were looking for...
      >
      So, how are such filters built? In a separate language? If so, what language is common?
      Thanks again,
      Brennon
    • Jan 04 2008 | 9:42 pm
      Quote: smill wrote on Fri, 04 January 2008 13:13
      ----------------------------------------------------
      > A couple things:
      >
      > 1) FYI - I recently got an email from Gareth re: the Musimat
      > programming language he created to demo the ideas in the books. He
      > gave me some detailed info on getting it to run on Intel Macs. I'll
      > check with him to make sure it's OK to post the info here, and follow
      > up accordingly.
      >
      That would be wonderful! I've fought with MUSIMAT quite a bit on Mac OS X to no avail. Although it seems that most of the music/DSP-related functions he has created seem relatively easy to implement in another language (classes in Java, etc.), I'd like to be able to play with MUSIMAT, as well. Please send my congratulations to him on these two excellent volumes. I've also struggled my way through the Digital Audio Signal Processing anthology edited by Strawn, and Musimathics has done wonders to fill in the holes for me.
      > 2) I believe you have the interpretation of the equation slightly
      > wrong: y is the output, x is the input. In a nutshell, a given output
      > sample y(nT) is produced by averaging the current x(nT) and most
      > previous x((n-1)T) inputs. There should, however, be some
      > coefficients in there, in this case to multiply each of the two
      > inputs by .5 before adding them, in order to average them. That's
      > what simple low-pass filtering is, averaging inputs to generate
      > outputs. You could achieve this in MSP by using [delay~] set to one
      > sample delay, and adding that to the direct signal after multiply the
      > delayed and direct signals by .5. This will then give you the
      > filtered (averaged) output. It achieves this by simply 'slowing down'
      > fast-changing signals (i.e. signals with high-frequency components).
      >
      > Hope this helps.
      >
      Thank you for the patch (I was mistaken in believing that delay~ took as it's argument a number of milliseconds--not samples.) And yes, I did transpose x(n) and y(n)--thank you for drawing my attention to this. Either way, I do understand what the filter is doing, and it's nice to see it in action--even if it is merely a simple example. Just a note, Loy does specify this primitive lowpass filter without averaging (at least at this point in the text).
      Thank you again,
      Brennon
    • Jan 04 2008 | 9:51 pm
      On Jan 4, 2008, at 12:56 PM, Graham Wakefield wrote:
      >
      > Well, you'd want to rearrange this to be in terms of the output
      > signal:
      >
      > x(nT) = y(nT) - x[(n-1)T]
      >
      > So you subtract a 1 sample delay of the output from the input.
      > Unfortunately, you can't get a 1 sample delay in a feedback path in
      > a Max patch. You can use comb~ or biquad~ for example, but I don't
      > think that's the autodidactic answer you were looking for...
      Again, to be correct, x is an input, y is the output, so the
      explanation here is a little off. There are, however, filters of this
      sort (output = average of input & output), but this isn't the same
      topology as the original question, which was an example of a simple
      averaging FIR filter. For FIR (finite impulse response) filters, no
      feedback is need. IIR filters need feedback.
      A good reference for these types of filter equations is Dodge & Jerse
      'Computer Music, 2nd Ed.' (pp. 201-219), and/or Roads 'Computer Music
      Tutorial' (pp. 397-419).
      ----
      Steven M. Miller
      Professor, Contemporary Music Program
      College of Santa Fe
      Home
      SFIFEM
      Atrium Sound Space
      OVOS
      CMP
    • Jan 04 2008 | 9:56 pm
      On Jan 4, 2008, at 2:42 PM, Brennon wrote:
      >
      > That would be wonderful! I've fought with MUSIMAT quite a bit on
      > Mac OS X to no avail. Although it seems that most of the music/DSP-
      > related functions he has created seem relatively easy to implement
      > in another language (classes in Java, etc.), I'd like to be able to
      > play with MUSIMAT, as well. Please send my congratulations to him
      > on these two excellent volumes. I've also struggled my way through
      > the Digital Audio Signal Processing anthology edited by Strawn, and
      > Musimathics has done wonders to fill in the holes for me.
      Agreed! I'll post the info here if/when he gives me the OK.
      >
      > Thank you for the patch (I was mistaken in believing that delay~
      > took as it's argument a number of milliseconds--not samples.) And
      > yes, I did transpose x(n) and y(n)--thank you for drawing my
      > attention to this. Either way, I do understand what the filter is
      > doing, and it's nice to see it in action--even if it is merely a
      > simple example. Just a note, Loy does specify this primitive
      > lowpass filter without averaging (at least at this point in the text).
      You're welcome. See another post I just sent on this thread for other
      references to filter equations & examples. Yes, Loy's example does
      omit the coefficients, but the classic examples I've seen all use
      them in order to do actual averaging rather than simple addition of
      successive samples. You can also manipulate the coefficients (as long
      as they all add up to 1) to change the characteristics of the filter,
      as well.
      >
      ----
      Steven M. Miller
      Professor, Contemporary Music Program
      College of Santa Fe
      Home
      SFIFEM
      Atrium Sound Space
      OVOS
      CMP
    • Jan 04 2008 | 10:11 pm
      Quote: smill wrote on Fri, 04 January 2008 14:51
      ----------------------------------------------------
      >
      > A good reference for these types of filter equations is Dodge & Jerse
      > 'Computer Music, 2nd Ed.' (pp. 201-219), and/or Roads 'Computer Music
      > Tutorial' (pp. 397-419).
      >
      I do have the Dodge & Jerse. Thank you for drawing my attention to it again. I had pushed it to to the side when I started into Musimathics. I checked the Roads out of the library several times when I was a student, but never purchased it (quite pricey!) With what I do have handy (Loy, Dodge & Jerse, the Strawn anthology, and Allen Strange's "Electronic Music..."), do you think the Roads will give me much more (at this point?) In which areas might it be stronger?
      Thanks,
      Brennon
    • Jan 04 2008 | 10:11 pm
      On 4 janv. 08, at 21:38, Brennon wrote:
      > So, how are such filters built? In a separate language? If so,
      > what language is common?
      They are written in C. You can also write them in Java. You'll find an
      example of biquad in java in the "mxj~ examples" folder.
      HTH,
      ej
    • Jan 04 2008 | 10:39 pm
      In terms of the specific filtering info, I don't think there's much
      'value added' in the Roads over the Dodge & Jerse. It is, however, in
      general more comprehensive and wide-ranging. I recently heard from
      Curtis that MIT Press gave the go-ahead on a new edition of it,
      though, so you might want to wait until it's out (he didn't give me a
      time frame...). I actually find that both books have strengths and
      have slightly different takes on similar material, which is a help in
      teaching.
      On Jan 4, 2008, at 3:11 PM, Brennon wrote:
      > I do have the Dodge & Jerse. Thank you for drawing my attention to
      > it again. I had pushed it to to the side when I started into
      > Musimathics. I checked the Roads out of the library several times
      > when I was a student, but never purchased it (quite pricey!) With
      > what I do have handy (Loy, Dodge & Jerse, the Strawn anthology, and
      > Allen Strange's "Electronic Music..."), do you think the Roads will
      > give me much more (at this point?) In which areas might it be
      > stronger?
      ----
      Steven M. Miller
      Professor, Contemporary Music Program
      College of Santa Fe
      Home
      SFIFEM
      Atrium Sound Space
      OVOS
      CMP
    • Jan 05 2008 | 10:09 am
      A very nice book and a classic for intro to DSP with Java code in the back is:
      Introductory Digital Signal Processing with Computer Applications, by
      Lynn and Fuerst
      specially if using linear difference equations (as per the low pass
      discussed here)
      Their example of a low pass and derivatives are very clear and informative.
      here:
      On 04/01/2008, Steven Miller wrote:
      > In terms of the specific filtering info, I don't think there's much
      > 'value added' in the Roads over the Dodge & Jerse. It is, however, in
      > general more comprehensive and wide-ranging. I recently heard from
      > Curtis that MIT Press gave the go-ahead on a new edition of it,
      > though, so you might want to wait until it's out (he didn't give me a
      > time frame...). I actually find that both books have strengths and
      > have slightly different takes on similar material, which is a help in
      > teaching.
      >
      >
      > On Jan 4, 2008, at 3:11 PM, Brennon wrote:
      >
      > > I do have the Dodge & Jerse. Thank you for drawing my attention to
      > > it again. I had pushed it to to the side when I started into
      > > Musimathics. I checked the Roads out of the library several times
      > > when I was a student, but never purchased it (quite pricey!) With
      > > what I do have handy (Loy, Dodge & Jerse, the Strawn anthology, and
      > > Allen Strange's "Electronic Music..."), do you think the Roads will
      > > give me much more (at this point?) In which areas might it be
      > > stronger?
      >
      >
      > ----
      > Steven M. Miller
      > Professor, Contemporary Music Program
      > College of Santa Fe
      >
      > Home
      > SFIFEM
      > Atrium Sound Space
      > OVOS
      > CMP
      >
      >
      >
      --
      A Pereshaped definition of an Apple:
      "You will never know what size worm is in your next byte"!
    • Jan 07 2008 | 9:43 am
      For 1st and 2nd order FIR and IIR filters biquad~ is your friend. For
      higher order filters there is the possibility of figuring out how to
      translate the coefficients so that you can use cascade~.
      Or you can make your own filters in C or Java. ASAIR there is a filter
      example in the examples for mxj~. Java filters will be a bit less
      efficient than filters programmed in C, but it's way simpler to code
      audio objects in Java for mxj~, so it could be a good point of
      departure. There is also a filter example in the Max SDK.
      Tim Place and myself are currently working on a new filter object that
      will be a wrapper for all kinds of filters. Once we have it up and
      running it should be fairly easy to add more filters to it. It will be
      implemented using the TTBlue library and included as part of Jamoma.
      Best,
      Trond
      Brennon wrote:
      > Hello all,
      >
      > I'm working through the second volume of Musimathics, by Gareth Loy, and learning quite a lot. I'd like to actually start realizing some of the topics he covers on my own in Max/MSP to help make them more concrete, and I'm having some troubles.
      >
      > For instance, I'm now reading about filters, and their supporting mathematics. As a rather simple example, I'd like to build my own lowpass filter in Max/MSP. I know how to implement one through the built in filtering objects in Max/MSP, but building one on my own will give me the opportunity to better understand what's really occuring.
      >
      > He gives the equation for a lowpass filter thus:
      >
      > y(nT) = x(nT) + x[(n-1)T]
      >
      > where y(nT) is the input signal, n is an instantaneous sample, and T is time.
      >
      > His explanation of the operation of this filter makes perfect sense, but realizing it in Max/MSP is giving me problems. I'm sure there's a simple answer, but I'm just not getting it.
      >
      > How would one realize such an equation? I appreciate your help!
      >
      > Thanks,
      > Brennon
    • Jan 07 2008 | 6:21 pm
      Quote: Trond Lossius wrote on Mon, 07 January 2008 01:43
      ----------------------------------------------------
      > Or you can make your own filters in C or Java. ASAIR there is a filter
      > example in the examples for mxj~. Java filters will be a bit less
      > efficient than filters programmed in C, but it's way simpler to code
      > audio objects in Java for mxj~, so it could be a good point of
      > departure. There is also a filter example in the Max SDK.
      >
      Would you have any resources to recommend on programming filters in C?
      > Tim Place and myself are currently working on a new filter object that
      > will be a wrapper for all kinds of filters. Once we have it up and
      > running it should be fairly easy to add more filters to it. It will be
      > implemented using the TTBlue library and included as part of Jamoma.
      >
      I look forward to it! Should I just watch maxobjects.com for updates? Or, is there somewhere else I should check?
      Thanks for your help,
      Brennon
    • Jan 07 2008 | 8:05 pm
      Hi Maxers,
      OK, having got the green light from Gareth to post this, here's some
      basic instructions for getting Musimat to run on a Mac. He asked me
      to alert folks that a much nicer graphical version, based on XCode on
      Intel Macs, will be coming soon. Check the Musimat website for that
      .
      Best,
      Steven
      ---------------
      From Gareth:
      Steven,
      I got the Musimat tutorial working on my Mac! It was relatively
      straightforward. Here's what I did.
      o I downloaded Musimat.zip from www.Musimat.com. The Mac unzipped
      it automatically and placed it as a folder on my desktop.
      o I dragged the folder to be a subdirectory of my username
      (garethloy for me), for convenience.
      o I had to install the latest development tools from Apple to pick
      up the g++ compiler and make program. There's two ways to get these
      tools.
      1) Via your Mac OS X Install Disk. There should be an Xcode Tools
      folder on Install Disc 1. Open it and launch XcodeTools.mpkg. When
      you get to the "Installation Type" step in the installation wizard,
      click the Customize button. Be sure you get Developer Tools
      Software, and either gcc 3.3 or gcc 4.0 (depending on which version
      of Mac OS X you have). I don't think you need anything else.
      OR
      2) Via the Apple Developer Connection. Go to http://
      developer.apple.com and click on "Download latest Xcode" under Quick
      Links. You have to be a member of ADC, but that's free. Just set up
      an account and get the download. Choose the same elements to install
      as described above.
      o Now you are ready to build and run the Musimat tutorial.
      o Launch the Mac terminal window. In the Finder, double-click on
      Applications/Utilities/Terminal. This is effectively a UNIX shell.
      o cd to the Musimat root directory. In my case it's /Users/
      garethloy/Musimat because that's where I placed the Musimat folder
      after it was downloaded. A shorthand for this directory is ~/Musimat.
      $ cd ~/Musimat
      o Issue the make command:
      $ make
      o Sit back and watch it compile and link... or not. I hit a snag.
      It compiled for a while then complained Undefined symbols:
      __Unwind_Resume. Google eventually told me that a Makefile was
      trying to use gcc instead of g++ to link the compiled objects. The
      fix is to edit all files named Makefile and change the line "CC =
      gcc" to "CC = g++". You might or might not need to do this depending
      upon the version of Xcode tools you are using. I used the vi editor
      because I'm familiar with it, but you can also just edit them using
      TextEdit.
      $ vi ~/Musimat/*/Makefile
      o I'll eventually fix the sources at www.Musimat.com to fix this
      problem, but it won't be for a while.
      o Eventually you will succeed in compiling all the applications.
      Files named *.exe are created in each subdirectory of ~/Musimat.
      o For example, cd to Musimat/MusimatChapter9 and execute Chapter9.exe.
      $ cd ~/Musimat/MusimatChapter9
      $ ./Chapter9.exe
      o (You have to say ./Chapter9.exe instead of just Chapter9.exe
      because ".", the current working directory, is not in the PATH
      variable by default.)
      o The standard output of this program executes all the functions
      discussed in Chapter 9. It goes by rather quickly! To slow it down
      and watch it execute, run a debugger, such as gdb. For example,
      $ gdb Chapter9.exe
      o Type help to get info on gdb. But for starters, try the following
      to set a breakpoint in main and then execute that far:
      (gdb) help
      (gdb) b main
      (gdb) run
      o You can then single-step the program, examine variables, etc.
      (gdb) step
      (gdb) list
      There are better ways to use gdb than this, such as running it with
      Emacs (if you know Emacs). This has the advantage of showing the
      source code graphically rather than a line at a time. Another
      alternative is to use SlickEdit, which is a terrific IDE/GUI. You
      can get a trial for free off the web.
      Let me know how it goes. Since you are my first Mac customer, you
      can be my guinea pig.
      Best,
      Gareth
      ----
      Steven M. Miller
      Professor, Contemporary Music Program
      College of Santa Fe
      Home
      SFIFEM
      Atrium Sound Space
      OVOS
      CMP
    • Jan 09 2008 | 4:59 am
      Beautiful! Thanks, Steven!
      --Brennon
    • Jan 09 2008 | 9:56 am
      Hi,
      for building externals in Max in general the MasMSP SDK is an absolute
      must. In addition you need a development environment installed (Xcode on
      Mac).
      If you have not programmed Max externals before, I would recommend
      taking a look at the documentation for how to develop Java code for xj
      and mxj~. The code is simpler and less techy to read and understand than
      C/C++ code for externals, but still provides a good intro to general
      concepts of what an external is made.
      If you have not been programming in C or C++ before, I would recommend
      that you get yourself a book providing an intruction to the languages. A
      good reference is also handy. I don't have particular suggestions for
      litterature, but I'm convinced that you'll find plenty at Amazon or
      O'Reilly.
      And apart from that, source code and projects for other externals that
      are somewhat related to what you want to work on yourself is always
      instructive.
      If you have Xcode, SVN and the MaxMSP SDK installed, you could check out
      the active branch of TTblue. If you have no prior experience with SVN,
      you could check the Jamoma wiki at www.jamoma.org for information.
      The TTBlue repository is available here:
      and there's a mailing list for ttblue development:
      Best,
      Trond
      Brennon Bortz wrote:
      > Quote: Trond Lossius wrote on Mon, 07 January 2008 01:43
      > ----------------------------------------------------
      >> Or you can make your own filters in C or Java. ASAIR there is a filter
      >> example in the examples for mxj~. Java filters will be a bit less
      >> efficient than filters programmed in C, but it's way simpler to code
      >> audio objects in Java for mxj~, so it could be a good point of
      >> departure. There is also a filter example in the Max SDK.
      >>
      >
      > Would you have any resources to recommend on programming filters in C?
      >
      >> Tim Place and myself are currently working on a new filter object that
      >> will be a wrapper for all kinds of filters. Once we have it up and
      >> running it should be fairly easy to add more filters to it. It will be
      >> implemented using the TTBlue library and included as part of Jamoma.
      >>
      >
      > I look forward to it! Should I just watch maxobjects.com for updates? Or, is there somewhere else I should check?
      >
      > Thanks for your help,
      > Brennon
      > --
      > Brennon Bortz
      > Composer / Engraver / Nutcase
      >
    • Jan 10 2008 | 6:58 am
      Looks like I just need to check out SVN, then. Thanks for the great advice, Trond!
      Best,
      Brennon
    • Apr 06 2011 | 2:25 am
      I have a question, how i Must upload musimath? Is it possible to adapt some bit of code in MaxMsp.
    • Apr 24 2012 | 2:25 am
      The best way is simply to use MatLab to generate the coefficients (using the fdatool in their DSP toolbox) and then MAX can process the audio.. Both F I R & I I R filters are available.
      MatLab will also process an entire sound file (not real-time) , something MAX doesn't do .. yet.
      I had the requirement to use a FIR filter to cut some noise from an field recording, and the EQs in Logic Pro, Soundtools and Ableton were lame.. an FIR can produce some impressive specs, but at 300 -1000 computation per sample, it's not very suitable for live work
    • Apr 24 2012 | 3:19 am
      True, FIR coefficients can be difficult to compute if you're unfamiliar with the math (but there's also the ifft~ trick: design the desired freq response, then feed it into through ifft~...the output of ifft~ IS the impulse response for the fir filter!), but Max6 and filterdesign can create all sorts of IIR filter shapes such as the Chebychev and Butterworth filters, so you can actually get some quite steep curves. (which can also be cascaded if you need, say, a shelf and a lowpass, etc.)
      In short, Max can do much more than it used to, and there's a lot that's worth checking into.