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

Automate how?
I could maybe just set the default values for R1/R2. It’s just a few clicks so an additional button/functionality to set them seems pointless.

Tbh that is a firmware problem, I have my own custom OSR with custom firmware that does not have this issue.
In MFP you could maybe setup smart limits based on stroke position for each axis so that it does not hit itself.
Also MFP assumes it works with generic TCode not with any specific device, so something like that would have to be implemented in a generic way.

Probably not in MAUI anymore. MAUI ended up more of a mobile cross platform framework that by accident runs on desktop. I’m leaning more towards rewriting in avalonia, which should also make the rewrite easier since avalonia is based on wpf.

Current problem is choosing a nice control library, avalonia does not seem to have any that are as mature as MaterialDesignInXAML. But I would probably use something like FluentAvalonia.

Does the custom firmware use TCode too?

Are the axes/movements synchronised for TCode in the MFP?
For example, there is an upward movement and in the middle of the movement need to start a Z turn - will an intermediate calculated value be sent to the device for the upward movement?

Yup, thats why MFP is generic, to support different TCode devices and firmwares.

I’m not sure I fully understand but you dont need to send intermediate commands.
If you send L09999I5000 which will take 5 seconds to reach 9999, and then in the middle of the move send R09999I1000, both commands will be executed in parallel by the firmware.

But MFP works differently where it samples all axis positions at fixed rate (the update rate slider in outputs) and sends the commands in small steps, for example a script move from 0% to 100% over 300ms will be split into 100 commands (at 333hz).
If MFP was made to only play scripts and nothing else then I would send commands based on the script instead of sampling. But you lose the ability to interpolate the script, generate random motion and a bunch of other features.

2 Likes

Um… Then it turns out that if I don’t use linear movement or rotation on device, the MFP will still send me this data. Or is it possible to disable this function and only send boundary values with timeslots to the device?

I’m just asking why, I’m back to my robot project again, and vector+quaternion is more preferable for robot - but I want to keep compatibility with TCode (scripts + MFP), if enough controller power to process values. Don’t know C#, don’t want to understand syntax (at the moment) and want to think through top-level logic before programming controller.

