One of the things I remember most when I opened up Pure Data for the first time a few years ago was being terrified. A blank and intimidating window stared back at me. I then jumped to Max/MSP, which was a bit easier (because of the interface), but it was still the same problem – where in the world do I begin? Its tough to start any project from absolutely nowhere. Youtube and text tutorials online only terrified me further. Its normal. Its the same reaction I get from friends or students attempting to patch for the first time.
Software like Max and Pure Data force you to think of sound as data and by manipulating data you can design things. The fun begins when you start using data that isn’t sound to design or control sound. It opens up a whole new world of interfacing. For most of us coming from DAW backgrounds, its a tough concept to get our heads around. What if you can sidechain anything in a mixer to anything?
The common question when trying to learn such software is, where to begin? There are loads of tutorials online, lots of amazing books and softwares like Max include a great help section as a good starting point. But, probably the best way to learn (from my experience) is by beginning to patch. Err..how do you patch without knowing how to patch?
Its probably a good idea to start with an…idea. Something simple. How about maths? Maths is usually scary, but not if its simple addition. We can all add with our fingers (I hope). I used to be horrible at maths. Pure Data and Max have not only helped me get better at maths (I don’t need my fingers in most cases now) but also helped me learn more conventional programming languages like Java.
So.. back to the idea. Its tough to start from nowhere. Let’s start with something simple like the addition of two numbers. Adding 3 and 5 should result in 8. 3 + 5 = 8. If we have to implement this in Max (its the exact same in Pure Data):
I’ve used the ‘plus’ object, which as you rightly guessed sums two numbers. I’ve given the ‘plus’ object an argument (5) and I’ve connected a number box (a user interface object that allows us to input numbers) to its inlet and its outlet (to display the output). Because I have entered in an argument in the ‘plus’ object, any number I input through the number box will get added by 5. 5 + 5 = 10
What if I want to change the value of the argument? The ‘plus’ object has a second inlet that lets me do just that. In the snapshot below, I’ve changed the value of the argument to 3. So, 6 + 3 = 9. The ‘plus’ object still shows the old argument I had entered, but the new argument (specified through the number box) overrides it.
‘What if we need to compute y = (x + 3) * 2, where ‘x’ is our input and ‘y’ is our output:
None of this results in sound, at least not yet! The point I’m trying to make here is that its important to start with an idea, however simple it is, and break it down in your head. Think logically and then translate it to patcher-speak.
If you need to build a synth, break it down into its components:
-
Signal generator(s)
-
Sound shaping: amplitude (envelope)
-
Sound shaping: filters (envelope)
-
Effects
-
Control (MIDI)
-
Interface (UI elements)
Each of these components can be broken down further:
-
Signal generator:
-
Different waveform types (sine, square, triangle, etc)
-
Custom waveforms?
-
Wavetables?
-
-
Amplitude envelopes:
-
Attack
-
Decay
-
Sustain
-
Release
-
-
Filter envelopes
-
Attack
-
Decay
-
Sustain
-
Release
-
Band pass or low pass?
-
-
Effects
-
Reverb
-
Delay
-
Tremolo
-
-
Control
-
MIDI Note on/off
-
MIDI Velocity
-
MIDI Pitch bend
-
MIDI FX control
-
Now translate these ideas into patcher-speak:
-
How do I generate waveforms? [cycle~] in Max or [osc~] in Pure Data. This generates a sine wave. Can I use other objects to generate different waveform types, or can I process the sine wave to become these other shapes?
-
Do I want to give the user the flexibility of loading their own samples? [buffer~] and [wave~] in Max or [table] and [tabosc4~] in Pd
-
[line~] can help me generate ramps over time to control both amplitude and ADSR envelopes (filter and amplitude)
-
[*~] can help me scale and sum signals (= change amplitude)
-
[reson~] in Max or [vcf~] in Pd can help me bandpass filter the signal. Or [onepole~] in Max or [lop~] in Pd can help me lowpass the signal
-
Reverb. Can I use third party reverb objects or abstractions? Or do I want to create my own reverb?
-
[tapin~] [tapout~] in Max or [delread~] [delwrite~] in Pd can help me create delays
-
Tremolo would require an LFO and amplitude control. Maybe [cycle~] in Max or [osc~] in Pd hooked up to a [*~] can help achieve this?
Like with most things, beginning work on a patch involves some amount of research, not only in the kind of objects available to make your idea a reality but often you might need to learn about how certain things work. For example, if you need to create a tremolo effect, reading up about how the effect is usually designed can help create one in Max or Pd. Often a simple search in your favourite search engine will lead you to the helpful Max forums or Pd mailing list. Its the concept that is important, not the knob or object.
Start with an idea and break it down till you have your answers. Frustration is only a part of the process. Don’t give in!
[…] my previous post I mentioned about thinking of sound as data. What is this data? It could be the frequency of […]