[PD] Clocks and [pipe] in Lua
Claude Heiland-Allen
claudiusmaximus at goto10.org
Thu Mar 13 13:36:43 CET 2008
Frank Barknecht wrote:
> Hi (Claude),
>
> inspired by Matteo's question I briefly tried to implement a [pipe]
> clone in pdlua, however I ran into problems which might hint at either
> some design issues with clock support in pdlua or, more likely, my
> lack of understanding how clocks work.
[snip]
> For the luapipe [lpipe] I thought I'd mimick that approach and collect
> the scheduled events in a table as member of the pdlua-class, like
> self.events.
It's easier to use idiomatic Lua, I think.
> So the method to add an event could look like this in pseudo-Lua:
>
> function M:in_1(sel, atoms)
> local deltatime = atoms[1] -- delay
> local e = event.new()
> e.payload = atoms
> e.clock = makeclock(deltatime)
> table.insert(self.events, e)
> end
>
> My problem is the hypothetical "makeclock". It should be a clock that
> somehow is tied to the event. But as I see it, clocks in pdlua are
> supposed to be tied to a pdclass object itself, and their callback
> methods don't accept any additional arguments to specify which of the
> event they should handle.
>
> Any ideas how to work around this?
Lua has lexical scope, and allows you to create closures (ie, functions
that reference some part of their context). You don't need a table of
events, you can just 'embed' the data in the function for each event.
I changed the interface of your object btw, having an "anything" inlet
for messages and a "float" inlet for delay time, which is safer (you had
an anything method, but assume the first atom is a float - bug!).
Something like this probably works (untested...):
-- initialise self.nextID to some number in constructor
function M:in_2_float(f)
self.deltatime = math.max(0, f)
end
function M:in_1(sel, atoms)
-- we need unique method names for our clock callbacks
self.nextID = self.nextID + 1
local id = "trigger" .. self.nextID
local clock = pd.Clock:new():register(self, id)
-- the clock callback outlets the data and cleans up
self[id] = function(self)
self:outlet(1, sel, atoms)
clock:destruct()
self[id] = nil
end
-- now start the clock
clock:delay(self.deltatime)
end
Hope this helps, was an interesting problem,
Claude
--
http://claudiusmaximus.goto10.org
More information about the Pd-list
mailing list