My idea is to give the data as a json:
{"actions":[{"at":650233,"pos":{"x":50, "y":50,"z":100},"rot":{"qw":1.0,"qx":0.0,"qy":0.0,"qz":0.0}}]

MFP by default sends commands only when the axis position has changed enough. Also on successful connection commands are sent with default positions for all axes.
IIRC only UDP output has this disabled by default because there is no way to know if the client received last commands. This can cause OSR to rapidly move when it receives the commands for the first time so UDP output sends data all the time. But this behavior can be enabled/disabled if you click the button to the right of the update rate slider.

I think my firmware converts TCode into position + normal vector of the receiver, and then calculates servo angles to match that.

1 Like

Yea, something like that would be nice, but we are stuck with funscripts.
Tho I would make the position xyz to still be in 0-1 range.

1 Like

In the post above, I was thinking of asking in this way:
x, y - position in mm (both positive and negative - +/- 75 mm).
z - vector modulus from the maximum length of 100 mm (to calculate the vector of the cup’s starting point position, depending on the length of the dick). Your idea is very correct - since we have float, let there be all float values, e.g. up to the 4th digit.
Well, a quaternion to the 4th digit seems to give an accuracy of 0.5 degrees.
Great idea! Thank you!

Took a while but I slightly reworked how the gap fill works, with gap fill enabled and no script present it now fallbacks to normal motion provider behavior, with gap fill enabled and with script present the gap fill respects the other settings, so you can limit gap fill motion based on other axis.

Build here:
Let me know if you manage to test it.

1 Like

Fixed a few gap fill edge cases with auto home and speed limit: nightly.link | Repository Yoooi0/MultiFunPlayer | Run #4707820367

1 Like

Does the SLR interactive support work for streaming the script to Multifunplayer? I am able to download the funscript and load it to sync with DeoVR, but SLR limits you to download only 3 scripts, however if you connect to the handy, you can play as many scripts as you want on the monthly script subscription.

Yes it does. It streams video to DeoVR/SlrApp and streams script to MFP.

@Yoooi Oh cool! I haven’t been able to figure out streaming the script to MFP from DeoVR, I enabled Remote Control in DeoVR, but I’m not sure how to load the script in MFP. Do I need to do something to the Scipt Librarys or Media Path Modifiers? Or edit something in the script menu like “Open Folder” or “Load”

You need to use the patreon only build, public builds don’t support SLR.
Then under DeoVR you will find “SLR” button where you enter your SLR credentials.

1 Like

MultiFunPlayer v1.25.1:

Download: Release MultiFunPlayer v1.25.1 · Yoooi0/MultiFunPlayer · GitHub
Patreon build:

v1.25.1:

  • Fix exception when clearing buttplug device list
  • Fix possible buttplug deadlock
  • Fix media content expander defaulting to expanded state

v1.25.0:

  • Add AB loop support (#112)
    KHJMH1xxM5
  • Support latest buttplug version by updating to Buttplug.Net library (#115)
  • Add separate bypass toggles for script/motion provider/custom transition (#71)
    I0GVch4vWY
  • Add ability to disable/enable shortcuts (#120)
    kaYtEwpbpb
  • Make motion provider gap fill work based on script presence (#67)
    WPKAU7Vdiw
  • Allow enabling window resize (#9)
    y5y41P8U3E
  • Add ability to limit motion provider speed when updating based on other axis motion
    R75edF9pIN
  • Start work on help/documentation page (Home | MultiFunPlayer)
  • Rework heatmap/chapter/bookmark tooltips
  • Add ability to disable sync on auto-home start/end
  • Use precise sleep for main script update loop
  • Make internal media source playlist items easier to click
  • Change default mpv arguments to --keep-open --pause to not pause on next playlist file
  • Change axis settings to enable random motion provider on R0/R1/R2 by default
  • Fix TCP output sending data in 1024 byte chunks (#122)
  • Fix plex media source getting stuck due to infinite timeout
  • Fix internal media source not clearing media state when disconnecting
  • Fix exception when using bookmark and chapter actions when none are loaded
  • Fix stutter when auto-home delay is longer than sync duration
  • Fix smart limit canvas popup
  • Fix keyframe heatmap not displaying long slopes correctly
  • Fix unable to map multiple buttplug devices with the same name

If you like what I’m doing, please consider supporting me on Patreon

6 Likes

Finally Lovense Gravity support, thank you <3

1 Like

If anyone uses e-stim here I added a proof of concept audio output in this build:
https://nightly.link/Yoooi0/MultiFunPlayer/actions/runs/4835566690

Would like to know if/how usable it is with e-stim, and any suggestions on what to change/add.

MultiFunPlayer v1.25.2:

Download: Release MultiFunPlayer v1.25.2 · Yoooi0/MultiFunPlayer · GitHub
Patreon build: https://www.patreon.com/posts/82509959

v1.25.2:

  • Add support for upcoming SLR multi-axis funscript
  • Fix exception when trying to create output target using missing type
  • Fix crash after removing/disabling an axis from device settings

v1.25.1:

  • Fix exception when clearing buttplug device list
  • Fix possible buttplug deadlock
  • Fix media content expander defaulting to expanded state

v1.25.0:

  • Add AB loop support (#112)
    KHJMH1xxM5
  • Support latest buttplug version by updating to Buttplug.Net library (#115)
  • Add separate bypass toggles for script/motion provider/custom transition (#71)
    I0GVch4vWY
  • Add ability to disable/enable shortcuts (#120)
    kaYtEwpbpb
  • Make motion provider gap fill work based on script presence (#67)
    WPKAU7Vdiw
  • Allow enabling window resize (#9)
    y5y41P8U3E
  • Add ability to limit motion provider speed when updating based on other axis motion
    R75edF9pIN
  • Start work on help/documentation page (Home | MultiFunPlayer)
  • Rework heatmap/chapter/bookmark tooltips
  • Add ability to disable sync on auto-home start/end
  • Use precise sleep for main script update loop
  • Make internal media source playlist items easier to click
  • Change default mpv arguments to --keep-open --pause to not pause on next playlist file
  • Change axis settings to enable random motion provider on R0/R1/R2 by default
  • Fix TCP output sending data in 1024 byte chunks (#122)
  • Fix plex media source getting stuck due to infinite timeout
  • Fix internal media source not clearing media state when disconnecting
  • Fix exception when using bookmark and chapter actions when none are loaded
  • Fix stutter when auto-home delay is longer than sync duration
  • Fix smart limit canvas popup
  • Fix keyframe heatmap not displaying long slopes correctly
  • Fix unable to map multiple buttplug devices with the same name

If you like what I’m doing, please consider supporting me on Patreon

3 Likes

I’m sorry I haven’t read through the years of comments on here yet. But in the original post it mentioned lube as a function. Can the lube pump be actuated by scripts? So the videos would automatically add lube at a scripted point!?

Yup, tho I’m not sure if/which firmware supports it.
You can activate lube via a script (<videoname>.lube.funscript) or you could setup a looping motion provider with a custom script that for example is at 0% for 1 minute, then at 100% for 5seconds. I should probably add a new motion provider that lets you specify on/off time so you dont have to make a script each time.
Also make sure you have lube axis enabled in device settings.