Tools Menu (t) | File Menu (f) | Keyboard Shortcuts (s) | in Japanese (日本語) (j)

See (q) for the most up-to-date information.

a3r (ASS_Help3r) for Windows XP/2000 April 14, 2012

An open-source helper tool for timing and typesetting in ASS (Advanced Sub Station Alpha).

[ Download (d) ]

One way to typeset is using software like Sub Station Alpha, Sabbu, and Aegisub, or retouching software like Photoshop. But some typesetters traditionally prefer using a plain text editor to directly edit a script. Probably every typesetter does that at least sometimes. a3r is a small utility designed to help you when you take this approach. It was originally my own private tool, and basically it still is. I always use it with EmEditor plus syntax highlighting. This tool doesn't really help unless you are already comfortable with editing ASS directly and already have a basic idea. For example, a3r helps you do subtitle‐lip‐sync, but only if you already know how to do subtitle‐lip‐sync.

Though this tool is small and poorly written, it can do several things that other tools can't. For example, checking the number of characters per second to make sure each subtitle text isn't too long for its duration, should be trivial, and very important too. Yet it seems that other typesetters are not very interested in doing this. To make sure that each character in each Dialogue is supported by the specified font is obviously important, but again, I don't know any other tools that can do this basic error checking properly. In earlier days, there were no other tools that could generate t-clip-based effects, such as smooth outline karaoke or vertical karaoke, either.


(More history)


Basic Interface

Basic interface is compatible with VirtualDub (VD) and—in some aspects—with Media Player Classic (MPC), altough in the source code level a3r is not related to those brilliant programs. Some shortcut keys, especially used in the Simple Timer tool, are also compatible with Sub Station Alpha v4.08.

When you open ASS and AVI, the video stream softsubbed by the current script is shown in the left pane. When you only open ASS without loading AVI, a blank, 24000/1001-fps clip is used as a video stream. When you open AVI without loading ASS, a3r simply shows the video stream as it is.

When a3r generates a new ASS for special effects such as Striped Colors, Multistate Karaoke, the right pane is used to preview that results. The preview is useful to tweak the parameters of the effect interactively. Otherwise, the left and the right show the same image.

In almost all editboxes, you don't need to hit [Ctrl]+[C] to copy a text. Make a selection, and the selected text is already sent to Clipboard.

The statusbar shows the current cursor position as {\pos(x,y)}, and the pixel color under the cursor as {\1c&Hbbggrr}. The origin is the left upper corner of the image in the left pane. To get the color code for a certain pixel, just click on it, and the code is sent to Clipboard. [Alt]+click will send the current {\pos(x,y)} to Clipboard. The following table summarizes what you can do with your mouse.

