MultiFunPlayer v1.34.4 - Multi-axis funscript player with SLR & FapTap support

Thanks. Also do I keep auto home off?

I mean its up to you, but auto-home does not work with PolledUpdate in the github vesion (v1.31.3), I added support for auto-home and speed limit to PolledUpdate in later versions.

What’s even the point of maintaining a github page anymore if you’re not willing to budge about engaging with the open source community for this project? The transparency may as well not exist when the public source code is over a year old now. Just archive the repo and call it paid-for software instead of maintaining this facade of being open sourced. Very disappointed to see the project being handled like that too because it’s literally a key glue layer for most of the sex tech industry right now. You’d have way more support, including from me, if you were truly willing to work with the community instead of grifting it.

It’s not like there aren’t multiple other ways to have up to date versions on the repo while offering patron only features and addons and shit. You even made a whole ass plugin system for it too. You just don’t want to because it’s easier to grift. Sorry for speaking my honest mind about it.

4 Likes

Hi OSR2 user here, am I supposed to use Linear for high speed scripts with vibration strokes? I’m using P-Chip at the moment I think.

I dusted off my Handy today and noticed that vibrations come through way better than on my OSR2 which i’m using MFP with.

Is it cause of my settings or are my 25 kg servo motors too weak?

The interpolation type should not matter for vibration strokes, the vibration patterns will basically act as a linear interpolation because there is too much movement in not enough time so there is no place to smooth things out. I don’t see a problem with vibrations and I’m always using pchip.

Its possible that your servos are just slow. 25kg should be fine for OSR but check what speed they are, usually measured in seconds per 60 degrees.

2 Likes

MultiFunPlayer v1.34.1:

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

1.34.1

  • Allow saving passwords in Web window when not in private mode
  • Create config backups when migrating to new config version
  • Fix unable to connect to outputs due to exception when generating TCode
  • Fix Web window only having 1px resize border

1.34.0

Additional patreon only changelog:

  • Add support for matching all scene scripts in SLR repository, previously only latest user made or ai made script was used
  • Add support for watching SLR 2D/VR videos in Web source with script streaming
  • Add support for multi-axis scripts in SLR repository
  • Add support for multi-axis scripts in FapTap repository
  • Add support for matching all scripts in HereSphere repository, previously only first script was used
  • Fix SLR repository not working with hls_h265 videos

