Add exposure to selected frame(s) in the timeline without affecting the exposure of other existing frames in the timeline

Increasing or decreasing frame exposure in Aseprite to time an animation is so cumbersome that I created an account just to make a feature request. :laughing: This is such a basic feature in every other animation and compositing program I’ve used (Flash, Animate, TVPaint, Harmony, Dragonframe, AfterEffects, etc.) that it’s extremely infuriating that Aseprite doesn’t have it, even though the timeline view is x-sheet-like. If I’m being honest, it’s one of the biggest reasons why I avoid using Aseprite unless I absolutely need to and avoid recommending it to people (especially people who have a traditional animation background).

  1. Ability to add exposure to a single frame, while “pushing” the subsequent frames in the same layer over. The other layers should NOT have a frame added.

addexposure1

In Aseprite terms, I believe this would entail moving all the cels after the selected cell over and then adding new linked cels into the empty space.

Here’s the “fastest” way I can do this in Aseprite currently… kind of. It isn’t ideal, and notice that it doesn’t “push” the frames over, so if I want to avoid overwriting those then I need to move them out of the way first (not shown in this gif). I don’t want to have to select EVERY frame and then move them over manually twice for all frames I want to retime! It’s too many button presses and if there are a lot of frames then this is very painful to do.

aseprite9

  1. Ability to add exposure to selected frames on multiple layers. Here we have the first linked cel on layer 3 and the second linked cel on layer 1 selected. Pressing the new frame hotkey adds 1 new linked cel to both of those frames, while pushing the subsequent frames on those layers over to the right.

addexposure2

I don’t think there’s any way I can do this in Aseprite right now. I think I’d have to go layer by layer, individually moving every single frame. Ugh! It takes forever! Please end my pain!!

  1. “Add/remove n exposure to/from all frames” - add/subtract some integer “n” amount of linked frames to ALL frames in the animation. (So you could, for example, change your animation from being on 1’s to 2’s and then fill in more keys in areas where the animation is faster and requires being on 1’s.)

This is pretty much the equivalent of selecting all frames and doubling the amount of time of each frame (think using “Constant Frame Rate” and going from 100ms to 200ms), but visually represented on the timeline instead of being under the individual properties of a frame (so if you went from 100ms to 200ms where all frames are 100ms, you’d end up with two 100ms frames).

The term Aseprite uses is “duration” rather than “exposure”, so using that might make your post easier to understand for people used to Aseprite.

I feel like these operations are better suited to a timeline editor (and all the ones you listed are), which Aseprite is not. Moving frames over to the next one and then linking the previous one (or vice versa to reduce a duration) is not a good method to increase the duration of a cell, since the durations of those other cells may not match. You could end up shifting some cells over to much longer or much shorter frames.

Your suggestions only makes sense in the special case of every frame having the exact same duration, which is really just a way to simulate timeline-based editing in a frame-based editor, and that is the source of your pain :'D

I think an alternative timeline-based editing interface that could “natively” have these features would be a better solution than trying to shoehorn it into a frame-based editor, as it would allow a different interface that would allow just dragging to change duration, and where the durations of individual “frames” would be a non-issue. For pixel art animation, I think the style of timeline in OP’s first image, where you have a set framerate and the cell durations are always in increments of one frame.
Under the hood, it could even still be implemented as a series of frames where the durations are fixed based on the framerate the user has input and can only be edited all together and could look largely the same, so it would mainly be a difference in the menus and what various mouse actions do.

Thanks for the feedback! In the past there were plans for a time-based Timeline:

I have a branch in the past with some changes but never had the time to finish this:

I would like to integrate this in a near future. Meanwhile as a workaround I think 1, 2, and 3 could be implemented with one script and associate the script with a shortcut. I think today I wouldn’t be able to write the script, but maybe tomorrow I can post a possible solution.

1 Like

@eishiya Thank you for translating for me! I have difficulty in the terminology barrier trying to explain these concepts to people who have only used Aseprite. I also agree with your reasons why it’s nontrivial from a design standpoint to implement in Ase, particularly because there is, as far as I can tell, no configurable setting currently on “default frame duration” (which you could set as the duration for newly created frames, but complicates things when you get into removing frames!).

“Frame-based animation” (in the Photoshop sense) seems like a good idea until you have objects on different layers with different timing (which is one of the biggest reasons to use layers for animation besides separating elements) or you’re trying to enforce a fixed time-slice as the duration of a frame in order to implement the animation in a frame-based system (such as one of the common methods of incrementing a counter per frame since it’s simple to code). Then it becomes pretty nightmarish to deal with.

