When I am designing sound I use a sonogram and oscilloscope a lot. the sonogram gives me the spectrum of the sound while the oscilloscope gives me the wave form. I mainly use the oscilloscope to look for dc offset or in the case of noisy sounds, look for periodicity. Max/MSP has a built in scope (scope~) but the user cannot pause it or freeze it so therefore I made my own.
To do this I used jit.catch~ to grab audio and turn it into a matrix. If you don’t know what that is, think of it as an xy plain with a certain amount of dimensions. The image below is how cycling74 shows what a jitter matrix is. As you can easily see it is ARGB plains with a dimension of 8×6. Each box holds a value between 0 and 255.
Once the sound is converted into a matrix we can use jit.graph to graph the information from the matrices. Jit.graph has 4 different modes which can be used to visualize the waveform in different ways and by adding @frgb you can change the color of the waveform. The last argument we have to add to the jit.graph object is @clearit 1. This refreshes the screen every frame and makes it so the wave does not write over itself. Lastley, a qmetro is used to trigger a new frame to appear. This acts to slow down the frames and or freeze one. This qmetro is the entire reason I made my own scope. It gives me the power to pause and look at an instance of the sound.
Here is the max patch that I made. I am using a basic ring modulation and running it through jit.catch~ at mode one (it says mode 0, but @mode 1 is the default). Qmetro 2 sends a bang every 2 milliseconds, therefore making jit.catch~ release a frame every 2 milliseconds.
*If you like these little tutorials or if there is something you want to see please let me know.