HandyControl - How to create scripts with the Script Sequencer

HandyControl - How to create scripts with the Script Sequencer

This topic describes how to create scripts with the Script Sequencer from HandyControl.
All generated scripts can be exported as funscript and also used in other applications.

If you have questions or a problem with a script you can ask here.

You can access the Script Sequencer throught the context menu.
If one of the csv files is altered then you can reload the files here.
On selection of an element HandyControl generates the script.

The Script Sequencer is a feature that allows you to generate scripts with help of a spreadsheet application like Excel or Google Sheets. You can use any app that supports a .csv export.

The Script Sequencer supports either , or ; as separator so you don’t have to care about the language setting. The csv file will look like this.

:warning: The headers must not be changed or the file is flagged as invalid.
Lines that only contain separators can be used anywhere below the header. They are ignored during import.


Get the newest version of HandyControl and also download the Sequencer.zip from the same download folder. This collection contains templates that will be used here for explanation and also a lot of working examples.

The Excel template in the zip file can be imported to Google Sheets so can don’t have to copy the structure if you don’t own Excel. The file contains a macro to automate the csv file export. If you want to use it you need to allow macros. The save location can be changed in the macro editor.

Spreadsheet Structure

The table contains two sheets.
Patterns (Patterns + Variants)


This is the place where you create the single parts of a script that are then combined in the Sequence sheet.

Currently there are three types of patterns:
The pattern type is detected on how the fields are used.

Pattern Type 1: Normal script sequences that are cut from scripts or generated elsewhere. The timestamps must increase with each row. Time and Position must be used.

Pattern Type 2: Sequence created from speed and stroke values. Position must be empty.

Pattern Type 3: This is a break. Only use fields as shown in the image.

By default a pattern always starts at the lower point and goes up with the next timestamp. A pattern will always end in the same location where it started so if the first point was low then the last point will be also low. This is neccessary for easier calculation if you build bigger patterns and sequences.

The duration has always priority. If the last stroke goes over the defined duration then the script will be shifted left so the last timestamp matches the given duration. It’s also possible that the script is shifted right. In real it’s a little bit more complicated but you should know that if you want to create a sync beat then you probably have to calculate some values to avoid this little correction.


Name of the pattern. Every row with the same name will be part of the pattern. The order on import is the same as seen on the sheet. A single row is called a SubScript. You can add empty rows.


Name for the variant. All rows that belong to a single variant are combined. You can use variants to create random scripts. In the example above there are three patterns with five different variants each.

A variant can be also build with multiple rows. The SubScripts are combined in the order of the rows.



How often a row is repeated. 0 will disable the row.


Type 1: Timestamp in milliseconds
Type 2: Duration in milliseconds


Type 1: Position in % 0-100
Type 2: Must be left empty!


Type 1: Can be left empty.
Type 2: Speed at t = 0


Type 1: Can be left empty.
Type 2: Speed at t = time


If used then this has higher priority than the speed values.
Type 1: Can be left empty.
Type 2: Can be left empty or enter a filename of a png file without extension


Type 1: Can be left empty.
Type 2: Lower Stroke position at t = 0


Type 1: Can be left empty.
Type 2: Upper Stroke position at t = 0


Type 1: Can be left empty.
Type 2: Lower Stroke position at t = duration


Type 1: Can be left empty.
Type 2: Upper Stroke position at t = duration


If used then this has higher priority than the stroke values.
Type 1: Can be left empty.
Type 2: Can be left empty or enter a filename of a png file without extension


A possibility to influence the SubScript generation.
If multiple options are used then the # separator must be used. Option1#Option2#Option3…

INV: Inverts all positions in a SubScript line. The SubScript is mirrored at the 50% center line.

DOWN: Changes the starting position to the upper stroke position for beat patterns so the beats go down. If this is not set then all variants start with the lower stroke position. You only have to set this on the first line in a variant if you want to change the direction.

UP: Same as DOWN but the other way.


You can use it to describe what you are doing here.
This column is ignored on import.

:warning: Speed minimum and stroke difference minimum = 10%
Speed below this minimum will create bad patterns. Zero is also a problem.

:warning: Images must be located in the same folder than the pattern csv file.


The sequence csv file is where you combine your patterns to create scripts. Although you can also create scripts in the pattern csv it’s easier here as you need less rows.


This is the name of the sequence


Name of the pattern in the pattern csv file.


Name of a variant of the given pattern. If you leave the variant empty then a random variant of the pattern is used.


Repeats this line x times. 0 will disable the row. If no variant is selected and repeat >= 1 then repeat will select a random variant x times. This is not shuffling the variants.


Currently nothing defined here.



You can use it to describe what you are doing here.
This column is ignored on import.


Images allow you to create dynamic stroke and speed path and save you much rows of values. Basically you just draw your script instead of writing it.


The image width is the duration from start to end of a pattern row no matter how large the image is. It will be always scalled to the duration. The image height is always 0-100% for speed/stroke.

The image needs to be a transparent png file so its easier to detect the borderlines. For the stroke range we need two borders so we can define the stroke range from top to bottom. In the above image the lower border line will be the ground at zero. For speed we only need a single value. Here we always use the upper borderline.