What You Do What You Get Note
Click (in Default Mode) &Hbbggrr The two magnified images shown below help you click on the exact pixel. One shows the 50x50 area around the cursor, the other shows the current pixel under the cursor and 8 surrounding pixels.
Click (in XY Mode) x Or [Ctrl]+[Alt]+[Shift]+Click in every mode.
RightClick (in XY Mode) y Or [Ctrl]+[Alt]+[Shift]+RightClick in every mode.
[Ctrl]+Click Average Color as &Hbbggrr Click on several sample points while holding down [Ctrl], and the average is calculated when you release the [Ctrl] key.
[Shift]+Click (in Def. Mode) Pixel Color as decimal (signed 32-bit integer) A decimal color code is usually not necessary in Advanced SSA, but you may need it for compatibility with the original V4 Styles.
[Ctrl]+[Shift]+Click Average Color as decimal Ditto.
[Shift]+Click (in non-Def. Mode) &Hbbggrr Like simple clicking in the default mode.
[Alt]+Click {\pos(x,y)} Correct PlayResX/Y are assumed. (The "Subpixel PlayResX/Y" technique is not supported.)
[Alt]+[Shift]+Click (*)
(3 times or more)
{\an7}{\p1}m x1 y1 l x2 y2 x3 y3 ...{\p0} Drawing a polygon as the clipping area with the points clicked. The polygon is previewed directly on the picture, and undoable by [Ctrl]+[Z].
(*) NOTE: Windows uses [Left Alt]+[Shift] to switch between input languages, if you have 2 or more keyboard layouts enabled. In that case, you may want to use [Shift]+[Tab] instead of [Left Alt]+[Shift] to prevent input lanaguage change.
[Alt]+[Shift]+Click (*)
(2 times)
{\move(x1,y1,x2,y2)} Generated when you release the [Ctrl]+[Alt] keys.
(*) NOTE: Windows uses [Left Alt]+[Shift] to switch between input languages if you have 2 or more languages enabled. In that case, you may want to use [Shift]+[Tab] instead of [Left Alt]+[Shift] to prevent input lanaguage change.
[Ctrl]+[Alt]+Click (**)
{\an7}{\clip(m x1 y1 l x2 y2 x3 y3 ...)} Similar as [Shift]+[Alt]+Click but the result is a polygon itself, not the clipping area.
(**) NOTE: Windows uses [Ctrl]+[Shift] to switch between keyboard layouts if you have 2 or more keyboard layouts enabled under one installed language. In that case, you may want to use [Ctrl]+[Tab] instead of [Ctrl]+[Alt] to prevent input lanaguage change.
[Tab]+Click x y May be useful when tweaking a parameter in {\p1}...{\p0} or {\clip(...)}
MouseWheel Up/Down Go to the previous/next Dialogue. If ASS is not loaded, go to the previous/next frame. MouseWheel behaves differently depending on whether ASS is loaded or not. If loaded, same as [PageUp]/[PageDown]; else same as [←]/[→].
[Shift]+MouseWheel Go to the previous/next Key Dialogue. If ASS is not loaded, go to the previous/next keyframe. [Shift]+MouseWheel behaves differently depending on whether ASS is loaded or not. If loaded, same as [Shift]+[PageUp]/[PageDown]; else same as [Shift]+[←]/[→].
[5]/[Alt]/[Tab]+MouseWheel Move by 5/50/500 frames. Same as [5]/[Alt]/[Tab]+[←]/[→], not depending on whether ASS is loaded or not.
MiddleClick {\pos(x,y)} Same as [Alt]+Click.

Navigation: Video

Shortcuts Meaning Note
[←]/[→] Go to the previous/next frame. [←] = The left arrow key. [→] = The right arrow key. Compatible with VirtualDub, AviUtl, and many other video-related programs.
[Shift]+[←]/[→] Go to the prev/next keyframe. Shortcuts compatible with VirtualDub. If the video is keyframe-only, or keyframes are not recognized, you simply get the prev/next frame.
[Ctrl]+[Shift]+[←]/[→] Go to the prev/next scene-change frame. Valid only when a scene-change frame list has been imported.
[Ctrl]+[←]/[→] Go to the first/last frame. Compatible with VirtualDub.
[Tab]+[←]/[→] 500 frames back/forward.
[Alt]+[←]/[→] 50 frames back/forward. Compatible with VirtualDub.
[5]+[←]/[→] 5 frames back/forward. Sometimes useful when checking heavy karaoke effects. [Num5] doesn't work for [5] here.
[Alt]+[Num+]/[Num-] 10 minutes back/forward.
[Num+]/[Num-] 1 minutes back/forward.
[Shift]+[Num+]/[Num-] 30 seconds back/forward.
[Alt]+[Shift]+[←]/[→] 0.8 seconds back/forward. Going to the nearest frame that is at least 0.8 seconds apart from the current frame. In 24000/1001 fps, this means 20 frames or 0.834 seconds.

Navigation: Dialogue

