Tidal < > Hydra

Hi everyone, I'm trying to route Tidal to Hydra.
I've followed a few routes but no luck so far.

Here's my setup:

  • Windows 11
  • Tidal runs in Pulsar => 6010 is allocated by GHCI, sound works
  • Hydra runs in Pulsar => Listens on 3333, visuals work
  • SC runs in background

Everything runs fine independently.
But I'd like to forward Tidal OSC to Hydra, so in SC I'm runinng one of these two:

var addr = NetAddr.new("127.0.0.1", 3333);
OSCFunc({ |msg, time, tidalAddr|
	var latency = time - Main.elapsedTime;
	msg = msg ++ ["time", time, "latency", latency];
	msg.postln;
	addr.sendBundle(latency, msg)
}, '/play').fix;

OR

var tidalAddr = NetAddr.new("127.0.0.1", 6010);
var hydraAddr = NetAddr.new("127.0.0.1", 3333);
OSCFunc.newMatching({ |msg, time, addr, port|
	var latency = time - Main.elapsedTime;
	msg = msg ++ ["time", time, "latency", latency];
 	msg.postln;
	hydraAddr.sendBundle(latency, msg)
}, '/play', tidalAddr);

Which, to me reads like it should:

  • catch a msg that's incoming on 6010
  • augment its payload
  • log it
  • forward to 3333

This makes sense, and for a brief moment it felt I swear it worked as I could see logs (msg.postln) in SC.

Then after a reboot I can't see anything in SC.

TL;DR: Tidal is running, port 6010 is allocated, sound comes out of the speakers, but the listener in SC doesn't catch any event as there is no logs.

Could this be a Windows firewall / defender problem?

Or am I missing something? Like do I have to change anything in BootTidal.hs?
I feel like no, I'm intercepting and routing at SC-level, so it should be transparent to Tidal right?

1 Like

Hi there, figured it out.

So, in case anyone is trying to have Tidal send OSC to Hydra (or anything else?) in 2025, this is how I did it.

  • Boot SuperCollider as usual, start Tidal in your editor.

  • Evaluate this bit in SC:
    adapted from here

// foward OSC from TidalCycles
var addr = NetAddr.new("127.0.0.1", 3333);
OSCFunc({ |msg, time, tidalAddr|
	var latency = time - Main.elapsedTime;
	msg = msg ++ ["time", time, "latency", latency];
	msg.postln;
	addr.sendBundle(latency, msg)
}, '/dirt/play').fix;
  • Start playing something in Tidal

  • You should see messages being logged in SC console

  • Now start Hydra (I'm doing so in Pulsar), have it listen on that same port, and log on message

msg.setPort(3333)
msg.on("/dirt/play", (msg) => {
  log(msg)
  console.log(msg)
})

The important bits here (what wasn't working for me):

  • The path needs to be exactly /dirt/play

I was using different paths, thinking this could be customizable like the port, but it's not.

BTW I'm not sure if it really impacts performance, but I'm removing logs both from Hydra and SC code (remove msg.postln;)

5 Likes