# Tidal \< \> Hydra

**URL:** <https://uzu.lurk.org/t/tidal-hydra/5741>\
**Category:** TidalCycles\
**Tags:** installation\
**Created:** [19 June 2025 13:48 UTC](https://uzu.lurk.org/t/tidal-hydra/5741 "2025-06-19T13:48:39Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![void0](https://uzu.lurk.org/letter_avatar_proxy/v4/letter/v/ba9def/32.png) [@void0](https://uzu.lurk.org/u/void0)\
**Post date:** [19 June 2025 13:48 UTC](https://uzu.lurk.org/t/tidal-hydra/5741/1 "2025-06-19T13:48:39Z")

</div>

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:

```haskell
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

```haskell
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?

---

<div class="post-metadata">

**Author:** ![void0](https://uzu.lurk.org/letter_avatar_proxy/v4/letter/v/ba9def/32.png) [@void0](https://uzu.lurk.org/u/void0)\
**Post date:** [19 June 2025 16:39 UTC](https://uzu.lurk.org/t/tidal-hydra/5741/2 "2025-06-19T16:39:59Z")

</div>

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](https://github.com/tado/ofxTidalCycles/blob/master/startup.scd)_

```haskell
// 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

```haskell
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;`)

---

<div class="post-metadata">

**Author:** ![luke](https://uzu.lurk.org/letter_avatar_proxy/v4/letter/l/7ab992/32.png) [@luke](https://uzu.lurk.org/u/luke)\
**Post date:** [3 August 2025 12:03 UTC](https://uzu.lurk.org/t/tidal-hydra/5741/3 "2025-08-03T12:03:03Z")

</div>

Thanks very much for this, @void0.

I’ve been following the OSC docs, but I can’t figure out how to successfully change the message from an argument list to name–value pairs. Have you tried doing that within this bit of SC? Thanks again!
