Ott file conversion to funscript?

I searched and searched on Eros scripts and found no converter. Is there a way? I’ve got all sorts of .ott scripts from the realtouchscripts days. Would love to give them a whirl as a funscript. I figure any conversion would likely involve taking input from the top belt commands and ignoring all the rest.

There are quite a number I was looking to convert, most notably Cock Hero Hardcore and Cock Hero Ultimate come to mind.

Thanks for your input.

Drop some files in here, never seen what they look like.

CH-Hardcore - Final - Copy.txt (119.4 KB)

See attached. I had to rename from OTT to TXT for upload purposes. As I recall, all they really were were text files. Unless you count the originals that had the commands encoded into WMV files.

The RealTouch had several commands available for the various functions. Those were top belt, bottom belt, Orifice (tightened or loosened), and lube. I think the number on the left was the frame number. I’m not sure what the others were. I’m guessing speed between the V and U, and then maybe location or amount of time on the right. The toy was out of this world, but did have it’s drawbacks. The lube pumps would rust out as they were not peristaltic, and if you didn’t have enough lube, it could rub you raw. Putting your extracurricular activities on hold for a few days while healing.

Hailey James - Tease_It_Out_Scene_8 - Copy.txt (211.1 KB)
FantasyHD - Busty Blonde Bombshell - Kayla Kayden [720p] cropped hd - Copy.txt (164.0 KB)

Not gonna lie, never seen the format and I’m not sure exactly machine this is for.

I was saying that there’s probably a way to convert the functions over to a funscript, though.
Sample from CH Script:
20900 H 255
20900 L 255 1000
25901 V 106 U IN 959 0 0 0 0
26860 V 110 U OUT 935 0 0 0 0
27795 V 110 U IN 935 0 0 0 0
28763 V 106 U OUT 960 0 0 0 0
29723 V 119 U IN 880 0 0 0 0
30603 V 119 U OUT 880 0 0 0 0
31531 V 111 U IN 928 0 0 0 0
^Here I can kind of assume that the 1st column is a timestamp, where 1000ms is 1 second, so the strokes are like less than a second apart. (25901 → 26860 ).
We could just take those timestamps and convert it to a funscript or something with some code, but I’m not sure what % of a stroke these strokes are, based on the numbers here. We could turn them into 0-100 strokes or something though by using what I assume is the timestamp in the first column.

Sample from Harley James script:
29294 P 5 46 U IN 69 41 6 41 6
29391 P 5 47 U IN 62 42 6 42 6
29482 P 5 48 U IN 64 43 6 43 6
29597 P 4 49 U IN 67 44 6 44 6
29715 P 5 50 U IN 68 45 6 45 6
29816 P 5 51 U IN 67 45 6 45 6
^I’m not sure what all the numbers mean here honestly, like the whole countup from 45 to 51, and the 69->41->6->41->6… Not. a. clue.

Syncydink supports realtouch format. It might be possible to look at what is happening there and create a conversion tool.

This is the toy…

I forgot it also does heat in the script. I think the belts would have been told to move at a certain speed for a certain time code rather than a certain distance. I’m pretty sure the number for timing was the frame of the video.

Here is a detailed explanation of the .ott script syntax used for RealTouch scripts from the original CDK, “Guide to Creating RealTouch Video Content” version 1.0.0.

I wrote a funscript to .ott parser at one point in JavaScript and it was relatively straightforward but never tried .ott to funscript. For example magnitude / velocity ranges from 0-255 in .ott files, so you could apply a scale factor to convert those into a 0-100 movement scale.

The main command types to look at are V (vector movement) and P (periodic movement, i.e. patterns). H = heat and L = lube so those only make sense for devices with those capabilities.

The axis parameter determined whether the command applied to T (Top Belt), B (Bottom Belt), U (both belts), or S (squeeze orifice at the entrance).

I looked at the Syncydink Github link and it lists “RealTouchScripter Format (RealTouch format)” under Supported Haptic File Formats but I couldn’t find where in the code that’s implemented. src/utils/HapticsToButtplug.ts has other conversion functions like FunScriptToFleshlightLaunchCommands.

buttplugio had a RealTouch plugin that parsed .ott format, but for applying them to USB commands for the RealTouch rather than funscript.

Excerpt from Guide to Creating RealTouch Video Content version 1.0.0:

3.1: Statements

Each script statement follows the general form:
<comment> <statement><newline>

The comment field can contain any textual data (as long as it doesn’t contain spaces). We use the comment field to record time offsets when preparing scripts for integration into video content — we’ll explain that convention in a later section.
The statement field is separated from the comment field by a single space. The contents of the statement vary depending on the type of command that is being represented. Each statement type is detailed below.

3.1.1: Movement (Vector)

Vector movements are represented with statements in the following format:
V <magnitude> <axis> <direction> <duration> [<inMagnitude> <inDuration> <outMagnitude> <outDuration>]

