Puredata! (thread)

pd-extended has been abandoned: https://puredata.info/downloads/pd-extended

(I’ll also add that the patching experience is much nicer in purr-data so if you’re dabbling or learning slowly, that would be my suggestion)

1 Like

Extended hasn’t been maintained for a few years, now, so I definitely would not recommend it. (I just checked, and it looks like the last release was 2013!) Unfortunately a lot of extant documentation and tutorials still refer to it, but at this point it’s really a non-starter.

Purr Data continues the mission of Extended by providing a lot of bundled externals and some other quality of life improvements. The GUI is all re-written in javascript, and while it provides some nice things like being able to zoom in/out (yes please!) and easily customizing the colours, I also find it to be sluggish. Purr Data lags behind Vanilla a bit, and so you won’t have access to the latest and greatest from upstream (not a huge issue with Pure Data, but just worth mentioning). In my personal experience, I’ve had more frequent crashes with Purr Data (usually something in the GUI will freeze up).

That said, I use Purr Data when I’m on a new/temporary system and I want to get up and running as quickly as possible to try out some ideas. I would recommend it to someone wanting to test the waters or someone with less experience setting up and maintaining development environments.

I use Vanilla on my main system and for any patches that are treated as “final” (i.e., I’m going to perform with them, or record with them, or install them, etc.) Once you’ve added whatever externals you need, the only significant difference between Vanilla and Purr Data will be the GUI.

There is a fork of Vanilla called PD-Next which is effectively Vanilla with a couple of GUI tweaks included, such as the ability to customize colours. PD-Next keeps pace with Vanilla releases, and I know a lot of Pd users who are using PD-Next as their main flavour.

My personal 2 cents: try to use vanilla when/where you can, and be mindful about the technical debt you build up with 3rd party externals–this is harder to do in Purr Data, especially if you’re new to the environment and may not necessarily know when the object you’re using is an external vs a core component. When I started with Pd it was back in the extended days, and all my old patches were made in that environment. I struggle to get many of them to run now due to dependencies on externals which are no longer maintained, or no longer compatible with current CPU architectures. In some cases fixing these issues is simple–just find a modern drop-in replacement. In other cases it has meant that I either need to rewrite the entire patch or I need to just load up Extended and treat that patch as belonging to a totally different system/environment.

4 Likes

I would recommend using vanilla or pd-next, especially if you are programming in the evening some of the different color schemes are easier on the eyes than the vanilla-white.
Vanilla is also the most compatible if you want to share your patches or try things like MobMuPlat for iOS and Android or Camomile to make VST plugins from your patches.

I can also recommend the else library, it was made by Alexandre Torres Porres as a replacement for extended and comes with loads of well documented objects. Lots of higher level stuff like the preset managment system i used in the patch i shared above. You can download it using the Pd internal packet manager and it comes with a tutorial too!

2 Likes

vanilla. purrr’s javascirpt UI is just too slow and fancy for older machines and has a huge dependency pile. it bundles in too much 3rd-party stuff of varying quality, PD should be lean, mean and portable.

5 Likes

Internet has spoken: vanilla :icecream:

Thank you for your insights, that is very generous. These kinds of matters are poorly addressed by search engines and available and accessible documentation.

3 Likes

One of the most frustrating parts of Pd in general!

I believe there’s a current effort to improve vanilla Pd’s extremely lacking documentation. I had some very weird experiences when trying to help with it and am no longer involved, but I would cautiously encourage others to try contributing if they feel motivated to do so!

Pd → crone/SuperCollider
↳ softcut

Watch out for attacky noise 8 secs in.

Next installing ELSE suggested above on norns.

Sound with the above instrument=contraption on the Pd side and some Otis messing around live.

1 Like

I finally got around to trying the prototype module in vcvrack. I will say compiling it for windows was a bit of a pain and I ended up removing the LED widgets because I didn’t need to use them and they were breaking the build, however that might’ve been me cherry-picking the wrong commit from some of the open PRs. Silly pic below of a six operator patch using vcv for some light signal manipulation.

The possibilities with this setup are pretty exciting, one of my favorites things to do with PD are to make little tape patches and if I can plug in a synth to do sample manipulation and that sorta stuff I think it’ll be incredibly fun.

6 Likes

