[ANSWERED] Process Multiple Osc Messages on Same Channel Arriving at the Same Time
niels last edited by mark
I've been hooking up TidalCycles (live-coding environment for generating patterns) to Isadora (via OSC) which works quite nicely. My TidalCycles sends out a messages such as:
Where the integer 4 is the DMX moving head I want to turn on. I got a set of these heads in the studio, and running them sequentially works perfectly fine.
However, when I send out a pattern from TidalCycles that should trigger all heads at the same time, Isadora only seems to catch the last of the following messages which are sent out by TidalCycles at almost the same time:
I'd expect Isadora to give me all these numbers in the OSC listener and not just the last one (that's what's happing).
Any idea how I could make Isadora pick up all of those four messages? Sending bundles from TidalCycles is not an option, because I will then need to take care of timing (messages are sent ahead of time). I also tried to set the general service task rate to its fastest setting, but no luck there.
OSC is a udp signal so overlapping data can get lost. You could start by checking the monitor window for all incoming OSC streams to seee if the data is actually coming through. I would then be checking the Communications/Stream Setup... and perhaps assigning channels to an OSC Multi Listener, where I can turn on 'show addr' and set the base channel 'base chan' assigned in the Stream Setup and the number of channels 'num chan'.
If you send OSC (OpenSoundControl) you will always get the latest value that Izzy is getting through that OSC path. Like @bonemap says open the monitor window and see or you receive all values correctly. The correct way to handle this in Isadora is to use a seperate path for each single Moving head.
So MH 1 would be /isadora/tidal/1, moving head 2 would be /isadora/tidal/2
If you can't do that we need to become creative with the way that we are patching, if you can confirm that all values are received we then can make a buffer that basically receives all the values and then spits them back out so that we can do something with it.
Let us know :)
mark last edited by mark
@Juriaan is exactly right: If you have a single OSC Listener and those messages are being sent at exactly the same time, the last message wins.
But to explain: during an Isadora processing cycle, it executes all of the actors in the scene from top to bottom. If multiple values are received at the same input during the same processing cycle, the last value will win.
Here's how it looks explicitly if you had a Scene with an OSC Listener connected to a Calculator:
1) Execute Calculator
2) Are there incoming links to the Calculator?
3) Yes! There is a link from the OSC Listener. So we need to execute the OSC Listener first before we can calculate.
4) Execute the OSC Listener. Check for new OSC values:
OSC Listener receives /isadora/tidal with value 1
OSC Listener receives /isadora/tidal with value 2
OSC Listener receives /isadora/tidal with value 3
OSC Listener receives /isadora/tidal with value 4
5) OSC Listener outputs the last value it received which is 4. Returns control to the Calculator actor.
6) Calculator now has all its input values, which includes the '4' sent by the OSC Listener.
7) Calculator performs the calculation
Hopefully that helps you understand why your initial attempt didn't work. If you do what Juriaan says, it will work.
niels last edited by
Thanks for all your explanations! I indeed see all four messages pop up at the same time in the monitor window, each carrying a different value (1,2,3,4). Splitting the messages up per DMX head is an option, that but makes it impossible to write up one single pattern in TidalCycles that turns on multiple heads simultaneously.
The solution to let the OSC monitor in Isadora output a buffer of all the values it has received during the processing cycle sounds like one that could work. The behavior that I expected as a user when I was patching things up, was for Isadora to run a new processing cycle for each OSC message that comes in (as in, event-based). I can imagine the latter option is quite intrusive on Isadora's current architecture.
For the piece I'm working on right now during Oulu Dance Hack it turns out we only want to run sequential patterns. But I can imagine I'd want to light up an array of lights simultaneously using TidalCycles patterns in a future project :)