That’s really useful, just set it like that. Thanks so much!
MultiFunPlayer v1.34.5:
Download: timed patreon only exclusive
Patreon build: https://www.patreon.com/posts/152640087
1.34.5
Additional patreon only changelog:
- Support SLR script streaming when playing local files downloaded from SLR
- File name needs to start with
SLR_,SLRG_orSLRT_, and contain_<scene id>_
- File name needs to start with
Changelog:
- Add support for TCode cubic commands in PolledUpdate mode
- Add support for PChip/Makima interpolation when using PolledUpdate, requires TCode v0.4 firmware
- Add support for PChip/Makima interpolation when using PolledUpdate, requires TCode v0.4 firmware
- Rework The Handy to support firmware v4 (#218)(#164)
- Still experimental and needs testing but should work better than previous implementation
Supports 3 modes:- HSSP: uploads the whole script to The Handy and it is played on device (supports range slider, applied only on script load)
- HDSP: sends real-time script actions to The Handy using PolledUpdate (supports speed limit, auto-home, range slider)
- HSP: sends buffered position updates to The Handy using FixedUpdate (supports all MultiFunPlayer features)
- Still experimental and needs testing but should work better than previous implementation
- Add ability to create a static index for script libraries
Static index has near instant script search but requires rebuilding when adding new files
Mainly useful for large script libraries or libraries located on remote servers
- Improve pacing of fixed update ticks
- Enable precise sleep by default in output targets (does not update currently added outputs)
- Fix crash when trying to manually recompile a plugin
- Fix ZoomPlayer source sending commands in wrong format (#232)
- Fix tooltips sometimes auto closing prematurely
- Fix plugin tabs not showing up in main window
- Remove support for loading funscripts from .zip files
1.34.4
- Fix crash when trying to edit device funscript names
- Fix unable to clone or rename devices
1.34.3
Additional patreon only changelog:
- Fix SLR video not getting detected after navigating the page when using Web source
Changelog:
- Show axes used in script groups
- Add support for videojs-vr players in Web source, used for example in Stash
- Add AdditionalDuration to PolledUpdate
- Process script repositories in parallel
- Fix Plex accounts list showing duplicates and empty names
- Fix script group color not updating when changing theme
- Fix json logging causing UI lag when deserializing even when disabled
- Fix funscript reader doing a lot of unnecessary deserializations
- Fix script libraries not streaming search results
- Fix local script repository causing the script refresh task to still run after cancelling
1.34.2
- Fix potential crash when changing media
- Fix possibility of wrong scripts or no scripts getting matched when rapidly changing media
- Fix mpv generating unnecessary path change events when using playlists
- Fix script drag-drop not adding scripts to the list
- Fix scroll wheel not changing scripts when hovering over script list popup box
- Fix selected script clear button not working
- Fix changing link axis target not causing the script to be updated
- Fix bypass all/none buttons not working
- Fix ability to set smart limit input axis to self
- Fix ability to set motion provider update with axis to self
- Use accurate UTC time for logging
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 beMyVideo.funscript,MyVideo.slow.funscript,MyVideo [fast].funscriptetc., andMyVideo.twist.funscript,MyVideo.slow.twist.funscript,MyVideo [fast].twist.funscriptetc. for R0 axis.
- 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
- 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
Thank you for all your hard work on MultiFunPlayer.
It’s awesome. I just received a Lovense Edge 2 and I’m getting everything set up for the first time.
The only problem I’m running into is that sometimes when MPC-HC starts a new video MFP loads the new script but doesn’t start playing it right away. If I pause and unpause the player MFP will start playing the script from 0s even if the video already played for 5s. The only way to get them synchronized is to seek in MPC-HC and then it will work for the rest of the video.
Any idea what might be causing this and how to resolve it?
Also since I’m using a Lovense Edge 2 I’m very interested in videos that provide two separate scripts for L0 and L1. However these seem to be pretty rare so I have L1 set to link to L0 whenever there is no L1 script loaded. Is there a way for MFP to apply Scale and Offset to this motion only when a link is being used? If an L1 script loads I want the script’s full motion to be used and offset set to zero but if L0 is the only script available then I’d prefer to have L1 follow it but at a 50-80% scale and offset 0.5-1s as this creates interesting resonance between the two vibrators in the device without the sensation getting too crazy when the L0 script has 100% vibration being sent.
My playlist has a mix of content with both L0 and L1 scripts attached so I don’t want to have to constantly adjust the scale and offset depending on which video loads when L1 is not available. I know I could copy L0 and modify the script myself but I was wondering if there was solution directly in MFP?
Hmm never had that happen. I just tested MPC-HC and it plays normally for me.
Do you use a playlist? What version of MPC-HC do you use? Any specific steps to reproduce this issue?
You could add shortcuts and switch between the “profiles” with a keyboard, but you cant do this automatically, it would require a small plugin.
Assuming you are using latest MFP, save this as Plugins\AutoConfigureL1\AutoConfigureL1.cs:
#:plugin
#:name AutoConfigureL1
public class Plugin : PluginBase
{
private static DeviceAxis TargetAxis { get; } = DeviceAxis.Parse("L1");
protected override void HandleMessage(ScriptChangedMessage message)
{
if (message.Axis != TargetAxis)
return;
var scale = message.Script switch { LinkedScriptResource => 0.5, _ => 1 };
var offset = message.Script switch { LinkedScriptResource => -1, _ => 0 };
_ = InvokeActionAsync<DeviceAxis, double>("Axis::ScriptScale::Set", TargetAxis, scale);
_ = InvokeActionAsync<DeviceAxis, double>("Axis::ScriptOffset::Set", TargetAxis, offset);
}
}
Scale will auto set to 0.5 (50%) and offset will auto set to -1s when the script is linked, otherwise resets to default values. You can change the values in notepad and MFP will update the plugin when you save.
If you are using the version from github you would have to post a screenshot with the plugin compilation errors, I don’t remember all of the changes. You can see if the plugin is running by clicking the plugin button at the top of the window
Yes, I use a playlist. I am using MPC-HC 2.7.1. I see 2.7.2 was just released today, I will try it out and let you know if it makes any difference.
I don’t really have any reproduction steps beyond opening a playlist and then going to the next or previous video in the playlist.
I should note that my videos and my scripts are stored on a NAS on my LAN, mounted as a Network Drive in Windows 10. The scripts are stored in the same folder as the videos.
EDIT: After having an actual session using it (I was previously just testing things out - I only received my toy a couple of days ago) I noticed that the only way to fix it is to press pause and then play again on the video. Seeking doesn’t seem to fix it on its own. I haven’t taken a look at the MFP code but I wonder if the video is playing and MPC-HC is sending the play event before MFP has finished loading the script?
Thanks for this script. It does give an error when copied exactly:
MultiFunPlayer.Plugin.PluginCompileException: Plugin failed to compile due to errors
C:\Users\SirEtco\Desktop\MultiFunPlayer-1.32.1\Plugins\AutoConfigureL1\AutoConfigureL1.cs(1,1): error CS9298: '#:' directives can be only used in file-based programs ('/feature:FileBasedProgram')
C:\Users\SirEtco\Desktop\MultiFunPlayer-1.32.1\Plugins\AutoConfigureL1\AutoConfigureL1.cs(1,2): error CS9298: '#:' directives can be only used in file-based programs ('/feature:FileBasedProgram')
It compiles fine if I remove the directives at the top of the file. Not sure if removing those directives is OK or not.
Also, how exactly do I connect a keyboard shortcut (e.g. Numpad *) to the function defined in the plugin script?
I cannot reproduce this on 2.7.0 using a playlist.
You would have to change log level to Trace in application settings at the top of the window, connect to MPC-HC and reproduce the issue, change log level back to Info, and DM me the latest log file.
Thats fine.
The plugin will change the settings automatically like you wanted.
If you want to do this manually with shortcuts, open application settings at the top of the window and add the shortcuts in shortcuts tab.
I will do that and let you know. Thank you!
Oh I misunderstood what you meant in your post. I thought the plugin was necessary for setting up the shortcut. I didn’t realize the plugin solution was the automatic version. Thanks for the clarification. I will give it a go!
I really appreciate your time and help. ![]()
Thanks for the logs.
If only way to fix it is to pause and unpause the video then I think this was fixed in v1.33.6, the bug was introduced in v1.32.0.
@Yoooi Could you please add the ability to change the axis output range for the Handy regardless of the current script?
Currently, the device only update the axis ranges when the script is currently playing and there is movement in it, which can result in the dick slipping out when the adjustments were done while the script was not producing outputs. Because when it will produce outputs again, the axis range will be updated immediately.
Having this functionality would be great, because then I could drop the haptic controls on DeoVR and HereSphereVR and control everything via MFP.
I have live preview of axis ranges added to todo: Manual device control for configuring axis ranges · Issue #190 · Yoooi0/MultiFunPlayer · GitHub
Problem is that with how the outputs are designed it requires a bunch of changes. The commands would have to be somehow injected into PolledUpdate/FixedUpdate.
But in normal use you should only have to set the ranges once, so not sure its worth adding.
Why are you changing it per script?
I’m not changing it per script, the ranges have to be changed for edging and for different sleeves/onaholes.
I’ll see about adding it to v1.35.0, but like I said it might be too much work for not that much benefit.
Have you tried adding “profiles” via shortcuts for different sleeves and edging? You will only have to figure out the ranges once and then you can switch between them with shortcuts.
MultiFunPlayer v1.34.6:
Download: timed patreon only exclusive
Patreon build: https://www.patreon.com/posts/152640087
1.34.6
Additional patreon only changelog:
- Preload first chunk of all SLR scripts to determine if the script is multi-axis
Changelog:
- Add ability to replace shortcuts
- Add local script repository script grouping options
- Remove script loading from internal source and use script repositories
- Improve AB loop behavior
- Bring current media and script info to the front UI
- Fix possibility of serial port refresh getting stuck
- Fix default theme color to improve medium color text contrast
- Fix script group resetting when disabling script link
- Fix unable to drag drop scripts on disabled script selection box
- Fix disabled script selection box when linked script is set
- Fix disabled script link with priority always setting the script to null
- Fix unable to use script selection box when using Internal source
- Fix internal source playing the same item when shuffle is enabled
- Fix internal source next/prev buttons not working with single item and shuffle enabled
- Fix duplicate scripts when playing media inside script library
- Fix script scaling generating invalid PolledUpdate events
- Fix mpv download dialog showing when auto-connecting
Additional plugin changelog: (plugin samples):
- Improve plugin loading performance
- Require
#:plugindirective at the top of the plugin
1.34.5
Additional patreon only changelog:
- Support SLR script streaming when playing local files downloaded from SLR
- File name needs to start with
SLR_,SLRG_orSLRT_, and contain_<scene id>_
- File name needs to start with
Changelog:
- Add support for TCode cubic commands in PolledUpdate mode
- Add support for PChip/Makima interpolation when using PolledUpdate, requires TCode v0.4 firmware
- Add support for PChip/Makima interpolation when using PolledUpdate, requires TCode v0.4 firmware
- Rework The Handy to support firmware v4 (#218)(#164)
- Still experimental and needs testing but should work better than previous implementation
Supports 3 modes:- HSSP: uploads the whole script to The Handy and it is played on device (supports range slider, applied only on script load)
- HDSP: sends real-time script actions to The Handy using PolledUpdate (supports speed limit, auto-home, range slider)
- HSP: sends buffered position updates to The Handy using FixedUpdate (supports all MultiFunPlayer features)
- Still experimental and needs testing but should work better than previous implementation
- Add ability to create a static index for script libraries
Static index has near instant script search but requires rebuilding when adding new files
Mainly useful for large script libraries or libraries located on remote servers
- Improve pacing of fixed update ticks
- Enable precise sleep by default in output targets (does not update currently added outputs)
- Fix crash when trying to manually recompile a plugin
- Fix ZoomPlayer source sending commands in wrong format (#232)
- Fix tooltips sometimes auto closing prematurely
- Fix plugin tabs not showing up in main window
- Remove support for loading funscripts from .zip files
1.34.4
- Fix crash when trying to edit device funscript names
- Fix unable to clone or rename devices
1.34.3
Additional patreon only changelog:
- Fix SLR video not getting detected after navigating the page when using Web source
Changelog:
- Show axes used in script groups
- Add support for videojs-vr players in Web source, used for example in Stash
- Add AdditionalDuration to PolledUpdate
- Process script repositories in parallel
- Fix Plex accounts list showing duplicates and empty names
- Fix script group color not updating when changing theme
- Fix json logging causing UI lag when deserializing even when disabled
- Fix funscript reader doing a lot of unnecessary deserializations
- Fix script libraries not streaming search results
- Fix local script repository causing the script refresh task to still run after cancelling
1.34.2
- Fix potential crash when changing media
- Fix possibility of wrong scripts or no scripts getting matched when rapidly changing media
- Fix mpv generating unnecessary path change events when using playlists
- Fix script drag-drop not adding scripts to the list
- Fix scroll wheel not changing scripts when hovering over script list popup box
- Fix selected script clear button not working
- Fix changing link axis target not causing the script to be updated
- Fix bypass all/none buttons not working
- Fix ability to set smart limit input axis to self
- Fix ability to set motion provider update with axis to self
- Use accurate UTC time for logging
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 beMyVideo.funscript,MyVideo.slow.funscript,MyVideo [fast].funscriptetc., andMyVideo.twist.funscript,MyVideo.slow.twist.funscript,MyVideo [fast].twist.funscriptetc. for R0 axis.
- 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
- 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
I hope add Android ver…
Can I connect mfp to a funsr pro via bluetooth? Been running a long usb cable between rooms and I’d love a reliable remote method. I don’t currently have bluetooth on my main PC but I just tried installing MFP on my laptop to figure it out, and didn’t see any bluetooth options
*edited as I had originally written Heresphere
Best remote setup will be to use wifi, bluetooth is very slow.
But bluetooth sometimes appears under serial ports, if its not visible there in MFP then it wont work as there is no direct bluetooth output.
If you can see bluetooth under serial ports make sure to switch to PolledUpdate to minimize the number of commands sent (using the clock button on the right).
Ah I didn’t realise wifi was an option! Is that under TCP in the Add Output menu? I’ll have to find the device’s IP but that could work perfectly if it simply replaces the Serial USB connection
Use UDP output in MFP. Also you have to have a firmware that supports wifi, not all of them do.
Ok brilliant, thanks, I’ll check that out. I had one from the very first batch but I just upgraded it to v1.1 so hopefully that will have done the trick
I love this software so much. This is great.
Might have a different experience if I try to use WiFi but using port connection so far has what I need and I might not even bother.
Recently got an sr6 and I heard a lot about how there’s a bit of a learning curve to using it with scripts/videos/games/etc. coming off the convenience of a handy I was a bit worried tbh.
Worried for literally no reason lmfao, this was so easy to set up and use, I was even able to figure out how to set up EDI and heresphere completely on my own. (Which is probably not surprising, but for me it was because basically everything id heard before was that getting max usage out of an sr6 is kind of hard)






