Automatically convert hardcore funscripts to Handy (while preserving sync) running in BT mode

I found another index error. Fixed in 1.03 py.

2 Likes

Hi @Magneato ,

First of all, thank you so much for your original tool — it’s been incredibly useful.

I’ve been using it for personal projects, and over time, I ended up modifying and extending it quite a bit to better suit my needs. I wanted to share what I’ve changed and why, in case any part of it is helpful for future updates to your original version. Feel free to use any of the code or ideas if you find them useful!

Here’s a quick breakdown of what I’ve added or modified:


1. Improve Vibration Pattern Replacement
In previous versions, the vibration pattern replacement applied to the entire script, which sometimes altered parts that didn’t need changing.

I changed it so that vibration patterns are only adjusted in areas where timing points were actually removed. To do this, I added a smarter detection system that uses buffer zones around removed points to better identify which sections need replacement. This helps preserve the original feel of the script where it was already working well.

2. Improve Speed Correction
I implemented recursive checks to catch chain reactions — for example, when fixing one low-speed point leads to another new low-speed transition nearby. The tool now detects and fixes these automatically.

I also improved the handling of edge cases where movement reaches the 0 or 100 position. Instead of forcing impossible movements, it now inserts a natural pause.

3. Minimum & Maximum Speed Handling
I updated the limit_speed function to handle both maximum and minimum speed constraints.

Additionally, I added a minimum speed parameter to prevent stuttering caused by extremely slow movements.

This can now also be set directly from the GUI, making it easier to fine-tune behavior without needing to edit code.

To improve motion accuracy, I reduced the default minimum interval from 60ms to 33ms.
This allows the tool to better capture high-frequency movement details without sacrificing device compatibility.

4. Detailed Speed Analysis & Debug Info
I added speed diagnostics and clearer messages explaining what changes are being made and why.

This has helped me a lot with debugging and understanding how scripts are being modified.


These changes were mainly made for personal use to help preserve the original intent of the scripts more accurately while still enforcing safe limits for devices like the Handy. I figured I’d pass this along in case anything here could help you in your development — feel free to use, ignore, or build upon it however you like!

Thanks again for creating and sharing the original tool — it’s a solid foundation and has saved me a ton of time.

All the best,
Pigtarao

Download Code (Pixeldrain)

1 Like

Oh, by the way — the modifications I made weren’t intended for Handy in Bluetooth mode!

I used this tool specifically to fix extremely fast or slow movements that even Handy in Wi-Fi mode struggles to handle.
(For example, on EroScripts there are many funscripts with speeds like 1000 units/s, made for devices like SR or OSR. I needed to adjust those.)

So my goals are quite different from yours.

Since I use Wi-Fi mode, I chose 33ms instead of 60ms, and my main focus was to preserve valid patterns that didn’t violate speed or interval constraints — whether slow or fast.
In particular, I started modifying the code because acceleration patterns were being misidentified as vibrations, causing unwanted pos changes that ruined otherwise well-designed sequences.

In short, my modifications may not align with your original goals — so please feel free to only take the ideas or code that you find useful!

Thanks for clarifying the part about lower intervals for WiFi. I don’t use WiFi with the Handy (firmware 3.x) for various reasons, so 60ms ish was the sweet spot for my tests. Your other changes sound interesting. I’ll try to check them out sometime.

1 Like

I wrote it quite grandly, but in fact, there is not much difference.

I created a ā€œminimum speed limitā€ and updated the limit_speed variable accordingly.
Because of the ā€œminimum speed limit,ā€ recursive search was needed, and also because I didn’t want to break the acceleration pattern, I made the ā€œvibration detection and recovery functionā€ work only when the action was changed by the ā€œminimum interval.ā€

I made it easy for users to set the minimum and maximum speed through the GUI.

And… well, there’s not much else to it!

Thank you so much for the great tool! Thanks to you, I’ve saved about 100 billion seconds.

2 Likes

I wonder how does it compare to Bright - Funscript heatmap generator 's Handy converter (which I basically never tested myself because I don’t have Handy)
Could someone compare please?
Tell me if I need to fix something there

No, I don’t believe they are doing the same things.

From the link you mentioned (and your forum post), I’m not seeing a relation between the two. Your app appears to merge multi access scripts and generate thumbnail heatmaps. The python code here takes a lot of care to check for action patterns which are too much for Handy (in bluetooth mode) to replicate, and translate them into something which still appears to sync to the action.

However, I’m not sure what this statement in your forum post refers to since Handy is not multi-axis:
New feature: convert your funscripts for Handy!

I see that your app seems to have a speed limiter, which my python script also has, but that’s the only similarity I’m spotting.

I’ve been manually converting scripts for the Solace Pro, and I’ve been debating doing something like this! It took quiet a bit of testing to figure out what the operating parameters where, so this can really help speed up script conversions!

One of the things I’ve found myself implementing a lot is wave patterns. I’ll make the ā€œVibrationā€ a movement of ±30u, and ā€œwaveā€ it over a period. Is there any settings to be aware of to make sure the script doesn’t remove these sections?

Okay I’ve compared it, my implementation I linked is poor compared to the script
Speed limiter works fine… but it is not allowed to change peak timing. Dunno it that’s good or bad thing.

(It’s ā€œdownload for Handyā€ button below, no settings needed)

Gonna rethink it


Also do you have some great test cases?
I’d like to have some

If time between movements is very short (min_interval = 60 in the Python script), then the design of this script will modify them. If you want to reduce the vibration detection a bit, you could try lowering min_internal value.