(max) line~, meter~, and levelmeter~

Three objects worthy of a special mention right from the start are line~, meter~, and levelmeter~.

If you have any sound experience at all you know to keep track of your visual indicators (meters) to make sure sound isn’t clipping at some point in the signal chain. In MaxMSP you have the meter~ and levelmeter~ objects to show audio levels. Meter~ can be arranged to be either horizontal or vertical, and sized according to visual need. You should insert meters into your patchers at all points that could output an original and/or a modified audio signal. This technique is like using number boxes for display purposes. Meter~ can be set to show more segments to give a more finely tuned display. Levelmeter~ is a bit more sensitive and finely tuned by default, but it is also a little more processor/graphics intensive.

The line~ object will create a smooth ramp to a specified value over a specified time (generally in ms). You will use the line~ object to create amplitude envelopes and frequency envelopes, and to smooth control-rate changes being used as arguments to audio-rate objects. For example, if you use a float object to type in a frequency change to an oscillator (saw~, cycle~, etc.), you need an audio rate ramp to smoothly change between the previous and new values.

Line~ expects <targetValue> <time> pairs. Multiple pairs can be sent as one message list and line~ will execute all the pairs at the proper time. A value followed by a comma tells line~ to immediately change to that value.

Line~ is often used to create a smooth ramp between amplitude multiplier values being sent to the *~object. I often use a floating point number box feeding a message object with the contents <$1 10>. The floating point number replaces the $1 and causes the list to be output to line~. The tutorial (MSP tutorial number 2) uses a pack object with arguments <0. 100>. The amplitude replaces the 0. and outputs the list. Either way is fine. Note that a message box doesn’t require you to format your argument according to data type. Pack does, however, want the argument to match the incoming message type. If the message and argument do not match, the message will be changed to the argument format. For example, if you type an integer as an argument to pack but send it a floating point number.