Implementing Karplus-Strong in Max

Karplus-Strong is easy and fun to mess around with (and a great way to learn) Max. What KP patchers have people made?

Here’s my simple starting template for when I get the itch to futz around with this:

(Patcher JSON)
{
	"patcher" : 	{
		"fileversion" : 1,
		"appversion" : 		{
			"major" : 8,
			"minor" : 6,
			"revision" : 2,
			"architecture" : "x64",
			"modernui" : 1
		}
,
		"classnamespace" : "box",
		"rect" : [ 491.0, 696.0, 581.0, 480.0 ],
		"bglocked" : 0,
		"openinpresentation" : 0,
		"default_fontsize" : 12.0,
		"default_fontface" : 0,
		"default_fontname" : "Arial",
		"gridonopen" : 1,
		"gridsize" : [ 15.0, 15.0 ],
		"gridsnaponopen" : 1,
		"objectsnaponopen" : 1,
		"statusbarvisible" : 2,
		"toolbarvisible" : 1,
		"lefttoolbarpinned" : 0,
		"toptoolbarpinned" : 0,
		"righttoolbarpinned" : 0,
		"bottomtoolbarpinned" : 0,
		"toolbars_unpinned_last_save" : 0,
		"tallnewobj" : 0,
		"boxanimatetime" : 200,
		"enablehscroll" : 1,
		"enablevscroll" : 1,
		"devicewidth" : 0.0,
		"description" : "",
		"digest" : "",
		"tags" : "",
		"style" : "",
		"subpatcher_template" : "",
		"assistshowspatchername" : 0,
		"boxes" : [ 			{
				"box" : 				{
					"id" : "obj-74",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 108.0, 152.0, 82.0, 33.0 ],
					"presentation_linecount" : 2,
					"text" : "Noise \nTrigger"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-73",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 231.0, 152.0, 82.0, 33.0 ],
					"presentation_linecount" : 3,
					"text" : "Pitch\n(Delay Time)"
				}

			}
, 			{
				"box" : 				{
					"floatoutput" : 1,
					"id" : "obj-71",
					"maxclass" : "slider",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 209.0, 45.0, 20.0, 140.0 ],
					"size" : 20.0
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-69",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 362.0, 152.0, 76.0, 33.0 ],
					"presentation_linecount" : 2,
					"text" : "Dampening\n(Feedback)"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-68",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 493.0, 152.0, 76.0, 33.0 ],
					"text" : "Brightness\n(Cutoff)"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-64",
					"maxclass" : "slider",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 471.0, 45.0, 20.0, 140.0 ],
					"size" : 8000.0
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-58",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 123.0, 367.0, 58.0, 22.0 ],
					"text" : "onepole~"
				}

			}