So spent a few more sessions with it, one unfortunate thing is that you can’t update stuff inside the patcher without messages. So no using vsliders in PD as an extra interface without some other patcher window sending OSC or something.

1 Like

yeah! you’ll want to send your audio into a buffer of a reasonable size (i usually use something like 1024ms), and have a vd~ received it with the shortest delay possible (around 5ms works). then, you’ll need to modulate that delay time with an LFO - could be any shape you want, tho i find sine waves sound a bit repetitive, so setting up a slewed/interpolated S&H might work better. don’t forget to multiply the output of the LFO for how obvious you want the effect to be :))

adc~
|
delwrite~ buff1 1024

5 osc~ 1
| /
+~
|
vd~ buff1
|
dac

(something like this, not at my laptop rn but i think this is right)

6 Likes

To get the smallest possible delay time/latency it’s important to get the execution order right, which is easy to mess up with copy pasting stuff or changing buffer names, or really anything else, if it’s wrong the lowest delay is one block of 64 samples (1.333 ms) which isn’t too bad if you don’t want to complicate your patch.
There is a trick to get it right though: putting the delwrite~ and the delread4~ into their subpatches and connecting these with a dummy signal using an outlet~ and an inlet~. This forces the right execution order. There is an example patch for that in Pd/doc/3.audio.example/G05.execution.order.pd.

As an LFO lowpass filtered noise could also work really nice for a tape wobble effect, something like lop~ 1 or lower, then you have to scale it up a lot, maybe *~ 1000

3 Likes

Looks super cool, what’s the current status?

Thanks! I’m still working on it, feature-wise it’s almost complete, but it still has some bugs. I’m focussing on graduating for a little while, but after that I’ll be back to work on it!

I really love puredata but often find it is never quite the right tool for any task, but always close yet not quite there. Has anybody here played with pd-lua much? It seems like it might provide some way around the grey areas of places where pd is less elegant. I’ve still yet to find any better free tool on PC for playing with building software instruments than pd.
(that said, I do tend to enjoy building very cursed pd patches - I built an IRC bot in vanilla pd once)

3 Likes

I made a little Pd patch, running on MobMuPlat on Android phone, to control track lengths on OP-Z over MIDI cc.

Just a little demo, I am trying to think what Pd means or could mean for me. Using a single USB cable :slight_smile: This gets real fun when setting the tracks to looping envelopes and controlling their loop points rather than track lengths.

The musical and UI ideas are Mark Fell’s, see Pattern Synthesis.

