timeBase - a Multi-Layer Timeline Component

timeBase is a customizable multi-layer timeline component that is designed to play and mix media elements.

See the updated November 2019 download and its latest documentation:

https://derivative.ca/community-post/asset/timebase-multi-layer-timeline-component

At the end of that page is also the community discussion/comments for timeBase.

Excerpt:

timeBase is intended to be as customizable as possible, with minimal UI and most of its setup and controls via custom parameters on components, making the timeline easier to extend and use. Its internal architecture is a reflection of recently-developed best-practices, so I hope you learn from its internals. It is currently developed in 099 2019 Official - the 10000 series.
TimeBase.1.jpg

Structure :The timeBase component contains Scenes (scene1, etc) that each act as a separate mixer of Layers . A Scene contains 1 or more layers, and each layer contains a number of Elements placed along the timeline. There are eight+ element types (“effects”) including Movie File, Audio File, Text, Generative, Channels and Events. The scene contains the network that pulls and mixes video, audio and channels from the layers.

Scene : Click the “Scene 1” button on the left to see all the setup parameters for the whole scene… total length, initialization and start (same as the buttons “I” and “S” in the UI), cue time and cue go, On Each Scene component, there are adaptive panel layout parameters of the UI on the Panel2 page of each Scene component.

Layer : Click the “Layer 1” button etc to get the layer setup parameters.

Element : Click any element on a timeline. Here you set the start and length of the element, and set the parameters of the specific element type:

Add an element by right-clicking on the background of the layer and selecting an element type that gets placed where you clicked. For example, right-click on the layer and select example Movie File.

There are seven+ element types that can be intermixed on a layer. The current element types (Effects) include: Movie File (with optional audio), Audio File, Text, Generative, Events, Channels and Scene (will play another scene component). Event elements run one python command on start and one command at end.

Wow! :ugeek:

So I finally decided to uninstall adobe suite the other day in an effort to demonopolize my creative tool set, which has been fine so far using Affinity Photo to replace photoshop… but then of course today I decide I need to edit some video for my portfolio, and forget that after effects and premier are now gone :astonished: . But then I think, I love touchdesigner so much, why not build some components to edit video?.. glad I did a quick forum search for “video editing” so I didn’t spend all day redoing all this work.

THANK YOU!! Happy to remonopolize my tool set to TD :wink:

Thank You for a really wonderful, thoughtful and very useful piece of work.
Eric

Wow, this is nice! Definitely a great tool to have for a lot of situations!

Awesome Greg - very elegant approach!

Greg this is so fresh!
I’m very excited to dive into this. Thanks so much for sharing. :smiley:

Hi, that super usefull :slight_smile: but I notice some strange thinks happends in sub range especially in last build of TD099 2017.10500. Anybody notice something similar ?

edited May 2019 …

Here is a more evolved version of timeBase, for sequencing media elements along a timeline.

It’s been built for screens around 1900 wide, but you can scale it down/up with the the Width parameter of /scene1 and the settings on its custom Panel2 page.

/timeBase is now a UI for all scenes inside.

download file deleted - see posts after May 17 2019 for the download.

Hey Greg!

Thanks a lot for this amazing tool, I can’t wait to start using it! That being said, when I open the latest version in 2018.22270, I get a lot of load warnings ( skipping unrecognize parameter ).

Is there an easy way to fix those?

Thanks!

Another note - I’m converting this component to slave to LTC, and for the moment running the project at 30fps to avoid glitching isuses with the timer CHOP while running off of a local TIME slaved to incoming LTC. However, this reveals that the movieEngine components don’t respect their parameter to switch to frame/second/fraction modes, looks like there’s no logic to handle that parameter change. There’s already a chop in all of the movieEngines with the correct seconds available, so to make the change as a hotfix:

for operator in ops('/timeBase/scene1/layer*/movieEngine/movieEngine*/moviein'): operator.par.index.expr = "op('mvsec')[0]" operator.par.indexunit = 'seconds'

The more I keep digging the more depth I find in this component, Greg. Thank you for releasing such a huge amount of work to the Touch Community! In the future, would you consider tracking the development of this on Github? I have quite a few ideas for features and some ways to refactor to allow for greater flexibility, and would be interested in merging in some of the features I’m currently adding on to my copy of this component for public use.

Hmmm, I seem to be having issues with instant crashes of touchdesigner with no autosave when trying to delete elements with start times outside of the total time of the timeline, but then those elements are preventing other elements from working on the timeline.

