Tutorial¶
This tutorial will guide you through creating MaxMSP patches with MaxPyLang.
Getting Started¶
Installation¶
First, install MaxPyLang:
git clone https://github.com/Barnard-PL-Labs/MaxPyLang.git
cd MaxPyLang
pip3 install .
Hello World¶
Let’s create a simple oscillator patch that generates a 440 Hz tone:
import maxpylang as mp
# Create a new patch
patch = mp.MaxPatch()
# Place objects
osc = patch.place("cycle~ 440")[0]
dac = patch.place("ezdac~")[0]
# Connect them
patch.connect([osc.outs[0], dac.ins[0]])
# Save the patch
patch.save("hello_world.maxpat")
Run this script, then open hello_world.maxpat in MaxMSP. Click the DAC (ezdac~) to hear the tone!
Basic Concepts¶
Creating a Patch¶
Every MaxPyLang script starts by creating a MaxPatch object:
import maxpylang as mp
patch = mp.MaxPatch()
Placing Objects¶
Use patch.place() to add objects to your patch. The method returns a list of created objects:
# Place a single object
metro = patch.place("metro 500")[0]
# Place multiple objects
oscs = patch.place("cycle~ 220", "cycle~ 330", "cycle~ 440")
You can also specify placement options:
# Grid placement with custom spacing
objects = patch.place(
"cycle~ 100", "cycle~ 200", "cycle~ 300",
spacing_type="grid",
spacing=[100, 80]
)
# Vertical placement
objects = patch.place(
"random 100", "random 200", "random 300",
spacing_type="vertical",
spacing=50
)
Connecting Objects¶
Connect objects using their inlets and outlets:
# Connect outlet 0 of obj1 to inlet 0 of obj2
patch.connect([obj1.outs[0], obj2.ins[0]])
# Connect multiple patchcords at once
patch.connect(
[obj1.outs[0], obj2.ins[0]],
[obj1.outs[1], obj3.ins[0]],
[obj2.outs[0], obj4.ins[0]]
)
Saving Patches¶
Save your patch to a .maxpat file:
patch.save("my_patch.maxpat")
Working with Inlets and Outlets¶
Every MaxObject has ins (inlets) and outs (outlets) that you can access by index:
osc = patch.place("cycle~ 440")[0]
dac = patch.place("ezdac~")[0]
# Access outlets and inlets by index
outlet = osc.outs[0] # First outlet of osc
inlet = dac.ins[0] # First inlet of dac
# Connect them
patch.connect([outlet, inlet])
Example: Building a Simple Synth¶
Let’s create a more complex patch with multiple oscillators:
import maxpylang as mp
patch = mp.MaxPatch()
# Create oscillators at different frequencies
frequencies = [220, 330, 440, 550]
oscillators = []
for freq in frequencies:
osc = patch.place(f"cycle~ {freq}")[0]
oscillators.append(osc)
# Create a mixer
mixer = patch.place("*~ 0.25")[0] # Scale volume to avoid clipping
dac = patch.place("ezdac~")[0]
# Connect all oscillators to mixer
for osc in oscillators:
patch.connect([osc.outs[0], mixer.ins[0]])
# Connect mixer to speakers
patch.connect([mixer.outs[0], dac.ins[0]])
patch.save("multi_oscillator.maxpat")
Example: Random Patch Generation¶
MaxPyLang makes it easy to generate patches programmatically:
import maxpylang as mp
import random
patch = mp.MaxPatch()
# Generate random number generators
num_generators = 5
generators = []
for i in range(num_generators):
max_val = random.randint(50, 500)
gen = patch.place(f"random {max_val}")[0]
generators.append(gen)
# Create outputs
outputs = []
for i in range(num_generators):
out = patch.place("number")[0]
outputs.append(out)
# Connect generators to outputs
for gen, out in zip(generators, outputs):
patch.connect([gen.outs[0], out.ins[0]])
# Add a metro to trigger them all
metro = patch.place("metro 1000")[0]
for gen in generators:
patch.connect([metro.outs[0], gen.ins[0]])
patch.save("random_generators.maxpat")
Loading Existing Patches¶
You can load and modify existing MaxMSP patches:
import maxpylang as mp
# Load an existing patch
patch = mp.MaxPatch("existing_patch.maxpat")
# Add new objects
new_obj = patch.place("print")[0]
# Save modified patch
patch.save("modified_patch.maxpat")
Next Steps¶
Explore the API for complete reference documentation
Check out Topics for advanced features
See the
examples/directory for more complex patchesLearn about Unknown Objects and Linked Files