Media Watcher – EAS Configuration

Installation and configuration of an EAS output system with Media Watcher.

Installation and configuration of an EAS

output system with Media Watcher

About

Description

Revision

1.1

History

18/02/2020

Authors

Peter Eszlari, Jerry Clark

Installation overview

  1. Install the latest TOGMediaWatcher-rxxxxx-windows-installer.exe
  2. Install a renderer, RT_OEM_DLL-4.6.4 or Tog_4.6.4. The oldest version that is supported with EAS: r25565.
  3. Configure the TOGMediaWatcher shortcut in the installation folder to load the configuration file: RTSWconfTOGMediaWatcher.conf
  4. Edit the configuration file according to the guide below
  5. Prepare 2 directory locations in your system:
    1. One that is accessible by both the Dasdec machine and MediaWatcher.

This will be the Dasdec output and MediaWatcher input.

  1. One that is accessible by both MediaWatcher and the renderer DLL or Tog.

This cannot be the exact same as folder a) but it can be a subfolder of that.

  1. Configure the Dasdec machine in correspondence to MediaWatcher file formats and folder locations.
  2. Prepare an RT Project with the appropriate graphic script and assets

MediaWatcher configuration via conf file

MediaWatcher will only work correctly if it starts up with a conf file set.

A basic conf file will be produced by the installer and placed here:

RTSWconfTOGMediaWatcher.conf

This will have to be edited, see the configuration details below.

The best way to run the conf file is to make the application shortcut pass the parameter to the executable.

  1. Right-click on the TOGMediaWatcher shortcut icon in the RTSW folder
  2. Click on Properties
  3. Edit the Target line by adding –conf and the full path to the conf file:
  4. –conf “C:UserstogDesktopRTSWconfTOGMediaWatcher.conf”
  5. Press Apply then Ok

EAS specific configuration details in the conf file:

  1. Input/Output directories:

<inputDirectory> : All the alert files will be delivered to this location by the Dasdec machine so this has to be set the same as the output directory of Dasdec.

<outputDirectory> : MediaWatcher will move the audio files here from its inputDirectory. In this case the RT graphic script will play the audio file directly from here.

NOTE: This is only if the alert file does not specify a separate location for the incoming audio file. This might be a configuration option in Dasdec. In that case the file will be kept there and will be read from there by the renderer.

This will be specified in the EAS alert file by this code: EAS.AUDIO.FILE.PATH.

See more details at the EAS codes section of this document.

  1. MOS communication settings

MOS settings will correspond to the values in the DLL/Tog preferences:

<mosId>Tog</mosId> :
<ncsId>Tog</ncsId>
<encoding>unicode</encoding>
<timeout>120</timeout>

And the IP address and ports of the DLL/Tog machine(s):

For a single rendering machine:

<hosts>192.168.100.89;10540;10541</hosts>

Multiple renderers can have the same port settings:

<hosts>10.163.0.145;10540;10541
10.163.0.146;10540;10541</hosts>

For multiple DLL channels on each renderer multiple pair of ports will be set on the same IP:

<hosts>10.163.0.145;10540;10541
10.163.0.145;10550;10551
10.163.0.147;10540;10541
10.163.0.147;10550;10551</hosts>

  1. EasFIPSCodes

<EasFIPSCodes> are area codes in the EAS alert file that will determine whether the alert is intended for the geographical broadcast area of interest. E.g.: 008041

Make sure this code matches the EAS.FIPS code in the alert files. This might be pre-configured in the Dasdec preferences so only area-specific alerts will be sent to MediaWatcher.

NOTE: If this section is empty or missing MediaWatcher will accept all FIPS codes.

Multiple codes can be separated by [~]:

<EasFIPSCodes>008041~502089</EasFIPSCodes>

  1. Plugin

<plugin> is the plugin that will be used to process the files arriving in the InBox. In this case the required plugin is TMWImportEAS:

<plugin>TMWImportEAS</plugin>

 

The EAS alert text file