opd-z.mmp
{
   "backgroundColor" : [
      0.250491350889206,
      0.250491350889206,
      0.250491350889206,
      1
   ],
   "canvasType" : "tallPhone",
   "gui" : [
      {
         "address" : "/bd_in",
         "class" : "MMPSlider",
         "color" : [
            0,
            0,
            0.998199224472046,
            1
         ],
         "frame" : [
            80,
            160,
            180,
            40
         ],
         "highlightColor" : [
            0.371674180030823,
            0.66145133972168,
            0.998770952224731,
            1
         ],
         "isHorizontal" : true,
         "range" : 16
      },
      {
         "address" : "/perc_in",
         "class" : "MMPSlider",
         "color" : [
            0,
            0,
            0.998199224472046,
            1
         ],
         "frame" : [
            80,
            340,
            180,
            40
         ],
         "highlightColor" : [
            0.371674180030823,
            0.66145133972168,
            0.998770952224731,
            1
         ],
         "isHorizontal" : true,
         "range" : 16
      },
      {
         "address" : "/sd_in",
         "class" : "MMPSlider",
         "color" : [
            0,
            0,
            0.998199224472046,
            1
         ],
         "frame" : [
            75,
            220,
            182.418212890625,
            40
         ],
         "highlightColor" : [
            0.371674180030823,
            0.66145133972168,
            0.998770952224731,
            1
         ],
         "isHorizontal" : true,
         "range" : 16
      },
      {
         "address" : "/hh_in",
         "class" : "MMPSlider",
         "color" : [
            0,
            0,
            0.998199224472046,
            1
         ],
         "frame" : [
            80,
            280,
            180,
            40
         ],
         "highlightColor" : [
            0.371674180030823,
            0.66145133972168,
            0.998770952224731,
            1
         ],
         "isHorizontal" : true,
         "range" : 16
      },
      {
         "address" : "/thing_in",
         "class" : "MMPSlider",
         "color" : [
            0,
            0,
            0.998199224472046,
            1
         ],
         "frame" : [
            80,
            400,
            180,
            40
         ],
         "highlightColor" : [
            0.371674180030823,
            0.66145133972168,
            0.998770952224731,
            1
         ],
         "isHorizontal" : true,
         "range" : 16
      }
   ],
   "isOrientationLandscape" : false,
   "isPageScrollShortEnd" : false,
   "pageCount" : 1,
   "pdFile" : "opd-z.pd",
   "port" : 54321,
   "preferAndroidFontDisplayInEditor" : false,
   "startPageIndex" : 0,
   "version" : 2
}
opd-z.pd
#N canvas 81 91 381 236 12;
#X obj 50 43 hsl 64 30 1 16 0 0 bd bd_in bd -16 16 0 10 #c7c6ff #000000
#000000 0 1;
#X obj 50 77 hsl 64 30 1 16 0 0 sd sd_in sd -16 16 0 10 #c7c6ff #000000
#000000 0 1;
#X obj 50 109 hsl 64 30 1 16 0 0 hh hh_in hh -16 16 0 10 #c7c6ff #000000
#000000 0 1;
#X obj 50 141 hsl 64 30 1 16 0 0 perc perc_in perc -32 16 0 10 #c7c6ff
#000000 #000000 0 1;
#X obj 50 173 hsl 64 30 1 16 0 0 thing thing_in thing -40 16 0 10 #c7c6ff
#000000 #000000 0 1;
#N canvas 55 254 647 448 datain 0;
#X obj 153 226 unpack f f f f f;
#X msg 32 22 list 11 2 3 5 10;
#X msg 32 47 list 11 4 3 7 4;
#X msg 33 74 list 3 11 4 7 11;
#X msg 33 102 list 5 11 4 7 15;
#X msg 33 131 list 13 12 8 9 5;
#X obj 154 262 send bd_in;
#X obj 180 285 send sd_in;
#X obj 207 308 send hh_in;
#X obj 234 332 send perc_in;
#X obj 262 357 send thing_in;
#X obj 178 21 receive fromGUI;
#X obj 177 47 route list;
#X floatatom 176 93 5 0 0 0 - - - 0;
#X floatatom 238 93 5 0 0 0 - - - 0;
#X floatatom 300 94 5 0 0 0 - - - 0;
#X floatatom 363 94 5 0 0 0 - - - 0;
#X floatatom 425 95 5 0 0 0 - - - 0;
#X obj 176 70 route /bd_in /sd_in /hh_in /perc_in /thing_in;
#X connect 0 0 6 0;
#X connect 0 1 7 0;
#X connect 0 2 8 0;
#X connect 0 3 9 0;
#X connect 0 4 10 0;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X connect 3 0 0 0;
#X connect 4 0 0 0;
#X connect 5 0 0 0;
#X connect 11 0 12 0;
#X connect 12 0 18 0;
#X connect 13 0 6 0;
#X connect 14 0 7 0;
#X connect 15 0 8 0;
#X connect 16 0 9 0;
#X connect 17 0 10 0;
#X connect 18 0 13 0;
#X connect 18 1 14 0;
#X connect 18 2 15 0;
#X connect 18 3 16 0;
#X connect 18 4 17 0;
#X restore 195 63 pd datain;
#N canvas 64 279 577 500 dataout 1;
#X floatatom 247 50 5 1 16 1 ch - - 0;
#X floatatom 147 71 5 0 0 0 - - - 0;
#X floatatom 190 49 5 0 127 1 cc - - 0;
#X obj 192 114 ctlout, f 7;
#X floatatom 246 94 5 1 16 1 ch - - 0;
#X floatatom 148 101 5 0 0 0 - - - 0;
#X floatatom 191 92 5 0 127 1 cc - - 0;
#X obj 191 155 ctlout, f 7;
#X floatatom 245 136 5 1 16 1 ch - - 0;
#X floatatom 149 133 5 0 0 0 - - - 0;
#X floatatom 190 135 5 0 127 1 cc - - 0;
#X obj 193 198 ctlout, f 7;
#X floatatom 247 179 5 1 16 1 ch - - 0;
#X floatatom 148 165 5 0 0 0 - - - 0;
#X floatatom 192 178 5 0 127 1 cc - - 0;
#X obj 191 240 ctlout, f 7;
#X floatatom 245 221 5 1 16 1 ch - - 0;
#X floatatom 150 199 5 0 0 0 - - - 0;
#X floatatom 190 219 5 0 127 1 cc - - 0;
#X obj 48 57 receive bd;
#X obj 50 90 receive sd;
#X obj 48 127 receive hh;
#X obj 47 160 receive perc;
#X obj 47 186 receive thing;
#X obj 191 70 ctlout;
#X obj 118 295 cnv 15 100 100 cs1 cr1 empty 20 12 0 14 #fcfcfc #404040
0;
#X floatatom 60 405 5 0 0 0 - - - 0;
#X msg 60 458 \; cr1 color \$1;
#X obj 99 404 select 1 2 3 4 8;
#X obj 99 435 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000
#000000;
#X obj 186 435 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc
#000000 #000000;
#X obj 120 435 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc
#000000 #000000;
#X obj 142 435 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc
#000000 #000000;
#X obj 164 435 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc
#000000 #000000;
#X obj 60 371 notein;
#X obj 411 48 receive bd_ch;
#X obj 311 18 receive track_len_cc;
#X obj 414 102 receive hh_ch;
#X obj 410 75 receive sd_ch;
#X obj 417 145 receive perc_ch;
#X obj 413 194 receive thing_ch;
#X connect 0 0 24 2;
#X connect 1 0 24 0;
#X connect 2 0 24 1;
#X connect 4 0 3 2;
#X connect 5 0 3 0;
#X connect 6 0 3 1;
#X connect 8 0 7 2;
#X connect 9 0 7 0;
#X connect 10 0 7 1;
#X connect 12 0 11 2;
#X connect 13 0 11 0;
#X connect 14 0 11 1;
#X connect 16 0 15 2;
#X connect 17 0 15 0;
#X connect 18 0 15 1;
#X connect 19 0 1 0;
#X connect 20 0 5 0;
#X connect 21 0 9 0;
#X connect 22 0 13 0;
#X connect 23 0 17 0;
#X connect 26 0 27 0;
#X connect 28 0 29 0;
#X connect 28 1 31 0;
#X connect 28 2 32 0;
#X connect 28 3 33 0;
#X connect 28 4 30 0;
#X connect 34 0 26 0;
#X connect 34 2 28 0;
#X connect 35 0 0 0;
#X connect 36 0 2 0;
#X connect 36 0 6 0;
#X connect 36 0 10 0;
#X connect 36 0 14 0;
#X connect 36 0 18 0;
#X connect 37 0 8 0;
#X connect 38 0 4 0;
#X connect 39 0 12 0;
#X connect 40 0 16 0;
#X restore 194 90 pd dataout;
#N canvas 442 560 450 300 init 1;
#X obj 76 41 loadbang;
#X obj 25 17 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000
#000000;
#X msg 75 71 \; track_len_cc 60 \; bd_ch 1 \; sd_ch 2 \; hh_ch 3 \;
perc_ch 4 \; thing_ch 5 \;;
#X connect 0 0 2 0;
#X connect 1 0 2 0;
#X restore 196 35 pd init;
5 Likes

I struggle with this, I always feel like I can make something approximating what I want in PD but I can never reach a point where a patch plays and feels like an instrument or fits into a performance in a way that feels solid. My recent foray into the vcvrack libpd stuff is a bit of an attempt to explore this space more, but I don’t know… it’s so maddening because pd is simultaneously one of my favorite things but still lacks something that I can’t put my finger on.

I really need to fix up my terminal osc control thing because maybe part of it is the control surface feels limiting.

2 Likes

Hehe respect, that’s a worthy project!

sorry if this has already been mentioned, but I found out about a cool Lyra 8 clone built in Pd a couple days ago from the ppooll Discord server - it’s called Lira 8 (by Mike Moreno DSP) and is available for free or donation! i haven’t played around with a physical Lyra 8, but messing around with this Pd patch is super fun maybe you peeps will enjoy it too.

Lira 8 by Mike Moreno

10 Likes

Oh yes this is quite excellent! Serves as a really nice reference for abstracting PD patches, and you gotta love the vanilla tanh~ :slight_smile:

Also I’m not sure how I’ve never been to musicdsp.org – looks like this is the “procedural” implementation of that tanh~ Rational tanh approximation — Musicdsp.org documentation