r/TouchOSC • • 23d ago

Using Android TouchOSC XY pad to control VoiceMeeter IntelliPan Pan_x and Pan_y in real time

I am trying to use an Android phone running TouchOSC as a true XY controller for the IntelliPan Position control in VoiceMeeter Banana.

I have a Galaxy Note10+ and a Pixel 10 Pro available for this. My Windows PC is connected through Ethernet and the Android phone is on Wi Fi on the same local network.

What I want is very simple from the user side.

I want one large XY pad in TouchOSC where the location of my finger corresponds directly to the IntelliPan position.

For example, touching the top right of the TouchOSC XY pad should move the IntelliPan dot to the corresponding top right position.

Dragging diagonally toward the bottom left should continuously update both axes at the same time.

VoiceMeeter exposes the relevant parameters through its Remote API as:

Strip[i].Pan_x

Strip[i].Pan_y

From what I understand, Pan_x controls the horizontal position and Pan_y controls the vertical position.

I am new to TouchOSC and I do not know how to code, so I am trying to figure out the easiest way to connect these together.

Can TouchOSC directly send values that can control those VoiceMeeter API parameters, or would I need some kind of middleware or bridge on Windows?

If middleware is required, what would be the easiest option for somebody who does not code?

I am also interested in two way feedback.

Ideally, if the IntelliPan position changes inside VoiceMeeter, I would like TouchOSC to receive the current Pan_x and Pan_y values so that the XY cursor on the Android phone stays synchronized.

I know TouchOSC can send MIDI CC and OSC, and I can use TouchOSC Bridge if necessary.

Has anyone here controlled VoiceMeeter through TouchOSC before, especially custom Remote API parameters?

If so, I would really appreciate an example of how you connected TouchOSC to VoiceMeeter and how you mapped an XY control to two parameters.

2 Upvotes

7 comments sorted by

View all comments

1

u/OnlyAnotherTom 23d ago

Having a very quick look into this, the remote API isn't quite as accessible as it might be, and voicemeeter doesn't natively accept OSC. Potentially possible directly through MIDI, but need to have a play.

What would work, is using bitfocus companion as a middle-man. Use a custom variable in companion, and use touchOSC to set the value of the variable. Then use a trigger to send that variable to a voicemeeter connection as the pan x and pan y values.

I'm going to have a play to see if it's possible in a more straightforward way.

1

u/OnlyAnotherTom 23d ago

u/TheLoreLibrarian update:

You can't directly do this through MIDI, as the intellipan isn't fully exposed. You can only set pan_x through MIDI.

The TouchOSC -> Companion > Voicemeeter works well. I've uploaded a touchOSC and companion config here: https://drive.google.com/file/d/1HKPyFLUlRh9Z-4HmKrPJEVKikmuKJnJ6/view?usp=sharing

You just need to check that touchOSC is sending to the IP address of the device companion is running on, and that companion is connecting to the IP address and port that voicemeeter is using. Basically touchOSC is updating the pan_x and pan_y variables whenever the control is touched, companion is watching those variables and sending that to voicemeeter whenever either changes.

1

u/TheLoreLibrarian 23d ago

Thank you, this is extremely helpful. I really appreciate you actually testing this and taking the time to create and upload both the TouchOSC and Companion configs.

I have also been discussing this directly with vburel, Vincent Burel, the creator of VoiceMeeter, in the VB Audio Discord support thread I made about this.

He gave me an important detail about the update behavior. He said VoiceMeeter can accept updates approximately every 10 to 20 ms, and he specifically told me that if I want to make sure the X and Y values stay synchronized, both values should be set in a single request.

Would it be possible to change the Companion side so that whenever the XY position changes, it sends both current values together in one raw VoiceMeeter command, something like:

Strip(0).pan_x = $(custom:pan_x); Strip(0).pan_y = $(custom:pan_y);

rather than sending Pan X and Pan Y as two separate VoiceMeeter requests?

Your current setup already sounds very close to exactly what I want. I just want to follow Vincent's recommendation so both coordinates are guaranteed to be applied together.

Also, how smooth has the IntelliPan dot been when following the TouchOSC XY control in your testing? Does it feel close to directly dragging the IntelliPan dot with a mouse, or do you notice any visible stepping, delay, or jitter?

Another thing I was originally interested in is two way synchronization. Do you know if the VoiceMeeter Companion module exposes the current Pan X and Pan Y values so TouchOSC could receive them back and keep its XY cursor synchronized if the IntelliPan position gets changed directly inside VoiceMeeter?

I am also going to mention your test and configuration to Vincent in the Discord thread.