The text file delivered by Dasdec must be named: EAS_NET_ALERT. The destination location of this file will have to be the MediaWatcher <inputDirectory>. These will be configured both in Dasdec and in the MediaWatcher conf file.

The alert file will have alert codes and their values formatted as in this example:

EAS.DURATION = ’13’
EAS.TYPE = ‘DMO’
EAS.TYPE.SEVERITY = ‘WARNING’

EAS codes processed by MediaWatcher

EAS.ALERT_EVENT.TYPE : EAN or NPT values signify a Live Alert. Any other value is not considered a live alert.

The only effect of this is that in case of a live alert MediaWatcher will ignore audio and pass an empty AudioFile string to TickerEAS.

EAS.TYPE.SEVERITY

Alert severity – This will drive the colour of the ticker plinth.

Options: ADVISORY, TEST, WATCH, WARNING, EMERGENCY

Plinth colours:

PlinthRed:        emergency and test

PlinthGreen:        warning

PlinthBlue:        watch and advisory

NOTE: for this to work all corresponding assets must exist in the RT project and be configured correctly. The actual colours of the ticker can be changed as long as the asset-names remain the same. See the RT Project section for more details.

EAS.DURATION: determines alert duration in seconds. This value is passed on to the TickerEAS script running in the renderer, a user code will process it and when this duration time has passed it will take off the alert graphics and audio.

EAS.TEXT, EAS.HEADLINE, EAS.DESCRIPTION, EAS.INSTRUCTION:

These are alert texts that will be added to TickerContents to display on the renderer output.

EAS.FIPS:

Area codes in the EAS alert file that will determine whether the alert is intended for the geographical broadcast area of interest.

Example: 008041

This might be pre-configured in the Dasdec preferences so that only area-specific alerts will be sent to MediaWatcher.

EAS.AUDIO.FILE.PATH: Might be configurable in Dasdec, the default is empty or ‘.’

If not empty or ‘.’ then the Dasdec box will transfer the file to this path. Otherwise it will be transferred together with the text alert file and MediaWatcher will move the file into its <outputDirectory>. In both cases MediaWatcher will send the final location of the file to the DLL or Tog.

EAS.AUDIO.FILE : name of the file with extension. The name must start with “eas_audio” which might be configurable in Dasdec.

NOTE: Dasdec has to be configured to output the audio file in a standard .wav format, mono or stereo and with a sample rate of 48000 Hz.

RT Project

The RT project will have specific requirements to work with the MediaWatcher EAS system.

Project files and assets needed:

GMScripts/Template/TickerEAS.rb
GMScripts/Template/TickerEAS.assets
GMScripts/Template/TickerEAS.manifest
GMData/Materials/PlinthBlue.mat
GMData/Materials/PlinthGreen.mat
GMData/Materials/PlinthRed.mat
GMData/Shaders/PlinthBlue.sha
GMData/Shaders/PlinthGreen.sha
GMData/Shaders/PlinthRed.sha
GMData/States/PlinthBlue.sta
GMData/States/PlinthGreen.sta
GMData/States/PlinthRed.sta

  • The project must have a graphic named TickerEAS, an example will be attached to this document.
  • TickerEAS must have a method named bringOn
    • brinOn will have these exact inputs set: TickerContents,  Duration, PlinthShader,  AudioFile
    • bringOn will have the Source Type set as MOS Parameter
    • The TickerContents input will accept some string data (the alert text)  
  • The PlinthShader input will accept one of these exact values: PlinthRed, PlinthBlue, PlinthGreen , and there will be some appropriate assets created to respond to them.
  • The AudioFile will be a file path (string).
  • TickerEAS must have a method named takeOff
  • TickerEAS must have a clockNode in the scenegraph.
    • On the clockNode enable Running
    • Add a step Animator to the beginning of bringOn to drive the Display field
    • Add a step Animator to the end of takeOff to drive the Display field
  • TickerEAS must have a method that brings on audio, might be named bringOnAudio.
    • The bringOnAudio method will have an AudioNode with a StartSound step animator to start playing the audio file. A step animator cannot be placed on the timeline sooner than frame-2.
    • In the bringOnAudio method set the AudioNode Volume path animator from 0-100 to turn up the wav volume and the appropriate InputGroupVolume(1-4) from 100-0 to turn down the program volume.  The path should be comfortably long, perhaps 5-20 frames.
  • TickerEAS must have a method that takes off audio, might be named takeOffAudio.
    • This will have the same path animators for the same AudioNode as bringOnAudio but all flipped to reverse the effect of that method.
    • Will have a StopSound step animator at the end to stop wav file reading.
  • TickerEAS must have user code added, see the code examples below.
    • In bringOn a code will call the takeOff method after the input Duration value has passed.
    • In bringOn and takeOff a code will call bringOnAudio and takeOffAudio respectively, based on whether the script has received an audio filename input from MediaWatcher or not.

