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 0
and 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 onchange
and 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/