I’ve theorized before that the way Aseprite handles things under the hood is not really meant to do what I’m asking, since it’s really just Photoshop-like frames… so the x-sheet-like view, although I really appreciate it, is a bit misleading! It leads to some confusion when coming from animation industry standard programs that use exposure-based systems when paired with the “frame-based” behavior. Familiar interface with unexpected results, I suppose?

Speaking of frame-based behavior, a frame-based system without an intuitive way to select and drag the frames around is painful, but I did see this was being worked on! I’m glad to know I’ll no longer have to either click a frame and then click its 1px-wide border or install and use an external theme that lets you right-click on the number to move a frame around, plus shift-click to select multiple frames in a row or ctrl-click for discrete selections (which don’t seem to me like they’re implemented at all right now?) will be great!

Your suggestion of having a timeline-based view would be great if it were implemented! Specifically what I’d want is the hybrid frame/timeline animation programs have, where dragging the edge of the frame increases or decreases the duration by a fixed time step of “one frame duration” (TVPaint-like). It differs slightly from the video editing program-like timeline where you can drag the edge of the frame to any amount of time (Final Cut Pro-like). Here’s an example of what I mean: Animation basics (TVPaint Animation 11 tutorial) - YouTube

@dacap Thank you for such a fast reply! I appreciate you taking the time to address this. What you have so far looks promising. If we could get the ability to “lock” the amount of time added or subtracted when dragging to increase/decrease the frame duration (for example, 1/24 of a second) then it would be perfect!

This would be a huge time saver for anyone whose animation workflow resembles mine, enabling adding keyframes then retiming them appropriately and filling inbetweens between the keyframes, or pipelines that use x-sheets to communicate with which timing pieces should move.

I’m not sure how well a script would work comparatively, but it’s certainly better than nothing while waiting for the completion of the timeline view - I’d be glad to save on button clicks :slight_smile:

Thanks!

1 Like

You can set a constant frame rate that will affect new frames being created. It’s in Frame > Constant Framerate.

I wonder if it might be worth having a different “Timeline Mode” setting, one that doesn’t allow for variable frame rate duration? The current settings work okay, but frame duration in milliseconds differs from other programs/tools.

From an animation background, I’m used to thinking of things in “Frames Per Second,” not “milliseconds per frame.” A different “Timeline Mode” that has typical dropdown settings for FPS (24, 30, 60, or custom) that you can’t change per-frame would help. (Right now, it’s a little confusing to try to remember what millisecond values approximate frame rate - and we can’t be exact. For example, 24 FPS has to be typed in as 42 millisecond durations per frame, but the precise value is actually 41.666… milliseconds per frame)

I don’t know how difficult that would be to implement, and I know it’s no small ask. But such a theoretical mode might make the functionality Kiana is asking for more intuitive.

EDIT: I’m realizing that I’m just rephrasing what Kiana said in the above comment. In any case, for me, I typically think of the timeline in consistent duration/frame. Ultimately I wonder if it’s possible to have the “add frame” and “add empty frame” functions only affect layers you have selected? There’s the question of what to do with unselected layers - whether to extend the frames at the end with empty ones or something else.

@mayonegg Ah okay, that’s good to know! I skimmed the forum on whether constant framerate was added yet earlier but didn’t find an answer. That makes me think we’re closer to the requested functionality than I initially thought.

I agree on FPS (with a fixed value, like 24 FPS) being the way I generally think about animating, coming from an animation background. I don’t find the ms per frame too useful and it has some conversion issues between FPS as mentioned.

On add frame/add empty frame only affecting the selected layer, I’d generally expect the end of the animation on other layers to be extended with empty frames. However, there’s a distinction that I don’t think Aseprite makes between what I’ll call a “nonexistent frame” and a frame that’s “created” but has no drawing in it. In other animation programs this action would not “create” empty frames that are selectable for drawing on, they would just be “nonexistent frames”. In some programs drawing on a “nonexistent frame” will “create”/enable it in the UI, whereas other programs forbid you from drawing on those frames unless you create a frame. I think I probably prefer the behavior where you’re able to draw on an empty frame to “create” a frame at that position.

I’ve just created a couple of scripts but still not satisfied with the result, in the future we could integrate this as internal commands (anyway they are quite slow so I have to investigate why). I was working in a 3rd script to reduce/delete cels, but it’s still not ready.