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

I dont like duplicates, you can enable/disable axes with a click and a restart.
You cant autoselect, you can have multiple different tcode devices connected. Also axis changes require a restart because everything internally depends on them.

The “device” section in settings should be renamed, you are not configuring a device there, you are configuring available axes for MFP to use.

Or you can just have multiple serial outputs and have different ranges/axes for each device.

If enabled it does not send the I part (move duration) of TCode. Tempest firmware calculates average move duration internally and it will be more precise.
If enabled the movement should be a little bit smoother on high update rates, but the firmware has to handle the move duration. It is disabled by default because I dont know if every firmware supports that.

@Khrull Firmware does support offload?

Its always based on Tempest firmware so yes.

Shouldn’t every firmvare that indentifies itself as tcode0.3 support it by definition?

No because that behavior is not in TCode spec, only in Tempest firmware, I pointed it out a long time ago that the official firmware is not to spec but it never got changed.

I have a quick question for you. I am a long time user of MFP and XBVR. When I updated to the newest MFP (i was back running 1.28 i believe) MFP no longer sees the scripts. I cannot for the life of me figure it out. I have even reverted back to the older version of MFP and now it will not see the scripts that I have clearly attached in xbvr to each respective video. Any idea what I am doing wrong here? I am connected to heresphere and my SR6, the video pops up in MFP but no script.

UPDATE - I have no Idea why, but I selected XBVR in my script repository and that worked THIS TIME! It was NOT working on the new version or the old version yesterday. Must have been a bug of some sort. Its all working properly now just by selecting that tick.

Is it possible to play a script without a video using MTP?

Yes, add “Internal” source with the top-right “+” button and drag-drop your scripts there.

Well I am back to no scripts again. I have not changed a thing, MFP cannot find my scripts. I have tried an alternative IP, nothing.

Disconnect MFP from video player, open application settings at the top of the window, change log level to trace, connect video player, play a video from XBVR, change log level back to info, send me the latest log file.

MultiFunPlayer v1.33.0:

Download: timed patreon only exclusive
Patreon build: https://www.patreon.com/posts/122741611

Additional patreon only changelog:

  • Add FapTap script repository - works with Web media source
    uo42J7VQRo
  • Fix scripts stored on VR headset not loading via SLR interactive api
  • Fix SLR login code not opening browser

