It was made for Disnosc, my company : https://www.disnosc.fr/
- Capture.PNG (46.02 KiB) Viewed 12758 times
- Capture2.PNG (28.49 KiB) Viewed 12758 times
So they idea behind this was simple : Managing editing in TVPaint can be quiet difficult sometimes because even if you use the timeline view to edit you storyboard you still have some problems syncing sound correctly.
I used Storyboard Pro and missed the drawing and animation features of TVPaint, so before those scripts I was always drawing in tvpaint all the frames and editing it in Premiere or After Effect (sometimes even storyboarding in after effect...). But the back and forth between the softwares annoyed me because I needed to draw on sound directly and TVPaint was almost there with the timeline view... Took some hours to make it work for my own workflow, maybe it can help others so I'm sharing this
All the scripts in this panels will keep your sound in sync with your clips, you have some of those functions already in TVPaint but I replicated them with George scripts so they also offset sound if they change the timing of your cuts.
For example : if you have a long dialogue in timeline view synced with multiple shots at the end of your storyboard, changing the timing of one of the shots (or creating/hiding/deleting clips) at the beginning of your project with those buttons keeps your dialogue in sync at the other end.
That way you can have sound across multiple shots without having to embed them in the clip with the "split track to clips" option that is not really convenient when you're editing your animatic. I found that sound splitted in different clips that will each change in length can be hard to manage.
A lot of those tools work with mark ins and mark outs so you can change your editing + sound without touching your layers. It will be difficult for your habits but if you want to keep your sound in sync using this panel you have to avoid using tvpaint's interface (like hiding clips, setting mark etc...).
The "Clip Editing" button is your main tool and most advanced script for animatic so use it well! You can avoid using a lot of buttons with this one.
Here is a breakdown of some buttons (you also have some descriptions if you let your mouse over panel's icons) :
Spoiler : :
- Play from current frame : If in project tab, play your storyboard from current clip and then goes back to current clip and image (tvpaint was going back to the first clip instead). Plays your clip as usual if in clip tab.
- Play from clip start : Same than above but begins playback from clip start instead of current image (need it all the time because when selecting a clip TVPaint goes to the last image you were working on in this clip, and when in thumbnail view you lose time going back to the beginning of the clip for playback)
- Clip New : Creates a new clip with same length than your current clip (when it timeline view it's hard to manage clips with a length of 1 frame). Layer is already stretched to the end of the clip so you can draw on it in timeline view without having to go to the first frame (I advise you to deactivate autobreak/create by default to avoid breaking your instances). Also have the same name plus "_b" to avoid having a space in the name (in french version the default clip name has a space). And offsets sound regarding the length of the new clip.
- Clip Hide toggle : Toggles clip hide state and offsets sound (doesn't undo properly for now so be carfeful to use the script again instead). If you use shift when clicking it will also offset the sound right net to the clip, it's usefull if the sound of your clip shifted left when you hid your clip and you want to put it back in sync when you decide to unhide it.
- Clip Delete : Deletes current clip and offsets sound.
- Clip Duplicate : Duplicates current clip and offsets sound. If you use shift when clicking the sound doesn't offset so you keep it in your first clip.
- Clip Next/Prev Skip Hidden : Just a shortcut so you can navigate between clips by skipping hidden clips (useful especially in clip tab when you're cleaning your storyboard).
- Clip Editing : This one is great! Instead of sliding at the right of your clips in timeline view to change the timing of your clips or managing your mark in/out, you just input the new length you want for your clip and it sets your mark out at the right place for you regarding your mark in. Of course it also offsets sound. If you use shift while clicking "ok" it will compensate your change in length in the next clip so your global timing for the two cuts does'nt change. I use it a lot because it's more precise than sliding in the timeline view and faster than setting marks in clip tab. Also it's a great learning tool because choosing your own timing in frames, you know what you do and can begin to spot which shot require which amount of frames <3
- Sound import : Opens a file requester to import a sound file and offsets the sound to your current image (TVP puts it at the beginning of the timeline which is a little annoying for long storyboards). Be aware that it doesn't work if you have unusual characters in your file's path/name.
- Sound offset : Just offsets sounds after current frame by a chosen number of frames.
- Layer Stretch to mark : Usefull script to stretch your layer to your mark in and mark out. I use it especially for camera work because the interpolation time follows the length of your layers and not your marks. Use it also when my layer's post behaviour in on hold and I'm out of the instance but need to draw on it at current frame.
- Marks set to Clip Extremes : Sets your mark In/Out to the first/last image of your clip regarding all your layers. Usefull when changing timings in your clip and you want to keep your marks at the extremes and offset sound.
- Marks set to Layer Extremes : Same than above but sets marks to your current layer extremes instead.
- Markout Inc/Decrement : Just a way to precisely fine tune the length of your clip, it will move your markout one frame left or right. If you use alt and/or ctrl it will offset 5 frames, 10 frames will both shortcuts. If you use shift is will compensate the change in length in your next clip so you keep the global length of your clips. It also offsets sound, of course.
- Markin/Out Clip/Project Set : Sets your mark to current frame (in/out and for clip or project regarding the button you use), and if there is already a mark at current frame it toggles the mark instead. The ones for clips are offseting sound, and the ones for project are nice if you are in Inlay View and you don't see the remote under your canvas to set your project marks (which is what I personally experience).
- Please note that the scripts will not work properly if you have spaces in your clip names (doesn't happen unless you split clips/have another language (like french) in TVP). To fix that I advise you to use this nice script by Mads Juul to batch rename your layers.
- Also note that there is some restrictions using Mark Ins in negative frames, because george script doesn't handle negative frames properly. So please use only positive frames
- I'll update the panel soon with timing tools that also move markin/out. That way you'll be able to reproduce a workflow like when you work without marks and the length of the clip changes regarding layer length. For now I advise you to add the "Marks Set To Clip Extremes" to your actual buttons and/or shortcuts, will almost do the job
- Importing sound doesn't work with unusual characters for file paths and names (so beware of spicy spaces D:).
I'm open to any suggestion, new tool idea or bug reporting, I can update the scripts quickly so don't hesitate to ask.
Nathan
P.S. Here is a library of functions I created if you want to script clip-related things and don't like some personal choices in my buttons, havn't finished to describe everything yet but function names are clear :
Spoiler : :
Code: Select all
#Function Otano_ClipCurrentPos()
LOCAL ClipID ClipPos PosID
tv_clipcurrentid
ClipID = result
ClipPos = 0
tv_ClipEnumID -1 ClipPos
PosID = result
While (CMP(PosID, ClipID)==0)
ClipPos = ClipPos+1
tv_ClipEnumID -1 ClipPos
PosID = result
END
result = ClipPos
#End
#Function Otano_ClipPos(ClipID)
LOCAL ClipPos PosID
ClipPos = 0
tv_ClipEnumID -1 ClipPos
PosID = result
While (CMP(PosID, ClipID)==0)
ClipPos = ClipPos+1
tv_ClipEnumID -1 ClipPos
PosID = result
END
result = ClipPos
#End
#Function Otano_ClipCount()
LOCAL ClipPos PosID
ClipPos = -1
DO
ClipPos = ClipPos+1
tv_ClipEnumID -1 ClipPos
PosID = result
Until CMP(PosID,"none") == 1
result = ClipPos
#End
#Function Otano_ClipIsExtreme(ClipID)
LOCAL clipPos clipCount clipState
Otano_ClipPos(ClipID)
clipPos=result
IF ClipPos == 0
clipState = Start
Else
Otano_ClipCount()
clipCount = result
IF clipCount-1 == clipPos
clipState = End
Else
clipState = none
End
End
result=clipState
#End
#Function Otano_EditingInfo()
//Note : A cause d'un bug TVP, FirstFrame = 0 même si layer commence plus tard, de même pour EditStart sans mark in
LOCAL a FirstFrame LastFrame TotalLength EditStart EditEnd EditLength ClipID ClipPos MarkInFrame MarkInState MarkOutFrame MarkOutState
//Collecting Clip Infos
tv_clipinfo
PARSE result a a a a a a a a a a a FirstFrame a LastFrame a TotalLength a EditStart a EditEnd a
EditLength = EditEnd - EditStart +1
tv_clipcurrentid
ClipID = result
//Findind Clip Posistion
Otano_ClipCurrentPos()
ClipPos = Result
//Findind and Setting Mark In/Out Infos
tv_MarkIn clip
parse result MarkInFrame MarkInState
tv_MarkOut clip
parse result MarkOutFrame MarkOutState
IF (CMP(MarkInState, "set ")==1)
MarkInState = 1
ELSE
MarkInState = 0
End
IF (CMP(MarkOutState, "set ")==1)
MarkOutState = 1
ELSE
MarkOutState = 0
End
//result
result = ClipPos" "ClipID" "FirstFrame" "Lastframe" "MarkInState" "MarkOutState" "MarkInFrame" "MarkOutFrame" "TotalLength" "EditStart" "EditEnd" "EditLength
#End
#Function Otano_NextClip()
LOCAL OriginalClipPos OriginalClipID a NextClipPos NextClipID ClipExtremeState
Otano_EditingInfo()
PARSE result OriginalClipPos OriginalClipID a
Otano_ClipIsExtreme(OriginalClipID)
Parse result ClipExtremeState
IF CMP(ClipExtremeState,"End")==1
NextClipPos = 0
tv_ClipEnumID -1 NextClipPos
NextClipID = result
ELSE
NextClipPos = OriginalClipPos + 1
tv_ClipEnumID -1 NextClipPos
NextClipID = result
END
tv_ClipSelect NextClipID
result = OriginalClipPos" "OriginalClipID" "NextClipPos" "NextClipID
#End
#Function Otano_PreviousClip()
LOCAL OriginalClipPos OriginalClipID a PreviousClipPos PreviousClipID ClipExtremeState
Otano_EditingInfo()
PARSE result OriginalClipPos OriginalClipID a
Otano_ClipIsExtreme(OriginalClipID)
Parse result ClipExtremeState
IF CMP(ClipExtremeState,"Start")==1
Otano_ClipCount()
PreviousClipPos = result - 1
tv_ClipEnumID -1 PreviousClipPos
PreviousClipID = result
ELSE
PreviousClipPos = OriginalClipPos - 1
tv_ClipEnumID -1 PreviousClipPos
PreviousClipID = result
END
tv_ClipSelect PreviousClipID
result = OriginalClipPos" "OriginalClipID" "PreviousClipPos" "PreviousClipID
#End
#Function Otano_NextClipSkipHidden()
LOCAL OriginalClipPos OriginalClipID a NextClipPos NextClipID ClipExtremeState
Otano_EditingInfo()
PARSE result OriginalClipPos OriginalClipID a
NextClipPos = OriginalClipPos
tv_ClipEnumID -1 NextClipPos
NextClipID = Result
DO
Otano_ClipIsExtreme(NextClipID)
Parse result ClipExtremeState
IF CMP(ClipExtremeState,"End")==1
NextClipPos = 0
tv_ClipEnumID -1 NextClipPos
NextClipID = result
ELSE
NextClipPos = NextClipPos + 1
tv_ClipEnumID -1 NextClipPos
NextClipID = result
END
tv_clipHidden NextClipID
Hidden = result
Until Hidden == 0
tv_ClipSelect NextClipID
result = OriginalClipPos" "OriginalClipID" "NextClipPos" "NextClipID
#End
#Function Otano_PreviousClipSkipHidden()
LOCAL OriginalClipPos OriginalClipID a PrevClipPos PrevClipID ClipExtremeState
Otano_EditingInfo()
PARSE result OriginalClipPos OriginalClipID a
PrevClipPos = OriginalClipPos
tv_ClipEnumID -1 PrevClipPos
PrevClipID = Result
DO
Otano_ClipIsExtreme(PrevClipID)
Parse result ClipExtremeState
IF CMP(ClipExtremeState,"Start")==1
Otano_ClipCount()
PrevClipPos = result - 1
tv_ClipEnumID -1 PrevClipPos
PrevClipID = result
ELSE
PrevClipPos = PrevClipPos - 1
tv_ClipEnumID -1 PrevClipPos
PrevClipID = result
END
tv_clipHidden PrevClipID
Hidden = result
Until Hidden == 0
tv_ClipSelect PrevClipID
result = OriginalClipPos" "OriginalClipID" "PrevClipPos" "PrevClipID
#End
#Function Otano_StretchToMarkIn(LayerID)
LOCAL a FirstFrame MarkInFrame Displacement LayerStart
tv_undoopenstack
Otano_EditingInfo()
PARSE result a a FirstFrame a a a MarkInFrame a a
tv_LayerInfo LayerID
PARSE result a a a a a layerStart a a a a
Displacement = (FirstFrame - MarkInFrame)*(-1)-LayerStart
IF (Displacement != 0)
IF Displacement > 0
tv_LayerStretch LayerID Start Displacement Cut
ELSE
tv_LayerStretch LayerID Start Displacement Last
END
END
tv_layerRecomputeExposure
tv_undoclosestack
result = layerID" "displacement
#End
#Function Otano_StretchToMarkOut(LayerID)
LOCAL LastFrame MarkOutFrame Displacement LayerEnd
tv_undoopenstack
Otano_EditingInfo()
PARSE result a a a LastFrame a a a MarkOutFrame a
tv_LayerInfo LayerID
PARSE result a a a a a LayerStart LayerEnd a a a
Displacement = (LayerEnd - MarkOutFrame)*(-1)
IF (Displacement != 0)
IF Displacement > 0
tv_LayerStretch LayerID END Displacement Last
ELSE
tv_LayerStretch LayerID END Displacement Cut
END
END
tv_layerRecomputeExposure
tv_undoclosestack
result = layerID" "displacement
#End
#Function Otano_SoundOffset(fromFrame,toFrame,offsetFrames)
LOCAL framerate soundIndex offset volume mute fadeIn1 fadeIn2 fadeOut1 fadeOut2 soundfilename in out q colorIndex offsetTest
tv_ProjectInfo
PARSE result q q q q framerate q
offsetFrames = offsetFrames/framerate
soundIndex = 0
Do
tv_soundprojectinfo 0 soundIndex
IF CMP(result,"-2")==0
PARSE result offset volume mute fadeIn1 fadeIn2 fadeOut1 fadeOut2 q q q colorIndex
offsetTest = offset*framerate + fadeIn1*framerate
print fromframe" "offsettest
IF offsetTest >= fromFrame && offsetTest < toframe
offset = offset + offsetFrames
tv_SoundProjectAdjust soundIndex mute volume offset fadeIn1 fadeIn2 fadeOut2 fadeOut1 colorIndex
END
soundIndex = soundIndex + 1
END
UNTIL CMP(result,"-2")==1
result = offsetFrames
#End
#Function Otano_MarkInSet(frame,state,compensate,oldsync)
//note : moving markin in negative values doesn't work due to TVP bug
//TODO : Compensate
LOCAL q ClipID firstframe OldState OldFrame EditStart curProjectImage curImage fromframe offset
tv_undoopenstack
tv_updateundo
tv_lockdisplay quiet
Otano_EditingInfo()
PARSE result q ClipID firstframe q OldState q OldFrame q EditStart q
tv_projectcurrentframe
curProjectImage=result
tv_layergetimage
curImage=result
fromframe = curProjectimage-curimage
IF State == 1 //Set mark
IF OldState == 1 //Si mark deja on, decaler offset selon ancienne mark
tv_clipHidden ClipID
IF result == 0
Offset = oldFrame - frame
IF oldsync != 1 && offset > 0
fromframe = fromframe + offset
END
Otano_SoundOffset(fromframe,999999,Offset)
END
tv_markin clip frame set
Else //Si mark off, decaler offset selon fin edit
tv_clipHidden ClipID
IF result == 0
Offset = firstframe - frame
IF oldsync != 1 && offset > 0
fromframe = fromframe + offset
END
Otano_SoundOffset(fromframe,999999,Offset)
END
tv_markin clip frame set
END
ELSE
IF State == 0 //clear mark
IF OldState == 1 //si mark on, decaler vers fin edit
tv_clipHidden ClipID
IF result == 0
Offset = oldframe - firstframe
IF oldsync != 1 && offset > 0
fromframe = fromframe + offset
END
Otano_SoundOffset(fromframe,999999,Offset)
END
tv_markin clip frame clear
Else //si mark deja off, ne rien décaler
tv_markin clip frame clear
END
END
END
tv_undoclosestack
tv_unlockdisplay
result = Offset
#End
#Function Otano_MarkOutSet(frame,state,compensate,oldsync)
//TODO : Compensate
LOCAL q ClipID Lastframe OldState OldFrame EditStart EditLength curProjectImage curImage fromframe offset
tv_undoopenstack
tv_updateundo
tv_lockdisplay quiet
Otano_EditingInfo()
PARSE result q ClipID q Lastframe q OldState q OldFrame q EditStart q EditLength
tv_projectcurrentframe
curProjectImage=result
tv_layergetimage
curImage=result
fromframe = curProjectimage-curimage+editstart+editlength
IF State == 1 //Set mark
IF OldState == 1 //Si mark deja on, decaler offset selon ancienne mark
tv_clipHidden ClipID
IF result == 0
Offset = frame - oldFrame
IF oldsync == 1 && offset > 0
fromframe = fromframe + offset
END
Otano_SoundOffset(fromframe,999999,Offset)
END
tv_markout clip frame set
Else //Si mark off, decaler offset selon fin edit
tv_clipHidden ClipID
IF result == 0
Offset = frame - lastframe
IF oldsync == 1 && offset > 0
fromframe = fromframe + offset
END
Otano_SoundOffset(fromframe,999999,Offset)
END
tv_markout clip frame set
END
ELSE
IF State == 0 //clear mark
IF OldState == 1 //si mark on, decaler vers fin edit
tv_clipHidden ClipID
IF result == 0
Offset = lastframe- oldframe
IF oldsync == 1 && offset > 0
fromframe = fromframe + offset
END
Otano_SoundOffset(fromframe,999999,Offset)
END
tv_markout clip frame clear
Else //si mark deja off, ne rien décaler
tv_markout clip frame clear
END
END
END
tv_undoclosestack
tv_unlockdisplay
result = Offset
#End
#Function Otano_MarkInMove(Offset,Compensate,InOrOut)
//note : moving MarkIn in negative values doesn't work due to a TVP bug
LOCAL StartImage ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength NewMarkOutFrame NewMarkInFrame NewNextClipMarkOutFrame Fromframe toframe OffsetChange
tv_undoopenstack
tv_updateundo
tv_lockdisplay quiet
tv_layergetimage
startImage = result
//Current Clip Mark In Increment
Otano_EditingInfo()
PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
IF CMP(MarkInState, "1") == 0
tv_markin clip FirstFrame set
MarkInFrame = FirstFrame
END
NewMarkInFrame = MarkInFrame + offset
tv_markin clip NewMarkInFrame set
//NextClip compensates exposure if Compensate==1, else offsetting sound
IF Compensate == 1
//Compensating In Point in negative values doesn't work, because of TVP bug
IF CMP(InOrOut,"In")==1
Otano_NextClipSkipHidden()
Otano_EditingInfo()
PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
IF CMP(MarkInState, "1") == 0
tv_markin clip FirstFrame set
MarkInFrame = FirstFrame
END
NewNextClipMarkFrame = MarkInFrame - offset
tv_markin clip NewNextClipMarkFrame set
Otano_PreviousClipSkipHidden()
tv_layerimage startImage
END
IF CMP(InOrOut,"Out")==1
Otano_NextClipSkipHidden()
Otano_EditingInfo()
PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
IF CMP(MarkOutState, "1") == 0
tv_markOut clip LastFrame set
MarkOutFrame = LastFrame
END
NewNextClipMarkFrame = MarkOutFrame + offset
tv_markout clip NewNextClipMarkFrame set
Otano_PreviousClipSkipHidden()
tv_layerimage startImage
END
ELSE
//offset sound if clip no hidden
tv_clipHidden ClipID
IF result == 0
tv_projectcurrentframe
fromframe=result
OffsetChange=-offset
Otano_SoundOffset(FromFrame,999999,OffsetChange)
END
NewNextClipMarkFrame = None
END
tv_unlockdisplay
tv_undoclosestack
result = NewMarkInFrame" "NewNextClipMarkFrame
#End
#Function Otano_MarkOutMove(Offset,Compensate,InOrOut)
LOCAL StartImage ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength NewMarkOutFrame NewMarkInFrame NewNextClipMarkOutFrame Fromframe toframe OffsetChange
tv_undoopenstack
tv_updateundo
tv_lockdisplay quiet
tv_layergetimage
startImage = result
//Current Clip Mark Out Increment
Otano_EditingInfo()
PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
IF CMP(MarkOutState, "1") == 0
tv_markout clip LastFrame set
MarkOutFrame = LastFrame
END
NewMarkOutFrame = MarkOutFrame + offset
tv_markout clip NewMarkOutFrame set
//NextClip compensates exposure if Compensate==1, else offsetting sound
IF Compensate == 1
//Compensating In Point in negative values doesn't work, because of TVP bug
IF CMP(InOrOut,"In")==1
Otano_NextClipSkipHidden()
Otano_EditingInfo()
PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
IF CMP(MarkInState, "1") == 0
tv_markin clip FirstFrame set
MarkInFrame = FirstFrame
END
NewNextClipMarkFrame = MarkInFrame + offset
tv_markin clip NewNextClipMarkFrame set
Otano_PreviousClipSkipHidden()
tv_layerimage startImage
END
IF CMP(InOrOut,"Out")==1
Otano_NextClipSkipHidden()
Otano_EditingInfo()
PARSE result ClipPos ClipID FirstFrame Lastframe MarkInState MarkOutState MarkInFrame MarkOutFrame TotalLength EditStart EditEnd EditLength
IF CMP(MarkOutState, "1") == 0
tv_markOut clip LastFrame set
MarkOutFrame = LastFrame
END
NewNextClipMarkFrame = MarkOutFrame - offset
tv_markout clip NewNextClipMarkFrame set
Otano_PreviousClipSkipHidden()
tv_layerimage startImage
END
ELSE
//offset sound if clip not hidden
tv_clipHidden ClipID
IF result == 0
tv_projectcurrentframe
fromframe=result
OffsetChange=offset
Otano_SoundOffset(FromFrame,999999,OffsetChange)
END
NewNextClipMarkFrame = None
END
tv_unlockdisplay
tv_undoclosestack
result = NewMarkOutFrame" "NewNextClipMarkFrame
#End
#Function Otano_ClipDelete(ClipID,Compensate)
LOCAL currentClipID q EditStart EditLength Offset InOrOut
tv_undoopenstack
tv_updateundo
tv_lockdisplay quiet
tv_clipcurrentid
currentClipID = result
tv_clipselect ClipID
Otano_EditingInfo()
PARSE result q q q q q q q q q EditStart q EditLength
IF CMP(currentClipID, ClipID)==1
Otano_NextClipSkipHidden()
tv_clipcurrentid
currentClipID = result
tv_clipselect ClipID
End
tv_clipHidden ClipID
isHidden = result
IF compensate == 1
IF isHidden == 0
Offset = -EditLength
Otano_MarkOutMove(Offset,compensate,Out)
END
ELSE
IF isHidden == 0
tv_projectcurrentframe
projCurFrame = result
tv_layergetimage
curFrame = result
fromframe = projCurFrame -(curFrame-EditStart)
OffsetChange = -EditLength
Otano_SoundOffset(FromFrame,999999,OffsetChange)
END
END
tv_clipclose ClipID
tv_clipselect currentClipID
tv_unlockdisplay
tv_undoclosestack
#End
#Function Otano_ClipDuplicate(ClipID,compensate,noshift)
//todo compensate
LOCAL q curClipID EditStart EditLength curProjectImage curImage fromframe
otano_editinginfo()
PARSE result q curClipID q
tv_clipselect ClipID
otano_editinginfo()
PARSE result q q q q q q q q q EditStart q EditLength
tv_clipHidden ClipID
IF result == 0
tv_projectcurrentframe
curProjectImage=result
tv_layergetimage
curImage=result
fromframe = curProjectImage-curimage+editstart
IF noshift==1
fromframe = fromframe+EditLength
END
Otano_SoundOffset(fromframe,999999,EditLength)
END
tv_clipduplicate ClipID
tv_clipselect curClipID
#End
#Function Otano_ClipNew(name,compensate)
//todo compensate
LOCAL q curProjectImage curImage fromframe EditStart EditLength
tv_clipnew name
tv_projectcurrentframe
fromframe=result
Otano_SoundOffset(fromframe,999999,1)
#End
Spoiler : :
- Two scripts to go to the next/previous image of the clips regarding all layers and automatically go to next/prev clip (I had some nice help from MJ and will do my own script). Will do the same with some basic shortcuts to move in timeline (maybe an option button to choose between looping on the clip or going to next clip and for steps like in the flipping panel)
- Maybe a script to have the frames of the clips following the global frames of the project by moving layers right and settings marks.
- Adding timing tools working with markins and markouts, with the new script you'll be able to have your marks updating even if they are not at the extremes of your script.
- A split clip button that renames splitted clips without space (and check if there is no other case when you end up with a clip name with unusual characters). And that works if your instance is in hold mode and doesn't stretch far enough.
Bugs to fix :
- Make Delete Clip work when there is only one clip in project.
- Make Negative Markins work with a script to normalize the clip to frame 0 by moving everything to the right.
- Undoing clip hide toggle doesn't unhide/hide clips.
- Importing sound doesn't work with unusual paths for files
- Maybe a script to have the frames of the clips following the global frames of the project by moving layers right and settings marks.
- Adding timing tools working with markins and markouts, with the new script you'll be able to have your marks updating even if they are not at the extremes of your script.
- A split clip button that renames splitted clips without space (and check if there is no other case when you end up with a clip name with unusual characters). And that works if your instance is in hold mode and doesn't stretch far enough.
Bugs to fix :
- Make Delete Clip work when there is only one clip in project.
- Make Negative Markins work with a script to normalize the clip to frame 0 by moving everything to the right.
- Undoing clip hide toggle doesn't unhide/hide clips.
- Importing sound doesn't work with unusual paths for files