Shortcuts Meaning Note
[PageUp]/[PageDown] The previous/next Dialogue in line-number order. Seek the Dialogue according to the line number in the file. For example, if you have Dialogues in line 20 and 21, and the current Dialogue is the one from line 20, the next Dialogue by [PageDown] is the one from line 21, regardless of their chronological order (start time/end time). You can also navigate in Dialogues chronologically using the up and down arrow keys ([↑]/[↓]).
[Shift]+[PageUp]/[PageDown] The key-Dialogue of the previous/next cluster in line-number order. A key-Dialogue (or a key-subtitle) is a Dialogue whose start time is different from the start time of the previous Dialogue in file, or whose end time is different from the end time of the previous Dialogue in file, or both. For various effects, you use a subtitle cluster—2 or more Dialogues, consecutive in line-number order, sharing the exactly same start time and end time. Only the first line in a subtitle cluster is a key-Dialogue. If a Dialogue is not in a cluster of 2 or more Dialogues (i.e. if it's an "ordinary" subtitle), [Shift]+[PageUp]/[PageDown] is same as [PageUp]/[PageDown]. You can think of an ordinary subtitle as a cluster of one member.
[Tab]+[PageUp]/[PageDown] 100 Dialogeus back/forward. In line-number order.
[Alt]+[PageUp]/[PageDown] 10 Dialogeus back/forward. In line-number order.
[↑]/[↓] The previous/next Dialogue, chronologically. Dialogues are sorted by start time, in increasing order, and the previous/next Dialogue is looked for in such a way that the start time of the destination Dialogue t is less/greater than or equal to the start time of the current Dialogue t0, and there is no Dialogue whose start time is truely between t0 and t (basically, this means that you get the previous/next Dialogue event, and "equal" is included when we say previous/next). If there are more than one Dialogues sharing the same start time t, the line-number order is used as the secondary sorting.
[Shift]+[↑]/[↓] The truely previous/next Dialogue, chronologically. Dialogues are sorted by start time, in increasing order, and the previous/next Dialogue is looked for in such a way that the start time of the destination Dialogue t is truely less/greater than the start time of the current Dialogue t0, and there is no Dialogue whose start time is truely between t0 and t (basically, this means that you get the previous/next Dialogue event, and "equal" is not included when we say previous/next). The Dialogues sharing the same start time t0, if any, will be skipped. If there are more than one Dialogues sharing the same start time t, the key-sub is selected, that is the first sub in line order in the cluster.
[Num0] Go to the start frame of the current Dialogue. The first video frame on which you see the current Dialogue. The video frame timestamp is greater than or equal to the Dialogue start time.
[Num.] Go to the last frame of the current Dialogue. The last video frame on which you see the current Dialogue. This is just before the end frame. The video frame timestamp is less than the Dialogue end time. [Num.] = the period (decimal point) key in the numeric keypad.
[Num1] Go to the end frame of the current Dialogue. The video frame next to the last frame of the current Dialogue. It's the first video frame after the current end time, on which you don't see the current Dialogue text anymore. The video frame timestamp is greater than or equal to the Dialogue end time. (NOTE: VSFilter is buggy if the end time is exactly equal to a video frame timing.)
[Ctrl]+[Num.] Go to the last frame of the previous Dialogue. Previous Dialogue in line-number order.

The "Timestamp" Editbox

Text example:
Frame 10000 (0:06:57.083 333 333)[ ][ ]( 29.5%) 24000/1001 fps > 0:06:57.08 (673.333,715.042) +282 -18

Field Example Note
Frame number Frame 10000 The number is 0-based. You can copy (i.e. send to the clipboard) the number by [Ctrl]+[F3].
Video timing 0:06:57.083 333 333 The part less than 1 nanosecond is rounded. If you ever need a more accurate value, hit [Alt]+[F3], and you have 50 digits after the decimal point.
Frame type [K] [K] means the frame is a keyframe. [F] also means the frame is a keyframe, but it is likely to be a forced keyframe, inserted even though it is not a scene change. [ ] means the frame is not a keyframe. Typically a forced keyframe occurs once in ten seoncds if there are no scene changes at all.
Percentage 29.5% The position of the frame in the video. 0% means the first frame, and 100% means the last frame.
FPS 24000/1001 fps Don't confuse 24000/1001 (23.97602...), 2997/125 (23.976), and 10000000/417083 (23.97604...): the difference is small, but could be critical in tyesetting. If you are not strict about them, you will easily get a subtitle whose start or end timing is off by one frame.
SSA style timestamp 0:06:57.08 To copy the current timestamp, hit [F3], or hit [G] (the shortcut keys you may use most frequently in this helper tool). The timestamp is normalized in such a way that (1) the largest timestamp is selected among the synonymous SSA timestamps, unless the margin is less than 0.5 milliseconds, when the second largest timestamp is used. As an exception, the SSA timestamp pointing to the frame 0 is always 0:00:00.00, the margin being 0.
t-values 673.333,715.042 Time arguments pointing to the start and end of the current video frame, in relation to the current Dialogue. The unit is millisecond. They are arguments you use in ASS commands such as {\t(t1,t2,...)}. Note that t-values will change if you select another synonymous SSA timestamp. Changing one synonymous SSA timestamp to another doesn't change the subtitle-video-frame timing, but it does change the nuance of ASS effects controlled by t-values, such as fade-in/out. Only shown when an ASS file is loaded.
Keyframe Distances +282 -18 The example means, the current frame is 282 frames after the previous keyframe and 18 frames before the next keyframe. If the current frame is a keyframe, it is reported as +0 -0.

The frame number is 0-based, which actually shows the number of elapsed frames from the beginning. The frame timestamp is shown in nanoseconds (less than 1 ns is rounded, not truncated). Also shown is an SSA/ASS-style timestamp ( for each video frame. The second timestamp is always a little smaller than the first one (Actual Timing), except when the first timestamp is ≦ 0.1 seconds, hence placed after the symbol >. This SSA/ASS timestamp is "normalized" in the recommended way. For more discussion, see Normalizing.

t value The t value is shown for each video frame, if both Video and ASS are loaded. This is the time in milliseconds relative to the ASS (Logical) Start Time of the Dialogue. For instance, the Dialogue that logically starts at 0:00:01.75 has t=335 (335.417) on Frame 50 at 24000/1001 fps (0:00:02.085 416 667):
2.085416667 - 1.75 = 0.335416667 sec = 335.416667 ms

This parameter is informative when you need to accurately control ASS tags such as {\t}, {\fad}, and especially {\move}. A command like {\move(0,1000,...)} usually doesn't result in a smooth movement, because the correct t value is generally not 0 on the first frame. In other words, this 0 means 0 relative to the Logical Start Time (Subtitle Start Time) s, and not to the Actual Start Time v, which is the 'next' (i.e. the smallest) Video Frame Timing greater than or equal to s (*). If, for instance, moving should start at t=5.333 and end at t=964.625, the accurate command would be {\move(6,965,... )}. When the moving is very rapid (e.g. 5000 pixels / second), the sub could logically move several pixels in 1 ms or an even shorter period, so if you assumed the start t to be 0 while it was actually 5.333, the sub would not be seen in its original position when actually observed on the first frame, but would be a little slid, and then suddenly would begin moving very fast starting from the second frame. Note that t=0 does not mean the moment when the subtitle first appears unless v-s happens to be 0. For the same reason, the start t should be rounded up, so that the moving would never take place before the actual timing.

The t value shown is relative to the Logical Start Time written in your ASS, which may not be normalized. After you set parameters for millisecond-sensitive commands, try not to re-select synonymous ASS timestamps. For instance, 0:00:01.74 might be synonymous with 0:00:01.75 as far as frame timing is concerned, yet changing 1.75 to 1.74 would increase the related t values by 10. You may want to normalize timestamps before working on details. The t2 value is also shown: t2 is the next video frame's t value, i.e. the t value at the very end of the current frame.

(*) NOTE: In theory, v should be able to equal to s. That is, the subtitle start time should be inclusive. Which is indeed true for Textsub.vdf and Subtitler.vdf, but unfortunately not generally true for VSFilter.dll. To avoid this confusion, subtract 1 unit (10 ms) from s if v-s is very small and s is not 0. This "anti-overnormalize threshold" is called "Margin" in a3r's Shift menu, the default value being 0.5 ms.

For Keyboard Users

You can make a selection in an editbox by [Shift] and navigation keys. When [Shift] is released, the selection is sent to Clipboard. To change the keyboard focus on the main window, hit the / key. The slash key is one-way ([Shift] + / doesn't work). Basically [Tab] works as if in a dialogbox too. You can use [Alt] + [Num 1~9] to move the cursor without a mouse. This is handy to set the cursor position delicately. [Q] works like a mouse click ( [Q] = Pick Color, [Alt] + [Q] = Pick Pos, etc.). Drawing by Keyboard is also possible. For instance, [Alt] + [Q] + [Num] will draw a rectangle and copy it as {\clip}; if [Shift] is pressed when [Q] is released, the rectangle will be copied as {\p1}...{\p0}. If you hit the [Delete] key when the main window has the keyboard focus, the keyboard focus moves to the main editbox. If you hit the [Delete] key when the main editbox or the timestamp editbox has the keyboard focus, the keyboard focus moves back to the main window.

"[Ins] then [A]"-style Hotkeys If you hit the [Insert] key, some of the succeeding keystrokes are interpreted as special kind of hotkeys. For instance, [Ins] then [O] will send a 'LATIN SMALL LETTER O WITH MACRON' (U+014D), ō, as Unicode text, to Clipboard. Similary, [Ins] then [Shift]+[O] will send a 'LATIN CAPITAL LETTER O WITH MACRON' (U+014C), Ō. These hotkeys are the same with the ones listed in the table in the Dialogbox popped up by [F4]. The other (non-assigned) keystrokes are simply ignored.

The "[Ins] then [A]"-type hotkeys are only valid for one second after [Ins] is released, and only once. If one second passes after [Ins] is released, the keystrokes are no longer interpreted specially. If, for instance, you hit [Ins], [O], [U] in this order, "[Ins] then [O]" would be interpreted and "[Ins] then [U]" wouldn't.

Note: You don't need to keep the [Ins] key pressed down while using these hotkeys (such as [O] or [Shift]+[O]). Press [Ins], release [Ins], then hit [O] or [Shift]+[O] will suffice, as long as it is within one second after [Ins] is released.

General Note

When a3r generates ASS commands, etc., the result may include debug information. This is because the current version is an early beta under testing. You can safely remove them.

Menu Overview


Opens a script (ASS/SSA) or loads an AVI file. The script can be practically in any encoding, but if the encoding is not autodetected, you'll be asked about it. If that is bothering, resave your script in Unicode (if UTF-8 put the BOM). Unknown encoding is never defaulted to the system's default Code Page, since a typesetter should sometimes handle files in different encodings (Win Latin, Shift_JIS, etc.) at the same time. UTF-8 without BOM is not autodetected either (theoretically impossible).

Shift/Normalize As... does frame-accurate (or subframe-accurate, if desired) time shifting for a specified range, and/or normalize the timestamps. To just normalize the timestamps, you can shift every Dialogue by 0 frames.

View File Info might give you some interesting information, such as dwStart, LAME tag, interleaving structure, and AVI JUNK.

Preview replays the video as softsubbing it by VSFilter. It will try to respect or ignore the LAME tag, if it exists, as you wish.

NOTE: LAME Tag handling is not tested well. Maybe wrong.

VBR MP3 and AC3 audio are supported only in newer versions ( For the details, see Supported A/V Format. The preview algorithm has been changed since The new one is more decent, but not well-tested, and may be unstable. Preview always starts from the current frame. If the current frame is before the Selection-End, then the preview will stop when it reaches the Selection-End; if the current frame is on or after the Selection-End, or no selection is made, preview doesn't stop until it reaches the last frame, or you pause it. To start from the Selection-Start, you need to hit [ to jump there first.

Reload or [F5] reopens the currently loaded file(s), refreshing the subtitle image.

Tools Overview

Fancy Note: Generates a stylish, animated note. The background is half-transparent rectangle with rounded corners.

Color Gradient: Generates color gradients. Vertical or horizontal. Not only for a colorful effect, but for giving a subtle tint when the color is too pure, somewhat like \be1.

Grad4v2: Tries to remove the foreground image, script-wise, faking up the background by interpolating the colors, using the pixels on the given four edges.

Striped Colors: Like Color Gradient, but the cells get two colors alternatively. The boundaries of areas can be diagonal too.

Generate Token/Line: Converts timed lines into untimed tokens (as a plain text file), as the first step of karaoke'ing. Simple, but a fast way to accurate karaoke.

Token/Line to Kara Lines: Make a basic karaoke script from timed tokens and timed lines.

Decorate Karaoke t/r: There are two totally different approaches in karaoke effects: temporal and spatial. t/r is temporal. You can specify things like "do this when activated" "do this when 100 milliseconds elapse since the event," and a3r automatically generates \t ... \r for each token. If you are a karaoke'er, probably you don't need any explanation.

Multistate Karaoke: Generates spatial karaoke effects (e.g. "do this 100 pixels left of the karaoke cusp" ). K-karaoke will be rewritten with \t and \clip. For this one, some explanation might be needed. Click the link for details.

Scan: Checks the \pos(x,y) and \clip(x1,y1,x2,y2) parameters for each glyph. a3r can also rewrite a Dialogue using one Dialogue for each glyph, as a starting point of per-glyph effects.

Special Characters: From this editbox, you can quickly copy-paste a special character commonly needed when typesetting. Some of commonly used ASS command combinations are also shown.

Detect Subtitle Overruns: Reports about possible subtitle overruns/underruns.

Verify Fonts in [Styles]: reports if a font specified as the [V4+ Styles] "Fontname" does not exist in your system. Also it detects problems about the "Encoding" parameters.

Font Viewer: Simple font viewer specifically designed for SSA/ASS typesetters. It reports Fontname and Encoding for SSA/ASS, the font's OS/2 table version. For a CJK font, both the native Unicode name and the ANSI name are reported.

Font Properties: directly reads the font file, and reports information from the 'name' table and the 'OS/2' table.

Run Calc.exe / [c]: Just launches Calc.exe.

Fix MP3: Fixes an MP3 file that doesn't begin by a complete MP3 frame.

Edit When copy/pasting image, CF_DIB is the first choice. Older versions use CF_BITMAP only, and may not be able to copy-paste to/from some tools.


"Go to Frame" Dialogbox

The "Go to Frame" dialogbox pops up when you hit [Num/] or [Ctrl]+[G], where you can specify the frame to jump to by the frame number itself, by the timestamp, or by the percentage. Basically, unrecognized characters are ignored. Starting with version, you can also specify the offset and/or the new cursor position.

Text You Enter Meaning Note
12345 Frame 12345 Frame numbers are 0-based, same as in VirtualDub or Avisynth. The first frame is 0, the second frame is 1, and so on.
1:2 Timestamp 0:01:02.00 If the input contains a colon, it is usually parsed as a timestamp. You can omit the leading zero. Also, you can use [Space] or [+] or [-] to input ":" (they are easier to type) unless the text contains "(".
0:01:23.45 or 1:23.45 Timestamp 0:01:23.45 You must use "." as a decimal point; "," doesn't work.
4: Timestamp 0:04:00.00 If the string ends in ":", ":0" is implied. You can quickly jump to the frame at 4:00 by hitting [Num/], [4], [Space], [Enter].
33.3% 33.3% of the current video Would be Frame 3330 if the number of frames was 10000.
12345(6) Frame 12345, Offset +6 Jump to Frame 12339. An integer surrounded by "(" and ")" after the frame number, the timestamp, or the percentage is understood as the offset unless a comma is included.
12345a Frame 12345, Offset +1 Jump to Frame 12344. The character "a" coming right after the frame number is an alias to "(1)", specifying 1-based frame numbers. Our Frame 12344 is called "12345" by AviUtl in the default settings or any other application that calls the first frame "1", and here "12345a" means "Go to the frame called 12345 by AviUtl", that is Frame 12344 if you call the first frame "0" as we do.
12345(100,200) Frame 12345, {\pos(100,200)} Jump to the frame and move the mouse cursor to the specified position. Two integers seperated by a comma, surrounded by "(" and ")" after the frame number, the timestamp, or the percentage are understood as coordinates.
(100,200) {\pos(100,200)} Move the cursor to the specified position in the current frame. You cannot specify the offset in this case.
12345(-1)(100,200) Frame 12345, Offset -1, {\pos(100,200)} You can specify the offset and the position at the same time, whichever may come first, after the frame number, the timestamp, or the percentage.

Video–22: The above tools didn't work for a large file. Also the tools were buggy and imperfect. For instance, JUNK Viewer didn't dump non-top-level 'JUNK' chunks. The above tools work also for an AVI file larger than (or equal to) 2 GiB, i.e. an OpenDML AVI file with RIFF 'AVIX' chunks. 'JUNK' in 'LIST' is searched for recursively, except in LIST 'movi'. Can import a "Scene-change frame" list, enabling to seek to the next/prev SC frame. The list file must be an ASCII plain text. The frame number can be either 0-based or 1-based, automatically detected. Also you can export the keyframe list. (Shortcut keys changed in



Free (GPL).


If you have any trouble, you might want to contact the author through the email address in this picture

More History