MultiFunPlayer v1.32.0 - Multi axis funscript player - Now with SLR script streaming

For SLR I am using deovr, it won’t connect. Tried both ports, neither works.

“Since MFP cant access the path where the video is located you have to add a script library (second button above the video file name). In that specific case you would have to place a 19331 - Giving the Neighbors a Show.funscript file inside the library folder.”

There is no such file as the name heresphere is using. Not sure if heresphere or xbvr is the problem here.

MarfaQ 120bpm SLR_StasyQVR_Giving the Neighbors a Show_2900p_35274_MKX200.mp4
MarfaQ 120bpm SLR_StasyQVR_Giving the Neighbors a Show_2900p_35274_MKX200.funscript

Anyway, I can’t rename all my scripts. They are already properly named and matched in xbvr.

Did you enable remote control and slr interactive in deovr?
What error is shown in MFP?

Not sure which one is the issue, but all funscript players need correct filenames reported by the video player to find the scripts.
I’m planning to add a feature where MFP would be able to search xbvr/stash for scripts. But I’m not sure their api allows that.

Ok, xbvr is changing the names of videos/scripts, and that is why heresphere sees that name.

Solution: In xbvr, options → funscripts → download all funscripts will dump out a zip file with all funscripts named the way that xbvr has internally named them, and that heresphere sees their names as. Just put all the scripts exported out into a directory somewhere and point MFP to it. This works well, although just one more non-automated task to do.

Remote control and slr interactive are turned on, username and password all entered.

DeoVR failed with exception:
System.Net.Sockets.SocketException (10061): No connection could be made because the target machine actively refused it.
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Net.Sockets.Socket.g__WaitForConnectWithCancellation|281_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
at System.Net.Sockets.TcpClient.CompleteConnectAsync(ValueTask task)
at MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSourceViewModel.RunAsync(CancellationToken token)

Not quite sure what is the issue then. If you can connect to heresphere on your quest with 192.168.1.193:23554 endpoint then deovr should connect too since they use the same port.

I was able to connect Heresphere and my Handy, using my pc to host my scripts. I’m also using Naughty America API. The video and funscript did sync up but there’s so much jitter and i’m confused on adjusting the update rate.

Any suggestions on how to fix this?

No fix, the handy api is bad. I will probably remove the handy support in MFP in the next version to not cause confusion.

So SLR still not connecting, not sure what else I can try.

“Bind keyboard/mouse/gamepad input to almost any customizable action (150+ available actions)”

Where can I find the gamepad settings / documentation? I don’t see it anywhere?

Are you using SLR app or DeoVR? What version?
Are you able to connect to DeoVR itself without SLR?
Heresphere on your quest connects just fine right?

Cog button at the top of the window → Shortcut

Latest version for both, 13.10

Not sure I understand? How would I check? Why would I want to use deovr without SLR?

Yes. But I need to figure out a lot of controls from the gamepad.

Ok, found it. I do not know what most of those settings would even do. What action would be:

increase/decrease top of range (* Up/Down D-Pad: adjust upper limit for JFP)?
decrease bottom range (* LB + Up/Down D-Pad: adjust lower limit for JFP)?
increase/decrease limit of roll?

Basically I’m looking for these types of settings (JoyFunPlayer 4.0 - OSR (TCode) Player):

Gamepad controls:

  • LSB: Toggle manual control over Pitch & Roll with left joystick
  • RSB: Toggle 3-axis random stroker mode
  • Up/Down D-Pad: adjust upper limit
  • LB + Up/Down D-Pad: adjust lower limit
  • RB + Up/Down D-Pad: adjust delay
  • RB: pause motion
  • LT: limit motion from top
  • RT: limit motion from bottom
  • LT: Boost mode (110% range of motion)
  • START: Twerking mode

If you are able to connect to heresphere on quest then it should connect to deovr too.

Make sure you use the same endpoint ip/port for heresphere and deovr in MFP.
Make sure that remote control is enabled, maybe disable/enable it, maybe try without slr interatcive enabled.
I dont have a quest so is it possible that heresphere is running in the background and preventing deovr from accepting connections? Since they are using the same port.
Is it possible to downgrade deovr version on quest?
Are you able to somehow get the deovr logs? No idea how to do that tho.

I’m running out of ideas tbh, 99% of the time the No connection could be made because the target machine actively refused it. error means that the remote control is disabled in deovr.

You will have to use
[Output Name]::Axis::Range::Maximum::Offset
[Output Name]::Axis::Range::Minimum::Offset

Set target axis to L0, some offset value you want, and change the limit if you dont want it to decrease/increase past some value.
You will have to have 4 gestures, one for each dpad direction.

Media::ScriptOffset::Offset for a global script offset.
Axis::ScriptOffset::Offset for a per axis script offset.

Either
Media::PlayPause::Toggle to pause video.
Axis::Bypass::All::Toggle to bypass axis updates.

Thats more complicated, probably not possible to get it to match JFP 100%.
You would first have to setup random motion providers on L0, R1, R2, with common settings -> blend set to 100%.

Then use two gestures to enable/disable motion providers with Axis::MotionProvider::Set actions for each axis (one gesture, 3x Axis::MotionProvider::Set).
If you leave the Motion provider setting empty in action configuration it will disable motion provider for that axis. If you set it to Random it will enable it.