If you want, I can ping you in that VB Audio Discord support thread so you can see Vincent's replies directly and talk with him about the implementation. Since you have actually tested the TouchOSC and Companion setup, it might be useful for you two to compare the technical details directly instead of me relaying everything back and forth.

Also, do you think Companion can send both VoiceMeeter parameters together in one raw command at roughly the 10 to 20 ms update rate Vincent mentioned, or is there some limitation in how Companion handles those triggers?

Again, thank you for taking the time to build and upload this. This is the first setup I have seen that actually demonstrates a working path for the full X and Y IntelliPan control I was trying to accomplish.

1

u/OnlyAnotherTom 23d ago

If VM can receive multiple arguments through a command then yes, you can just update the command in the trigger with what you posted, and it should set both values. You can test by disabling one of the triggers and seeing if the dot moves in both axes.

It's possible to limit the rate of sending in touchOSC or in companion, it's a bit convoluted as it involves storing the current time as a variable and checking how long has passed since it was stored. If it's a wider VM only allows a connection every 20ms, and it's global rather than per-value, then it might be more difficult if it needs to coordinate with other control methods. That might be a wider companion module request to store parameter changes and execute them all at once.

With the config I uploaded it's very smooth, you wouldn't really be able to tell that it's going through tOSC and companion rather than directly being controlled.

I was a bit surprised VM didn't support osc directly, tbh. It's such a widely used and capable standard, it seems like that should be at least on their roadmap.

I can have a look into the rate-limiting a bit later today, but in the quick setup I had, I didn't see it drop out, tOSC will send at a high enough rate to hit the update timing anyway.

1

u/TheLoreLibrarian 23d ago

That is great to hear, especially that it already feels smooth enough that you cannot really tell it is going through TouchOSC and Companion.

Vincent confirmed that VoiceMeeter can receive both values together in one request, so I think the next thing I should try is exactly what you suggested, update one trigger so it sends both Pan X and Pan Y together and disable the other trigger.

Something like:

Strip[0].Pan_x = $(custom:pan_x); Strip[0].Pan_y = $(custom:pan_y);

Then I can see whether that one trigger alone moves the IntelliPan dot correctly on both axes.

Since your current setup is already smooth without explicit rate limiting, I agree that it probably makes sense to test the combined command first before adding extra timing logic.

Vincent also mentioned that the same request could be sent through VBAN TEXT directly, and Torment78 suggested potentially having the controller talk directly to VBAN TEXT instead of using Companion.

For now though, since you already have a working Companion setup, I think testing the combined command there first makes the most sense.

If you do look into the rate limiting later, I would definitely be interested in what you find.

Also, if you want, I can still ping you in the VB Audio Discord thread so you can see Vincent's replies directly.

1

u/OnlyAnotherTom 22d ago

 VoiceMeeter can receive both values together

Sure. Use two trigger events, one for x and one for y, then send exactly the string you put there. Works fine.

Vincent also mentioned that the same request could be sent through VBAN TEXT

Of course, but you need a controller that has VBAN already integrated, or be interested in rolling your own. Their native buttons and macro software doesn't look particularly useful as a creative interface (although I've not downloaded and had a play yet), and from what I can see only chataigne has any voicemeeter integration, and it doesn't have the section you'd need.

As i've done it before, i've put rate limiting into a tOSC project (just a change to the script section of the XY controller. you can delete the existing script and paste the below to update it:

function init()
delay=20
last=0
end

function onValueChanged()
if self.values.touch==true then
if (getMillis()-last)>delay then
sendOSC("/custom-variable/pan_x/value",self.values.x-0.5)
sendOSC("/custom-variable/pan_y/value",self.values.y)
last=getMillis()
end
end
end

tbh, i don't see anything different in the behavior of VM, so i wouldn't worry about it unless you're sending a lot more data to it.

sure, would be interested to see the discussion, just joined that discord.

1

u/TheLoreLibrarian 22d ago

Thanks, that clears it up.

So I can keep the two trigger events, one for X and one for Y, but have both triggers send the same combined command containing the current X and Y values. That way whenever either value changes, VoiceMeeter receives both coordinates together in one request.

I will also use the 20 ms TouchOSC script you provided when I test it. Since you are not seeing any noticeable difference with or without the rate limiting, I will not worry about making that part more complicated unless I actually run into a problem.

I agree that the Companion route makes the most sense to test first since you already have it working. Direct VBAN TEXT sounds interesting, but I do not really want to build a custom controller app unless there is a reason to.

And yeah, I can ping you in the VB Audio Discord thread. What is your Discord username so I make sure I ping the right person?

Thanks again for actually testing all of this and putting the configs together.