User code in bringOn for Ticker Duration:

@clock.setEnable(false)
@clock.setTimeResetStart(“00:00:00:00”)
@clock.setEnable(true)
@clock.clearEvents()
@clock.addEvent(_Duration*1000,0,”takeOff”)

User code for audio in bringOn:

$AudioFile = _AudioFile
if ($AudioFile != “”)
self.runMethod(“bringOnAudio”,data)
End

User code for audio in takeOff:

if ($AudioFile != “”)
self.runMethod(“takeOffAudio”,data)
End

Appendix A

MOS transfer log

If MOS debug is set in the DLL or Tog preferences a successful transfer will look like this:

2020-12-17T16:05:21.184: DEBUG – MOS:RxMosStart
<mos>
  <mosID>Tog</mosID>
  <ncsID>Tog</ncsID>
  <mosTOGCommand>
      <objID>1</objID>
      <command>PLAYMETHOD</command>
      <parameter>
          <name>NAME</name>
          <value>bringOn</value>
      </parameter>
      <parameter>
          <name>TickerContents</name>
          <value>A broadcast or cable system has issued A PRACTICE/DEMO WARNING for the following counties or areas: El Paso, CO; at 9:15 AM on FEB 6, 2020 Effective until 9:30 AM. Message from DASDEC. </value>
      </parameter>
      <parameter>
          <name>PlinthShader</name>
          <value>PlinthGreen</value>
      </parameter>
      <parameter>
          <name>Duration</name>
          <value>40</value>
      </parameter>
      <parameter>
          <name>AudioFile</name>
          <value>C:UserstogDesktopRTSWTOGMediaWatcheroutbox/eas_audio.wav</value>
      </parameter>
  </mosTOGCommand>
</mos>
RxMosEnd

Appendix B

A TOGMediaWatcher.conf file example:

<tOGMediaWatcher>
        <home>C:UserstogDesktopRTSW</home>
        <clearWorkingOnLoad>false</clearWorkingOnLoad>
        <exitWhenEmpty>false</exitWhenEmpty>
        <processOneFile>false</processOneFile>
        <numberBackupDays>0</numberBackupDays>
        <checkFileHasChanged>false</checkFileHasChanged>
        <numberLogBackups>0</numberLogBackups>
        <logDatabaseStatements>false</logDatabaseStatements>
        <allDownloadsFirst>false</allDownloadsFirst>
        <inBox>
                <name>EAS</name>
                <inputDirectory>C:UserstogDesktopRTSWTOGMediaWatcherinbox</inputDirectory>
                <outputDirectory>C:UserstogDesktopRTSWTOGMediaWatcheroutbox</outputDirectory>
                <hosts>192.168.100.31;10540;10541
192.168.100.31;10542;10543
192.168.100.31;10544;10545</hosts>
                <FallbackEasTXduration>45</FallbackEasTXduration>
                <plugin>TMWImportEAS</plugin>
        </inBox>
</tOGMediaWatcher>

Appendix C

TickerEAS.rb graphic script example