An example of a vector movement command would be the following:
@ V 192 T IN 1000 96 250 64 250

In this example, @ is our comment. V represents that this is a vector movement. The magnitude is 192. This command will move the top belt in the device (T) inwards (IN) for 1000 milliseconds (1 second). Additionally it contains an “envelope” (fade in and out)–it will fade in from magnitude 96 for 250 milliseconds (¼ of a second) and then will reach the full magnitude of the movement (192). It will then run the full movement for 500 milliseconds (½ of a second) . The last 250 milliseconds will fade from magnitude 192 to magnitude 64. The main magnitude is played for 500 milliseconds because of the fade-in and fade-out in the envelope.

Here are the possible values for each part of the statement:
• Magnitude values range from 0 (no movement) to 255 (the fastest possible
• Axes can be represented as: “U”—both top and bottom belts, “T”—top belt, “B”—
bottom belt and “S”—squeeze (orifice)
• Directions are represented as either “IN” or “OUT”—and are from the perspective of
the user of the device
• Duration values are expressed in milliseconds (1/1000th of a second) and the
available range is from 0 to 65535

3.1.2: Periodic Movements

Periodic movements are very similar to vector movements. The primary difference is that they contain a “period”. They start out in the direction that is specified in the statement, and then after the period has elapsed, they direction is reversed. Periodic statements have
the form:

P <period> <magnitude> <axis> <direction> <duration> [<inMagnitude> <inDuration> <outMagnitude> <outDuration>]

An example of a periodic movement statement looks like this:
@ P 2 127 U OUT 1500
The optional envelope is omitted from this example statement.

This example creations a vibration with a period of 2 milliseconds, a magnitude of 127 (out of 255—so 50% intensity) affecting both belts (U), starting with an outward movement (OUT) and lasting for 1500 milliseconds (one and a half seconds). The ranges and values of the statement work the same as a vector movement. The only addition is a period value. Periods are expressed in milliseconds and can range from 0 to 255. They are intended to create short, vibratory pulses or persistent vibrations and other special effects when combined with vector movements. If a vector movement is currently being played back on the device, and then a periodic movement command is issued, as long as both commands have the same directionality then the effect will be additive—in other words the vibration will be overlaid over the top of the movement. If the directions disagree, then the second command will terminate the first command.

3.1.3: Heat

Heat can be turned on or off. The format of the heat statement is as follows:
H <magnitude>
An example would look like the following:
@ H 224

As with the other examples, @ is our comment. H defines this as a heat statement. The magnitude is set to 224. The current revision of the device ignores heat magnitudes, and simply turns the heat on in response to a heat command. This was done in order to provide a margin of safety. Future revisions of the output device will likely allow much more fine-grained control over the heat and other environmental properties.

3.1.4: Lube [the lube pump stopped working on many RealTouch devices so in practice these commands often had no effect]

Lube is dispensed into the device based on “bursts”. You can release more lube into the device by sending more volume, longer bursts or more frequent bursts. It is up to you as a content developer to determine how much lube volume is appropriate for your application.

Below is the format of a lube statement:
L <magnitude> <duration>

An example would look like the following:
@ L 192 1000

The magnitude and duration values work the same way as they do in the other statements — magnitude ranges from 0 to 255 and the duration is expressed in milliseconds and ranges from 0 to 65535.

3.1.5: Stop
It is possible to stop each component of the device independently — each of the axes, the dispensing of lube and the heater. Stop commands have the following structure:
S <axis>

An example would be:
@ S T

This example tells the device to stop the top belt. Possible values for the “axis” parameter
• “A”: “All”—stop every component of the device
• “H”: “Heater”—turn off the heater
• “L”: “Lube”—stop the dispensing of lube
• “T”: “Top Belt”—stop the top belt
• “B”: “Bottom Belt”—stop the bottom belt
• “U”: “Both Belts”—stop both the top and bottom belt
• “S”: “Squeeze” (orifice)—stop the orifice

In practice, you will probably not issue stop commands for most of these axes. Most of the movement or environmental commands you issue already have durations and as such will end on their own. The two most useful stop commands are for the heater and the “all” stop.

1 Like

Open the RealTouch file in ScriptPlayer, then save it as a Funscript. It will do the conversion for you.

1 Like

Thanks Thanny - I confirmed the latest version of ScriptPlayer (currently 1.2.0) will load .ott files and save as Funscript via Script > Save As.

Thank you @Thanny that works great. I wish there was a batch option, but I’ll take it and be thrilled for a solution. Once it’s converted, is a script dump allowed of old RT OTT files? I know scripters frequently want credit for their work. In this case I’d have no idea who did what way back when as RealTouchScripts has been down for a long time. I’m sure some of those guys have got to still be on here.

I’d say it’s fair game to upload here, as you’d be fulfilling an archival purpose for apparently orphaned content.

If you know the original author, give credit. If the original author wants it taken down, that can be dealt with when it comes up.