MultiFunPlayer v1.29.4 - Multi axis funscript player - Now with SLR Interactive support

Update .net desktop runtime to latest: Download .NET 6.0 Desktop Runtime (v6.0.9) - Windows x64 Installer
Or alternatively you can use the self-contained versions have it prepackaged.

Windows should show you a dialog to update .net, but they broke it.

No idea, if it doesnt show up in device manager then I cant really do much from MFP.

Not exactly sure what you are asking for, can you clarify?

Are NAVR scripts in different format?
Why would you need handyfeeling.com hosting?
Why do you want to connect scriptplayer with MFP?

If there are other “script streaming” subscriptions similar to SLR i might add support for them in the future depending on complexity.

Hey man, thanks for getting back to me here and on the Discord. I’ve gone into the mfp not working on there, but I’ll continue with the scripts hosting business here if you don’t mind?

Yes, very much so. The ‘funscripts’ you can download from them are actually tokens, tiny 1 or 2kb files which connect to the full scripts which are hosted on handyfeeling.com, and streaming from there (the scripts themselves are ‘streaming’ despite my having the downloaded video file on my PC).

That’s who provide the scripts to Naughty America, and they host them there

Well, this was in case you were unable/unwilling to redirect to handyfeeling.com in the same way that scriptplayer allows. I wondered if there was some way to simply connect to scriptplayer while that continues to redirect to the host on handyfeeling.com as an alternative method

Yes the word is that POVR will be heading in the same direction to minimise script piracy, possibly even at the same host.

Thanks!

Can you post/dm me one such script/file?

That doesn’t really minimize script piracy unless they support only the handy.

1 Like

if timestamp server is removed from deovr/slr, wouldnt that prevent one from using the OSR/SR6 with SLR premium?

1 Like

For those wondering where this concern originates:

It depends on what will they remove.

If they just remove the remote control api/timestamp server, but leave the script streaming api then I will still be able to get the necessary data from the script streaming api as iirc it also provides a video name and timestamp.

If they remove everything then yes, but it might be still possible to patch/mod custom code that will act as the old code, or even do memory reading kinda like cheat engine. Script streaming would have to work via unofficial api then so they will be big mad.

Easiest way to keep it working would be to just not update deovr/slr.
It will work as long as deovr can access their api to get the scripts.
If they remove scripts from the api altogether then there will be no way for it to work anymore.

Given the results of this pool: Interactive sex toy usage poll they are probably going full the handy support and you also wont be able to download/buy scripts from their website soon.

no-michael-scott

2 Likes

posting a small tip i’ve found to be incredibly useful for getting the most out of motion providers on additional axes paired with a main stroke funscript:
use smartlimits tied to the auxiliary outputs V0, A1, A2!

using funscripts to set speedlimits is way, way easier and faster than scripting manually. it’s a different approach, but basically just set the value of the script to match the “intensity” of that part of the file, that “intensity” will be our speedlimit. pairing pitch and roll, surge and sway to their own “intensities”, and giving twist it’s own would give the best result, but you could even just tie all 5 to the same, or even leave some static, depending on how lazy/demanding you are.
open up the smart limit on the axis you are looking to control, set the input axis to the appropriate source funscript, add points on the chart at 0,0 and 100,100, set mode to speed, and youre good.
this sets the maximum speed of the axis to the value of the funscript it is referencing. you can probably go further than this, but the essence of the idea is to be lazy so you aren’t chasing diminishing returns. that said, you will have to mess with this idea a bit to get what you want out of it. it’s still random, but a bit tamer.
unfortunately i don’t know how to set a minimum speed this way. you can play with the randomness settings to influence this (kind of), but those can’t be changed on the fly, so you’re SOL if you want to change your lower bound as you go afaik.

sorry this is kinda all over the place but I hope someone can find this useful.
for reference I do not use this with video, but for long audio files. motion providers help a lot there since there is a lot a ground to cover with much less to go off of than video. best part is you can still script sections if you want to, and blend appropriately. but i kept fumbling with macros during sessions so i thought of this to eliminate that

thanks Yoooi for all the functionality that makes this possible! really adds a lot of value
crackpot idea for future development (ignore): scripting for motion providers so that parameters can automatically be changed without use of macros. we’re basically partway there…

1 Like

So if I understand correctly, you made a script that specifies a speed limit at given video position, then loaded it to V0, and configured smart limit on stroke/L0 to limit its speed based on V0 value?
Thats pretty neat.

I think you might like the device editor I added in development builds: https://nightly.link/Yoooi0/MultiFunPlayer/actions/runs/3221986893
(Unpack it to a separate folder as its missing a config migration so it might reset some settings)

If you click on the settings button on top of the window, go to “Device”, there you can customize your devices/axes.
So you can for example add your own A9 (or whatever name) axis, configure “Funscript names” to something like intensity, and then MFP will auto load scripts named <video name>.intensity.funscript to A9 axis.

