By
imitto
Hello all!
I use Autoit for a while, already made some automation for a TV station's master control room with it. I made a UDF to easily work with PAL timecode and time with milliseconds, convert, add or subtract them. Feel free to use it if you want something like this
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Description=PAL Timecode Calculator UDF
#AutoIt3Wrapper_Res_LegalCopyright=horvath.imre@gmail.com
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;
; #FUNCTION#
; Name...........: _tcAdd
; Description....: Returns addition of two timecodes
; Syntax.........: _tcAdd($fTc1, fTc2 [, $fFormat = "P"])
;
; Parameters.....: $fTc1 - First timecode in hh:mm:ss.ff format
; $fTc2 - Second timecode in hh:mm:ss.ff format
; $fFormat - Time base - "P" (default): PAL (25 fps)
; "M" : millisecond
;
; Return value...: Sum of the two timecode in the selected format
Func _tcAdd($fTc1, $fTc2, $fFormat = "P", $fHourFormat = 1)
Local $fMs1 = _tcToMs($fTc1)
Local $fMs2 = _tcToMs($fTc2)
Local $fSumMs = $fMs1 + $fMs2
Return _msToTc($fSumMs, $fFormat, $fHourFormat)
EndFunc
; #FUNCTION#
; Name...........: _tcsSub
; Description....: Returns addition of two timecodes
; Syntax.........: _tcSub($fTc1, fTc2 [, $fFormat = "P"])
;
; Parameters.....: $fTc1 - First timecode in hh:mm:ss.ff format
; $fTc2 - Second timecode in hh:mm:ss.ff format
; $fFormat - Time base - "P" (default): PAL (25 fps)
; "M" : millisecond
;
; Return value...: Subtract $fTc2 from $fTc1 in the source format
Func _tcSub($fTc1, $fTc2, $fFormat = "P")
Local $fMs1 = _tcToMs($fTc1)
Local $fMs2 = _tcToMs($fTc2)
Local $fSumMs = $fMs1 - $fMs2
If $fSumMs < 0 Then
$fSumMs = _tcToMs("24:00:00.00") - ($fSumMs * -1)
EndIf
Return _msToTc($fSumMs, $fFormat)
EndFunc
; #FUNCTION#
; Name...........: _tcToMs
; Description....: Returns timecode converted to total milliseconds
; Syntax.........: _tcToMs($fTc)
;
; Parameters.....: $fTc - Timecode in hh:mm:ss.ff or hh:mm:ss:xxx format, where xxx are milliseconds
;
; Return value...: Milliseconds as an integer value
Func _tcToMs($fTc)
Local $fTemp = StringSplit($fTc, ":.")
Local $fChr = StringLen($fTemp[4])
Switch $fChr
Case 2
Return ($fTemp[4] * 40) + ($fTemp[3] * 1000) + ($fTemp[2] * 60000) + ($fTemp[1] * 3600000)
Case 3
Return ($fTemp[4]) + ($fTemp[3] * 1000) + ($fTemp[2] * 60000) + ($fTemp[1] * 3600000)
EndSwitch
EndFunc
; #FUNCTION#
; Name...........: _msToTc
; Description....: Converts total milliseconds to timecode
; Syntax.........: _msToTc($fIn, $fFormat = "P", $fHourFormat = 1)
;
; Parameters.....: $fIn - Time in milliseconds
; $fFormat - Output format "P": PAL TC (default)
; "M": hh:mm:ss.xxx where xxx are milliseconds
; $fHourFormat - Hour format "1": max. value is 23, then starts from 0 (default)
; "0": hours can be more then 23
;
; Return value...: Timecode as string in the selected format
Func _msToTc($fIn, $fFormat = "P", $fHourFormat = 1)
Switch $fFormat
Case "P"
Local $fFr = StringFormat("%02i", (StringRight($fIn, 3) - Mod(StringRight($fIn, 3), 40)) / 40)
Case "M"
Local $fFr = StringFormat("%03i", StringRight($fIn, 3))
EndSwitch
$fIn = StringTrimRight($fIn, 3)
Local $fSec = StringFormat("%02i", Mod($fIn, 60))
$fIn -= $fSec
Local $fMinTot = $fIn / 60
Local $fMin = StringFormat("%02i", Mod($fMinTot, 60))
$fIn -= $fMin*60
Local $fHourTot = $fIn / 60 / 60
Switch $fHourFormat
Case 1
$fHour = StringFormat("%02i", Mod($fHourTot, 24))
Case 0
$fHour = StringFormat("%02i", $fHourTot)
EndSwitch
Return($fHour & ":" & $fMin & ":" & $fSec & "." & $fFr)
EndFunc
; #FUNCTION#
; Name...........: _tcFormatChange
; Description....: Toggle TC format
; Syntax.........: _tcFormatChange($fTc)
;
; Parameters.....: $fTc - Timecode in hh:mm:ss.ff or hh:mm:ss:xxx format, where xxx are milliseconds
;
; Return value...: PAL timecode or time with milliseconds as string, depends on input
Func _tcFormatChange($fTc)
Local $fTemp = StringSplit($fTc, ":.")
Local $fChr = StringLen($fTemp[4])
Switch $fChr
Case 2
Return $fTemp[1]&":"&$fTemp[2]&":"&$fTemp[3]&"."&StringFormat("%03i", $fTemp[4]*40)
Case 3
Return $fTemp[1]&":"&$fTemp[2]&":"&$fTemp[3]&"."&StringFormat("%02i", ($fTemp[4]-Mod($fTemp[4], 40))/40)
EndSwitch
EndFunc
And the example script:
#include<_PAL_TC_Calc.au3>
$palTC1 = "00:01:12.20"
$palTC2 = "23:59:50.02"
$msTC1 = "00:01:12.800"
$msTC2 = "23:59:50.120"
MsgBox(0, "1", _tcAdd($palTC1, $palTC2)); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns PAL TC format
MsgBox(0, "2", _tcAdd($palTC1, $palTC2, "M")); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns time with milliseconds format
MsgBox(0, "3", _tcAdd($palTC1, $palTC2, "M", 0)); Adds $palTC1 to $palTC2, hours can be infinite, returns time with milliseconds format
MsgBox(0, "4", _tcAdd($msTC1, $msTC2)); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns PAL TC format
MsgBox(0, "5", _tcAdd($msTC1, $msTC2, "M")); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns time with milliseconds format
MsgBox(0, "6", _tcAdd($msTC1, $msTC2, "M", 0)); Adds $palTC1 to $palTC2, hours can be infinite, returns time with milliseconds format
MsgBox(0, "7", _tcSub($palTC2, $palTC1)); Subtract $palTC1 from $palTC2, returns PAL TC format
MsgBox(0, "8", _tcSub($palTC2, $palTC1, "M")); Subtract $palTC1 from $palTC2, time with milliseconds format
MsgBox(0, "9", _tcSub($msTC1, $msTC2)); Subtract $palTC1 from $palTC2, returns PAL TC format - when hits zero, counts back from 24:00:00.00
MsgBox(0, "10", _tcSub($msTC1, $msTC2, "M")); Subtract $palTC1 from $palTC2, time with milliseconds format - when hits zero, counts back from 24:00:00.000
MsgBox(0, "11", _tcFormatChange($palTC2)); Convert PAL TC to time with milliseconds and back
MsgBox(0, "12", _tcFormatChange($msTC2)); Convert PAL TC to time with milliseconds and back
TC_CALC_example.au3
_PAL_TC_Calc.au3