Changelog:

  • Add Web media source - opens a custom Edge browser which sends playback information to MFP from a video element on the page
    MultiFunPlayer_QGPzRTZJKl
  • Add option to split axes in heatmap preview (#198)
  • Add ability to configure main thread update rate (#176) - can be used to lower CPU usage
    MultiFunPlayer_woxUjv5IfH
  • Add support for reading and writing PotPlayer playback speed - requires 2501xx beta or later
  • Make looping optional in script motion provider
  • Aggregate plugin file watcher events and queue compile only once
  • Optimize axis state locking
  • Fix unable to receive data from auto-started PotPlayer
  • Fix OFS source PathAndQuery not set after changing ip or port (#203)
  • Fix first plugin #r reference not found if source file contains BOM

If you like what I’m doing, please consider supporting me on Patreon
https://www.patreon.com/yoooi

1 Like

Is there a method for importing all of my settings from one version of MFP to the next? Is there a file I should copy and paste?

I still think about this potential feature every time I use MFP. Right now my solution for these long gaps/“strokes” is to use a hotkey on my computer to drop the stroke range to 30% so that I at least don’t fall out of the sleeve when the action eventually starts up again. It’s not ideal because I feel like I’m constantly fidgeting with my computer and the stroke range for a while after this happens, but I’m grateful that there’s some kind of work around in the meantime.

A “skip to next action” button would also be really useful. Not only would this be another work around for the “gaps that are technically very long strokes” problem, but this would also be good for when I don’t have “auto-skip gaps” on and come across a gap I eventually do want to skip.

And one more thing, how do I set a deadzone for the bottom of the twist axis? I want to set it so that it never twists from 0 to 10 including when gap fill is on, when there’s a twist script, and when it’s doing random action in the event there is no twist script.

Yes, you can either copy MultiFunPlayer.config.json file, or just extract the new version on top of the old one and replace all files.

The feature is on my todo so it should be added someday.
I spend most of the time figuring out where to put the buttons, there is not much UI space left.

Here is a simple plugin that should work, save it to Plugins folder as skip.cs. Change the 5 to whatever value you want.

public class Plugin : PluginBase
{
    protected override void OnInitialize() => StartTask(async token =>
    {
        var axis = DeviceAxis.Parse("L0");
        while (!token.IsCancellationRequested)
        {
            await Task.Delay(250, token);

            var keyframes = ReadProperty<DeviceAxis, IScriptResource>("Axis::Script", axis)?.Keyframes;
            if (keyframes == null)
                continue;

            var index = ReadProperty<DeviceAxis, int>("Axis::Index", axis);
            if (index < 0 || index == int.MaxValue)
                continue;

            if (keyframes.SegmentDuration(index) > 5)
                PublishMessage(new MediaSeekMessage(TimeSpan.FromSeconds(keyframes[index + 1].Position)));
        }
    });
}

I think this should do it.
image

1 Like

So does this work with Stash?

Can you explain this a little more for me please? I copied and pasted this to a notepad doc and saved it as “skip.cs.” I’ve also got it in the Plugins folder. When I click on the plug icon in MFP, there’s a red exclamation mark and it says “Unable to find base Plugin class.”

Also, can you tell me what this plugin is supposed to do? :laughing: Does this make it so the gap filler and auto-skip gaps functions treat any stroke longer than 5 seconds as a gap?

Thank you for the help with everything else I asked about.

Yoooi thanks for the constant work on MFP its an amazing piece of software.

I just played around with the update settings and I can not make fixed update as smooth as polled update on an SSR1. Fixed update is jittery no matter what settings. Why is that so?

1 Like

I used MFP for the first time when I got my SR1, and it was an unpleasant jittery mess. After some trial and error, I got it working smoothly though. I don’t really understand what everything in MFP does, but I’ll tell you how I have mine set up.

I have the update rate all the way down to 31 Hz.
Precise sleep: OFF.
Offload elapsed time: ON.
Send dirty axes only: ON.

Something else that makes a huge difference is that my computer is running nothing else but MFP. If I have videos and webpages running at the same time, I get really bad jitter. Even just turning my screen off makes my device noticeably jump while in use.

As I said, I don’t really understand all the settings so I hope someone else more informed than me can chime in.

I assume you are talking about when connected over bluetooth? (It works fine on USB for me). My understanding is the bluetooth connection isn’t fast enough for how fixed update works. Fixed update works by constantly telling the device where it should be, if the connection isn’t fast enough the it misses some of the positions making it jittery.
Polled update just gives it the next position and time to reach meaning a lot less data.
I just use polled update.

If I’m wrong and someone has better info please correct me.

Yes I don’t see why it wouldn’t, tho I have not tested if the Stash repository works with it yet.

That plugin will work only on v1.32.0 or later.

It works as a separate thing from gap fill, it automatically skips all long moves.
Like I said its just a simple plugin as a workaround.

If you use bluetooth you probably want to use polled update. Or you have to drop the update rate very low.

If you use serial then you probably have esp32 with CH340, in that case you should try installing CH340 driver, you can also disable all axes but L0 on your serial output to minimize the amount of data sent, and you can try dropping update rate from 333hz to 200-250hz.
The CH340 has trouble handling that amount of data for some reason, an esp32 with CP2102 would work just fine at 333hz + 6 axes.

Thats unusual. If you are not using any outputs at 333hz then you can lower the main thread update rate as in the changelog.
Also what is your CPU? Precise sleep will help with jitter not cause it.

Wifi Khrulls firmware. Cant imagine its too slow. And as Burt the Reynolds writes movement jitters or stepped. Polled update is fine but fixed update has so much more options. So would be nice to work over Wifi.