Changelog:

  • Update to .net 10 (performance improvements)
  • Add support for matching multiple scripts per axis
    • Allows matching scripts from multiple sources to a single axis, for example multiple script libraries or HereSphere/SLR repotiory scripts.
    • Matched scripts are organized into colored groups (except when a group contains a single script, then the group has no color). When switching between groups all other axes also switch to that group, when switching to a script within a group only that axis script changes.
    • For example when switching L0 from orange to purple group, other axes like R0/R1/R2 will switch to the first script in purple group, while switching L0 from first to second script in orange group will not change scripts in other axes.
    • Users can add shortcuts for easily switching scripts (actions Axis::Script::):
      • Next/Previous script
      • Next/Previous script within current group
      • Next/Previous group
  • Add support for alternative script names (#145)
    • MultiFunPlayer now matches script files that start with video file name, so additional text can be added after. For example if the currently played video file is MyVideo.mp4, valid script file names for the L0 axis would be MyVideo.funscript, MyVideo.slow.funscript, MyVideo [fast].funscript etc., and MyVideo.twist.funscript, MyVideo.slow.twist.funscript, MyVideo [fast].twist.funscript etc. for R0 axis.
  • Rework sync settings to allow ignoring sync per setting/event
  • Allow hiding unused heatmaps when heatmap is split per axis (#205)
  • Rework Plex source to use user sessions instead of clients
    • This allows use of all Plex clients instead of only few select ones, but control (seek, play/pause etc.) from MultiFunPlayer UI can still only happen for those select clients (needs “Advertise as player” enabled)
  • Add ZoomPlayer support (#134)
  • Optimize TCode command generation for high frequency updates
  • Improve UI responsiveness
  • Fix possibility of some migrations to not run by changing config version from integer to date
  • Fix additional elapsed time could cause devices to exceed range limits
  • Fix stuck keyframes preview when media is reset while the popup is open
  • Fix heatmap “split axes” and “normalize heat” settings not loading
  • Fix shortcut action configurations not getting marked as valid when missing action gets registered
  • Fix pasting actions from clipboard not preserving enabled state
  • Fix duplicated JSON logging
  • Fix keyframes tooltip content overflowing available space
  • Fix motion providers not updating time in UI
  • Fix possibility of unwanted motion when keyframe collection changes at current script position
  • Fix The Handy output ignoring range settings
  • Fix custom curve motion provider time overshooting set duration
  • Fix Plex timeout exception when using auto-connect
  • Fix ability to shrink output range size below 1% using actions
  • Fix mpv downloader using old boostrapper script
  • Fix mpv download popup showing when trying to connect to external instance with auto-start disabled
  • Fix keyframes tooltip performance degradation when showing script end
  • Many other small fixes and improvements

Additional plugin changelog: (plugin samples):

  • Use ignored preprocessor directives for references (#:reference)
  • Add ability to set plugin metadata which will be visible in UI (#:name, #:version, #:author, #:description, #:url)
  • Add OnLaunch() method, called after settings are loaded
  • Call Close() method before saving settings
  • Add new helper methods to DynamicKeyframeCollection
  • Add ability to broadcast PolledUpdate events from actions
  • Prevent possible object disposed exception in PluginBase when using CancellationToken property
  • Force actions invoked inside other actions to be run directly to prevent dead locks (#196)
  • Fix plugin compile/dispose race condition when handling file events
  • Fix DynamicKeyframeCollection RemoveRange removing additional items

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

3 Likes

I encountering the following issued recently on .33 and .34 version. Then it gets disconnected, how can I solve this?

Error when connecting to Serial:

System.IO.FileNotFoundException: Could not find file ‘COM3’.
File name: ‘COM3’
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()
at MultiFunPlayer.OutputTarget.ViewModels.SerialOutputTarget.Run(ConnectionType connectionType, CancellationToken token)

1 Like

Your serial port number must have changed, so click the refresh button next to serial port selection, and select the new one.

Awesome update now I can finally switch between different scripters/script variations easily

1 Like

Yea, this took a while to implement, not a lot of code, just a lot of thinking about UX and how it should work and mesh with other features like script linking/locking.
I think I tested everything but let me know if there are any issues or if something does not behave as expected.

1 Like

Hi,

I perused this thread and didn’t find an answer to the question I have. Or . . . I’m too thick-headed to understand.

I have 2 Handy’s that I’d like to have controlled independently via 2 unique funscripts (for each video) that are synced to both 2D and VR videos.

Is this possible with MFP? If, so is there a tutorial, or instructions on how one would do that?

Thank You,
Nylon

MFP can only connect to one video player at a time, so you would have to run two instances of MFP, one connected to VR player, one connected to 2D player.

MFP can handle multiple funscripts to multiple devices, for the handy you would want to use bluetooth mode and connect to it via buttplug/intiface. Tho in this case each instance would be connected to one device.

Problem is you can only connect one app to intiface at a time.

So I don’t think this setup is doable in any app. I think you could use handy specific apps that connect to VR/2D players like ScriptPlayer, but you will still have to run two instances.
Handy specific apps upload the script directly to the handy and let the device play it, MFP is more of a live control app which handy currently does not support except in bluetooth mode.

I’m sorry - I don’t think I was as clear as I could have been.

I don’t want to run 2 videos at the same time. I want to be able to run either a 2d or VR video at a time. I do however, want to use 2 handys (and 2 funscripts) simultaneously with either a 2D or a VR video.

Yea, that should work in MFP.

Both would need to be in bluetooth mode and connected to your PC, then intiface will be able to detect both of them (I’m assuming intiface supports multiple handy devices but it should). Just start Intiface and start the server after both are connected, they should appear in Intiface UI.

In MFP you add buttplug.io output at the bottom right, click connect, and after its connected you will be able to map one handy to for example L0 and second to R0 (expand buttplug.io settings with the arrow button on the right side), after mapping switch both from FixedUpdate to PolledUpdate.

And then when you play video.mp4 MFP will use actions from video.funscript for first handy, and video.twist.funscript for second handy.

This is optional but after you confirm the setup you can open application settings at the top, go to device tab, and clone the default device and add new H1/H2 axes with custom funscript names, so that you don’t have to rely on OSR script naming (you will have to recreate the mapping).

Thank you so much for the response!!

1 Like

Nice additions, especially the multi axis support on sites like faptap. Also happy to see the multi script support.

Are you able to bring multi axis support to stash as well? Seems like scripts loaded through stash only load in a single axis. I would like to avoid serving the scripts locally as the search times are pretty long for some reason.

Is there a work around for this like merging fun scripts or is this a limitation of stash?

In stash you can only assign a single funscript to a scene. I know there is a plugin for stash that adds ability to assign multiple funscripts to a scene, but it requires changes in MFP to support it. But I will probably add support for it eventually.

For now you could use Heatmap Generator (web), merge multi-axis scripts into one to merge multiple funscripts into a single funscript and assign that single funscript to a scene, MFP will unpack the funscript into multiple axes when reading.

Or even simpler solution is to add a script library under “Local” script repository and point it to a location where your scripts are. MFP will read the video file name from stash and use it to find scripts, which will load scripts for all axes.

1 Like

Does the local script repo work with a more complex folder system or only a flat folder of scripts and unique video names?

e.g.


└── stash/
    ├── 3d_data/
    │   └── studio/
    │       ├── blender/
    │       │   ├── video1/
    │       │   │   ├── video1.mp4
    │       │   │   └── video1.funscript
    │       │   └── video2/
    │       │       ├── video2.mp4
    │       │       └── video2.funscript
    │       ├── sfm/
    │       │   ├── video1/
    │       │   │   ├── video1.mp4
    │       │   │   └── video1.funscript
    │       │   └── video2/
    │       │       ├── video2.mp4
    │       │       └── video2.funscript

Yes if you enable the recurse directories checkbox after adding the library then it will search the full tree.

Oh, also just noticed the same filenames in multiple folders, in that case you will need the latest v1.34, MFP will match all video1.funscript files from multiple folders and you will be able so switch between them. In previous versions only one of those would be used.

1 Like

thanks, that is exactly what I was wondering. I have path length constraints due to my file system (and I generally prefer retaining og filenames anyways) so some files have the same simpler name but different paths.

I will try it out on v1.34 as being able to swap between scripts with stash has been one of the bigger items on my wishlist (without duping the files or introducing hard links). Main concern would be knowing which script is the matching one and how laggy it is with a large repo on a networked drive. I think it showing the path will generally be enough at least. Hopefully one day I can use the stash interactive dropdown menu to change what script is served but this might be a good stopgap.