OSC `/mute` Control Input causes dirt handshake

I am following the example OSC | Tidal Cycles to send OSC messages to tidal to control playback.

I modified the example to react on CC messages which should not cause any problem I guess.

playbackControl = MIDIFunc.cc({ |val, num, chan, src|
    var patID;
    if (mutes.at(num) !== nil, {
        patID = mutes.at(num);
        if (val == 0, {
            osc.sendMsg("/mute", patID);
        }, {
            osc.sendMsg("/unmute", patID);
        });
    });
});

I am using Protokol | hexler.net to inspect the OSC messages that are out from tidal and forwarding them to dirt. When mute works, then tidal just does not send any more /dirt/play messages such as (receiving from tidal on 6060 and forwarding to the dirt at 57120)

10:01:09.602 | RECEIVE    | ENDPOINT([::ffff:127.0.0.1]:6060) ADDRESS(/dirt/play) STRING(_id_) STRING(1) STRING(cps) FLOAT(0.5625) STRING(cycle) FLOAT(149) STRING(delta) FLOAT(1.777776) STRING(n) FLOAT(0) STRING(orbit) INT32(0) STRING(s) STRING(superpiano)
10:01:09.606 | SEND       | ENDPOINT(127.0.0.1:57120) ADDRESS(/dirt/play) STRING(_id_) STRING(1) STRING(cps) FLOAT(0.5625) STRING(cycle) FLOAT(149) STRING(delta) FLOAT(1.777776) STRING(n) FLOAT(0) STRING(orbit) INT32(0) STRING(s) STRING(superpiano)

However, in regular scenarios, instead of muting, a /dirt/handshake happens, and the respective pattern keeps playing. The handshake looks like this:

10:16:25.181 | RECEIVE    | ENDPOINT([::ffff:127.0.0.1]:6060) ADDRESS(/dirt/handshake)
10:16:25.213 | SEND       | ENDPOINT(127.0.0.1:57120) ADDRESS(/dirt/handshake)
10:16:25.213 | RECEIVE    | ENDPOINT([::ffff:127.0.0.1]:57120) ADDRESS(/dirt/handshake/reply) STRING(&serverHostname) STRING(127.0.0.1) STRING(&serverPort) INT32(57110) STRING(&controlBusIndices) INT32(0) INT32(1) INT32(2) INT32(3) INT32(4) INT32(5) INT32(6) INT32(7) INT32(8) INT32(9) INT32(10) INT32(11) INT32(12) INT32(13) INT32(14) INT32(15) INT32(16) INT32(17) INT32(18) INT32(19) INT32(20) INT32(21) INT32(22) INT32(23) INT32(24) INT32(25) INT32(26) INT32(27) INT32(28) INT32(29) INT32(30) INT32(31) INT32(32) INT32(33) INT32(34) INT32(35) INT32(36) INT32(37) INT32(38) INT32(39) INT32(40) INT32(41) INT32(42) INT32(43) INT32(44) INT32(45) INT32(46) INT32(47) INT32(48) INT32(49) INT32(50) INT32(51) INT32(52) INT32(53) INT32(54) INT32(55) INT32(56) INT32(57) INT32(58) INT32(59) INT32(60) INT32(61) INT32(62) INT32(63) INT32(64) INT32(65) INT32(66) INT32(67) INT32(68) INT32(69) INT32(70) INT32(71) INT32(72) INT32(73) INT32(74) INT32(75) INT32(76) INT32(77) INT32(78) INT32(79) INT32(80) INT32(81) INT32(82) INT32(83) INT32(84) INT32(85) INT32(86) INT32(87) INT32(88) INT32(89) INT32(90) INT32(91) INT32(92) INT32(93) INT32(94) INT32(95) INT32(96) INT32(97) INT32(98) INT32(99) INT32(100) INT32(101) INT32(102) INT32(103) INT32(104) INT32(105) INT32(106) INT32(107) INT32(108) INT32(109) INT32(110) INT32(111) INT32(112) INT32(113) INT32(114) INT32(115) INT32(116) INT32(117) INT32(118) INT32(119) INT32(120) INT32(121) INT32(122) INT32(123) INT32(124) INT32(125) INT32(126) INT32(127)
10:16:25.230 | SEND       | ENDPOINT(127.0.0.1:57120) ADDRESS(/dirt/handshake/reply) STRING(&serverHostname) STRING(127.0.0.1) STRING(&serverPort) INT32(57110) STRING(&controlBusIndices) INT32(0) INT32(1) INT32(2) INT32(3) INT32(4) INT32(5) INT32(6) INT32(7) INT32(8) INT32(9) INT32(10) INT32(11) INT32(12) INT32(13) INT32(14) INT32(15) INT32(16) INT32(17) INT32(18) INT32(19) INT32(20) INT32(21) INT32(22) INT32(23) INT32(24) INT32(25) INT32(26) INT32(27) INT32(28) INT32(29) INT32(30) INT32(31) INT32(32) INT32(33) INT32(34) INT32(35) INT32(36) INT32(37) INT32(38) INT32(39) INT32(40) INT32(41) INT32(42) INT32(43) INT32(44) INT32(45) INT32(46) INT32(47) INT32(48) INT32(49) INT32(50) INT32(51) INT32(52) INT32(53) INT32(54) INT32(55) INT32(56) INT32(57) INT32(58) INT32(59) INT32(60) INT32(61) INT32(62) INT32(63) INT32(64) INT32(65) INT32(66) INT32(67) INT32(68) INT32(69) INT32(70) INT32(71) INT32(72) INT32(73) INT32(74) INT32(75) INT32(76) INT32(77) INT32(78) INT32(79) INT32(80) INT32(81) INT32(82) INT32(83) INT32(84) INT32(85) INT32(86) INT32(87) INT32(88) INT32(89) INT32(90) INT32(91) INT32(92) INT32(93) INT32(94) INT32(95) INT32(96) INT32(97) INT32(98) INT32(99) INT32(100) INT32(101) INT32(102) INT32(103) INT32(104) INT32(105) INT32(106) INT32(107) INT32(108) INT32(109) INT32(110) INT32(111) INT32(112) INT32(113) INT32(114) INT32(115) INT32(116) INT32(117) INT32(118) INT32(119) INT32(120) INT32(121) INT32(122) INT32(123) INT32(124) INT32(125) INT32(126) INT32(127)

So it looks like that instead of just muting the pattern, the effect of the mute command is to initiate a handshake.

What is the cause for the handshake?

When I send another mute right after a handshake, then the mute works. I would like to make the mute work all the time :slight_smile:

Using the verbose option I can see that tidal in the handshake scenario also says

"Waiting for SuperDirt (v.1.7.2 or higher).."

So it looks like that the thread that listens for osc control messages gets stopped and is spawned again.

Can I make it run continuously?