<pclass="rvps7"><spanclass="rvts20">Taseditor combines multiple experimental ideas into single system. Many of these ideas appeared long ago (see topics on the forum, like "</span><aclass="rvts24"href="http://tasvideos.org/forum/viewtopic.php?t=4559"target="_blank">dream tool</a><spanclass="rvts20">", etc.), but it took a long time to implement them in terms of a consistent system.</span></p>
<pclass="rvps7"><spanclass="rvts20">The underlying idea of Taseditor is the Piano Roll interface that allows user to interact with the movie in a very intuitive from. The first mention of the need for a Piano Roll-based TAS tool sounded back in </span><aclass="rvts24"href="http://tasvideos.org/forum/viewtopic.php?p=38496#38496"target="_blank">2005</a><spanclass="rvts20">, perhaps even earlier. A prototype called TASEdit was made in 2008. The final vision of Taseditor was formed in September 2011 and was improved during the course of development until the summer of 2012. In addition to the ideas implemented at that time, many promising but minor or hard-to-implement ideas were invented and postponed for the future.</span></p>
<liclass="rvps7"><spanclass="rvts20">It is a significantly redesigned List (ListView) or Table (GridView) component. Columns of the List correspond to Input buttons, rows of the List correspond to movie frames. The number of rows (lines) in the List is regularly updated automatically to match the number of frames in the current movie. The lines are numbered from top to bottom, starting from zero. The line number is equal to the number of frame associated with this line. The number of columns depends on the movie type (on the number of joypads and the number of buttons).</span></li>
<liclass="rvps7"><spanclass="rvts20">To the left from the Input columns there are two additional columns in the List. The first column (width ~17 pixels) is responsible for displaying icons and controlling the Playback cursor. Current Playback cursor position is displayed with a light-blue arrow icon. When you left-click on that column, the Playback cursor is sent to the appropriate frame, and then you can drag the cursor by moving the mouse, until you release the left button.</span></li>
<liclass="rvps7"><spanclass="rvts20">The second column (75 pixels wide) is responsible for displaying frame numbers and Markers, and for controlling the Selection and Markers. A single left-click on the column changes the Selection (and then you can stretch it by dragging). A double-click on a frame number puts a Marker there and starts dragging this Marker until you release the left mouse button.</span></li>
<liclass="rvps7"><spanclass="rvts20">The List Header displays names of the columns. The first column (icons column) does not have a name, the second column is called "Frame #" (frame number), the remaining columns are named with corresponding joypad button symbols. The same symbol appears in the cells of the column on the rows where the button is pressed. The user can click any cell of the List Header in order to change the appropriate button Input in the selected frames. Click the "Frame #" to change Markers in the selected frames.</span></li>
<liclass="rvps7"><spanclass="rvts20">In addition, the Header serves as an indicator of the pressed joypad buttons. And during Input Recording, the recorded symbols flash in the Header.</span></li>
<liclass="rvps7"><spanclass="rvts20">Input columns show the state of every joypad button for each frame of the movie. To see the state of the button of interest, you need to visually find the point of intersection of the frame row and the button column. If this cell contains a button symbol, then the button is pressed in this frame. If that cell is empty or has a dash, then the button is released. By left-clicking on any Input cell you can invert the state of the corresponding button. Also, if you hold the left mouse button, you can draw or erase Input in neighboring frames by moving your mouse up or down.</span></li>
<liclass="rvps7"><spanclass="rvts20">Piano Roll lines are colored with different pastel colors, so the frame numbers (black symbols) and the buttonpress symbols (dark-colored symbols) are always clearly visible on the pastel background. By the color of a Piano Roll line you can immediately determine if this movie frame is inside the Greenzone, whether there is lag in that frame, whether the given frame is currently displayed in the emulator window, and is the frame selected or not. Also, additional colors can focus the user's attention on specific frames, for example, on the target frame of seeking (flashing light-blue line) or the undo keyframe (purple line). In addition, by the background color of the frame numbers the user can see if there is Marker on the frame (yellow color).</span></li>
<liclass="rvps7"><spanclass="rvts20">The coloring of the Piano Roll cells also depends on the column (although to a lesser extent). Icon column always appears in white. Frame numbers column is displayed with pale shade of the current line color. The columns of the 1st (and 3rd) joypad buttons appear in normal shade of the current line color (green, red, blue, etc.), and the columns of the 2nd (and 4th) joypad buttons are displayed in a slightly tinted shade of this line color.</span></li>
<liclass="rvps7"><spanclass="rvts20">The visible area of the Piano Roll can be scrolled with the mouse wheel or by using the scrollbar, or a variety of other </span><aclass="rvts24"href="Navigation.html#scrolling-piano-roll">navigation methods</a><spanclass="rvts20">. Such multitude of methods is meant to speed up the navigation to any desired segment of the movie, since only a limited number of lines can be displayed on screen at any given moment. This number depends on the current Piano Roll height in pixels, which depends on the current TAS Editor window height.</span></li>
<pclass="rvps7"><spanclass="rvts20">As in any other editor, in Taseditor the Selection is used to apply an operation to multiple frames at once. But in addition, here the Selection also serves as a pointer (cursor) to the last edited Input location.</span></p>
<liclass="rvps7"><spanclass="rvts20">The Selection is stored as a list of numbers of frames that are considered selected.</span></li>
<liclass="rvps7"><spanclass="rvts20">Taseditor also stores the Selections Log in memory, as an array of lists. The array size is equal to the the History Log size. You can return to the previous selections with </span><spanclass="rvts27">Ctrl + Q</span><spanclass="rvts20"> and </span><spanclass="rvts27">Ctrl + W</span><spanclass="rvts20">. This is useful for tracking the recent history of clicks on the Piano Roll.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Piano Roll column of frame numbers is used to control the Selection. If you hold the left button after you click on the frame number, you can stretch the Selection to adjacent frames. If you hold down the </span><spanclass="rvts27">Ctrl</span><spanclass="rvts20"> key before clicking on a frame number, the previously selected frames remain highlighted, but if you make a simple click on a frame number or on Input, the current selection disappears (moves into the Selection history), and a new selection is created instead, consisting of one frame (which was clicked). If you hold down </span><spanclass="rvts27">Shift </span><spanclass="rvts20">before clicking on a frame number, you will select all the frames starting from the old Selection to the clicked frame. If you hold down </span><spanclass="rvts27">Alt </span><spanclass="rvts20">before clicking on a frame number, a pattern-based Selection will appear. Selection also changes when you click on Input cells, but only if the modifier keys are not held.</span></li>
<liclass="rvps7"><spanclass="rvts20">The topmost selected frame is called Selection cursor. If currently not a single frame is selected, it is implied that the Selection cursor points to the frame -1. This is necessary in some situations, for example, when there's no Selection, the bottom edit field displays the Note of the zeroth Marker.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Selection Log (including the current Selection) is saved and loaded from the project file. When you change the "max undo levels" setting, it will change both the size of the History Log and the Selection Log.</span></li>
<liclass="rvps7"><spanclass="rvts20">While inserting and removing frames, the current Selection is automatically shifted up or down by a corresponding number of lines, in order to remain in the same position (relative to Input).</span></li>
<liclass="rvps7"><spanclass="rvts20">Current Selection can be moved (</span><spanclass="rvts27">Ctrl + Up</span><spanclass="rvts20"> / </span><spanclass="rvts27">Ctrl + Down</span><spanclass="rvts20"> / </span><spanclass="rvts27">Ctrl + Home</span><spanclass="rvts20"> / </span><spanclass="rvts27">Ctrl + End</span><spanclass="rvts20">). If some part of the Selection goes beyond Piano Roll, this part disappears. That is, the user can not select any frame beyond the current movie.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Selection cursor can jump on Markers (</span><spanclass="rvts27">Ctrl + Page Up</span><spanclass="rvts20"> / </span><spanclass="rvts27">Ctrl + Page Down</span><spanclass="rvts20">), with each jump the current Selection goes to History and a newly selected frame appears at the next Marker.</span></li>
<liclass="rvps7"><spanclass="rvts20">The visible area of the Piano Roll always follows the Selection. If the selection does not fit the screen, Piano Roll scrolls in such a way that the Selection cursor is in the middle, but if the selection fits, the Piano Roll shows all selected frames.</span></li>
<liclass="rvps7"><spanclass="rvts20">The bottom text edit field displays the Note of the nearest Marker above the Selection cursor. This text is updated every time the Selection changes or you change Markers.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you press </span><spanclass="rvts27">Ctrl + A</span><spanclass="rvts20">, the current Selection goes to History, and instead it selects the frames starting with the nearest Marker above the Selection cursor and ending with the next Marker (not including that Marker). This way you can select the whole segment. At the second </span><spanclass="rvts27">Ctrl + A</span><spanclass="rvts20"> press, the Selection changes to a set of frames between the Markers, not including the upper and lower Markers. On the third </span><spanclass="rvts27">Ctrl + A</span><spanclass="rvts20"> press, the Selection will change to a set of frames between the Markers, excluding the upper but including the lower Marker. Finally, the fourth </span><spanclass="rvts27">Ctrl + A</span><spanclass="rvts20"> pressing modifies the Selection into a set of frames between the Markers, including both Markers. All the next </span><spanclass="rvts27">Ctrl + A</span><spanclass="rvts20"> presses will repeat these four versions of the selection.</span></li>
<pclass="rvps7"><spanclass="rvts20">When editing large movies, the user may need to set some marks on the Piano Roll lines, in order to distinct these lines visually from their neighbors. After a series of improvements, that simple idea evolved into a versatile feature.</span></p>
<liclass="rvps7"><spanclass="rvts20">Any frame of the movie can be marked. If necessary, the user can even mark all movie frames. Also, you can leave a mark, say, on a frame 1200, and then truncate the Input after frame 1000, leaving the Input-detached Marker outside the movie boundary. This Marker will remain in the project. To see it, you would need to emulate the game up to frame 1200 again, so the Piano Roll displays the marked line.</span></li>
<liclass="rvps7"><spanclass="rvts20">Unmarked Piano Roll lines are displayed in normal colors, but in the marked lines the frame number cell is colored yellow. This color is chosen because Markers are intended to attract user's attention. Also the numbers of marked frames are written using special font, so that the Marker presence can be guessed even when the yellow background is covered by the blue Selection color.</span></li>
<liclass="rvps7"><spanclass="rvts20">Markers can be attached to the Input (then they are displayed by pale yellow), or can be detached (displayed by more saturated yellow). When the Markers are attached, they are affected by all operations that move Input up/down, and affected by Input truncation.</span></li>
<liclass="rvps7"><spanclass="rvts20">A Marker can be set by double-clicking (with the left mouse button) on the desired frame number. If you double-click on an already existing Marker, you will start dragging it until you release the left button. So you can move the Marker to another frame, or remove a Marker by throwing it away from the Piano Roll. When you drag it, a Marker image is hanging under the mouse cursor, looking like a yellow rectangle with the number of the frame it was taken from. To cancel the dragging, either drop the Marker on the same cell, or drop it on any Input cell.</span></li>
<liclass="rvps7"><spanclass="rvts20">Markers can also be created and removed using the context menu or by clicking on the "Frame#" caption.</span></li>
<liclass="rvps7"><spanclass="rvts20">Usually Markers are placed far from each other, so there are intervals of unmarked frames between them. Therefore, Markers can be used not only as color highlighting for special frames, but also as border marks for movie segments. The following terminology is used: each Marker corresponds to the movie segment that starts with the marked frame and ends with the last unmarked frame. For example, if Markers are set at the frames 10 and 20, we are calling the range of frames 10-19 as a "segment of the first Marker", and the segment of the second Marker consists of all the frames from the frame 20 to the last movie frame.</span></li>
<liclass="rvps7"><spanclass="rvts20">The intervals between the Markers can be crossed by jumping from the current Marker to the next one (or previous). This allows to speed up the navigation through the movie in some cases.</span></li>
<liclass="rvps7"><spanclass="rvts20">With the </span><spanclass="rvts22">Select between Markers</span><spanclass="rvts20"> function (</span><spanclass="rvts27">Ctrl + A</span><spanclass="rvts20">) the user can quickly select all frames in the current Marker segment. Thus Markers can accelerate not only navigation, but also editing.</span></li>
<liclass="rvps7"><spanclass="rvts20">Each Marker has a text Note. After Marker creation it is empty. The user can view and edit the Note using any of the two text edit fields. In the upper edit field you can see the Note of the Marker above the current Playback cursor. The lower edit field displays the Note of the Marker above the Selection cursor. So, to edit the desired Note, you must first put one of the two cursors below desired Marker or right into the Marker. In theory it sounds awkward, but in Taseditor the general workflow ensures that one of the cursors is usually located under the needed Marker.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Note size is limited by one hundred of characters, because Notes are not intended to store long texts, they are for short comments, tags and similar kinds of napkin notes. In an extreme case you can always place multiple Markers in a row and break the long text into several adjacent Notes.</span></li>
<liclass="rvps7"><spanclass="rvts20">You can make a regular search through Notes text (Find Note) or fuzzy search (Similar/More). See more in </span><aclass="rvts24"href="AdvancedFeatures.html#UsingMarkers">Advanced Features</a><spanclass="rvts20">.</span></li>
<liclass="rvps7"><spanclass="rvts20">Markers are saved and restored from the Bookmark branches along with Input. Each Marker operation is recorded to History Log the same way as Input operations. Also, the current state of Markers is saved into the project file, right after saving the Input data.</span></li>
<pclass="rvps7"><spanclass="rvts20">Taseditor paints text symbols in the Input cells by different colors, depending on the time of editing the cell. For details, see </span><aclass="rvts24"href="PianoRoll.html#HotChanges">Program Interface</a><spanclass="rvts20"> and </span><aclass="rvts24"href="ProgramCustomization.html#EnableHotChanges">Program Customization</a><spanclass="rvts20">.</span></p>
<liclass="rvps7"><spanclass="rvts20">Taseditor stores the hotness value for all the Input cells, despite the fact that majority of them has zero hotness. It is necessary for the rare occasions when almost all movie cells become mass-changed (e.g, </span><aclass="rvts24"href="Operations.html#Import">Import </a><spanclass="rvts20">or </span><aclass="rvts24"href="Operations.html#Paste">Paste</a><spanclass="rvts20"> operations). Thus the array of Hot Changes takes a lot of memory, but it is well compressed and takes little space on the disk.</span></li>
<liclass="rvps7"><spanclass="rvts20">Using 16 shades of color, so that one byte can fit the data about hotness of 2 cells. Also, it makes no sense to add more grades, since the human eye will hardly distinguish them, while the value of the Hot Changes is in the ability to quickly estimate Input without long deliberation.</span></li>
<liclass="rvps7"><spanclass="rvts20">The state of the current Hot Changes map changes only when a new item is added to the History Log (and during History undos).</span></li>
<liclass="rvps7"><spanclass="rvts20">when changing Input, all old cells lose one level of hotness, and changed cells gain maximum level</span></li>
<liclass="rvps7"><spanclass="rvts20">when removing frames, old cells lose one hotness level</span></li>
<liclass="rvps7"><spanclass="rvts20">when inserting frames, old cells lose one hotness level, and all the inserted frames cells appear with maximum level</span></li>
<liclass="rvps7"><spanclass="rvts20">when editing Markers or Bookmarks, and when truncating the movie, Hot Changes do not change</span></li>
<liclass="rvps7"><spanclass="rvts20">when loading a Bookmark, the current Hot Changes are replaced by the Hot Changes from the Bookmark branch</span></li>
<liclass="rvps7"><spanclass="rvts20">when importing Input, the old cells are reset to zero hotness, and changed cells gain maximum level</span></li>
<pclass="rvps7"><spanclass="rvts20">Since the Piano Roll interface provides the user with almost instant editing of the Input of any frame, it is also desirable to provide the ability to instantly view the game state at any given frame. This is accomplished by caching the data on all emulated game states.</span></p>
<liclass="rvps7"><spanclass="rvts20">The Greenzone is an array of data about the Output of the game, retrieved at the beginning of each frame. That is, the item #0 stores the game state before any emulation started, the item #1 stores the game state before emulating the second frame (the frame with number 000001), and so on. Besides the savestates the Greenzone stores the Lag Log that corresponds to the Input of the current movie. It's also theoretically possible to store other information.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Greenzone starts with zeroth frame and has a lower boundary (head) – the frame number after which the Greenzone has no information about future game states (however, there may still be some information about the Lag of those frames).</span></li>
<liclass="rvps7"><spanclass="rvts20">The game data is collected into the Greenzone at the beginning of each frame (before emulation) in the following way: if the Greenzone array item with the number equal to the current frame is empty, or the position of the Greenzone head is smaller than the current frame number, then the array item is filled with information about the current game state (from emulator), and the Greenzone head moves forward if necessary.</span></li>
<liclass="rvps7"><spanclass="rvts20">To save some memory, the Greenzone is rarefied periodically, removing the savestates (but not the Lag Log data) of some early frames that are left too far from the Playback cursor. For details, see </span><aclass="rvts24"href="ProgramCustomization.html#SetGreenzonecapacity">Program Customization</a><spanclass="rvts20">.</span></li>
<liclass="rvps7"><spanclass="rvts20">All the Greenzone data together with the Lag Log is saved and loaded from the project file. After loading the project, Taseditor restores the Playback cursor state using the Greenzone.</span></li>
<liclass="rvps7"><spanclass="rvts20">Any change of the current movie Input forces the Greenzone remove the savestates of all frames after the first edited frame, not including the frame. This is accomplished by reducing the position of the Greenzone head and removing the outdated information from an array of savestates (but without freeing the memory, because the place of the old savestates will soon be taken by the new data of about the same size).</span></li>
<liclass="rvps7"><spanclass="rvts20">The Playback cursor must always be is inside the Greenzone, in order to avoid displaying the irrelevant game states on the FCEUX screen. So the Greenzone truncation may also move the Playback cursor.</span></li>
<liclass="rvps7"><spanclass="rvts20">When creating a Bookmark, the savestate of the bookmarked frame and the whole Lag Log are copied into it. When loading this Bookmark, the Greenzone is first truncated (because of the Input change), but then the bookmarked savestate and the relevant part of the bookmarked Lag Log are restored, and the Greenzone head position is moved, if necessary.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Greenzone data is used for coloring the Piano Roll lines and the Bookmarks List items. The Lag Log stores information independently from savestates stored in the Greenzone. Every item of the Lag Log can have one of the three possible values: LAG=YES, LAG=NO, LAG=DONTKNOW.</span></li>
<liclass="rvps7"><spanclass="rvts20">The lag information for the Lag Log is collected at the same time when collecting the current game state to the Greenzone. That is, before emulating the current frame. At this point the emulator has knowledge about the previous frame lag, so at the frame 000020 we can store the lag data to the cell 19. Also, during this time the </span><aclass="rvts24"href="Operations.html#AdjustLag">AdjustLag</a><spanclass="rvts20"> operation can fire off and shift the entire following Input up or down. The Input is shifted up, if in the previous frame the Lag Log has LAG=YES, and the emulator says there was no lag in previous frame. The Input moves down if the Lag Log has LAG=NO in the previous frame, and the emulator says there was lag. Together with the Input this operation shifts all subsequent items of the Lag Log get, so that the red lines of the Piano Roll are still consistent with the shifted Input gaps.</span></li>
<liclass="rvps7"><spanclass="rvts20">The main attribute of the Playback is the "currently played movie frame", the frame whose screenshot is displayed at the emulator window at the moment. This frame corresponds to the light-blue line in the Piano Roll, which is called Playback cursor. Since the Playback cursor is tied to the state of the emulated game, you can use it not only as an indicator, but as a control too. E.g. to see the frame of interest on the FCEUX screen, you need to put the Playback cursor to the line with that frame number. There are </span><aclass="rvts24"href="Navigation.html#playback-cursor">many ways</a><spanclass="rvts20"> to do this.</span></li>
<liclass="rvps7"><spanclass="rvts20">When the user sends the Playback cursor on a frame contained in the Greenzone, the emulated game state is recovered from the corresponding savestate. Since there was no emulation in this case, Taseditor has to simulate the events "frame boundary" and "frame begin"/"frame end", so that the respective Lua functions could fire off.</span></li>
<liclass="rvps7"><spanclass="rvts20">When the user sends the Playback cursor on a frame outside the Greenzone, Taseditor restores the game state from the nearest preceding frame that has the Greenzone savestate, and then starts seeking to the desired frame. "Seeking" is the emulation which automatically stops when the target frame is reached. When the Playback is seeking, a copy of the light-blue cursor flashes at the target frame in the Piano Roll.</span></li>
<liclass="rvps7"><spanclass="rvts20">Seeking is based on the following assumption. Since the emulator provides determinism, the game state for any frame is guaranteed to be obtained by using the initial game state (the movie beginning state) and the Input of the movie. Moreover, you can get the required state using the state for any previous frame (any Greenzone savestate) and the Input of the movie.</span></li>
<liclass="rvps7"><spanclass="rvts20">The seeking process is indicated by the progressbar, in order to let the user estimate the waiting time if seeking takes too long. When there is no seeking, the progressbar is full during pause and empty during emulation.</span></li>
<liclass="rvps7"><spanclass="rvts20">The seeking can be done at the highest possible emulation speed. In this case the seeking will be finished instantly (for relatively small segments).</span></li>
<liclass="rvps7"><spanclass="rvts20">In many cases it is useful to automatically stop emulation at the last frame of the movie Input. The </span><aclass="rvts24"href="ProgramCustomization.html#AutopauseattheendofMovie">Autopause at the end of Movie</a><spanclass="rvts20"> option serves for this. When the emulator is paused, if the Playback cursor is not on the last movie frame, the Playback sets the "automatic stop" flag. And if the user releases the pause, the Playback automatically stops when it reaches the last movie frame. Thanks to it, the Playback cursor will not run away when the pause is released.</span></li>
<liclass="rvps7"><spanclass="rvts20">In most cases the user does not want to automatically scroll the Piano Roll after the Playback cursor when the cursor moves itself. But for the cases when it is needed, there is the "Follow cursor" checkbox.</span></li>
<pclass="rvps7"><spanclass="rvts20">When making speedruns, TASer is trying to beat his record on each segment. In most cases the optimality criterion is </span><spanclass="rvts31">the number of frame where the target event of the segment occurs</span><spanclass="rvts20">. To detect the frame, TASer moves the Playback cursor while watching the FCEUX screen, and stops this manual search when he detects the beginning of the event of interest. Then the Playback cursor is usually left at this frame, and the TASer starts to change the Input on the segment (above the Playback cursor), hoping to improve the old approach and get the same event at an earlier frame.</span></p>
<pclass="rvps7"><spanclass="rvts20">While changing Input, the Greenzone becomes truncated and the Playback cursor jumps up. When the TASer believes that the Input was changed enough, he starts checking the game Output in order to determine at which frame the target event occurs now. For this, he moves the Playback cursor again while watching the FCEUX screen.</span></p>
<pclass="rvps7"><spanclass="rvts20">To conclude an improvement, the TASer needs to compare the old frame number (detected last time) and the new number, detected just recently. Taseditor visualizes this data to the user, so that he doesn't need to keep the numbers in mind. The new number is indicated by the Playback cursor, the old number is shown by the green arrow.</span></p>
<liclass="rvps7"><spanclass="rvts20">Thus the actual name of the green arrow is "last position of the Playback cursor".</span></li>
<liclass="rvps7"><spanclass="rvts20">The more universal replacement of the green arrow would be Bookmarks and Markers that can be set manually.</span></li>
<liclass="rvps7"><spanclass="rvts20">The icon of the green arrow appears in the icons column of the Piano Roll. When drawing icons in Piano Roll, the green arrow has priority over the blue arrow (the Playback cursor icon), since the position of the blue cursor can be defined by the other columns.</span></li>
<liclass="rvps7"><spanclass="rvts20">The green arrow appears on the frame of the Playback cursor at the moment of Greenzone truncation. And it remains on that frame until the user performs the following sequence of actions:</span></li>
<liclass="rvps7"><spanclass="rvts20">Thus the green arrow will not change its position when the Greenzone is truncated twice in a row without an emulation between (e. g. the TASer changed Input on the frame 90 and then on the frame 80, but the green arrow remains on the frame 100).</span></li>
<liclass="rvps7"><spanclass="rvts20">Also, the green arrow does not change its position when the Greenzone is truncated during seeking, granted that the emulator is unpaused at the moment.</span></li>
<liclass="rvps7"><spanclass="rvts20">The green arrow does not change its position during operations </span><aclass="rvts24"href="Operations.html#AdjustLag">AdjustLag</a><spanclass="rvts20">, </span><aclass="rvts24"href="Operations.html#Branch">Branch</a><spanclass="rvts20">, </span><aclass="rvts24"href="Operations.html#Record">Record</a><spanclass="rvts20">.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you press the middle mouse button, the Playback starts seeking to the green arrow, if the arrow is outside the Greenzone. But if the arrow is inside the Greenzone, it means the current segment has been already watched, and the automatic pause on the green arrow is not needed anymore.</span></li>
<pclass="rvps7"><spanclass="rvts20">When making any TAS, the optimality criterion may be either </span><spanclass="rvts31">the game state on a certain frame</span><spanclass="rvts20">, or </span><spanclass="rvts31">the sequence of events on the segment</span><spanclass="rvts20">. TASer watches the segment and leaves the Playback cursor on the last frame of the segment, then he changes the segment Input and watches the segment again, stopping the Playback cursor on the same frame as last time. TASer makes the conclusion about the improvement either while watching the segment events, or after stopping the emulation and evaluating the properties of the final frame.</span></p>
<pclass="rvps7"><spanclass="rvts20">That process can be automated by auto-starting the seeking to the green arrow after every Greenzone truncation. The "Auto-restore last position" checkbox serves for this purpose.</span></p>
<liclass="rvps7"><spanclass="rvts20">When the checkbox is enabled, the Playback starts seeking to the green arrow right after the Greenzone truncation.</span></li>
<liclass="rvps7"><spanclass="rvts20">If the Greenzone was truncated during seeking, the original seeking will be resumed without changing the target frame. But if the seeking was paused at the moment of the Greenzone truncation, the original seeking is canceled and a new seeking will start, targeting the green arrow. The implication is that if TASer did not wait for the finish of seeking, and instead he paused the emulator and started to change the Input on the current segment, then TASer has focused on a subsegment, so the further auto-restore should run only for this subsegment.</span></li>
<liclass="rvps7"><spanclass="rvts20">Auto-restoring does not start during operations </span><aclass="rvts24"href="Operations.html#AdjustLag">AdjustLag</a><spanclass="rvts20">, </span><aclass="rvts24"href="Operations.html#Branch">Branch</a><spanclass="rvts20">, </span><aclass="rvts24"href="Operations.html#Record">Record</a><spanclass="rvts20">. When the </span><aclass="rvts24"href="Operations.html#AdjustLag">AdjustLag</a><spanclass="rvts20"> operation fires off, the movie playing is not affected.</span></li>
<pclass="rvps7"><spanclass="rvts20">The Recorder is a meeting of all functions for editing Input on the frame pointed by the Playback cursor. The Recorder provides TASer with the second way to edit Input – by recording.</span></p>
<liclass="rvps7"><spanclass="rvts20">Multitracking allows TASer to change the data of only one selected joypad in Recording mode, leaving the other joypads data on the same frames intact. For details, see </span><aclass="rvts24"href="Toolbox.html#multitracking">Toolbox</a><spanclass="rvts20">.</span></li>
<liclass="rvps7"><spanclass="rvts20">When Recording mode is on, at the beginning of every frame the emulator polls virtual joypads and writes the data to the current movie. Then it immediately passes control to the Recorder.</span></li>
<liclass="rvps7"><spanclass="rvts20">uses the data from the movie (from the frame under the Playback cursor) as newly recorded data, or (if recording the pattern, and "no presses" need to be recorded now) uses nil as the newly recorded data</span></li>
<liclass="rvps7"><spanclass="rvts20">compares the newly recorded data to the old data stored in the History Log</span></li>
<liclass="rvps7"><spanclass="rvts20">imposes the filter over the changes, according to the currently selected multitracking mode</span></li>
<liclass="rvps7"><spanclass="rvts20">selectively combines old and new data, according to the "Superimpose" checkbox</span></li>
<liclass="rvps7"><spanclass="rvts20">saves the resultant changes to the current movie</span></li>
<liclass="rvps7"><spanclass="rvts20">calls the History Log to let it create a new item and then truncates the Greenzone</span></li>
<liclass="rvps7"><spanclass="rvts20">returns control to the emulator</span></li>
<liclass="rvps7"><spanclass="rvts20">Emulator returns the current movie data (from the frame under the Playback cursor) to virtual joypads, in order to use the data for the frame emulation. Also, at this moment the emulator executes the recorded commands (reset, etc.).</span></li>
<liclass="rvps7"><spanclass="rvts20">Each frame, the Recorder gets information from the emulator about the currently pressed buttons of virtual joypads and prepares certain information for the Piano Roll, the information about which columns in the Piano Roll Header should glow green. For example, if you have selected the "2P" radiobutton and checked the "</span><aclass="rvts24"href="ProgramCustomization.html#Use1PkeysforallsingleRecordings">Use 1P keys for all single Recordings</a><spanclass="rvts20">", that means when you press </span><spanclass="rvts26">A</span><spanclass="rvts20"> on the first joypad, the Piano Roll Header will highlight the "A" symbol of the second joypad. And if the </span><spanclass="rvts26">A</span><spanclass="rvts20"> button wasn't held in previous frame, the Recorder considers this in accordance with the "</span><aclass="rvts24"href="ProgramCustomization.html#UseInputkeysforColumnSet">Use Input keys for Column Set"</a><spanclass="rvts20"> checkbox.</span></li>
<pclass="rvps7"><spanclass="rvts20">Lua allows the user to expand Taseditor capabilities, in particular, it provides the TASer with the third way to edit Input – by automatic generation.</span></p>
<liclass="rvps7"><spanclass="rvts20">Lua interpreter calls the appropriate Taseditor function not directly but through Taseditor's gateway (taseditor_lua).</span></li>
<liclass="rvps7"><spanclass="rvts20">When some function from the "taseditor" library fires off, Lua interpreter takes the arguments data from the stack, converts it to a format accepted by Taseditor's gateway, and sends it to the appropriate function of the Lua gateway of Taseditor.</span></li>
<liclass="rvps7"><spanclass="rvts20">The gateway calls the appropriate functions of Taseditor and sends the result back to the Lua interpreter.</span></li>
<liclass="rvps7"><spanclass="rvts20">Lua interpreter puts the returned data to the stack, converting the data to a format accepted by Lua code if necessary.</span></li>
<liclass="rvps7"><spanclass="rvts20">The functions </span><spanclass="rvts61">submitinputchange()</span><spanclass="rvts20">, </span><spanclass="rvts61">submitinsertframes()</span><spanclass="rvts20"> and </span><spanclass="rvts61">submitdeleteframes()</span><spanclass="rvts20"> do not cause immediate change of the movie data, but only create an entry in the array of the postponed jobs, stored in Taseditor's Lua gateway. All the postponed jobs are executed when the </span><spanclass="rvts61">applyinputchanges()</span><spanclass="rvts20"> function is called. Thanks to this, a Lua script can apply many changes to the movie at once, creating only one item in the History Log.</span></li>
<pclass="rvps7"><spanclass="rvts20">Bookmarks are a specialized alternative to Markers. And branches are needed to store several movies in a single project. So, to simplify the creation and navigation through branches, they are assigned to Bookmarks, by analogy with the traditional savestates.</span></p>
<liclass="rvps7"><spanclass="rvts20">A project can store up to 10 Bookmarks. This limitation is due to the number of the numeric keys on the keyboard. Also, such a restriction allows Taseditor to display basic information about all the Bookmarks at once, with no need for scrolling. In addition, the long-term experience of traditional TASing confirms that this number of slots for Bookmarks is enough for productive TASing.</span></li>
<liclass="rvps7"><spanclass="rvts20">A Bookmark can be set at any frame of the movie. Bookmarks will not disappear even when the movie is truncated. For example, if you set a Bookmark to the frame 1200 and then truncate the Input after frame 1000, a Bookmark will remain beyond the movie boundary, and if you jump to the Bookmark, the movie will expand to frame 1200.</span></li>
<liclass="rvps7"><spanclass="rvts20">Bookmarks are displayed in the Piano Roll as icons with corresponding digits (slot numbers). A Bookmark that corresponds the current movie branch is shown by the blue-colored digit, other Bookmarks are displayed by green digits.</span></li>
<liclass="rvps7"><spanclass="rvts20">A Bookmark can be set by pressing the corresponding hotkey (each slot has a dedicated hotkey for saving) or by right-click on the Bookmark slot. The Bookmark is set to the frame where the Playback cursor currently is. This frame number is stored in the Bookmark, and in the future you can always send the Playback cursor on that frame by clicking with the left mouse button over the Bookmark slot, or pressing the hotkey (each slot has a dedicated hotkey for jumping). "Jump to Bookmark" is not an operation, because no change is made to the movie.</span></li>
<liclass="rvps7"><spanclass="rvts20">When setting a Bookmark, Taseditor checks whether the newly saved data differs from the data already contained in this Bookmark slot. If there's no difference, the </span><aclass="rvts24"href="Operations.html#Bookmark">Bookmark</a><spanclass="rvts20"> operation is not performed.</span></li>
<liclass="rvps7"><spanclass="rvts20">In addition to storing the frame number, all movie data is also stored in the Bookmark slot (Input type, Input, Hot Changes, Markers). In future, the current movie may be changed many times, but you can always return back to the state of the movie stored in this Bookmark.</span></li>
<liclass="rvps7"><spanclass="rvts20">In addition, each Bookmark also stores the screenshot of the FCEUX screen at the time of bookmarking, allowing you to quickly see the contents of the Bookmark without loading it. Also it stores a copy of one savestate from the Greenzone (on the bookmarked frame), allowing to immediately put the Playback cursor on the Bookmark frame after loading the branch.</span></li>
<liclass="rvps7"><spanclass="rvts20">After setting a Bookmark, the Bookmark becomes current (shown with a blue-colored digit), because its branch is closer to the current movie than the other branches.</span></li>
<liclass="rvps7"><spanclass="rvts20">Whenever the current movie is changed to a bookmarked branch, the Input change occurs, so the Greenzone is truncated after the first different frame. But thanks to the savestate stored inside the Bookmark, one savestate returns back to the Greenzone on the bookmarked frame. Therefore, when loading a Bookmark you always immediately move the Playback cursor to the bookmarked frame, while jumping to a Bookmark (without changing the movie) may require seeking.</span></li>
<liclass="rvps7"><spanclass="rvts20">All Bookmark operations (setting, jumping, loading) are executed only after the emulation of the current frame, even if the signal from the user comes in the middle of the frame.</span></li>
<liclass="rvps7"><spanclass="rvts20">To display the basic Bookmark data, Taseditor uses the Listview with disabled scrolling. The List contains 10 rows and 3 columns. When creating a new project, all 10 Bookmarks are empty, so the 2nd and the 3rd columns in the Bookmark List are empty.</span></li>
<liclass="rvps7"><spanclass="rvts20">The 1st column of the Bookmarks List displays the slot number that corresponds to the given line. The number is displayed the same way it is displayed in the Piano Roll – i.e. with digit icons of green or blue color. The numbering of slots goes in this order: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. This order is necessary, so that user doesn't lose the association with the numeric keys on the keyboard.</span></li>
<liclass="rvps7"><spanclass="rvts20">The 2nd column of the Bookmarks List displays the bookmarked frame number.</span></li>
<liclass="rvps7"><spanclass="rvts20">The 3rd column of the Bookmarks List displays the real time when the Bookmark was created.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Bookmarks List is divided in half with a vertical bar. The left side (which contains the 1st and the 2nd column of the List) is associated with bookmarking functionality of the Bookmarks. The right side (the 3rd column) is associated with branching functionality of the Bookmarks. The left side is displayed in a lighter shade, the right one – in the darker. Left-clicking on the left side means a jump to the Bookmark, and left-click on the right side is loading the branch of the Bookmark.</span></li>
<liclass="rvps7"><spanclass="rvts20">Bookmarks List lines are painted in colors, matching the bookmarked Piano Roll lines. For example, if the Bookmark is set on the frame 1000, and the Playback cursor is currently on that frame, this line will be drawn in light-blue color in the the Bookmarks List. This feature gives the user some additional information about the Bookmarks location in the movie.</span></li>
<liclass="rvps7"><spanclass="rvts20">Instead of constant viewing of the Bookmarks List, the user can switch to the Branches Tree. Switching is done by clicking on the caption above the Bookmarks List.</span></li>
<liclass="rvps7"><spanclass="rvts20">Branches Tree is a graphical representation of the relationship between the branches of all Bookmarks in the project. Bookmarks are usually set during the movie creation, so the later Bookmarks contain the branch the initial part of which coincides with earlier Bookmarks branches. For each Bookmark you can find the "parent" Bookmark, whose movie likely gave birth to this Bookmark movie. As a result, Bookmarks can be arranged in a hierarchical structure, the beginning of which is the root (shown as a cloudlet), that is a parent for Bookmarks that have no parent. Searching for Bookmarks parents re-occurs after every change in Bookmarks. The search is guided by numbers of the bookmarked frames, so the beginning of the hierarchy will contain the Bookmarks with the lowest frame number.</span></li>
<liclass="rvps7"><spanclass="rvts20">Markers contained in the Bookmarks do not affect the algorithm of searching for parents. The parent is found by comparing the Input.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you set a Bookmark, it becomes current, and its contents are no different from the current movie. But after some editing of the movie it will become different from the current Bookmark, so the Branches Tree will show the fireball to report the difference. The fireball symbolizes the current movie, and the current Bookmark is always considered to be its parent. There's no real search for the best parent of the fireball, because such search would need to be done after every movie modification, and it would require comparing the current movie to the Input of each Bookmark, that is too resource-intensive.</span></li>
<liclass="rvps7"><spanclass="rvts20">Bookmarks in the Branches tree are displayed as digit icons (like in the Piano Roll). Current Bookmark is displayed as a blue-colored digit. Bookmarks relation is shown in thin lines. For the current Bookmark there is a sequence of the red lines that connect all the Bookmarks which will not change the current movie Input if you load the Bookmark (because at least up to the bookmarked frame the loaded Input will be the same as the Input stored in the current Bookmark). These red lines go from the cloudlet to the current Bookmark or even further – to the heirs of the current Bookmark (if the current Bookmark contains the same Input as these successors).</span></li>
<liclass="rvps7"><spanclass="rvts20">Due to how the Bookmarks are located in ascending order of bookmarked frame numbers, the sequence of the red lines can be interpreted as a timeline of the current movie. The cloudlet is the beginning of this timeline, by clicking on it the Playback cursor is sent to the beginning of the movie. The Bookmarks sitting on the red thread are the intermediate stages of that timeline, by clicking on them the Playback cursor is sent to the bookmarked frames. The fireball (if exists) is considered to be the end of the timeline, and when you click on it the Playback cursor is sent to the end of the movie.</span></li>
<liclass="rvps7"><spanclass="rvts20">Thus, any position of the Playback cursor can be projected onto this timeline by finding the two Bookmarks which contain the Playback cursor in between, and then converting the distance from frames to pixels. As a result, the current Playback cursor position is always displayed in the Branches Tree as a small blue triangle (similar to the Playback cursor icon in Piano Roll).</span></li>
<liclass="rvps7"><spanclass="rvts20">If you need to see the alternative timeline of any Bookmark. hover the mouse cursor over it (the timeline will be displayed by blue lines).</span></li>
<liclass="rvps7"><spanclass="rvts20">All Bookmarks data is saved and loaded from the project file. As for the Branches Tree, Taseditor only saves the cached data about the number of the first frame of difference in the Input for each pair of Bookmarks. Based on this data, Taseditor easily restores the hierarchy of parent relation between the Bookmarks. And if this data is not available, Taseditor will have to redo the comparison of Input.</span></li>
<pclass="rvps7"><spanclass="rvts20">They are used to display the context-sensitive information that is needed only at certain moments of time.</span></p>
<liclass="rvps7"><spanclass="rvts20">TAS Editor 1.0 has only two types of pop-ups: screenshots for Bookmarks and text descriptions for Bookmarks. Both windows pop up when the user is hovering the mouse cursor either over the right side of the Bookmarks List or over any Bookmark icon in the Branches Tree.</span></li>
<liclass="rvps7"><spanclass="rvts20">Both windows appear (with translucency) within about half a second after the mouse cursor was pointed to an active element. They disappear in the similar fashion after moving the cursor off the item.</span></li>
<liclass="rvps7"><spanclass="rvts20">You can turn off one or the other type of pop-ups in the </span><aclass="rvts24"href="ProgramCustomization.html#DisplayBranchScreenshots">settings</a><spanclass="rvts20">.</span></li>
<liclass="rvps7"><spanclass="rvts20">The </span><spanclass="rvts22">screenshot</span><spanclass="rvts20"> pop-up window displays a copy of the FCEUX screen made at the time of bookmarking. Depending on the </span><aclass="rvts24"href="ProgramCustomization.html#HUDinBranchscreenshots">HUD in Branch screenshots</a><spanclass="rvts20"> option, the image will be either raw emulated console screen or the console screen with the superimposed emulator on-screen display. Screenshots are used to quickly check the Bookmarks contents and to compare alternative strategies.</span></li>
<liclass="rvps7"><spanclass="rvts20">The </span><spanclass="rvts22">description</span><spanclass="rvts20"> pop-up window displays a text field with the width equal to the width of the upper and lower edit fields. That text field shows the Marker Note text taken from the pointed Bookmark branch. The Marker is determined by the bookmarked frame number.</span></li>
<liclass="rvps7"><spanclass="rvts20">The screenshot window is displayed to the left from the Bookmarks section, the description window appears under the screenshot window.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you drag the TAS Editor window, the pop-ups move along with it.</span></li>
<liclass="rvps7"><spanclass="rvts20">If the contents of the displayed Bookmark change while pop-up windows still display the old contents, the pop-up windows will be instantly updated.</span></li>
<pclass="rvps7"><spanclass="rvts20">The logging of all significant changes of the project serves mainly for undo, as well as for visual tracking of the history.</span></p>
<liclass="rvps7"><spanclass="rvts20">Each item of the History Log stores a full copy of current Input, Lag and Markers at the time of the item creation. Also, any item can store a backup copy of a Bookmark, if the item was created because of the </span><aclass="rvts24"href="Operations.html#Bookmark">Bookmark</a><spanclass="rvts20"> operation.</span></li>
<liclass="rvps7"><spanclass="rvts20">The data of each item is stored in memory in both compressed and uncompressed state. Uncompressed data is used during work, and its compressed version is saved in fm3 file. When creating a new item in History Log, the data of the item is only stored in an uncompressed form, but every half-second Taseditor goes through the History Log and creates a compressed version of the first found item without a compressed version. Thus, at the time of saving the project to disk, almost all History items already have compressed versions, and those that don't have it will be compressed during saving (which slows down the process of saving). When loading an fm3 file, the History Log is loaded in a compressed form, and is decompressed.</span></li>
<liclass="rvps7"><spanclass="rvts20">Using the History Log, Taseditor implements searching for the first changed frame after which the Greenzone should be truncated. Most </span><aclass="rvts24"href="Operations.html">operations</a><spanclass="rvts20"> work as follows:</span></li>
<liclass="rvps7"><spanclass="rvts20">Edit the current movie data.</span></li>
<liclass="rvps7"><spanclass="rvts20">Remember the minimum and maximum number of changed frame.</span></li>
<liclass="rvps7"><spanclass="rvts20">Call the History to register changes, passing the minimum and maximum frame as parameters, together with the operation code and other parameters.</span></li>
<liclass="rvps7"><spanclass="rvts20">The History compares the contents of the current movie with the contents of the last item of the History Log. If the minimum frame is provided, the search begins from that frame, ignoring the previous movie contents (in order to speed up the work). Otherwise everything from the movie beginning is checked. If the maximum frame is set, then the search ends on that frame (but most operations do not pass the maximum frame, since, for example, an insertion of a blank frame shifts all subsequent Input, and we need to check everything up to the end of the movie).</span></li>
<liclass="rvps7"><spanclass="rvts20">Once the History detects the first difference between the Input/Markers of the current movie and the Input/Markers of the previous movie snapshot, it creates a new new item in the History Log and fills all its attributes.</span></li>
<liclass="rvps7"><spanclass="rvts20">If the differences were not found, it is believed that the operation did not affect the movie, and no change in the project is registered. For example, if you record the same buttonpresses over existing ones, the </span><aclass="rvts24"href="Operations.html#Record">Record</a><spanclass="rvts20"> operation will not be registered.</span></li>
<liclass="rvps7"><spanclass="rvts20">Even if an operation didn't change Input/Markers, it could still shift Lag, so the History also compares Lag Logs and returns the first frame of difference.</span></li>
<liclass="rvps7"><spanclass="rvts20">For the </span><aclass="rvts24"href="Operations.html#Record">Record</a><spanclass="rvts20"> operation, the History registers not only the frame number of the changed Input, but also the number of the joypad whose buttons were changed.</span></li>
<liclass="rvps7"><spanclass="rvts20">Consecutively added items for operations </span><aclass="rvts24"href="Operations.html#AdjustLag">AdjustLag</a><spanclass="rvts20">, </span><aclass="rvts24"href="Operations.html#Record">Record</a><spanclass="rvts20">, </span><aclass="rvts24"href="Operations.html#Set">Set</a><spanclass="rvts20"> or </span><aclass="rvts24"href="Operations.html#Unset">Unset</a><spanclass="rvts20"> can be combined into one item of the History Log, to make it easier to roll back when necessary. The combining is done when the History is filling the attributes of the new History Log item. Instead of appending the item to the end of the Log, it replaces the last item by the new one.</span></li>
<liclass="rvps7"><spanclass="rvts20">After the registration of a new item, the History sends a signal to the Branches Tree (to spawn the fireball) and to the project manager (to add an asterisk to the window caption), and then exits, returning the number of the frame of the first difference found. If no difference was found, it returns -1.</span></li>
<liclass="rvps7"><spanclass="rvts20">Truncate the Greenzone after the first different frame. This number can be greater than the minimum number of the frame of the changes made by the operation. For example, if you set buttonpresses in all selected frames, the minimum frame will be the first selected frame, but the Greenzone will be truncated only after the frame where the button wasn't pressed before.</span></li>
<liclass="rvps7"><spanclass="rvts20">The History can be rolled back by jumping from the current History Log item to the previous one. It's possible to directly jump to any item of the History Log. Current movie and current Markers are recovered from the data contained in this item, and the item becomes current.</span></li>
<liclass="rvps7"><spanclass="rvts20">One of the attributes of each History item is the "key frame number". For most operations it's the frame number of the first difference. But for operations that shift Input it will be the number of the minimum frame.</span></li>
<liclass="rvps7"><spanclass="rvts20">When jumping through History Items, a purple pointer appears in the Piano Roll for half a second, focusing the user's attention on the keyframe. When you roll back (undo), the purple cursor points to the keyframe of the next item in History (relative to the current), when you redo, this cursor points to the keyframe of the current History item.</span></li>
<pclass="rvps7"><spanclass="rvts20">By tradition, all TAS emulators keep track of rerecords used during the creation of a TAS. This number can be used to estimate the labor.</span></p>
<liclass="rvps7"><spanclass="rvts20">The Rerecord counter is stored in the movie (and hence in an fm3 project file too). When creating a new movie (or a new project in Taseditor) the counter is reset to 0.</span></li>
<liclass="rvps7"><spanclass="rvts31">When TASing outside of Taseditor:</span><spanclass="rvts20"> the counter increments every time the TASer loads a savestate in the Recording mode, since he wants to change the Input on the previously watched segment of the movie. The counter does not increase when the TASer records Input for frames whose events he does not know.</span></li>
<liclass="rvps7"><spanclass="rvts31">When TASing in Taseditor:</span><spanclass="rvts20"> the counter increments every time the TASer changes the Input of a previously greenzoned segment of the movie. The counter does not increase when the TASer changes Input for frames that are beyond the Greenzone head.</span></li>
<liclass="rvps7"><spanclass="rvts20">Thus in both cases the emulator keeps track of </span><spanclass="rvts31">how many times the TASer changed the known future</span><spanclass="rvts20">. The counter does not increase when the TASer changes the future blindly, i.e. before watching the game events occurring at the frames he edits.</span></li>
<liclass="rvps7"><spanclass="rvts20">In old emulators the counter increases immediately when loading the savestate in the Recording mode, even before the TASer changes Input. Because of this, it is possible that the user repeatedly presses a load savestate hotkey (e.g. </span><spanclass="rvts23">F1</span><spanclass="rvts20">), and each time the counter will increase. In Taseditor the counter increments only when truncating the Greenzone, regardless of the navigation method. Therefore, at the first press of the </span><spanclass="rvts23">F1</span><spanclass="rvts20"> the counter will increase only if the branch of this Bookmark is different from the current movie, and the difference begins from a greenzoned frame. And the second press of the </span><spanclass="rvts23">F1</span><spanclass="rvts20"> will not increase the counter, because now the Bookmark branch does not differ from the current movie, and no Input change is happening.</span></li>
<pclass="rvps7"><spanclass="rvts20">For a more intuitive keyboard control, Taseditor enforces a strict separation of modifier keys functions:</span></p>
<liclass="rvps7"><spanclass="rvts27">Shift</span><spanclass="rvts20"> is associated with the movie </span><aclass="rvts24"href="Glossary.html#Output">Output</a><spanclass="rvts20">, and specifically with the Playback cursor. Key combinations involving this key usually control the Playback cursor. If you quickly press </span><spanclass="rvts27">Shift</span><spanclass="rvts20"> twice, the Piano Roll will automatically scroll to the Playback cursor.</span></li>
<liclass="rvps7"><spanclass="rvts27">Ctrl</span><spanclass="rvts20"> is associated with the movie </span><aclass="rvts24"href="Glossary.html#Input">Input</a><spanclass="rvts20">, and specifically with the Selection cursor. Key combinations involving this key usually control the Selection. If you quickly press </span><spanclass="rvts27">Ctrl</span><spanclass="rvts20"> twice, the Piano Roll will automatically scroll to the Selection cursor.</span></li>
<liclass="rvps7"><spanclass="rvts27">Alt</span><spanclass="rvts20"> is associated with patterns and alternating sequences, in particular, with gaps in these sequences.</span></li>
<pclass="rvps7"><spanclass="rvts20">Prepared sequence of button states for a single button. See more in </span><aclass="rvts24"href="AdvancedFeatures.html#UsingPatterns">Advanced Features</a><spanclass="rvts20">.</span></p>
<liclass="rvps7"><spanclass="rvts20">Patterns are stored in an external text file in a format that can be edited in Notepad. The file format should be described in the file itself.</span></li>
<liclass="rvps7"><spanclass="rvts20">Each pattern must have its name, which will appear in the list of patterns.</span></li>
<liclass="rvps7"><spanclass="rvts20">Patterns are loaded from the file at the time of launching the TAS Editor.</span></li>
<liclass="rvps7"><spanclass="rvts20">TAS Editor 1.0 has no built-in Pattern editing, as the format is very simple and that feature is not too much in demand.</span></li>
<liclass="rvps7"><spanclass="rvts20">Input, Markers and even Selection can be set by pattern.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you set a pattern, the current lag log can be taken into account or disregarded. More: </span><aclass="rvts24"href="ProgramCustomization.html#AutofirePatternskipsLag">Program Customization</a><spanclass="rvts20">.</span></li>
<pclass="rvps7"><spanclass="rvts20">This is an additional method of quick navigation through the Piano Roll contents. It helps to visually track long sequences of a single button or Markers. Also it allows to move from a Bookmark to another Bookmark.</span></p>
<liclass="rvps7"><spanclass="rvts20">Crossing gaps is the process of scrolling the Piano Roll vertically, triggered by rolling the mouse wheel while holding down </span><spanclass="rvts27">Alt</span><spanclass="rvts20">. The speed of rolling the wheel is irrelevant here, because the actual amount of scrolling is calculated individually based on the state of the Piano Roll cell near the mouse cursor. So only the direction of the wheel rolling is relevant (up or down).</span></li>
<liclass="rvps7"><spanclass="rvts20">Crossing gaps implies that the user wants to find the cell at a distance of more than one frame from the cell under the mouse cursor (otherwise there is no reason to use this feature, because you could simply move your mouse right above).</span></li>
<liclass="rvps7"><spanclass="rvts20">Thus, when the mouse wheel is scrolled up, this feature memorizes the value of the cell above the cell under the mouse cursor. Then it searches for a cell whose value is not equal to a given value. Search goes upwards from the cell above the cell under the mouse. If such a cell is successfully found, the Piano Roll scrolls up so that the mouse cursor is now pointing to the found cell. If the search reached the movie beginning, and the cell was not found, the Piano Roll does not scroll.</span></li>
<liclass="rvps7"><spanclass="rvts20">Similarly, when the mouse wheel is rolled down, this feature memorizes the value of the cell following the cell under the mouse. Then it searches for a cell whose value is not equal to the value. Search goes down from the cell following the cell under the mouse.</span></li>
<liclass="rvps7"><spanclass="rvts20">The memorized value is of a boolean type. E.g. the search considers all icons to have the same value (true), and all empty cells also have the same value (false).</span></li>
<pclass="rvps7"><spanclass="rvts20">The Taseditor project file is primarily designed to save the exact snapshot of the workflow.</span></p>
<pclass="rvps7"><spanclass="rvts20">In order to use the same format for file sharing, the user should be able to selectively save data to the file. When you open such an fm3 file, the missing data is be replaced with default data.</span></p>
<pclass="rvps7"><spanclass="rvts20">For details, see </span><aclass="rvts24"href="AdvancedFeatures.html#ProjectsSharing">Advanced Features</a><spanclass="rvts20"> and </span><aclass="rvts24"href="FM3format.html">FM3 Format</a><spanclass="rvts20">.</span></p>
<pclass="rvps7"><spanclass="rvts20">As any office document, Taseditor project should to be saved to disk from time to time, even if you do not plan to exit the program. However, TASers are not accustomed to such habits, so it makes sense to save the project automatically, allowing the user to customize or disable this feature.</span></p>
<pclass="rvps7"><spanclass="rvts20">For details, see </span><aclass="rvts24"href="ProgramCustomization.html#Projectfilesavingoptions">Program Customization</a><spanclass="rvts20">.</span></p>
<pclass="rvps7"><spanclass="rvts20">This is the next stage of evolution of the Memory Watch tool. It's intended to watch the game data in a dynamic way, not just static. Similarly to the Lag Log, this feature will make analyzing the game Output easier and more accurate.</span></p>
<liclass="rvps7"><spanclass="rvts20">It is a significantly redesigned ListView, whose vertical scrolling is synchronized with the Piano Roll scrolling. Its height is equal to the height of the Piano Roll, and the number of rows is always equal to the number of Piano Roll lines. The number of columns depends on the needs of the user.</span></li>
<liclass="rvps7"><spanclass="rvts20">The user can flexibly change the width of the List by dragging the narrow border between it and the Piano Roll, thus changing the Piano Roll width as well, so their total width is always the same. You can also swap the List and the Piano Roll, or even completely disable the display of the Output Log. When you disable the Log display, the Piano Roll extends to take up the free up space, just as in TAS Editor 1.0. Note that hiding the Log does not disable logging of data.</span></li>
<liclass="rvps7"><spanclass="rvts20">The List Header displays the names of logged cells. You can add and remove columns, change names, change places and change the columns width. When you create a new project, the Output Log has no columns, and, accordingly, nothing is logged.</span></li>
<liclass="rvps7"><spanclass="rvts20">The rows of the List display the values of the cells. The values are saved from the game state on the appropriate movie frame. The List lines are painted with the same colors as the corresponding Piano Roll lines. When you select a line in the Piano Roll, the respective Log lines are selected too.</span></li>
<liclass="rvps7"><spanclass="rvts20">In addition to the RAM cells, it's necessary to implement Lua variables logging. For example, to provide Lua-scripts with a read/write-access to a dozen of Taseditor's int-variables and allow the user to log any variable from the dozen.</span></li>
<liclass="rvps7"><spanclass="rvts20">In addition, in the future a column with screenshots of the game (or selected rectangular area of the game screen) should be added. The displayed size of the screenshots will depend on the current width of the screenshots column, and as a result, the screenshots will not appear on each line of the Log, but on every few lines, even though the screenshot capturing is done every frame.</span></li>
<liclass="rvps7"><spanclass="rvts20">All logged data is stored in the Greenzone, along with the Lag Log. When adding a RAM cell, an automatic filling of the entire column is possible (Taseditor runs through all Greenzone savestates, unpacks them and takes the value of the saved copy of RAM). When you add a Lua variable, the cell values are unknown (blank cells in the list), and to fill them you need to re-emulate the movie with the Lua-script running.</span></li>
<liclass="rvps7"><spanclass="rvts20">When truncating the Greenzone, the old data that has become outdated will not be removed, but will appear in less bright color, until the new data takes its place. Also, when savestates are removed from the Greenzone tail, the Log data remains intact and is shown in the normal color.</span></li>
<liclass="rvps7"><spanclass="rvts20">It should allow flexible coloring of cells, for example, highlighting the same values in the Selection, highlighting the desired values, automatic color change when the value changes, automatic indication when certain value is hit, etc.</span></li>
<liclass="rvps7"><spanclass="rvts20">Lua scripts may read any Greenzone data using Taseditor API.</span></li>
<liclass="rvps7"><spanclass="rvts20">The accelerators </span><spanclass="rvts27">Shift + Right</span><spanclass="rvts20"> / </span><spanclass="rvts27">Shift + Left</span><spanclass="rvts20"> will now scroll horizontally not the Piano Roll, but the Output Log. Scrolling is done by whole columns.</span></li>
<liclass="rvps7"><spanclass="rvts20">It is also necessary to implement the new methods of navigation through the movie, depending on the cells values. For example, by using the </span><spanclass="rvts27">Alt</span><spanclass="rvts20"> key and the wheel you can cross gaps in the List to find the nearest unequal or equal value.</span></li>
<pclass="rvps7"><spanclass="rvts20">Graphically displays the entire movie in TAS Editor window – Greenzone, Lag, Playback cursor, Selection, Markers, Bookmarks, Hot Changes, highlighted Output Log values, etc. Provides the user with an instant image of the current project, which lacks details but completely fits on the screen. Also improves navigation.</span></p>
<liclass="rvps7"><spanclass="rvts20">The Minimap is a rectangular bitmap canvas, whose height is equal to the height of the Piano Roll, and the width is 30 pixels (plus 10px for Bookmark icons). Can be positioned to the left or right from the Piano Roll and the Output Log.</span></li>
<liclass="rvps7"><spanclass="rvts20">The "View" menu item allows the user to customize the elements displayed on Minimap (set a tick near the desired items). You can also entirely disable the display of Minimap.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Minimap does not store any data of the project. It is automatically redrawn in the specified interval of time (by default, once per second).</span></li>
<liclass="rvps7"><spanclass="rvts20">Markers are displayed as horizontal yellow lines on the left half of the Minimap. Each Marker line has the height of at least one pixel, so the Markers are not lost even on a small-scale Minimap (when the movie has a lot more frames than the height of the Minimap in pixels). The line width is 9px.</span></li>
<liclass="rvps7"><spanclass="rvts20">Hot Changes are displayed as horizontal lines of the corresponding color on the right side of the Minimap. Each line has the height of at least one pixel. The line width is 9px.</span></li>
<liclass="rvps7"><spanclass="rvts20">Bookmarks are displayed by corresponding icons to the left from the Minimap, and they take additional 10px. You can click these icons with left or right mouse button, the effect will be similar to clicking on the icon in the Branches Tree.</span></li>
<liclass="rvps7"><spanclass="rvts20">When the mouse cursor hovers over the Minimap, it displays the rectangular magnifying glass.</span></li>
<liclass="rvps7"><spanclass="rvts20">Left-click on the Minimap = instant scrolling of visible area of the Piano Roll to that place. You can then drag the visible area up/down by holding the right button.</span></li>
<liclass="rvps7"><spanclass="rvts27">Shift</span><spanclass="rvts20"> + left-click, or just right-click on the Minimap = Playback cursor navigation. You can then drag the Playback cursor by holding the right button.</span></li>
<pclass="rvps7"><spanclass="rvts20">An alternative way to enter Input. Very similar to modifying Input by clicking the Piano Roll Header, but is more visual and intuitive.</span></p>
<liclass="rvps7"><spanclass="rvts20">The Virtual Joypad is a non-modal pop-up resizable window. Contents of the window are automatically resized when the window is resized.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Virtual Joypad window appears under the mouse cursor when you right-click in the Piano Roll on the selected Input or on Input under the Playback cursor. In the settings you can disable the appearance of the Virtual Joypad under the cursor when you right click. Then you can leave the window in a convenient place on the desktop and move the mouse cursor back and forth from the Piano Roll to the Virtual Joypad.</span></li>
<liclass="rvps7"><spanclass="rvts20">By the window background color you can determine whether the Virtual Joypad currently displays the Input state in the Selection (dark blue), or under the Playback cursor (light-blue).</span></li>
<liclass="rvps7"><spanclass="rvts20">When the mouse cursor is moved out of the Virtual Joypad window, this window is either hidden automatically (if the "Hide on mouse leave" is checked) or left in place.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you press the left mouse button over the inactive area of the window, the window dragging starts.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you right-click anywhere in the window, it hides.</span></li>
<liclass="rvps7"><spanclass="rvts20">Various controls can be located inside the window – e.g. the buttons that correspond to the real joypad buttons. The buttons layout corresponds to the real prototype. By the buttons look you can determine whether the corresponding button in the Selection is pressed, released or partially pressed (this is for cases when more than one frame is Selected).</span></li>
<liclass="rvps7"><spanclass="rvts20">The window contents are automatically updated every time the Input is changed, or Selection is changed and the Virtual Joypad shows the Input in the Selection.</span></li>
<liclass="rvps7"><spanclass="rvts20">The Virtual Joypad reflects only the state of the single controller – the current controller, selected by a radiobutton in the Recorder section.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you click on a button, it changes the Input of the current joypad. Pressed button becomes released, and released or partially pressed becomes pressed. The Input of all the selected frames or the frame under the Playback cursor changes accordingly.</span></li>
<liclass="rvps7"><spanclass="rvts20">In addition to the normal Input buttons, the Virtual Joypad may contain several macro-buttons. A click on a macro button will be similar to a few clicks on different normal buttons. This will allow to change the Input in the Selection even faster than before, for example, instead of three clicks on </span><spanclass="rvts26">Up</span><spanclass="rvts20">, </span><spanclass="rvts26">Right</span><spanclass="rvts20">, and </span><spanclass="rvts26">B</span><spanclass="rvts20"> buttons, you can do one click on </span><spanclass="rvts64">Macro1</span><spanclass="rvts20">.</span></li>
<liclass="rvps7"><spanclass="rvts20">If you hold down </span><spanclass="rvts27">Alt</span><spanclass="rvts20"> before clicking a Virtual Joypad button or a macro button, the Input will be set by pattern.</span></li>
<liclass="rvps7"><spanclass="rvts20">After implementing the Virtual Joypad we can change the principle of clicking on the Piano Roll Header. Instead of changing the Input, the click on the Header will select the appropriate columns in the Piano Roll.</span></li>
<pclass="rvps7"><spanclass="rvts20">TAS Editor 1.0 architecture is not designed to support the selection of Piano Roll columns, but in some situations it may be useful in TASing. For example, to clear the Input of the first joypad without clearing the second joypad Input. Or to shift the Input for one buttons without moving the rest buttons.</span></p>
<pclass="rvps7"><spanclass="rvts20">Besides, it's necessary to improve the process of painting the Selection, so that users will see the Piano Roll line color under the translucent Selection.</span></p>
<liclass="rvps7"><spanclass="rvts20">Selecting columns should be done like selecting rows – when you left-click on the Header of the corresponding Piano Roll column, the column is selected, and all other columns are deselected. If you hold down </span><spanclass="rvts27">Ctrl</span><spanclass="rvts20"> before clicking the button, Selection of the rest columns will not disappear. If you hold down </span><spanclass="rvts27">Shift</span><spanclass="rvts20">, you will select the range of columns from the previous click place. If you hold down </span><spanclass="rvts27">Alt</span><spanclass="rvts20">, the columns selection will be set by pattern. And of course after clicking you can hold the left mouse button and stretch the selection horizontally.</span></li>
<liclass="rvps7"><spanclass="rvts20">Only Input columns can be selected. The Markers depend on the "Bind Markers to Input" setting.</span></li>
<liclass="rvps7"><spanclass="rvts20">Selected columns are colored in the Header by blue background in the appropriate cells.</span></li>
<liclass="rvps7"><spanclass="rvts20">The absence of selected columns is equivalent of "all columns are selected".</span></li>
<liclass="rvps7"><spanclass="rvts20">When the selected lines are displayed, the Input cells of unselected columns are drawn with alpha ~0.4, whereas the cells of the selected columns have alpha ~0.7.</span></li>
<liclass="rvps7"><spanclass="rvts20">In the column of frame numbers, the selected lines have alpha ~0.4, when the Markers are detached, and ~0.7, when the Markers are attached.</span></li>
<liclass="rvps7"><spanclass="rvts20">Splicer section displays not only the number of the selected lines (rows), but the number of selected columns (columns).</span></li>
<liclass="rvps7"><spanclass="rvts20">When you Copy, only the Input from the selected columns is copied to the Clipboard, and it appears there as a rectangular table with no gaps between columns. This allows the user to change the selected columns and insert some buttons in place of the other buttons.</span></li>
<liclass="rvps7"><spanclass="rvts20">When the SELECTION object is initialized (i.e. at Taseditor startup or project creation), Selection is reset to "no selection of columns".</span></li>
<liclass="rvps7"><spanclass="rvts20">If you change the order of columns or hide/disclose them, the Selection is reset to "no selection of columns".</span></li>
<liclass="rvps7"><spanclass="rvts20">When recording, the Input is filtered to match columns selection. Unselected columns will not change, even if the user records a different button state for the column.</span></li>
<liclass="rvps7"><spanclass="rvts20">Columns selection is also saved in the project file.</span></li>
<liclass="rvps7"><spanclass="rvts20">This innovation does not affect the Selection History. Changing the Selection of columns is not saved in the Selection History, because there's no need to navigate through column selections history.</span></li>
<pclass="rvps7"><spanclass="rvts20">In TAS Editor 1.0 the Piano Roll columns have fixed width. The number and order of the columns are also fixed. There's also no columns dedicated to hardware commands (reset, insert disk, etc.), because these commands are rarely used. However, porting Taseditor to another emulator will increase the number of columns (e.g. PSX needs to display columns for 14 buttons), so it's necessary to give the user the ability to customize them.</span></p>
<liclass="rvps7"><spanclass="rvts20">Since this setting is typically done only once (when you start using the program), it does not have to be done directly in the Piano Roll, it should be configured in a separate window called from the "Config" menu.</span></li>
<liclass="rvps7"><spanclass="rvts20">The ability to display any Input columns, including the command columns.</span></li>
<liclass="rvps7"><spanclass="rvts20">Ability to hide any columns. However, each joypad must be represented by at least one button column (but if the user has configured project to 1P mode, the second joypad columns in any case will not be displayed).</span></li>
<liclass="rvps7"><spanclass="rvts20">The ability to change the order of the columns.</span></li>
<liclass="rvps7"><spanclass="rvts20">When you Copy to the Clipboard, only the abstract values like true/false are copied. So if after copying you reorder the columns and insert the Input from the Clipboard to the same place, the real movie Input may change (because button columns are swapped).</span></li>
<liclass="rvps7"><spanclass="rvts20">The ability to change the width of columns. For platforms with many buttons (like PC) it's useful to shrink the width of columns down to a few pixels, so that a lot of columns can fit the screen.</span></li>
<liclass="rvps7"><spanclass="rvts20">The possibility to restore the default settings (those recommended by the author) by one click.</span></li>
<liclass="rvps7"><spanclass="rvts20">All settings are saved in config.</span></li>
<liclass="rvps7"><spanclass="rvts20">Все настройки сохраняются при выходе.</span></li>
<pclass="rvps7"><spanclass="rvts20">Stores and displays the statistics about "changes done after watching" (rerecords). It may be useful to identify the difficult places in the movie.</span></p>
<liclass="rvps7"><spanclass="rvts20">Stores an array of int, one entry for each movie frame (including the frames beyond the current Input). The value corresponds to the number of Greenzone truncations at the frame.</span></li>
<liclass="rvps7"><spanclass="rvts20">Saves and loads the data from the project file.</span></li>
<liclass="rvps7"><spanclass="rvts20">As a canvas for displaying the Heatmap we can use the Minimap canvas. There's no point to constantly see the Heatmap during TASing, so you can just occasionally (e.g. at the end of every day) toggle the Minimap to the Heatmap display mode and evaluate the work.</span></li>
<liclass="rvps7"><spanclass="rvts20">Since this feature is not as much operational as aesthetic, we'll need to think over the Heatmap drawing algorithm, so that it is not only informative but also beautiful.</span></li>
<liclass="rvps7"><spanclass="rvts20">Separate History Log for the </span><aclass="rvts24"href="Operations.html#Bookmark">Bookmark Set</a><spanclass="rvts20"> operations (</span><spanclass="rvts27">Alt + Z</span><spanclass="rvts20"> and </span><spanclass="rvts27">Alt + Y</span><spanclass="rvts20">), so the user will be able to undo the Input/Markers changes without undoing Bookmarks and vice versa.</span></li>
<liclass="rvps7"><spanclass="rvts20">Work with movies starting from savestate.</span></li>
<liclass="rvps7"><spanclass="rvts20">Work with multiple emulated games simultaneously (for Multi-TAS projects).</span></li>
<liclass="rvps7"><spanclass="rvts20">Lua API improvements.</span></li>
<liclass="rvps7"><spanclass="rvts20">Support for multi-touch controls.</span></li>
<liclass="rvps7"><spanclass="rvts20">Think out the concept of the background greenzoning (how exactly it corresponds to TASing specifics).</span></li>
<pclass="rvps7"><spanclass="rvts20">If Taseditor gains popularity among TASers, its availability needs to be expanded to all emulated platforms.</span></p>
<liclass="rvps7"><spanclass="rvts20">Think about the ways to display and change an analog Input using the Piano Roll. The Virtual Joypad partially solves this problem, but the user should also be able to quickly and easily create an analog Input with the mouse. For example, set the "stick tilt" value for one frame and then stretch it to many frames. Also, remember the value of the newly cleared cell and offer it when drawing by mouse. The cells should be able to display not only a single character, but a fixed-point number from -1.0 to +1.0. By double-clicking on a cell you can type the exact value of this number with the keyboard. While holding </span><spanclass="rvts27">Ctrl</span><spanclass="rvts20">, you can stretch the value of the cell by holding the left button and moving the mouse left/right or up/down. A single column can correlate to only single coordinate axis (thus the analog stick requires two columns in Piano Roll).</span></li>
<liclass="rvps7"><spanclass="rvts20">The Virtual Joypad should provide the ability to draw an envelope for a frame range. It is also necessary to remake the format of patterns file, so that they can represent the sequence of "voltage levels", including relative values (for example, increase in a parabola, where the initial and final values are taken from the initial and final frame of the selected range).</span></li>
<liclass="rvps7"><spanclass="rvts20">Transition to a 64-bit platform is highly desirable, because the Greenzone size is going to increase dramatically when storing savestates for more advanced consoles. 2GB of RAM will not be enough for Taseditor 2.0.</span></li>
<pclass="rvps6"style="clear: both;"><spanclass="rvts16">Created with the Personal Edition of HelpNDoc: </span><aclass="rvts17"href="https://www.helpndoc.com/help-authoring-tool">Free help authoring environment</a></p>