Pure Data Objects Written in C
I’ve been using Pure Data for a month or two now to spice up the visuals when I stream live, and I’ve found it pretty fun but occasionally frustrating. Most of my frustration has been around finding objects (or combinations of objects) that do what I want to do. For whatever reason I’ve strugged to find specific things online so there’s a good chance that what I’ve done in the rest of this blog has been for naught, other than a learning experience for me.
The main thing I wanted was something I could use to switch between scenes I have set up. Each one has one or more
gemhead objects that can be turned on or off. I had rigged something up using an
hradio object and a
select. Each outlet of the
select outputs then went to a
1 message, and every other output went to a
0 one. Both of these messages then go in to a
toggle object which is linked to all the
gemhead objects for that scene. This gets very cumbersome, for example I have seven scenes I want to use, each one of these needs a
1 message, and each
0 message has to be connected to every
select output except the one that corresponds to that scene. Here is a picture of the patch:
Yesterday I had a look at this excellent git repo, HOWTO write an External for Pure Data, and saw that it would be pretty simple to write an object in C, which I then did. And then I wrote a few more.
The object I created to help me with this problem is one I’ve called
select8. It takes the place of the
select object in this patch and has 8 outlets. Maybe one day I’ll change it to use a creation argument for the number of outlets but 8 will do for now. What it does is pretty simple. It takes in a float (such as that provided by the
hradio object) and sends a
1 out of the corresponding outlet. The important change from the built in
select output is that it also sends a
0 out of all the other outlets. This means that not only do I not need to have a
0 and a
1 message for every scene, I don’t need to connect the other outlets to each
0. This has cleaned it up a lot, as you can see from the screenshot below:
Now that I’d got bitten by the bug, I wrote some more objects. The next one was
switch8, which I wanted to use with
pix_video. You can only have one
pix_video object for a given device and I wanted to be able to route it through different render chains, so this is what I use. It takes anything at all in to it’s first inlet, and sends it out of one of the eight outlets. Which outlet is in use is determined by a float you send to the second inlet. Like
select8 the number of outlets is fixed, maybe a future version will be more flexible but that’s more than enough for me right now.
I’ve also written
on1. These both take in floats, and emit bangs.
onchange emits a bang when the input value is changed,
on1 when the input value is just
1. I wrote these because of a side-effect I noticed after I modified
select8 to advance to the next outlet when it receives a bang. I discovered that despite me using the explicit
outlet_float function that would also be picked up as a bang, so I needed a way to filter these. I initially wrote
onchange which almost did what I wanted, but it was really
on1 that was the final piece of the puzzle.
That’s all I written for now, I’m sure I’ll write more in future. I’ve made them all freely available under the Clear BSD License over on gitlab: https://gitlab.com/benofbrown/pd-objects/