, 			{
				"box" : 				{
					"floatoutput" : 1,
					"id" : "obj-23",
					"maxclass" : "slider",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 340.0, 45.0, 20.0, 140.0 ],
					"size" : 1.0
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-18",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 209.0, 334.0, 29.5, 22.0 ],
					"text" : "*~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-14",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 123.0, 334.0, 49.0, 22.0 ],
					"text" : "tapout~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-13",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "tapconnect" ],
					"patching_rect" : [ 123.0, 290.0, 42.0, 22.0 ],
					"text" : "tapin~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-9",
					"maxclass" : "message",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"patching_rect" : [ 76.0, 163.0, 29.5, 22.0 ],
					"text" : "1"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-6",
					"maxclass" : "ezdac~",
					"numinlets" : 2,
					"numoutlets" : 0,
					"patching_rect" : [ 62.0, 482.0, 45.0, 45.0 ]
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-5",
					"maxclass" : "gain~",
					"multichannelvariant" : 0,
					"numinlets" : 1,
					"numoutlets" : 2,
					"outlettype" : [ "signal", "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 65.0, 308.0, 22.0, 140.0 ]
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-3",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 65.0, 259.0, 29.5, 22.0 ],
					"text" : "*~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-2",
					"maxclass" : "newobj",
					"numinlets" : 5,
					"numoutlets" : 4,
					"outlettype" : [ "signal", "signal", "", "" ],
					"patching_rect" : [ 76.0, 226.0, 89.0, 22.0 ],
					"text" : "adsr~ 0 10 0. 0"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-1",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 26.0, 226.0, 44.0, 22.0 ],
					"text" : "noise~"
				}

			}
 ],
		"lines" : [ 			{
				"patchline" : 				{
					"destination" : [ "obj-3", 0 ],
					"source" : [ "obj-1", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-14", 0 ],
					"source" : [ "obj-13", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-5", 0 ],
					"order" : 1,
					"source" : [ "obj-14", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-58", 0 ],
					"order" : 0,
					"source" : [ "obj-14", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-13", 0 ],
					"source" : [ "obj-18", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-3", 1 ],
					"source" : [ "obj-2", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-18", 1 ],
					"source" : [ "obj-23", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-13", 0 ],
					"order" : 0,
					"source" : [ "obj-3", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-5", 0 ],
					"order" : 1,
					"source" : [ "obj-3", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-6", 1 ],
					"order" : 0,
					"source" : [ "obj-5", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-6", 0 ],
					"order" : 1,
					"source" : [ "obj-5", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-18", 0 ],
					"source" : [ "obj-58", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-58", 1 ],
					"source" : [ "obj-64", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-14", 0 ],
					"source" : [ "obj-71", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-2", 0 ],
					"source" : [ "obj-9", 0 ]
				}

			}
 ],
		"dependency_cache" : [  ],
		"autosave" : 0
	}

}

but I know people get way more crazy with it.

What weird patchers have you made? What tips for patching in Max? What questions do you have about getting it to work?

11 Likes

I’m gonna have a go at this over the next week or two.

2 Likes

Same.

Thanks for starting this thread @jemmons . This forum needs more Max talk IMHO.

2 Likes

I need to dig in my hard drive for previous experiments.
Your patch is indeed a good starting point but must be completely out of tune quite fast in high pitches. It can’t follow midi notes accurately.
[gen~] is mandatory for pitch-tracked Karplus Strong.

4 Likes

Yeah, I’ve been learning Gen for a bit, it’s essential for about 80% of the stuff I want to do (feedback based, obvs).

3 Likes

Thank you for this thread, @jemmons!

Looking back through my Notes app, I see the same pattern, where every 9–18 months I start to gather links and resources to learn Max/Max for Live, then just…never… do it…?

But THIS time… THIIIS time… :heavy_heart_exclamation:

3 Likes

may I ask what are your resources to learn Gen ?
I’ve got this book and it’s quite nice.

3 Likes

Yeah, that’s the one.

Pretty much mandatory reading really.

3 Likes

True. But it tracks perfectly over a very playable four octave range. gen~ is awesome, but not always “necessary” and can scare people off.

(Patcher JSON)
{
	"patcher" : 	{
		"fileversion" : 1,
		"appversion" : 		{
			"major" : 8,
			"minor" : 6,
			"revision" : 2,
			"architecture" : "x64",
			"modernui" : 1
		}
,
		"classnamespace" : "box",
		"rect" : [ 163.0, 245.0, 652.0, 605.0 ],
		"bglocked" : 0,
		"openinpresentation" : 0,
		"default_fontsize" : 12.0,
		"default_fontface" : 0,
		"default_fontname" : "Arial",
		"gridonopen" : 1,
		"gridsize" : [ 15.0, 15.0 ],
		"gridsnaponopen" : 1,
		"objectsnaponopen" : 1,
		"statusbarvisible" : 2,
		"toolbarvisible" : 1,
		"lefttoolbarpinned" : 0,
		"toptoolbarpinned" : 0,
		"righttoolbarpinned" : 0,
		"bottomtoolbarpinned" : 0,
		"toolbars_unpinned_last_save" : 0,
		"tallnewobj" : 0,
		"boxanimatetime" : 200,
		"enablehscroll" : 1,
		"enablevscroll" : 1,
		"devicewidth" : 0.0,
		"description" : "",
		"digest" : "",
		"tags" : "",
		"style" : "",
		"subpatcher_template" : "",
		"assistshowspatchername" : 0,
		"boxes" : [ 			{
				"box" : 				{
					"id" : "obj-30",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 2,
					"outlettype" : [ "bang", "float" ],
					"patching_rect" : [ 292.0, 139.0, 29.5, 22.0 ],
					"text" : "t b f"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-29",
					"maxclass" : "message",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"patching_rect" : [ 268.0, 167.0, 39.0, 22.0 ],
					"text" : "1000."
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-17",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "float" ],
					"patching_rect" : [ 293.0, 196.0, 29.5, 22.0 ],
					"text" : "/ 1."
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-8",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"patching_rect" : [ 292.0, 108.0, 32.0, 22.0 ],
					"text" : "mtof"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-7",
					"maxclass" : "kslider",
					"numinlets" : 2,
					"numoutlets" : 2,
					"offset" : 32,
					"outlettype" : [ "int", "int" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 292.0, 41.0, 336.0, 53.0 ]
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-74",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 155.0, 213.0, 82.0, 33.0 ],
					"text" : "Noise \nTrigger"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-69",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 409.0, 213.0, 76.0, 33.0 ],
					"text" : "Dampening\n(Feedback)"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-68",
					"linecount" : 2,
					"maxclass" : "comment",
					"numinlets" : 1,
					"numoutlets" : 0,
					"patching_rect" : [ 540.0, 213.0, 76.0, 33.0 ],
					"text" : "Brightness\n(Cutoff)"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-64",
					"maxclass" : "slider",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 518.0, 106.0, 20.0, 140.0 ],
					"size" : 8000.0
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-58",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 170.0, 428.0, 58.0, 22.0 ],
					"text" : "onepole~"
				}

			}
, 			{
				"box" : 				{
					"floatoutput" : 1,
					"id" : "obj-23",
					"maxclass" : "slider",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 387.0, 106.0, 20.0, 140.0 ],
					"size" : 1.0
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-18",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 256.0, 395.0, 29.5, 22.0 ],
					"text" : "*~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-14",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 170.0, 395.0, 49.0, 22.0 ],
					"text" : "tapout~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-13",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "tapconnect" ],
					"patching_rect" : [ 170.0, 351.0, 42.0, 22.0 ],
					"text" : "tapin~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-9",
					"maxclass" : "message",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "" ],
					"patching_rect" : [ 123.0, 224.0, 29.5, 22.0 ],
					"text" : "1"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-6",
					"maxclass" : "ezdac~",
					"numinlets" : 2,
					"numoutlets" : 0,
					"patching_rect" : [ 109.0, 543.0, 45.0, 45.0 ]
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-5",
					"maxclass" : "gain~",
					"multichannelvariant" : 0,
					"numinlets" : 1,
					"numoutlets" : 2,
					"outlettype" : [ "signal", "" ],
					"parameter_enable" : 0,
					"patching_rect" : [ 112.0, 369.0, 22.0, 140.0 ]
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-3",
					"maxclass" : "newobj",
					"numinlets" : 2,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 112.0, 320.0, 29.5, 22.0 ],
					"text" : "*~"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-2",
					"maxclass" : "newobj",
					"numinlets" : 5,
					"numoutlets" : 4,
					"outlettype" : [ "signal", "signal", "", "" ],
					"patching_rect" : [ 123.0, 287.0, 89.0, 22.0 ],
					"text" : "adsr~ 0 10 0. 0"
				}

			}
, 			{
				"box" : 				{
					"id" : "obj-1",
					"maxclass" : "newobj",
					"numinlets" : 1,
					"numoutlets" : 1,
					"outlettype" : [ "signal" ],
					"patching_rect" : [ 73.0, 287.0, 44.0, 22.0 ],
					"text" : "noise~"
				}

			}
 ],
		"lines" : [ 			{
				"patchline" : 				{
					"destination" : [ "obj-3", 0 ],
					"source" : [ "obj-1", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-14", 0 ],
					"source" : [ "obj-13", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-5", 0 ],
					"order" : 1,
					"source" : [ "obj-14", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-58", 0 ],
					"order" : 0,
					"source" : [ "obj-14", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-14", 0 ],
					"source" : [ "obj-17", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-13", 0 ],
					"source" : [ "obj-18", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-3", 1 ],
					"source" : [ "obj-2", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-18", 1 ],
					"source" : [ "obj-23", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-17", 0 ],
					"source" : [ "obj-29", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-13", 0 ],
					"order" : 0,
					"source" : [ "obj-3", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-5", 0 ],
					"order" : 1,
					"source" : [ "obj-3", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-17", 1 ],
					"source" : [ "obj-30", 1 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-29", 0 ],
					"order" : 0,
					"source" : [ "obj-30", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-9", 0 ],
					"order" : 1,
					"source" : [ "obj-30", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-6", 1 ],
					"order" : 0,
					"source" : [ "obj-5", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-6", 0 ],
					"order" : 1,
					"source" : [ "obj-5", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-18", 0 ],
					"source" : [ "obj-58", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-58", 1 ],
					"source" : [ "obj-64", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-8", 0 ],
					"source" : [ "obj-7", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-30", 0 ],
					"source" : [ "obj-8", 0 ]
				}

			}
, 			{
				"patchline" : 				{
					"destination" : [ "obj-2", 0 ],
					"source" : [ "obj-9", 0 ]
				}

			}
 ],
		"dependency_cache" : [  ],
		"autosave" : 0
	}

}
2 Likes

(slightly off topic)

I barely touched the audio part of Max so far, really digging into the jitter world but I’ve saved a lot of repositories with insane patches and a lot of gen stuff, if anyone wants to take a look I’ve posted in this thread

4 Likes

Aw heck, I missed that thread. I don’t think there’s enough Max chat around here to have a separate conversation just for Karplus stuff, so makes sense to merge this into there.

Sorry, @moderators!!

2 Likes

nah there’s enough space for specific patch things, just wanted to share collection of stuff I’ve found around :slight_smile:

2 Likes

VERY basic with gen~

1 Like

I can’t help with patching or coding advice, unfortunately.

But there’s this nice and free m4l KS device by @Ess you can probably take apart and study: Fors Pluck

Here’s a pretty straightforward Karplus-Strong patch in Gen~ with a very simple dampening filter.
I usually just use codebox/genexpr but I thought that it’d be a bit less daunting with a patcher-based example. Maybe I’ll follow up with some spicier implementations later. :slight_smile:

Some fun details here include bipolar feedback which results on even/odd harmonics as well as a pitch tracked impulse input which results in a bit more consistent timbre.

An obvious extension would be adding a noise source– you could for example duplicate the one-shot ramp, or just square it (ramp * ramp) and use as a noise envelope.

Also a bonus is a simple sequencer – you can edit those two messages, the left one corresponds to triggers (1 for trigger, 0 for rest) and the right one semitones.

Just copy (down to where it says end) and paste this and select File > New from Clipboard in Max. :slight_smile:

Patch data
----------begin_max5_patcher----------
2409.3ocyas0bihiE94jeEr9wcS7HIjDvVSM07v7unqtRgMJNLCFbA3jzYpY
+su5F2r4hrsf1U0sIVfQmy246bSB96GeX0lrOYEqb9uNey4gG96Ge3A4PhAd
P+8GVsO7ysIgExKa0qGS2VFmkt5I0IODVt8s3zcujy1VptQtX3ZvSN3.h3.D
DHNP8VCb9t9GkdbebZBqTdKg5Aix1GFmJGg+CTiIm23sur8X96r1WL+Njcrr
5Vf0iFGIkwrM+4yt9MRXd3dVIK+EVZ3lD4so59uOKpysUcOK+wAlRUV8ZRVX
4pmbVU8+Mgo6VUqH47uouzmkJMrkVFFEcHKNsr3kOhKeqQG9lCPbopef3exi
qIU+k3HUdqzeHtX9PNeWbe+mGeT7wSFZuRYevgiJrnj8ozHsJJb6+aDSHBIE
EOpzD5J+DgFxBh50n.5wn3s5JTgj32Yq2w4F0R76g4oba5.mcD8AnnjtToZQ
uLEhziBQGikUwpJdK6iJ4ELDSqHdWZXhfh07Wh+Wy.ShKJaXdY4wrzxPoqXq
ohCZbkOLMkkrM6XZY6orH7cVzKgkk4waNVxZ9qBM3qQeA9lbjk8Z0vUi2VKi
SiKi4Roh66AZfx9tryAkNWURV5tgMnctz8bpg3xnUwHN4rpHHRApuymEU4x6
1yoyJ19Rsb7qQrWCOlT9a8IFbSZdoghbkQtOA5HGeJJ+gBZvpyKcOpNbM9JQ
BCyPtJhS9M32GwYASUwuQpCtxO8mJ7cWeETO9JDS7UNyunwGnd9sJQl84grT
lxSwsWRSGpNF.rFS+OB2eXLNd.etFklCWTV9Phqw7a3syuGHc1gb1AVZjSTi
HNByl3KSC3SGOsV+LaXOLa7pAYu1LocsVx1F9ioK.qRM8skZ5ZY0zrfUionP
OYvIneSjJB91iTgrUjJdbIdEhmTMvrkFFr1yZglZQw5M1Db77uvEMvzPB6cP
jo+CO04zElp6UxEcMEZ2mqJbPW0XQpNKFTZeImgNoBRv.STPyiEAVlPtkNab
1Lh54orapCPJ9ZTudh.gBFT8jMf1zH5Unp6YEEg71VOUWgHCHpDk4DXIhJxe
YriErDG3z1QWEKEeMZWelQ2IMiWmVVlsSjUYJ8AqZbGW84M5zACLYMUJdem7
WrXQf9JYcRV1ecbrJ+PDYIQHe8ZR4YIKLjtZrxArpd97nLXTfr7GnJSBJPrd
RVvAEBVT6HK0.UTE8w0Z1P3xYC4kGFob8GtnV2fFeWhsJduI3d+ghrZlDfim
CwIvAhbD+oK+KsicLjJGHsqPXfkRt.cWljKxUZikaP3GUUPptPGVAIltH2Px
nNmsV1ZqW0GqLOS3INYNHkQk5ZIaZvLPiug7JJcz5oU7uWxp.UcXa6rJd2OI
UpzPKmTgdWkSAp7+rbNExBlRAxyj.cTeBlVSUQc7HVJpC9dIQhVirbdDzOqz
HUqn4aeYvRHnBxRCrUEQV1lNDyk2ozAC58TqdXps5rltLb1cLS14UJETskq1
w3MrGod6Sqm.oPwcpNYwUeMNg8NKun6Fn9vpvCGZMb20cce3elIuQA0KnHW3
UC0rFi4r2iq98MiFlyglRNtbLWspkeRwMqYoXYQySOF2YwHqDIoMPrZmEGB2
p9wQEGVuqNulXNq.bpupceWUbP02Hh0FudsgWsKONpH9KMhAUEuPZeEcdtPZ
iAsYIcF+D1x1r86E6p1SMmulxjkxdt3srRm716nz.NGZ0QskF5rznNa27.jn
gejD5YmIqFWuBvU9E1Vy4maiCm40DjevspRspMX.cF0a7Ro2Ew6Ojvb3F9CY
7iIYebP7yFGBzO4PXJYFg.WaBAcBQdRlNwJlI2eRmemKvbkieL7S4d7NANfH
pDeptiCNKD54v.XPX.N.L.aKCCkvX9QI1mGLCLbAJ1f+zfA7hACv8AX7ucdt
7irCw+RQnv6IOrjYF3nO.gvY.cp2Zhexny93OML9g9g9hRlFMbuXzv69.MdK
tnLK+GNu90TfhOpEEg3MGLD78AlDscSR11+xrDs5.J3f4.PbuO.jmmpVKETn
WrGOCfBzECE2IwV2McvTpF.z8ZimAz.FbeE8vf5w0nBT8LA6QlA2k58T6mLp
7aN.CAC8piRmCvfbe.F+hiwUgnaYaVoH2IoX3yrCbB3f.Asx35dSvw.cw.QK
ZWLu8ktGFUKLHvz8vPnnV8v34OC8v.uS5gQ2om3YRSASOCVGDDnvJ4eZFgop
EGDZN.q6kdbLr5LrdC1HyPVX+6Cn3ecAgX0tSUgXmitfuyZrI5KyXJcVrDKC
I2I0kDwR3gVfAh3tN+drXGiN3r83l3slAQ5xUflz72E6LcMkqzrryIwoCsry
R8Qb99Auhri4aqlFsf3zUwhXEkwo0uxTeq4Ai4jKLKORseA.iLnWpjIJdwHQ
SzrDOI62mEoPrjelIEApKbVjhpa9jRgXQ4lMo.BLTJ7mQChmgx.YFkAnwdMy
Jo.bIRwrgEzKwMs6EtOV+p+Vsmb9hGbFnmrCQOW25usnwcLUg5gETKZv4QzL
MLPO5P+XMxGrFigX.Ew+FkDrFM3nPjplAsUBI2Izetl.hwTJxZJffo9dDwa.
k6oC1uUDMO9stWPXzYChMMuVOogOAiIdPIbBjPsWfa82VT2VSUHuk1q00z3z
hcIwAMWYK7rkOEDJMzXLdM0KP4R4F3uFS7.tPz3mB5gWGTEYo1Qrdrkjw3eI
lkQQDsd3pdUY03i7ayjwzz5OnKMW23hAbmyBiLkpivFy04I6fPOnjQ66s1Cz
v0G7THW5Zj1K.FHCR1LzRZUP3KgpCmn6yr73cwo5lY4hxyXvpyegPkWe2NUU
O9bmJ75GhtyCa1w+bn9cZwiN6A0y3YBoz5wmIeKLSAFnRcZz9DlwrNwcqm8T
OAer5gZ2aMFo35HJn6PmKzfaRnglH0AVvrfLhpAsAUCZxLArwLQLYlv1Xlvl
PtviQtvdRpDUkGEodAJje6VkMpInfWG+eKwdMepst2NzDKRk7caJo6Ma6cIy
ksGXhrYAP.dAXvsEmxn7GTaMSSkRDYiThHSXPHaDkGZhCIp0ZWd0yjIoSP1n
xEnQtez4H7FjX5TeyJoQ9WfECNgyRHafoUnguUkDYxLYC1oILDaDVzjrc9yg
O.xvI9VUPOCaa.u..IcNX+lDY1yFIan2b4Jp9flpZEU2um7RRIjpSd4nN4Ei
57WJpgegnN8kgR9hP02KAkXmze7ed7+StBQYU
-----------end_max5_patcher-----------
22 Likes

Little bit of tinkering, now we’re cooking…

4 Likes

So I’ve not started tinkering inside @Ess’s patch yet, but just a few effects on the top of it can make it sound really good, really viscerally sort of real, if you get what I mean.

3 Likes

So here’s a version of @chapelierfou’s Gen patch, but with envelope controlled white noise exciting the feedback loop and a low pass filter being controlled by the same envelope. Add a bit of reverb and saturation and we’ve got some sort of weird piano thing.

I’ve built a couple of simple neural network things what I nicked off of Simon Hutchinson that I’m controlling with the mouse for now. One of them is being massively under utilised for sequencing notes, but I’ve got plans for it.

Edit:

Completely forgot, I’m also using the output of the neural network that’s controlling note pitch to track the filter.

8 Likes

Max and Ben~ Senseis – in your opinion is it better to work through the Max tutorials and get my feet wet with Max and Max for Live before looking at Gen~, or is it feasible to “learn”/experience/whatevers in parallel with that learning?

1 Like

I’m not much of a sensei, but I’d say that once you’ve got a reasonable understanding of what Max, and specifically MSP, do and how things work, Gen is fairly straightforward. A lot of Gen operators are basically the same as MSP objects and work in more or less similar ways. I think the thing that takes a bit of getting your head around with Gen is that you can’t use UI objects inside Gen patches, so you have to get good at using ins and outs and sub-patching and all that jazz.

Gen is kinda just something I stumbled into because I needed to make better use of feedback, which Gen is excellent at, due to it working right down to single samples at all times.

2 Likes