Should be doable with Axis::Value::Drive. You have to capture the left joystick axis gesture to see the ::Drive actions.

Could be either
Axis::ScriptScale::Set which will scale the script making the script range bigger, or
[Output Name]::Axis::Range::Size::Offset which will change the minimum/maximum range at the same time

No idea how that works and how it differs from upper/lower limit.

No idea what that does, but probably would be a similar setup as for Toggle 3-axis random stroker mode but with a pattern provider.

I am using the same endpoint ip/port, heresphere has been quit in quest2 so I doubt it is running.
After a reboot of quest2, and I removed heresphere from MFP so it wouldn’t try to connect, without ever starting heresphere in q2, gives same behaviour.

Just to be clear, I start quest2 headset from reboot, only start deovr, and MFP should connect?
I also tried both remote control off and on, I have slr interactive on.

Thanks for the rest of this, several controls I seldom use anyway, should have been more careful with my paste. Mostly just needed the top/botttom/roll to be controlled while 15 feet away from a computer with a headset on. I should be able to use heresphere/xbvr/osr2+ now and that is my usage 99% of the time if an OSR2 is being used.

You will have to use
[Output Name]::Axis::Range::Maximum::Offset
[Output Name]::Axis::Range::Minimum::Offset

Set target axis to L0, some offset value you want, and change the limit if you dont want it to decrease/increase past some value.
You will have to have 4 gestures, one for each dpad direction.

Media::ScriptOffset::Offset for a global script offset.
Axis::ScriptOffset::Offset for a per axis script offset.

Either
Media::PlayPause::Toggle to pause video.
Axis::Bypass::All::Toggle to bypass axis updates.

Thats more complicated, probably not possible to get it to match JFP 100%.
You would first have to setup random motion providers on L0, R1, R2, with common settings -> blend set to 100%.

Then use two gestures to enable/disable motion providers with Axis::MotionProvider::Set actions for each axis (one gesture, 3x Axis::MotionProvider::Set).
If you leave the Motion provider setting empty in action configuration it will disable motion provider for that axis. If you set it to Random it will enable it.

Should be doable with Axis::Value::Drive. You have to capture the left joystick axis gesture to see the ::Drive actions.

Could be either
Axis::ScriptScale::Set which will scale the script making the script range bigger, or
[Output Name]::Axis::Range::Size::Offset which will change the minimum/maximum range at the same time

No idea how that works and how it differs from upper/lower limit.

No idea what that does, but probably would be a similar setup as for Toggle 3-axis random stroker mode but with a pattern provider.
[/quote]

Yea

Maybe try with slr interactive off?

Also maybe try completely disabling firewall on your pc as a test. But if heresphere connects it should not matter.
Maybe there are some permissions or a firewall on the quest that prevent deovr from working?

I would like to help more but I have no idea why heresphere would work but deovr wouldnt.

i just keep getting errors when trying to connect this to a video player any idea what to do?

heres one when trying to connect to mpc

MPC-HC failed with exception:

System.TimeoutException: A task was canceled.
—> System.Threading.Tasks.TaskCanceledException: A task was canceled.
at System.Threading.Tasks.TaskCompletionSourceWithCancellation1.WaitWithCancellationAsync(CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.HttpConnectionWaiter1.WaitForConnectionAsync(Boolean async, CancellationToken requestCancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
— End of inner exception stack trace —
at MultiFunPlayer.Common.ExceptionExtensions.Throw(Exception e)
at MultiFunPlayer.MediaSource.ViewModels.MpcMediaSourceViewModel.UnwrapTimeout(Func`1 action)
at MultiFunPlayer.MediaSource.ViewModels.MpcMediaSourceViewModel.RunAsync(CancellationToken token)

You need to enable web interface in mpc (Options → Web Interface → Listen on port).

Hello Yoooi,

On the handy integration: could this be the same ‘problem’ with the interpolation causing the stuttering?

dec 22:
Is there a way to only output the raw funscript points to the t-code device, without the interpolation?
(i.e. L00000I500 L09999I450 L00000I300 L05000I250)
I’m using a stepper servo system and the controller needs this for the correct acceleration values, currently it’s working but it’s far from smooth.

Script interpolation on itself is not causing the stuttering. Its the amount and frequency of data sent to the handy. But apparently it is even stuttering at like 5-10hz update rate which should not be a problem. Without a handy to test with I cant tell what is the issue, but it is most likely the problem with sending data through their servers.

Even if MFP sent funscript points it would use the same method, so not really a fix. And implementing that would be a huge change to the core loop of MFP, so I’d rather wait for them to support local wifi, or remove the handy completely. A toy requiring always online communication sounds/works terrible.
To me it seems like only way for handy to behave correctly is to upload the full script, which tbh would be an easy plugin to make so maybe I will convert the implementation to a plugin that uploads the script.

I have done this, but it does not seem to have any effect on adjusting the top value of L0? What am I doing wrong/missing?
i.e., in JFP each time I hit DirectionalPadUp, the top of the range limit moves up.
In MFP nothing changes, I can’t move the output range up or down with the controller.

The offset is configured to 0%, so it doesn’t change the range.

Is there currently any way to use MFP with Stash?

1 Like

No, I recently checked the stash api and there seems to be no way to get the status of currently played video, or something like a user session state.
You would have to use stash as a host for other supported video players, but there might be an issue with MFP not finding the funscripts from stash.