#encoding: UTF-8
#######################################################
#
# TOG-3D Graphics: tOG-3D 4.6.4_r25565_64
#
# Fri Jan 15 12:01:48 2021
#
# This file is automatically generated. Only add code
# to those sections marked startUserBlock()/endUserBlock()
#
#######################################################


classTickerEAS < Gm::GMScript

        definitialize(rootNode)
                super()
                self.setScriptType(“TOG 2D”)
self.setExportMethods([“bringOn”,”bringOnAudio”,”cueGraphic”,”takeOff”,”takeOffAudio”])
                self.setIsLibrary(false)
                self.setVersion(“tOG-3D 4.6.4_r25565_64”)
        end

        defConstruct(data)
                self.swap()
                @DLL_CAM = Gm::GMCameraNode.new(Gm::GMRootNode.rootNode,”DLL_CAM”)
                @DLL_LGT = Gm::GMLightNode.new(@DLL_CAM,”DLL_LGT”)
                @TickerEAS_OBJ = Gm::GMObjectNode.new(self,@DLL_LGT,”TickerEAS_OBJ”,”Generic”,Gm::GM_ONT_Default,Gm::GM_ONA_Default)
                Gm::GMRootNode.rootNode.setClearColour(0,0,0,0)
                Gm::GMRootNode.rootNode.setClearStencil(0)
                Gm::GMRootNode.rootNode.setClearDepth(1)
                if (! @DLL_CAM.isInitialised())
                        # DLL_CAM Initialisation
                        @DLL_CAM.setProjectCamera(true)
                        @DLL_CAM.setViewport(0,0,1280,720)
                        @DLL_CAM.setPixelAligned()
                        @DLL_CAM.setAllowInitialise(true)
                        @DLL_CAM.initialise(true)
                end
                @DLL_LGT.setEnabled(true)
                @DLL_LGT.setAmbient(1,1,1,1)
                @DLL_LGT.setDiffuse(1,1,1,1)
                @DLL_LGT.setSpecular(1,1,1,1)
                @DLL_LGT.setPosition(1,1,3)
                
                # TickerEAS_OBJ Construct
                @posGuideTRFM = Gm::GMTransformNode.new(@TickerEAS_OBJ,”posGuideTRFM”)
                @posGuideSHDR = Gm::GMShaderNode.new(@posGuideTRFM,”posGuideSHDR”)
                @posGuideDGEOM = Gm::GMDynamicGeometryNode.new(@posGuideSHDR,”posGuideDGEOM”)
                @strap_ALPH = Gm::GMAlphaNode.new(@TickerEAS_OBJ,”strap_ALPH”)
                @strapTRFM = Gm::GMTransformNode.new(@strap_ALPH,”strapTRFM”)
                @strapSHDR = Gm::GMShaderNode.new(@strapTRFM,”strapSHDR”)
                @strapDGEOM = Gm::GMDynamicGeometryNode.new(@strapSHDR,”strapDGEOM”)
                @tickerPosition = Gm::GMTransformNode.new(@strap_ALPH,”tickerPosition”)
                @n1_CLIP = Gm::GMClipPlaneNode.new(@tickerPosition,”n1_CLIP”)
                @EASticker = Gm::GMTickerNode.new(@n1_CLIP,”EASticker”)
                @slug = Gm::GMTransformNode.new(@EASticker,”slug”)
                @slugTextTRFM = Gm::GMTransformNode.new(@slug,”slugTextTRFM”)
                @slugTextSHDR = Gm::GMShaderNode.new(@slugTextTRFM,”slugTextSHDR”)
                @slugTextTEXT = Gm::GMTextNode.new(@slugTextSHDR,”slugTextTEXT”)
                @control_AUDIO = Gm::GMAudioNode.new(@TickerEAS_OBJ,”control_AUDIO”)
                @clock = Gm::GMClockNode.new(@TickerEAS_OBJ,”clock”)
                
                # TickerEAS_OBJ Initialisation
                if (! @TickerEAS_OBJ.isInitialised())
                        @posGuideTRFM.setTranslateV(640,360,0)
                        @posGuideSHDR.setMoviePauseOnLoad(true)
                        @posGuideSHDR.setMaterialDiffuse(1,1,1)
                        @posGuideSHDR.setMaterialAlpha(1)
                        @posGuideSHDR.setTextureTV(Gm::GL_TEXTURE0,0,0,0)
                        @posGuideSHDR.setTextureRV(Gm::GL_TEXTURE0,0,0,0)
                        @posGuideSHDR.setTextureSV(Gm::GL_TEXTURE0,1,1,1)
                        @posGuideSHDR.setUsePerPixelLighting(false)
                        @posGuideSHDR.addActiveLight(@DLL_LGT.getLibraryNamespace() + “DLL_LGT”)
                        @posGuideDGEOM.setRectangleXSize(1)
                        @posGuideDGEOM.setRectangleYSize(1)
                        @posGuideDGEOM.setRectangleRadius(0)
                        @posGuideDGEOM.setRectangleDAngle(10)
                        @posGuideDGEOM.setRectangleDX(0)
                        @posGuideDGEOM.setRectangleDY(0)
                        @posGuideDGEOM.setRectangleXGrid(10)
                        @posGuideDGEOM.setRectangleYGrid(10)
                        @posGuideDGEOM.setRectangleTexture(true)
                        @posGuideDGEOM.setRectangleTXSize(1280)
                        @posGuideDGEOM.setRectangleTYSize(720)
                        @posGuideDGEOM.setMultiTexture(true)
                        @posGuideDGEOM.setDisplay(false)
                        @strap_ALPH.setAlpha(-0.0140161, 0)
                        @strapTRFM.setTranslateV(640,684,0)
                        @strapSHDR.setShader(“PlinthRed”)
                        @strapSHDR.setTextureTV(Gm::GL_TEXTURE0,0,0,0)
                        @strapSHDR.setTextureRV(Gm::GL_TEXTURE0,0,0,0)
                        @strapSHDR.setTextureSV(Gm::GL_TEXTURE0,1,1,1)
                        @strapSHDR.setUsePerPixelLighting(false)
                        @strapSHDR.addActiveLight(@DLL_LGT.getLibraryNamespace() + “DLL_LGT”)
                        @strapDGEOM.setRectangleXSize(1280)
                        @strapDGEOM.setRectangleYSize(46)
                        @strapDGEOM.setRectangleRadius(0)
                        @strapDGEOM.setRectangleDAngle(10)
                        @strapDGEOM.setRectangleDX(0)
                        @strapDGEOM.setRectangleDY(0)
                        @strapDGEOM.setRectangleXGrid(10)
                        @strapDGEOM.setRectangleYGrid(10)
                        @strapDGEOM.setMultiTexture(true)
                        @tickerPosition.setTranslateV(0,680,0)
                        @n1_CLIP.setTranslateV(0,0,0)
                        @n1_CLIP.setRotateV(0,0,0)
                        @EASticker.setDirection(Gm::GM_TD_Horizontal)
                        @EASticker.setSpeed(1.5)
                        @EASticker.setExtent(0,1280)
                        @EASticker.setSpacing(100)
                        @EASticker.setNumberCycles(0)
                        @EASticker.setCount(0)
                        @EASticker.setAnimationTriggerEvent(Gm::GM_TATE_WhenSlugFullyVisible)
                        @EASticker.addUpdateNode(false,”slug”,”slugTextSHDR”,”text”)
                        @EASticker.addUpdateNode(true,”slug”,”slugTextTEXT”,””)
                        @slugTextTRFM.setTranslateV(-0.839996,-2.205,0)
                        @slugTextSHDR.setShader(“text”)
                        @slugTextSHDR.setUsePerPixelLighting(false)
                        @slugTextSHDR.addActiveLight(@DLL_LGT.getLibraryNamespace() + “DLL_LGT”)
                        @slugTextTEXT.setFont(“Default”)
                        @slugTextTEXT.setString(“text1”)
                        @slugTextTEXT.setSize(15)
                        @slugTextTEXT.setMaxXSize(0)
                        @slugTextTEXT.layout()
                        @slugTextTEXT.setLayoutNodesReady(true)
                        @control_AUDIO.setChannel(0)
                        @control_AUDIO.setVolume(0)
                        @control_AUDIO.muteAudio(false)
                        @control_AUDIO.setInputMasterVolume(100)
                        @control_AUDIO.setOutputMasterVolume(100)
                        @control_AUDIO.setInputMasterMute(0)
                        @control_AUDIO.setOutputMasterMute(0)
                        @control_AUDIO.setInputGroupVolume(100,0)
                        @control_AUDIO.setInputGroupVolume(0,1)
                        @control_AUDIO.setInputGroupVolume(0,2)
                        @control_AUDIO.setInputGroupVolume(0,3)
                        @control_AUDIO.setInputGroupMute(0,0)
                        @control_AUDIO.setInputGroupMute(0,1)
                        @control_AUDIO.setInputGroupMute(0,2)
                        @control_AUDIO.setInputGroupMute(0,3)
                        @clock.setType(Gm::GM_CT_Relative)
                        @clock.setMillisec(0)
                        @clock.setSecond(0)
                        @clock.setMinute(0)
                        @clock.setHour(0)
                        @clock.setDay(1)
                        @clock.setMonth(1)
                        @clock.setYear(2000)
                        @clock.setETMillisec(0)
                        @clock.setETSecond(0)
                        @clock.setETMinute(0)
                        @clock.setETHour(0)
                        @clock.setETDay(1)
                        @clock.setETMonth(1)
                        @clock.setETYear(2000)
                        @clock.setCountDown(false)
                        @clock.setFormat(“hh:mm:ss”)
                        @clock.setOffsetMillisecs(0)
                        @clock.setFixAtTargetTime(false)
                        @clock.setRestart(true)
                        @clock.addEvent(4000,0,”takeOff”)
                        @clock.setEnable(true)
                        @clock.setDisplay(false)
                end
                
                # TickerEAS_OBJ Set
                
                # TickerEAS_OBJ Links
                if (! @TickerEAS_OBJ.isInitialised())
                end
                
                # Node Events
                
                # TickerEAS_OBJ Stage 2 Initialisation
                if (! @TickerEAS_OBJ.isInitialised())
                end
                
                # Save Links to Nodes above Object Nodes
                
                # Save Explicit Script Variables
                
                # Construct Block

                self.startBlock(“Construct.block1”)
                self.endBlock(“Construct.block1”)
                
                # Set Objects Initialised
                @TickerEAS_OBJ.initialise(true)
                
                # Save Events
                
                # Set Current Method/Block
                self.setCurrMethodName(“bringOn”)
                self.setCurrBlockName(“bringOn.block1”)
        end


        defMain(data)
                self.transfer()

                self.startBlock(“Main.block1”)
                self.endBlock(“Main.block1”)
        end

        defbringOn(data)
                data.setInput(“bringOn”,”TickerContents”,true,true,Gm::GM_DT_String,Gm::GM_IP_Mos,
                                Gm::GM_OP_SceneGraph,@EASticker,@EASticker.pContents(),””,””,””,”Sample content for ticker input”)
                data.setInput(“bringOn”,”Duration”,true,true,Gm::GM_DT_Int,Gm::GM_IP_Mos,
                                Gm::GM_OP_ScriptValue,nil,nil,””,””,””,”4″)
                data.setInput(“bringOn”,”PlinthShader”,true,true,Gm::GM_DT_String,Gm::GM_IP_Mos,
                                Gm::GM_OP_SceneGraph,@strapSHDR,@strapSHDR.pShader(),””,””,””,””)
                data.setInput(“bringOn”,”AudioFile”,false,true,Gm::GM_DT_String,Gm::GM_IP_Mos,
                                Gm::GM_OP_SceneGraph,@control_AUDIO,@control_AUDIO.pFileName(),””,””,””,””)

                self.startBlock(“bringOn.block1”)
                        self.startClipBlock(true)
                                @EASticker.setAnimator(
                                                Gm::GM_AC_Step,
                                                Gm::GM_AGT_Manual,
                                                @EASticker.pRestart(),
                                                Gm::GM_AT_Absolute,
                                                Gm::GM_AR_None,
                                                “ip=,nv=,av=,sf=,ef=”,
                                                0,
                                                [2,0])
                        self.endClipBlock(true)
                self.endBlock(“bringOn.block1”)

                self.startBlock(“bringOn”)
                        self.startInputBlock(false)
                                _TickerContents = data.getParameter(“TickerContents”)
                                _Duration = data.getParameter(“Duration”).to_i
                                _PlinthShader = data.getParameter(“PlinthShader”)
                                _AudioFile = data.getParameter(“AudioFile”)
                        self.endInputBlock(false)

                        self.startUserBlock(false)
                                @clock.setEnable(false)
                                @clock.setTimeResetStart(“00:00:00:00”)
                                @clock.setEnable(true)
                                
                                @clock.clearEvents()
                                @clock.addEvent(_Duration*1000,0,”takeOff”)
                                
                                $AudioFile = _AudioFile
                                if ($AudioFile != “”)
                                        self.runMethod(“bringOnAudio”,data)
                                end
                        self.endUserBlock(false)

                        self.startUpdateBlock(false)
                                @EASticker.setContents(data.getInputValue(“bringOn”, “TickerContents”))
                                @strapSHDR.setShader(_PlinthShader)
                                @control_AUDIO.setFileName(_AudioFile)
                        self.endUpdateBlock(false)

                        self.startClipBlock(true)
                                @strap_ALPH.setAnimator(
                                        Gm::GM_AC_Path,
                                        Gm::GM_AGT_Manual,
                                        @strap_ALPH.pAlphaMultiply(),
                                        Gm::GM_AT_Absolute,
                                        Gm::GM_AR_None,
                                        “ip=,nv=,av=,sf=,ef=”,
                                        0,
                                        [1,-0.013539,1.000000,0.000000,0.000000,180.000000,
                                        26,1.000000,0.000000,180.000000,1.000000,180.000000])
                                @clock.setAnimator(
                                                Gm::GM_AC_Step,
                                                Gm::GM_AGT_Manual,
                                                @clock.pDisplay(),
                                                Gm::GM_AT_Absolute,
                                                Gm::GM_AR_None,
                                                “ip=,nv=,av=,sf=,ef=”,
                                                0,
                                                [2,true])
                        self.endClipBlock(true)
                self.endBlock(“bringOn”)
        end

        defbringOnAudio(data)

                self.startBlock(“bringOnAudio.block1”)
                        self.startClipBlock(true)
                                @control_AUDIO.setAnimator(
                                        Gm::GM_AC_Path,
                                        Gm::GM_AGT_Manual,
                                        @control_AUDIO.pInputGroupVolume1(),
                                        Gm::GM_AT_Absolute,
                                        Gm::GM_AR_None,
                                        “ip=,nv=,av=,sf=,ef=”,
                                        0,
                                        [1,100.000000,5.200001,0.000000,0.000000,0.000000,
                                        26,0.000000,0.000000,0.000000,5.200001,180.000000])
                                @control_AUDIO.setAnimator(
                                                Gm::GM_AC_Step,
                                                Gm::GM_AGT_Manual,
                                                @control_AUDIO.pStartSound(),
                                                Gm::GM_AT_Absolute,
                                                Gm::GM_AR_None,
                                                “ip=,nv=,av=,sf=,ef=”,
                                                0,
                                                [2,0.000000])
                                @control_AUDIO.setAnimator(
                                        Gm::GM_AC_Path,
                                        Gm::GM_AGT_Manual,
                                        @control_AUDIO.pVolume(),
                                        Gm::GM_AT_Absolute,
                                        Gm::GM_AR_None,
                                        “ip=,nv=,av=,sf=,ef=”,
                                        0,
                                        [1,0.000000,5.200001,0.000000,0.000000,180.000000,
                                        26,100.000000,0.000000,180.000000,5.200001,180.000000])
                        self.endClipBlock(true)
                self.endBlock(“bringOnAudio.block1”)
        end

        defcueGraphic(data)

                self.startBlock(“cueGraphic”)
                self.endBlock(“cueGraphic”)
        end

        deftakeOff(data)

                self.startBlock(“takeOff”)
                        self.startUserBlock(false)
                                if ($AudioFile != “”)
                                                self.runMethod(“takeOffAudio”,data)
                                end
                        self.endUserBlock(false)
                        self.startClipBlock(false)
                                @strap_ALPH.setAnimator(
                                        Gm::GM_AC_Path,
                                        Gm::GM_AGT_Manual,
                                        @strap_ALPH.pAlphaMultiply(),
                                        Gm::GM_AT_Absolute,
                                        Gm::GM_AR_None,
                                        “ip=,nv=,av=,sf=,ef=”,
                                        0,
                                        [1,1.793211,9.699120,-4.249835,0.000000,180.000000,
                                        26,-0.014016,0.000000,180.000000,8.335194,175.758484])
                                @TickerEAS_OBJ.setAnimator(
                                                Gm::GM_AC_Step,
                                                Gm::GM_AGT_Manual,
                                                @TickerEAS_OBJ.pTransferType(),
                                                Gm::GM_AT_Absolute,
                                                Gm::GM_AR_None,
                                                “ip=,nv=,av=,sf=,ef=”,
                                                0,
                                                [26,54])
                                @clock.setAnimator(
                                                Gm::GM_AC_Step,
                                                Gm::GM_AGT_Manual,
                                                @clock.pDisplay(),
                                                Gm::GM_AT_Absolute,
                                                Gm::GM_AR_None,
                                                “ip=,nv=,av=,sf=,ef=”,
                                                0,
                                                [26,false])
                        self.endClipBlock(false)
                self.endBlock(“takeOff”)
        end

        deftakeOffAudio(data)

                self.startBlock(“takeOffAudio.block1”)
                        self.startClipBlock(true)
                                @control_AUDIO.setAnimator(
                                        Gm::GM_AC_Path,
                                        Gm::GM_AGT_Manual,
                                        @control_AUDIO.pInputGroupVolume1(),
                                        Gm::GM_AT_Absolute,
                                        Gm::GM_AR_None,
                                        “ip=,nv=,av=,sf=,ef=”,
                                        0,
                                        [1,0.000000,5.200001,0.000000,0.000000,180.000000,
                                        26,100.000000,0.000000,180.000000,5.200001,180.000000])
                                @control_AUDIO.setAnimator(
                                        Gm::GM_AC_Path,
                                        Gm::GM_AGT_Manual,
                                        @control_AUDIO.pVolume(),
                                        Gm::GM_AT_Absolute,
                                        Gm::GM_AR_None,
                                        “ip=,nv=,av=,sf=,ef=”,
                                        0,
                                        [1,100.000000,5.200001,0.000000,0.000000,0.000000,
                                        26,0.000000,0.000000,0.000000,5.200001,180.000000])
                                @control_AUDIO.setAnimator(
                                                Gm::GM_AC_Step,
                                                Gm::GM_AGT_Manual,
                                                @control_AUDIO.pStopSound(),
                                                Gm::GM_AT_Absolute,
                                                Gm::GM_AR_None,
                                                “ip=,nv=,av=,sf=,ef=”,
                                                0,
                                                [26,false])
                        self.endClipBlock(true)
                self.endBlock(“takeOffAudio.block1”)
        end
end