You cant really have a minimum speed, it would mean that the device would have to move with nothing happening.

What do you mean by scripting for motion providers?

Perfect! I’ll start using this.

I do not doubt that I have some fundamental misunderstandings about what is going on lol, I’ll read up sometime

just a way to have more indirect control, automated. a happy medium between absolute position precision provided by funscript and set patterns/randomness. so one could specify at a time: [R0 R1 R2, Random, Range:30-70, Speed:30]. I’m half joking, but it’s something I would use.

You can do that with shortcuts and multiple actions, unless im still not understanding what you mean.

yea I have shortcuts setup (a lot of them!), but I have to press the buttons. If I want to change R1 and R2 from Random to Sine, and speed from 20 to 70 at the 02:37 mark on my funscript playing on L0, as I understand it I need to press my shortcut(s) at that time. I want my script to do that for me so I’m not fumbling. Ideally it’s some other script that is synced up with whatever main L0 script I have (like how I’m currently controlling speed on a separate script). I could setup an ahk script to do that but that’s not without its own drawbacks (though I haven’t tried it, it’s probably fine if don’t pause).
not meaning to belittle the shortcuts! they have been very useful for experimenting and quickly making changes that take minutes to do manually.

is there a pause/sleep for between actions? that would go a long, long way. that and a “on <funscript_name/path> play” shortcut trigger that manages pauses, might cover all the bases. It’d be a bit more awkward than a timeline based scripter, but should do everything I want.
there are so many actions I wouldn’t be surprised if I missed them.

With how it currently works yea, but you can have all that actions under a single key. So its not like you have to press 10 buttons.

No and there probably never will be, shortcuts are more of a “if this then do that”. Sleep adds a lot of complexity so no plans for that right now.

But I do plan on redesigning the shortcut system some day to more of a trigger based system, so events like play/pause, video/funscript load, video position, double/tripple clicks etc. could be supported.

1 Like

haha yea most of mine are doing multiple actions don’t worry!

This is a way better way to actually solve the problem I have, thank you.

If these events could be (optionally) conditional to the specific video/funscript file loaded/playing, that would be awesome. I know they don’t currently have this sort of logic functionality, but that would cover all the functionality ““motion provider scripting”” meant in my head. All in a way much more congruent with the current setup. love this!

Tacking on these further suggestions:

  • a way to organize/label shortcuts would appreciated
  • a “MotionProvider::Pattern::Pattern::Set” action should be added, to change between Triangle, Sine, etc. Currently you’re locked into whatever you’ve manually set until you click in and change it. afaik every other MotionProvider parameter has an action.

thanks again!

Yea I dunno. That would require some custom visual programming stuff.
Not sure if that is worth adding as it will be pretty complex.

I think I’d rather somehow add a way to have different configs per video. So on video change the shortcuts would change. But that is probably also not happening any time soon

Label how?

I have this on TODO for v1.23.0.
Right now only the range min/max and speed are configurable iirc, everything else is not.

1 Like

currently you can see just the keybind, but if you could write a small description like “grind”

Hi @Yoooi, would you consider adding a MediaSource that is a WebSocket listener so web applications like Stash could send a media/funscript URL pair from client-side code and synchronize to playback there? Thanks!

Hmm interesting, so like a media source that requires someone to implement some api specified by MFP?
If I would add something like that I would probably have to allow tcp, udp and websocket listeners to make it more generic.

But just a media path is not enough it needs to also send time in frequent intervals (like max 1s) and play/pause state.
Scripts get loaded based on the video filename/path, so if MFP can access the files there is no need for funscript url.

Yeah, since MFP wouldn’t be able to easily connect to an arbitrary webapp, do it the other way around where the website reaches out to MFP. That way this could work with Stash or just about any other website.

Stash is a self hosted web app. It can hold and serve funscripts on its own, so a URL like http://192.0.2.1:9999/scene/1234/stream is the video, while http://192.0.2.1:9999/scene/1234/funscript serves a funscript for that scene. Right now, Stash only works with The Handy, but integrating MFP would open it up to all the outputs that MFP supports.

The idea would be for Stash and other web sites to integrate client side code that connects to a websocket listener inside MFP and sends a funscript URL to load (or maybe just the content of the funscript?) over that websocket and periodic bidirectional time/pause state. That way MFP can work without any local files, just using the data inside Stash.

If you have a better approach for webapp sync, I’d be interested to hear it.

1 Like

So how would you implement the stash part, like a plugin or edit the server code directly?

If it is self hosted then why websocket? Im assuming because browsers can only use websockets and not tcp/udp, but couldnt you just send data directly from the server instead of the webpage? This way you could just emulate deovr api with tcp (without the funscript part).

But I think it might be better to create an api server in stash if that does not exist yet, and MFP would connect to that. This way other players could do the same.

If we go the MFP api way, any suggestions on what would you like the api to look like?