If you use the same image for speed and stroke this will look like this.

The upper borderline of a speed image must always be above 10% of the image height. The lower borderline bust be at the bottom.

The vertical distance between the upper boarderline and the lower borderline must always be bigger than 10% of the image height.


A break is currently not possible inside an image.

You can use any colors you like. The Script Sequencer will only analyse the alpha channel in the png image.

Anything that has an opacity >95% will be used to detect the borderlines. This means that you can add semi transparent drawings in the image that are ignored by the Script Sequencer. The 10% grid lines in the images above are an example. They have an opacity of 50%.

Only the most upper and most lower boardline is used. So if you have a donut shape image then the hole in the middle is ignored.

You can find the example shapes in the Photoshop template of the sequencer zip.

To draw smooth curves you should use the path and shape tools in Photoshop so you can adjust your drawing anytime.

If you dont have Photoshop you can use any other application that can export transparent png images.


Trying to process all of this - especially the image feature. I am sure your software can accomplish this, just trying to figure out how to do it. This is a feature of VirtualBlowJob. Is there a way to generate a random script where you input these four parameters? (minimum desired speed, max speed, min stroke and max stroke)

A funscript generator that can do this would be awesome.

I could create something like that but thats no real blowjob. It would just create random strokes with some +/- variations with 4 parameters. That could be even done live in the 2.13 firmware so it changes stroke and speed every few seconds. Not very realistic…

You could use the command line feature to build this on your own if you can code a bit.

My idea is to use script parts from real blowjob scripts and create something like that. But I need to collect much more scripts for this to have enought variety. The Script Sequencer is a tool to help me reaching this goal one day. If the script collection grows I could just press a button and Handy streams a real blowjob script that can be adjusted in intensity during play. Or you switch to handjob or fucking sequences. You get the idea…?

You are right good Sire. I think I can already achieve most of this just using your software as is as it has min and max stroke offsets. The question I have is - is it possible to set the top speed of the script with HandyControl?

The stroke lenght does not influence the sync time of a script. Changing speed will do.

You could create different patterns with fixed speeds and combine them in sequences that only use patterns of your range.
Pattern 10%, Pattern 20%, Pattern 30%, Pattern …
Sequence A - Pattern 20%, Pattern 30%
Sequence B - Pattern 20%, Pattern 30%, Pattern 40%, Pattern 50%
Sequence C - Pattern 50%, Pattern 60%, Pattern 70%

But I think its easier to just write some code to randomly change speed and stroke.

You can also try one of the baseline scripts. Just load it and add jitter. Then you can scale it to change the speed. The scripts are in my mega folder.

1 Like

I will definitely try this!

I dont mind if the script duration changes. For my use case, I like to use theHandy for solo scenes so sync is not an issue at all. If you think you can code something that can randomly change speed and stroke to predefined limits, that would super awesome. I totally fine with it not being super-realistic :slight_smile:

1 Like

I tried to do this and I could not get too far :slight_smile: I read the howto which is quite well done - do I need to open Excel for this or can it be done entirely through HandyControl sequencer function. Also, once I create the patterns, how do I then combine them?

If you would be so kind to offer a the steps on how to achieve this :slight_smile: Thanks in advance.

Have a look in the Excel template. Have you tried this?

If you are using excel you can do everything in one excel file. Maybe Google Sheets support that too.
Patterns and Sequences have one page each.

On the sequence page you must use the pattern names from the pattern page.

A: The name of the sequence can be anything.
B: Here you add the names of existing patterns.
C: You can also set variants names here. Leave empty for random.
D: Repeat this row x times.


To use the HandyControl Sequencer you need to export both pages as csv file.
There is a button in the Excel template which does this.
Then set the path to the .csv files in HandyControl script settings.

I will take a second look, although at this point, I will very patiently wait for HandyControl update good Sir :grinning: :pray:

are people making these sequenced scripts?
i would love to make some but i don’t have access to a Windows system.
i’ve allready tried all your scripts @Lucifie and i love them,
but now i’m looking for some slow building slow but mostly long stroking sequences. slow because then my Handy doesn’t make that much noise so i can use it while my housemate is in the other room.
can somebody help me? is there a way to use this program in OSX (without bootcamp, i am aware) or is there a library of scripts i’m not aware of??

1 Like

HandyControl only works in Windows and you need it to use the Sequencer.
The Sequencer is also not easy to use.

Do you need to be connected to a HandyControl or have the key code to create a script using Script Sequencer?

EDIT: i just download sequencer and pattern from somewhere else and it work. Maybe the file provided here is not working, IDK…

Hi, I’m not sure if I’m supposed to ask a question here, but here I go.
I’ve download HandyControl 1.2.3 (and I’ve try also with 1.2.2) and sequencer.zip.
In setting I’ve set the pattern for the pattern csv and sequencer for the sequencer.csv.
But when I try to populate the data for the sequences (Reload), nothing happen (I can’t have data in the dropdown). The pattern “Reload” is working fine.

Can you help me?