I don’t run into complete hard crashes of touch without at least an autosave often - any ideas on what would cause something like this?

To avoid crashing when deleting element, ensure that they’re inside of the current range of the timeline, this seems to avoid issues.

As a separate issue, any overlapping elements can potentially disable that entire layer from functioning properly in certain situations. So if you randomly get black output on a layer, ensure you don’t have any hidden elements completely obscured by other elements. Making a list/dat of all the current elements with start/stop times helps diagnose this.

First of all, Greg, thank you for this component! It was very helpful!

Would be nice to run it on 41570 - looks like something with Findop DAT, Timer CHOP goes to dependency loop and even if I lock segments table, it not working properly… :frowning:

I’m posting the latest revamped and modenized timeBase that has undergone a lot of internal improvements and redesign, made with the latest new Official TouchDesigner.

It still needs a lot of polish, optimization, dummy-proofing and documentation, but it’s quite functional and more robust than the previous version from last year, so I thought I’d put something out in the interim. I think I’ve fixed all the bugs reported.

See the first post of this thread for links.

I’d classify this version Experimental. Feel free to yank parts out, critique, or adopt its approaches.

The new incarnation of timeBase (Version 14, November 2019) is released and located as a community post here:

https://derivative.ca/community-post/asset/timebase-multi-layer-timeline-component

It runs in the latest 10K Official or the latest Experimental

Some of the changes:

drive any scene with a CHOP channel, OR embed in another scene with a Scene element type. Also the LTC CHOP can drive a scene directly with its new Seconds parameter which outputs time in the form that timeBase likes…

Control over the Scene button order in top menu via Display Order parameter.

Added basic keyframing to all elements. You press Keyframe Channels on the element’s Animate page and it will bring up the graph editor in a floating window (after creating the appropriate animation nodes in the element). After creating channels you still need to hand-connect them to the parameters or operators you want to drive.

Renovated Movie File elements and Movie Spec Elements to allow for movie trimming, looping, speed and self-crossfade.

click-drag an element to change its start time (if it is not Following another element).

Elements whose Start Method is set to Follow will have a magenta bar at its start point, to signify it is attached to the previous element.

Elements whose End Method is set to To Element will have a yellow bar at its end point.

When an element is set to Follow another, you can add a time offset with the new Follow Offset parameter.

Audio elements will show the audio graph when layer is Expanded.

Select multiple elements using shift-leftclick. or Ctrl-leftclick.

Right-click on an element and pick Loop Selected Elements to play a loop containing the time-range of all the selected elements.

when one scene is playing another scene as a slave, the control of the slave scene is now done through an Execute DAT that runs every frame and fetches the local scene time from the master scene, and runs a timer.goTo(seconds=time) from that time value.

Now you can run timeBase with the LTC In CHOP directly, and more simpler (in seconds) with 30K.

made scene1 blank so you can just delete the following example scenes and start fresh.

replaced movieEngine with Version 30, which doesn’t conflict with python 3.7 in TD 30000: movieEngine in 30000 uses a keyword “async” which is now reserved in python 3.7.

Resolution can be set on each scene.

Timecode formatting better.

Updated moviePlayer to Version 30.

made all Movie File Elements’ file path parameters bound to File parameter on mvspec inside.

Movie elements can be trimmed: set the Movie Interval Method menu, then press Edit Start End (uses moviePlayer), Then run it at any speed, and loop to any length.

Cut-paste: You can copy multi-elements on one later and paste to any layer. Shift-click or Ctrl-click to puck multi elements, Rclick on element or layer to copy, rclick on layer to paste at that point.

You can place any Generative (or any) element outside the timeBase component and drive it with timeBase.

Internally it uses more procedural expressions, Binding, Internal Parameters, parameter read-only - much cleaner!

1 Like

This looks fantastic. I’m a little confused and working to learn it. Let’s say I made a circle TOP and wanted to include it in the timebase. What’s the easiest way to do this?

It’s a few steps. The most common is to customize a Generative element, where you would put your Circle TOP in a single element. See “Customizing Generative Elements” here:

https://derivative.ca/community-post/asset/timebase-multi-layer-timeline-component

If you want to use that effect many times, you would follow “Generative Elements outside timeBase” and copy/paste (or clone) that component with your Circle TOP once per Generative element.

Have a look at the Comments section at the end of that post.