System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great...

251

Transcript of System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great...

Page 1: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the
Page 2: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the
Page 3: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

System Manual -

Advanced programmer 5.1

2007 gmbH & co. kg, im Dörener Feld 11, D-33100 Paderborn. www.ecue.de EN V5.1 2009-07-03 Christian Brink

Page 4: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the
Page 5: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 5/251

Introduction This manual is considered to follow up the 'e:cue Programmer

System Manual – Basic' by covering some more advanced topics.

We begin with a programming course for the e:script Macro

Language in chapter one, starting with the very basics. If you are

already familiar with programming, you might want to skip

directly to chapter two where e:script is used for several

advanced purposes like automation and device access.

Chapter three explains the e*net protocol for software developers

who want to implement it in their products.

In chapter four, the e:cue Programmer Toolbox is explained along

with some other tweaks and tricks for using the e:cue

Programmer.

Page 6: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 6/251

1 THE E:SCRIPT LANGUAGE ................... 10

1.1 How To Run e:script Macros ........................................ 14 1.1.1 Internal Macros ......................................................... 14 1.1.2 e:script Wizards ........................................................ 15 1.1.3 How to run the code examples.................................. 16

1.2 Structure of e:script macros ......................................... 18 1.2.1 e:script Keywords ..................................................... 18 1.2.2 Adding Comments to a macro .................................. 19 1.2.3 Our first macro: Hello, World .................................. 20

1.3 Variables ......................................................................... 22 1.3.1 Integer Variables ...................................................... 23 1.3.2 String Variables ........................................................ 24 1.3.3 Arithmetic Operations .............................................. 26

1.4 Input Dialogues, format and printf .............................. 32 1.4.1 Input Dialogues ........................................................ 32 1.4.2 Using format and printf ............................................ 36 1.4.3 Control Characters .................................................... 41

1.5 Conditional Execution ................................................... 42 1.5.1 Branches ................................................................... 42 1.5.2 Relational Operators ................................................. 44 1.5.3 Selecting Paths with switch ...................................... 47

1.6 Loops ............................................................................... 50 1.6.1 Explanation of Loops................................................ 50 1.6.2 The while-Loop ........................................................ 51 1.6.3 Conditions or Logical Expressions ........................... 52 1.6.4 MessageYesNo in a while loop ................................ 53 1.6.5 The for-Loop ............................................................ 56

1.7 Nesting ............................................................................ 58 1.7.1 Explanation of Nesting ............................................. 58 1.7.2 Example: Think of a number .................................... 59 1.7.3 Example: A Pocket Calculator with a while-loop..... 62

Page 7: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 7/251

1.8 More About Variables ................................................... 64 1.8.1 Global variables ........................................................ 64 1.8.2 Arrays ....................................................................... 65 1.8.3 Additional String Operations .................................... 67 1.8.4 Bitwise Operations ................................................... 75

1.9 Functions ........................................................................ 81 1.9.1 Creating your own Functions ................................... 81 1.9.2 Return Values ........................................................... 82 1.9.3 Parameters ................................................................ 83 1.9.4 Recursions ................................................................ 85

1.10 State Machines ............................................................ 87 1.10.1 The Basic Concept of State Machines ...................... 87 1.10.2 State Machines in the e:cue Programmer ................. 88 1.10.3 Example: Pong.......................................................... 90

1.11 Event-driven Macro Execution ................................. 93

2 AUTOMATION & DEVICE ACCESS ..... 102

2.1 Accessing Cuelists ........................................................ 103 2.1.1 Starting and Stopping Cuelists................................ 103 2.1.2 Retrieving Information about Cuelists .................... 105 2.1.3 Deleting Cuelists .................................................... 110 2.1.4 Recording Cues ...................................................... 110

2.2 Accessing the Programmer View ................................ 111 2.2.1 Manipulating Fixtures in the Programmer View .... 111 2.2.2 Example: Making your own Effect Macro ............. 115 2.2.3 Using LoadValue .................................................... 120

2.3 Accessing Cues ............................................................. 123 2.3.1 Creating and Deleting Cues .................................... 123 2.3.2 Reading and Setting Cue Properties ....................... 123 2.3.3 Example: The Generate Single Colors Macro ........ 128

2.4 Processing Input & Output ......................................... 132

Page 8: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 8/251

2.4.1 Serial I/O ................................................................ 132 2.4.2 MIDI ....................................................................... 134

2.5 Reading Arguments on Macro Call............................ 138 2.5.1 Calling a Macro from another Macro ..................... 138 2.5.2 Receiving Arguments in a called macro ................. 139 2.5.3 Passing Arguments on Macro Call ......................... 141 2.5.4 Reading Arguments from Triggers ......................... 142

2.6 Accessing the Action Pad ............................................ 147 2.6.1 Addressing single Elements .................................... 147 2.6.2 Manipulating Action Pad items .............................. 148 2.6.3 Action Pad Auto Text ............................................. 150

2.7 Terminals ...................................................................... 155 2.7.1 Retrieving Terminal Input ...................................... 155 2.7.2 Sending Information to the Terminal ..................... 157

2.8 Saving Variables to XML ............................................ 160 2.8.1 The Command Set .................................................. 160 2.8.2 Example: Saving and Recalling Fader Values ........ 162

2.9 Peer Connectors ........................................................... 165 2.9.1 Auto Text Redirection ............................................ 168 2.9.2 Inputs and Outputs .................................................. 170 2.9.3 Sending Key and Init Messages .............................. 171 2.9.4 e:script redirection .................................................. 172 2.9.5 Peer events .............................................................. 174 2.9.6 Example: Controlling Cuelists on a Peer Machine . 175

2.10 I/O Boxes ................................................................... 177 2.10.1 Overview ................................................................ 178 2.10.2 Projection Devices .................................................. 198 2.10.3 Querying Status Information .................................. 203 2.10.4 Changing Values of the Output Ports ..................... 208 2.10.5 Overview of Device Properties and Commands ..... 211

2.11 Open Sound Control ................................................ 217 2.11.1 Basic Usage ............................................................ 217

Page 9: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 9/251

2.12 Generic UDP Packets ............................................... 220

3 THE E*NET PROTOCOL ....................... 225

3.1 Introduction ................................................................. 226

3.2 General Information .................................................... 227

3.3 Sending a Status Broadcast ......................................... 229

3.4 Sending a keyboard event ........................................... 230

3.5 Network Parameter Set ............................................... 233

3.6 Remote Command Execution and Macro Calls ........ 234

4 BUNDLE OF TWEAKS AND TRICKS ... 236

4.1 Programmer Tuning via Toolbox ............................... 237 4.1.1 Configuration Values .............................................. 238 4.1.2 The Quick Tune up Cookbook ............................... 241 4.1.3 Troubleshooting ...................................................... 241 4.1.4 Tips and Tricks ....................................................... 242

4.2 Tweaking your Workflow ........................................... 243 4.2.1 Programmer View and Cues ................................... 243 4.2.2 Macro Text Editor .................................................. 244

4.3 Using the Video Wizard on multiple Sections ........... 245

5 APPENDIX ............................................. 247

5.1 ASCII Table ................................................................. 248

6 IMPRINT, COPYRIGHT ......................... 250

Page 10: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 10/251

1 The e:script Language

The e:script language is a macro language embedded in the e:cue

Programmer. Based on the C programming language and

equipped with lots of special language commands, the e:script

language offers great possibilities for advanced control of the

e:cue Programmer. Most of the features the e:cue Programmer

offers in its graphical user interface, such as cuelist control and

fixture manipulation, are accessible via particular e:script

commands. This enables advanced users to tab the full potential

of the e:cue Programmer when creating shows.

This tutorial has been designed to form a starting point for users

willing to learn how to make their own e:script macros. We start

with the basics of programming, working on bit by bit in order to

establish the prerequisites for more complex topics. If you are

already experienced in programming, you can skip the first

chapters, but for a beginner it is strongly recommended to work

through all chapters in correct order.

Below is a list to give an overview about e:script language

features:

Language features

- Based on ANSI C

- Local and Global Variables: Integer, String, Arrays

- Control Loops: while, for

- Program Control: if, switch/case/break, return, exit

- Nesting

- Arithmetic operations: sqrt, radius, sin, cos, tan, etc…

- custom user functions (no parameters yet)

- Convert HSB to RGB values

- Call other macros

Page 11: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 11/251

Cuelists

- Read/write access to all cuelists

- Start or stop cuelists

- Copy, paste, and delete cuelists

- Change Mutual Exclude cuelist properties

Single Cues

- Read/write access to all cue properties

- Record new cues

Masters

- Read/write access to GrandMaster, Submaster, and

Versatile Masters (formerly known as Speed Masters)

Other Programmer Functions

- Read/write access to all fixture channels

- Read/write access to all patch data: Patch new fixtures

etc.

- Set preheat values

- Access to LiveFX

- Read/write access to e:cue programmer sections (cluster

size etc.)

- Access to programmer view: select / deselect fixtures, set

values, clear programmer view

- Read backup mode and status of operation

- Read/write access to ActionPad

- Read/write access to DMX start byte for all universes

External Communication

- Read/write access to all e:com terminals and e:cue

Terminal Emulators

Page 12: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 12/251

- Send e:com terminal messages into the network

- Setup remote terminals

- Read faderunit jogdials

- Read DMX input data (from e:cue calypso)

- Read/write access to all MIDI data

(note/controller/program or binary)

- Start and stop Timecode

- Read/write access to all RS232 data (string or binary)

- Communicate with eFlashPlayer on remote machines

- Read/write access to all Network Parameters for

communication with other applications

Remote Machine Control

- remote PC shutdown and restart via e:cue Terminal

Emulator

- Send WakeOnLAN packets to power up remote PC's

System Functions

- Read the system time and access Sunrise Timer

- Shut down and reboot the system

- Play sounds

- Start external applications via system command

interpreter

User Interaction

- Create modal dialogues for user interaction with the

following items:

Images

Text input fields

Value input fields

Password input fields

Page 13: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 13/251

Color Picker input fields

Checkboxes

Combo boxes

- Present system message boxes to the user – OK,

OK/CANCEL, YES/NO etc.

Page 14: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 14/251

1.1 How To Run e:script Macros

1.1.1 Internal Macros

e:script macros can be used as internal macros inside a show.

Internal e:script macros are stored in the Automation window

under the tab "Macros". Select Automation/Trigger Rules from the

menu bar (you can also just press ‘T’, 'F7' or click the Automation

icon on the toolbar) and select the tab "Macros". Here you can

create, edit, delete, and run macros.

Macros are executed as one-time "code snippets": The runtime of

a snippet is usually less than 0.01 seconds. To run longer, more

"continuous" macros, it is possible to store global values and

repeatedly call a macro to run a kind of "state machine". We will

explain that more detailed later.

Usually a macro inside a show would be called either by an

Automation rule or a Cue Action. An example of the first would

be "On a certain time, run macro X":

Page 15: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 15/251

An example of the second would be a cuelist with a single cue

that calls macro X via Cue Action:

More information on Automation trigger rules and Cue Actions

can be found in the e:cue Programmer system manual.

1.1.2 e:script Wizards

External e:script macros can be run using the e:script Wizard –

available from the main menu via Wizards/e:script Wizard.

Page 16: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 16/251

These macro files need to be put inside a subdirectory of the e:cue

Programmer's main directory (typically C:\Program

Files\ecue\Programmer V3.X) named "Wizards".

The e:script Wizard will display all files with the correct extension

that it finds in that subdirectory as executable macros. To be

recognized by the e:script Wizard the files need to have a .cpp

extension.

You can edit the macro files as plain text, using Windows

Notepad or any other standard text or code editor.

1.1.3 How to run the code examples

There are two ways to run the several macro code examples. You

can create a new macro in the automation window and simply

Page 17: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 17/251

copy the desired macro code into the e:script editor. Save the

macro and run it by pressing the "Run Macro"-button.

The other way is to create a text file inside the "Wizards"-

subdirectory of the e:cue programmer directory. Do not forget to

give the file a .cpp extension or the e:script Wizard will not

recognize it. Now copy the macro code into the file. Afterwards

you should be able to run them straightaway from the e:script

Wizard.

Page 18: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 18/251

1.2 Structure of e:script macros

Objectives

In this chapter you will learn about the following:

1. e:script keywords

2. how to end a single statement

3. how to add comments to your code

4. writing your first macro

1.2.1 e:script Keywords

e:script makes use of keywords which, when used with the

correct syntax, form the macro language. A keyword is a special

control word that may not be used for any other purposes. For

example, you cannot have a variable called StartCuelist

because that word is already reserved as a command name.

All keywords are case sensitive, so if you want to call the

command StartCuelist, you have to write it exactly this way.

Writing the command like startcuelist will be

misinterpreted. The same applies for variable names, so that e.g.

the variables number and Number are different. More about

variables can be found in chapter 1.3.

Each statement that you write in your macro needs to be finished

with a semicolon. The interpreter needs to have the semicolons to

know that "one statement finishes here, and the next one starts

afterwards". Any other layout is up to you.

Page 19: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 19/251

A very common mistake made by beginners is to miss off the

semicolon at the end of a statement. If the semicolon is

missing, the interpreter will read two or more commands as

one, and probably not understand the result. Furthermore,

the error message produced by the compiler will relate to a

line of your macro which could be some distance from the

initial mistake.

1.2.2 Adding Comments to a macro

A comment is an annotation inside the macro. All comments are

ignored by the interpreter - they are used primarily to document

and describe your source code, so that you can remember later

how it works and how to use it.

You can also use a comment to temporarily remove a line of code.

In e:script, a comment is signalled by the // character pair. The

complete line written after the // will be ignored by the

interpreter. For example, this is a syntactically correct comment:

// This is a comment

You can also add a comment after a line of code to describe your

purpose:

a = 2 - 1; // Subtract 1 from 2 and store the

// result into variable a

Page 20: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 20/251

1.2.3 Our first macro: Hello, World

Our first macro simply displays a message to the user: "Hello,

World!". When you run the macro, you should see the following

message box:

Let us have a look at the macro.

// This is the "Hello, World" macro

MessageOk("Hello, World!");

This is how it works:

1. The macro starts with a comment, which is ignored by

the interpreter, because the line is prefixed with the //

characters.

2. The next statement invokes a command called MessageOk.

3. The text inside the brackets () is a parameter which is

passed to the command so that it knows what to display

inside the message box. In our case it is the text "Hello,

World!".

4. The statement then finishes with a semicolon at the end.

Page 21: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 21/251

Here is the command description from the e:script Language

Reference:

MessageOK

int MessageOk(string text);

Present a standard message box to the user.

As can be seen from the above reference entry, MessageOK will

only accept parameters of the type string. This is why we have

put "Hello, World" in quotation marks "", which signifies a string

type variable. We will talk about variable types such as string in

the next chapter.

Note: instead of MessageOK you could have also used the

printf function, which puts the text into the e:cue

programmer logbook instead:

printf("Hello, World!\n");

Note the \n at the end: This signifies to the printf

command that it has to insert a carriage return and go down

to the next line. More about control characters like \n can be

found later on.

Page 22: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 22/251

1.3 Variables

Objectives

After you have read this section you should be able to:

1. declare an integer or string variable

2. assign values to variables

3. perform arithmetic operations using local variables

The first thing you need to know about e:script (or any other

programming language) is that you can create variables to store

values. A variable is just a named area of storage that can hold a

numeric value (such as 128) or a string (such as "Hello,World").

When you create a variable, e:script would like to know the type

of variable (integer or string) and its name, before you can do

something with it.

In this section we are only going to be discussing local variables.

These variables are used within the current macro. In a later

section we will be looking at global variables - variables that

remain persistent when a macro has finished, and will be

available to other macros then.

The types of variables offered by e:script are:

int - integer: a whole number such as 127.

int arrayname [size] – We will be discussing

arrays in a further section.

string - a string of characters, such as "Hello, World".

You can call variables what you like, but it helps if you give them

meaningful names that give you a hint of what they're being used

Page 23: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 23/251

for - names like sum, total, average and so on. Also, your

variables must not use the words that e:script uses for command

names, such as MessageOk or StartCuelist.

All variables must begin with a letter (or a "_" character for global

variables, but this will be discussed later on).

1.3.1 Integer Variables

The first type of variable we need to know about is of class type

int - short for integer. An int variable can store a 32-bit whole

number (the range is -2.147.483.648 to 2.147.483.647). No

fractional part is allowed.

To declare an int you use the instruction:

int variablename;

For example:

int a;

declares that you want to create a variable of type int called a.

To assign a value to our integer variable we would use the

following e:script statement:

a = 10;

Be aware that the e:script language, like most common

programming languages, uses the "=" character for assignment. A

statement of the form a = 10; is interpreted as take the numerical

value 10 and store it in a memory location associated with the integer

variable a.

Page 24: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 24/251

1.3.2 String Variables

The other type of variable used by e:script is the string type

variable. You can imagine a string as an alignment of single

alphabetic and special characters, up to a length of 255. Each

single character is stored as an 8-bit integer value, with each

number from 0 to 255 representing a certain char, encoded in

ANSI-standard. Later on, when we are going to access single

characters, it will be necessary to know about that.

To declare a string you use the instruction:

string variable name;

For example:

string MessageText;

declares that you want to create a string variable called

MessageText.

To assign a text to our string variable we would use the following

e:script statement:

MessageText = "Hello, World!";

The e:script Language uses the "=" character for assignment. A

statement of the form MessageText = "Hello, World!"; is

interpreted as take the text "Hello, World!" and store it in a memory

location associated with the string variable MessageText.

Since we can pass variables onto functions, our "Hello, World"

macro could also be written like this:

Page 25: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 25/251

// This is the "Hello, World" macro with a

// passed message text

string MessageText;

MessageText = "Hello, World!";

MessageOk(MessageText);

Since the MessageOK function expects a string type parameter,

the following would not work:

int a;

a = 10;

MessageOK(a);

and you would receive an error message in the e:cue

Programmer's logbook saying "Expression expected".

Page 26: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 26/251

1.3.3 Arithmetic Operations

Now, what makes variables useful is that you can use them to

store the result of an arithmetic operation. Consider the four basic

mathematical operations: addition, subtraction, multiplication and

division. Let us see how to use these operations. In this example,

we will perform mathematical operations on two variables a and

b and store the result into a variable c.

addition: c = a + b;

subtraction: c = a – b;

multiplication: c = a * b;

division: c = a / b;

Arithmetic Ordering

Whilst we are dealing with arithmetics, we want to remind you of

something that everyone learns at school but then might forget.

Consider the following calculation:

a = 10 + 2 * 5 - 6 / 2;

The answer to the above, in a programming language, is not 27 -

in the above calculation e:script will evaluate the multiplication

and division parts first, and then do the addition and subtraction

parts. This gives an answer of 17.

Note: To avoid confusion, use brackets. This will also make the

code more legible, e.g.:

a = 10 + (2 * 5) – (6 / 2);

This calculates the same as the example above, but can be

conceived much easier.

Page 27: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 27/251

Example: Our first multiplication macro

We could now write a little macro that takes two variables, a and

b, multiplies them, and stores the result in a third variable, c:

// Multiplying a and b

int a, b, c;

a = 2;

b = 2;

c = a * b;

Variable Increment / Decrement

You will often make use of a variable to implement some sort of a

counter. For example, you have a bunch of operations and want

to count how often a certain result appears. To achieve this, you

declare a variable, assign the value 0 to it and each time

something specific happens, you increment it by a fixed value.

The simplest approach to this is the following:

a = a + 1;

Page 28: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 28/251

It might be quite confusing to see the variable a appear on both

sides of the =, but remember that this is an assignment operation

(you store the value on the right side of the = into the variable on

the left side). A shortcut exists to increment/decrement a certain

variable by using special assignment operators:

a += 1;

will increase variable a by one, while

a -= 1;

will decrease it.

Of course, this does not only work when increasing/decreasing by

one. You can add/subtract any value. This is a little shortcut so

that you do not have to write the same variable on both sides. If

you only want to increase/decrease a variable by one, there is an

even shorter way:

a++;

a--;

These statements make use of special operators, which

increment/decrement the variable by 1. The increment operator

++ and the equivalent decrement operator --, can be used as

either prefix (before the variable) or postfix (after the variable).

Note that ++a increments a before using its value; whereas a++

means use the value in a then increment the value stored in a.

In most cases there will be no difference in using prefix or postfix

operators but sometimes, especially when using the assignment

operator = at the same line, something unexpected might happen:

b = a++;

Page 29: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 29/251

After this line of code, b stores the "old" value of a, while a has

been incremented by 1. If we use the postfix operator instead, we

will recognize a difference:

b = ++a;

In this case, b and a store the same value, precisely, the

incremented value of a.

This problem might not occur very often, but it is very important

to be aware of the possible side effects that can occur when using

these operators.

Page 30: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 30/251

Advanced Arithmetics

Using the basic arithmetic operations, in most cases you are

capable to calculate what you want. To simplify more complex

calculations, the e:script language features several commands so

that you do not have to build up complex formulas by yourself.

The following table shows the commands as well as some

explanations about what results will be returned.

command description remarks

abs(x) Returns the

absolute value

of a number.

Returns 'value' if value is

above or equal zero. '-value' if

value is below zero.

atan2(x, y) Returns the

angle of a

given point (x,

y) relative to

the origin (0,

0).

cos(x) Returns the

cosine of a

given number.

Because the radian measure

system is not compatible with

integer numbers input values

must be multiplied by 1000.

For the same reason the

return value is also multiplied

by 1000.

radius(x, y) Returns the

distance of a

given point (x,

y) to the origin

(0, 0).

The radius command

calculates sqrt(x*x + y*y).

sin(x) Returns the

sine of a given

number.

Because the radian measure

system is not compatible with

integer numbers input values

must be multiplied by 1000.

For the same reason the

return value is also multiplied

Page 31: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 31/251

by 1000.

sqrt(x) Returns the

square root of

a given

number.

Only large values for x make

sense since the result is

integer.

tan(x) Returns the

tangent of a

given number.

Because the radian measure

system is not compatible with

integer numbers input values

must be multiplied by 1000.

For the same reason the

return value is also multiplied

by 1000.

Most of these commands will come to their use when we reach

more advanced topics, especially when making effect macros for

fixtures.

Page 32: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 32/251

1.4 Input Dialogues, format and printf

Objectives

Having read this section you should be able to:

1. present a modal dialog to the user which reads integer

variables

2. use the printf and format commands to put text into

string variables

1.4.1 Input Dialogues

The multiplication macro from the last chapter always yields the

same result – that's why we want to make a dialogue box to ask

the user for two values, then multiply them and display the

result.

To start off the macro, we will declare three integer type

variables, a, b and c. Also we'll declare one string type variable,

myResult. We will use this later to display the result to the user

once we have done our multiplying.

int a, b, c;

string myResult;

Next, we will write the code that tells the e:cue programmer to

display a modal dialogue to the user, asking for input:

Page 33: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 33/251

PropDlgInit("Multiply");

PropDlgSetHeaderText("Multiply\nThis will

multiply value a with value b.");

PropDlgAddInt("Value A", "", a, 0, 0);

PropDlgSetInfo("Enter the value of A");

PropDlgAddInt("Value B", "", b, 0, 0);

PropDlgSetInfo("Enter the value of B");

PropDlgDoModal();

This code produces a modal dialogue with some text in the

header, two input boxes for values, A and B, and help texts for the

input boxes.

How did we get there? The first command, PropDlgInit,

declares that we want to create a dialogue. The syntax is as

follows:

Page 34: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 34/251

PropDlgInit

int PropDlgInit(string caption);

Create a new dialog.

We need to pass a string type parameter to let the programmer

know the name of the dialogue. This text will be displayed on the

dialogue title bar.

Next, PropDlgSetHeaderText determines what you want the

dialogue heading textbox to read. Again, we put the text that we

want the caption to be inside the brackets, in inverted commas,

followed by a semicolon.

PropDlgSetHeaderText("Multiply\nThis will

multiply a with b");

Notice how we've actually written "Multiply\n …". The \n tells

the e:cue programmer that there is a line break, the

equivalent of hitting Enter in any word processor to start a

new line. In the PropDlgSetHeaderText command, any

text after \n is the sub-caption and will be written below the

Header in smaller text size.

Next, we want to add fields for the user to enter information, a

and b.

The PropDlgAddInt function takes five parameters, separated

by commas:

PropDlgAddInt

int PropDlgAddInt(string caption, string unit,

int-ref variable, int min, int max);

Add an integer value to the dialog

min=0, max=0 disable range checking

The first parameter is the caption of the value that the user is

asked for. We fill that with "Value A".

Page 35: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 35/251

The second parameter is a description of the unit. We don't need

this, so we put "", but if you were asking values for other

purposes you would put e.g. "pixels", "fixtures", or "terminal

number", to keep the user informed about what they are entering.

Hint: If you want to add a parameter description, you should add

a leading blank to ensure that there is some space between

the input field and the description itself.

The third parameter is the name of the variable that we want the

programmer to use for storing whatever number the user has

entered. Here we put "a", which is simply the name of the variable

that we declared at the beginning of the macro.

The last two parameters tell the programmer to put a limit on the

range of numbers the user can put here. Since we do not really

care about the size of the numbers we are going to multiply, we

can disable range checking by simply putting 0, 0 for both

minimum and maximum. In other scenarios we could limit it to a

number between e.g. 1 and 10 by putting 1, 10.

Finally, our statement with all the parameters in place reads like

this:

PropDlgAddInt("Value A", "", a, 0, 0);

Even though some of the parameters are not doing much in the

above statement, in programming we always need to pass the

right number of parameters when invoking a macro

command.

Page 36: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 36/251

Next, we want to associate some help information with this

particular input field:

PropDlgSetInfo("Enter the value of A");

The command PropDlgSetInfo always relates to the last

inserted element of the dialogue. Therefore, to associate a help

text with an item, PropDlgSetInfo needs to come straight after

the PropDlgAddInt statement.

This approach of commands relating to a certain (previously

created) element might be a bit confusing at the beginning.

However, there are various more commands that work this

way, so you should take your time and get a little used to

this. You will certainly have to use commands like this more

often, especially when creating modal dialogues.

Now that we are finished adding the item for Value A, we do

exactly the same thing for Value B, with different parameters:

PropDlgAddInt("Value B", "", b, 0, 0);

PropDlgSetInfo("Enter the value of B");

Finally, we tell the Programmer that we have finished the creation

of our dialogue box. With

PropDlgDoModal();

we present the dialogue to the user. To complete our

multiplication macro, refer to the next chapter.

1.4.2 Using format and printf

Now for the second part: After the user has entered values and

clicked OK, our variables are going to contain these values and

Page 37: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 37/251

we can process. We want to multiply the values and present the

results to the user:

c = a * b;

The variable c now stores the result of the multiplication of a

and b.

The command MessageOK needs the the variable c converted

into a string. This, according to the e:script language reference, is

the only valid parameter type for MessageOK:

MessageOK

int MessageOk(string text);

Present a standard message box to the user.

So if we simply try this:

MessageOK(c);

the Programmer will return the following error message: "'c' is

not a string". So what we need to do is insert the number contained

in the integer type variable into a string variable. We do this by

invoking the format command.

format

string format(string format, ...);

Returns a string. The format is like at the

printf function.

As we can see from the above description, format first requires a

string, and then an indefinite list of variable parameters (this is

what the three dots ... mean). The command name is prefaced

with the return type string, which means that format returns a

string. Obviously, we can use the assignment operator "=" to

assign the result which is returned by format to a string type

Page 38: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 38/251

variable. Do you remember we declared a string type variable

called myResult in the beginning? This is how we assign the

output returned by format to our string variable:

myResult = format("The result is %d", c);

After the above statement, if c is 4, the variable myResult now

contains the text "The result is 4". The way this works is that

format scans the string from left to right and prints any

characters it encounters - except when it reaches the % character.

The %d is a signal that the next variable in the list of variables is

an integer type variable, and should be taken and printed as a

number. format then moves on to process the rest of the control

string and any other variables the string might specify. For

example:

myResult = format("Hello World");

only has a control string and, since this contains no % characters it

results in the text "Hello World" being displayed. The specifier %d

means convert the next value to a signed decimal integer and so:

myResult = format("The result is %d", c);

means that the text will be "The result is " and then the number

contained in the variable c.

The ... in the parameter description of format (and its cousin,

printf, which only writes to the logbook) means you can carry

on writing a list of variables separated by commas as long as you

want to:

myResult = format("The result of %d multiplied

with %d is %d",a,b,c);

Now, since we have stored everything in the string variable

myResult, the only thing left is to display it to the user – by

passing myResult to MessageOK as a parameter:

Page 39: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 39/251

MessageOk(myResult);

We could have used printf instead and simply put the output

into the e:cue programmer logbook (and not use the myResult

string variable):

printf("The result of %d multiplied with %d is

%d", a, b, c);

Note that printf uses the same set of parameters as format.

Here is a list of the different format specifiers the commands

printf and format use:

The % Format Specifiers for printf and format

Commands

Specifier Variable type Display

%d int signed integer

%s string sequence of chars

%x int unsigned hex value

Page 40: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 40/251

For now, the completed macro reads as follows:

// Multiply Dialogue

// Multiplies A with B

int a, b, c;

string myResult;

PropDlgInit("Multiply");

PropDlgSetHeaderText("Multiply\nThis will

multiply value a with value b");

PropDlgAddInt("Value A", "", a, 0, 0);

PropDlgSetInfo("Enter the value of A");

PropDlgAddInt("Value B", "", b, 0, 0);

PropDlgSetInfo("Enter the value of B");

PropDlgDoModal();

c = a * b;

myResult = format("The result of %d multiplied

with %d is %d", a , b, c);

MessageOk(myResult);

Page 41: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 41/251

Hint: You are not limited to using variables as parameters. It is

also possible to directly perform arithmetic operations or use

commands as parameters for printf and format. For

Example, you could alter the code of your multiplication

macro like this:

myResult = format ("The result of %d

multiplied with %d is %d", a , b, a * b);

This way, you get rid of using the variable c because the

multiplication result is directly passed to the format

command. Using other commands with the appropriate

return types is possible just the same way. Do not use it too

excessively because statements nested too deeply can be very

hard to read and to understand.

1.4.3 Control Characters

You already encountered the control character '\n' as a way of

writing down the non-printable 'line feed' into your printf or

format – command. Several other non-printable characters have

to be written down in a special way. These control characters will

only be interpreted using printf or format. This includes \\

for a backslash and \" for a quotation mark as \ and " are special

characters for themselves in e:script (as for \ marking a control

character sequence and " as a marker for the beginning and the

end of a string). The different control characters can be found in

the following table:

Control Character Description

\n line feed

\r carriage return

\\ '\' (backslash)

\" " (quotation mark)

Page 42: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 42/251

1.5 Conditional Execution

Objectives

Having read this section you should have an idea about:

1. branches with if, if-else and switch structures

2. Conditions TRUE and FALSE

1.5.1 Branches

The next step of macro programming that we are going to tackle

is conditional execution. We often need to be able to choose which

set of instructions is executed according to a condition. In general

the if statement is of the following form:

if (condition)

statement;

As an example, we can use MessageYesNo in an if statement

and execute some code if the user clicked "Yes":

if (MessageYesNo("Click Yes, please") == 1)

{

MessageOK("Thank you!");

}

The if statement allows you to evaluate a condition and only

carry out the statement, or compound statement, that follows if the

condition is true. In other words, MessageOK will only be

executed if the condition is true. If the condition is false then the

macro continues with the next instruction.

Here's an example macro using two if statements:

Page 43: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 43/251

int a, b, c;

string myResult;

PropDlgInit("Compare");

PropDlgSetHeaderText("Number compare\n");

PropDlgAddInt("First number", "", a, 0,1000);

PropDlgAddInt("Second number", "", b, 0,1000);

PropDlgDoModal();

if (a < b)

MessageOK("First number is smaller than

second");

if (b < a)

MessageOK("Second number is smaller than

first");

Now think of the cuelist stopping macro from the last chapter.

We receive many error messages because we are trying to stop

cuelists that do not actually exist. There is another function

though, GetCuelistHandle, which returns a cuelist handle; it

returns –1 if the cuelist we are trying to access does not exist. This

means we can check if the result of GetCuelistHandle is not –1,

and only then run the StopCuelist statement:

if (GetCuelistHandle(0) != -1)

StopCuelist(i);

Another possibility is that you might want to select one of two

possible statements - one to be executed when the condition is

true and one to be executed when the condition is false. You can

do this using the following form:

if (condition)

statement1;

else

statement2;

In this case statement1 is carried out if the condition is true and

statement2 if the condition is false. Here is another example with

MessageYesNo in an if statement:

Page 44: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 44/251

if (MessageYesNo("Click Yes or No"))

MessageOk("You clicked YES");

else MessageOk("You clicked NO");

Notice that it is certain that one of the two statements will be

executed because the condition has to be either true or false! You

may be puzzled by the semicolon at the end of the if part of the

statement. The if part is one statement and the else part

behaves like a second separate statement, so there has to be a

semicolon terminating the first statement.

1.5.2 Relational Operators

So far, we have assumed that the way to write the conditions used

in loops and if statements is so obvious that we don't need to

look more closely. In fact, there are a number of deviations from

what you might expect. To compare two values you can use the

standard symbols:

> (greater than)

< (less than)

>= (for greater than or equal to )

<= (for less than or equal to)

== (to test for equality)

|| (Boolean AND)

&& (Boolean OR)

As mentioned before, the reason for using two equal signs for

equality is that the single equal sign always means store a value

in a variable - i.e. it is the assignment operator. This causes many

problems to beginners because they tend to write:

if (a = 10)

Page 45: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 45/251

instead of

if (a == 10).

The e:script interpreter will generate an error message if it parses

an expression like the first one.

Just as the equals condition is written differently from what you

might expect so the non-equals sign looks a little odd. You write

"does not equal" as !=. For example:

if (a != 0) is 'if a is not equal to zero'.

An example macro showing the if else construction now

follows:

int num1, num2, numresult;

PropDlgInit("Division");

PropDlgSetHeaderText("Whole Number Division\n");

PropDlgAddInt("Enter first number", "", num1, 0,

1000);

PropDlgAddInt("Enter second number", "", num2,

0, 1000);

PropDlgDoModal();

if (num2 == 0) printf("\n\nCannot divide by

zero\n");

else printf("\n\nAnswer is %d\n\n",num1/num2);

This macro uses an if and else statement to prevent division by

0 from occurring. Notice also how we've done a small

mathematical operation inside the printf() statement at the end.

e:script allows mathematical operations practically in all the

places where variables could be used instead.

Page 46: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 46/251

Here is an advanced trick that you might need to know about.

The e:script language, just like in C, does not have a concept

of a Boolean variable, i.e. a type class that can be either true or

false. Why bother when we can use numerical values. true is

represented by any numeric value not equal to 0 and false is

represented by 0. This fact is usually well hidden and can be

ignored, but it does allow you to write if(a != 0) just as

if(a) because if a isn't zero then it also acts as true. You

should care about clarity of your of you code if you make us

of this. Reading something like if(!done) as 'if not done' is

clear, but if(!total) is more or less vague.

Page 47: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 47/251

1.5.3 Selecting Paths with switch

While if is good for choosing between two alternatives, it

quickly becomes cumbersome when several alternatives are

needed. The solution to this problem is the switch statement.

The switch statement is a multiple selection statement. It is used

to select one of several alternative paths in macro execution and

works like this: A variable is successively tested against a list of

integer or character constants. When a match is found, the

statement sequence associated with the match is executed. The

general form of the switch statement is:

switch(expression)

{

case constant1: statement sequence; break;

case constant2: statement sequence; break;

case constant3: statement sequence; break;

.

.

.

default: statement sequence; break;

}

Each case is labelled by one, or more, constant expressions (or

integer constants). The default statement sequence is performed

if no matches are found. The default statement is optional. If all

matches fail and default is absent, no action takes place. When

a match is found, the statement sequence associated with that case

is executed until break is encountered.

The switch statement differs from if in that switch can only

test for equality, whereas the if conditional expression can be

more complex.

The following example macro lets the user enter two numbers

and decide what mathematical operation is wanted to perform

with the numbers, using a ComboBox dialogue element. Please

note there are line breaks within statements in the macro below –

this is only due to formatting reasons! If you copy this macro, do

Page 48: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 48/251

not use line breaks within statements or you might get an error

message.

int a, b, mathOperation;

mathOperation = -1;

string myText;

PropDlgInit("Calculator");

PropDlgSetHeaderText("Please enter two numbers

and select the

mathematical

operation\n");

PropDlgAddInt("Enter first number", "", a, 0,

0);

PropDlgAddComboBox("Select mathematical

operation to be

performed",mathOperation,"Add;Subtract;Mul

tiply;

Divide");

PropDlgAddInt("Enter second number", "", b, 0,

0);

PropDlgDoModal();

switch(mathOperation)

{

case 0:

myText = format("%d plus %d equals %d

\n", a, b, a + b);

break;

case 1:

myText = format("%d minus %d equals %d

\n", a, b, a - b);

break;

case 2:

myText = format("%d multiplied by %d

equals %d \n", a, b, a * b);

break;

case 3:

if (b) myText = format("%d divided by %d

equals %d \n", a, b, a / b);

else myText = format("Error: Cannot divide

by zero.");

Page 49: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 49/251

break;

default:

myText = format("Error: Please select a

mathematical

operation.");

}

MessageOk(myText);

In the macro above, note the PropDlgAddComboBox element:

The parameters it takes are a caption string, a variable that

receives the selection the user took (zero-based, i.e. if the user

selects the first item the variable will be zero), and a string which

is a list of items – the items being separated by semicolons.

Note also the if statement inside the switch statement: If the

user did select "divide", this makes sure we don't try to divide

anything by zero (which would stop the macro with an error

message).

Finally, note the "default:" statement inside the switch

statement: This is the statement that gets executed if the user did

not select anything from the ComboBox. This works only because

we took care to set mathOperation to –1 in the beginning of the

macro, and the "default:" statement only gets executed if

mathOperation does not equal any of the numbers 0, 1, 2, 3.

Page 50: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 50/251

1.6 Loops

Objectives

Having read this section you should have an idea about:

1. the basic concept of loops

2. the while loop

3. the for loop

1.6.1 Explanation of Loops

After variables, the second important thing to know is the concept

of loops. Certain e:script commands let us repeat (loop) portions

of the code, and we can determine flexibly how long we want to

keep the loop going. Suppose we ask you to display "Hello

World!" five times on the screen. Easy! you'd say:

printf("Hello World!\n");

printf("Hello World!\n");

printf("Hello World!\n");

printf("Hello World!\n");

printf("Hello World!\n");

Indeed, this does exactly what we asked for. But now we up the

bet and ask you to do the same job for 100 hellos or, if you're still

willing to type that much code, maybe 1,000 Hello World's, 10,000

Hello World's, … That would be a hard time of copy & pasting,

wouldn’t it?

What you really need is some way of repeating the printf

statements without having to write it over and over again. The

solution for this problem is to construct a loop. First, we will have

a look at the while-loop.

Page 51: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 51/251

1.6.2 The while-Loop

You can repeat any statement using the while-loop:

while (condition)

statement;

The condition is a test to control how long you want the

statement to carry on repeating.

Each line of a macro up to the semicolon is called a statement. The

semicolon is the statement's terminator. The braces { and } can be

used to group related declarations and statements into a

compound statement or a block. That way, you can insert a group

of statements into a single while or for loop.

while (condition)

{

printf("Hello World");

printf("\n");

}

The while checks out the condition, and if it equals TRUE the

statement is carried out, then the condition is checked again, if it

is still TRUE the statement is carried out again etc. - If the

condition turns out to equal FALSE, the statement is not carried

out even once and the macro moves on to the next statement. This

way you can see that the instruction really means while something

or other is true keep on doing the statement.

Notice that the statements within the curly brackets have to be

terminated by semicolons as usual. Notice also that as the while

statement is a complete statement it too has to be terminated by a

semi-colon - except for the influence of one other punctuation

rule. You never have to follow a closing curly bracket with a semi-colon.

Both lines are executed perpetually

as long as the condition is true.

Page 52: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 52/251

This rule was introduced to make code look tidier by avoiding

things like };};};}

at the end of a complex code. You can use a compound statement

anywhere you can use a single statement.

1.6.3 Conditions or Logical Expressions

The condition (or Logical Expression), which can return either TRUE

or FALSE, can be any test of one value against another. For

example:

20 > 10 is always TRUE; the while loop would keep running

forever.

20 > 50 is always FALSE, the while loop would never run

once.

a > 0 is only TRUE if a contains a value greater than zero;

b < 0 is only TRUE if b contains a value less than zero.

a == 10 is only TRUE if a equals the value 10.

Note that the test for 'something equals something else' uses the

character sequence == and not =. That is right: A test for

equality uses two equal signs, as in a == 0, while an

assignment, as in a = 0, uses one. Wrong use of the double

or single equal sign to have different meanings is a cause of

many a program bug for beginner and expert alike!

To solve our problem of printing "Hello World!" a 100 times we

need a counter and a test for when that counter reaches 100. Now

it is easy to print "Hello World!" 100 times using the while loop:

Page 53: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 53/251

int count;

count = 0;

while (count < 100)

{

++count;

printf("Hello World!\n");

}

The integer variable count is declared and then set to zero, ready

to count the number of times we have gone through the loop. The

value of count is checked against 100. As long as it is less, the loop

starts a new cycle on. Each cycle, count is incremented and "Hello

World!" is printed - so eventually count does reach 100 and the

loop stops.

Always make sure that the while loop will terminate to avoid

infinite loops!

1.6.4 MessageYesNo in a while loop

This short example for a while loop introduces a new concept: It

uses a call to the MessageYesNo function as a condition.

MessageYesNo displays a message box with "Yes" and "No"

buttons to the user. The function returns TRUE if the user has

clicked "Yes" and FALSE if the user has clicked "No". We can use

MessageYesNo as a condition inside a while-loop. As long as

the user clicks "Yes", the while loop is executed. Note that because

the function call is inside the () brackets, there is no semicolon

after MessageYesNo.

Page 54: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 54/251

int counter;

counter = 0;

while (MessageYesNo("Keep going?"))

{

counter++;

}

string message;

message=format("You clicked YES %d times before

you got bored.", counter);

MessageOk(message);

The user is asked if he wants to keep going, and if he clicks "Yes",

the counter is incremented and the user gets to see the same box

again. When he clicks "No", a message box will present the result

of the counter to him.

Now let us make this example a bit more complex: This time we

set a maximum number of times the user can click "Yes".

Page 55: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 55/251

int a, maximum, keepGoingFlag;

a = 0;

maximum = 10;

keepGoingFlag = 1;

string message;

while (keepGoingFlag == 1)

{

message = format("You've clicked YES %d

times.\nClick YES to continue", a);

if(MessageYesNo(message) && a < maximum)

a++;

else keepGoingFlag = 0;

}

if (a==maximum) message=format("You clicked YES

%d times, that's enough!", a);

else message=format("You clicked YES %d times

before you clicked NO.", a);

MessageOk(message);

We use a signal variable, keepGoingFlag, as a condition for the

while loop. Then we use MessageYesNo and a counter, a, as a

condition for the if statement. As long as the user clicks YES and

the maximum isn't reached , keepGoingFlag is left untouched,

which keeps the loop running, and the counter a is simply

increased. But as soon as either one of the conditions becomes

false (i.e. the user clicked NO or the maximum was reached), the

else statement is executed: keepGoingFlag is set to zero which

stops the while loop. The user gets a different message depending

on a simple check wether the loop stopped because the maximum

was reached or the user clicked NO.

Page 56: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 56/251

1.6.5 The for-Loop

The while-loop repeats a set of instructions while a certain

condition is true. But often you just want to repeat something a

given number of times.

The traditional solution to this problem is to introduce a variable

that is used to count the number of times that a loop has been

repeated and use its value in the condition to end the loop, just as

we did in the examples above.

int i;

i = 1;

while (i < 10)

{

printf("%d\n", i);

++i;

}

repeats while i is less than 10. As the ++ operator is used to add

one to i each time through the loop you can see that i is a loop

counter and eventually it will get equal to or bigger than 10, i.e.

the loop will end.

The question is how many times does the loop cycle? More

specifically what values of i is the loop carried out for? If you run

this macro snippet you will find that it prints 1,2,3... and finishes

at 9. That is, the loop repeats 9 times for values of i from 1 to 9.

This sort of loop - one that runs from a starting value to a

finishing value going up by one each time - is so common that

nearly all programming languages provide special commands to

implement it. In e:script this special type of loop can be

implemented as a for loop.

for (counter = start_value; counter <=

finish_value; ++counter)

compound statement

which is entirely equivalent to:

Page 57: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 57/251

counter = start_value;

while (counter <= finish_value)

{

statements;

++counter;

}

The condition operator <= is interpreted as less than or equal to. We

will be covering more conditions or logical expressions in the next

chapter.

Example: To print the numbers from 1 to 100, you could use:

for (i = 1; i <= 100; ++i)

printf("%d \n", i);

Here is one example that stops the first 64 cuelists:

int i;

for ( i=0; i < 64; ++i)

StopCuelist(i);

Note how the variable i is initialized with zero in this example.

This is because the parameter for StopCuelist has to be zero-

based. This means that the value 0 represents the first cuelist in the

e:cue programmer, 1 refers to the second cuelist, 2 refers to the

third cuelist and so on.

Unfortunately, running this macro will generate many error

messages like "Release fader_id#11: Cuelist not found" in the

logbook. We will deal with this concern later, for the moment, it

will do as it should, as it will stop the cuelists.

Page 58: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 58/251

1.7 Nesting

Objectives

After having read this section you will have learned about the

following:

1. what nesting means

2. how to use nesting to create more complex and

powerful code

1.7.1 Explanation of Nesting

It is one of the great discoveries of programming that you can

write any macro using just simple while loops and if

statements. You do not need any other control statements at all.

Of course it might be nice to include some other types of control

statement to make life easy - for example, you do not need the

for loop, but it is good to have! As long as you understand the

if and the while loop in one form or another you can write any

macro you want to.

If you think that a loop and an if statement are not much to build

programs then you are missing an important point. It is not just

the statements you have, but also the way you can put them

together. You can include an if statement within a loop, loops

within loops are also OK, as are loops in ifs, and ifs in ifs and

so on. This putting one control statement inside another is called

nesting and it is really what allows you to make a macro as

complex as you like.

Page 59: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 59/251

1.7.2 Example: Think of a number

Now let us have a go at writing the following program: 'Think of a

number in the range from 0 to 99 and then ask the user to guess it'. This

sounds complicated, especially the 'think of a number' part, but

all you need to know is that the statement

target = random(100);

will store a random number between 0 and 99 in the integer

variable target.

Page 60: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 60/251

int target, guess;

string myText;

myText="Your first guess:";

while(MessageYesNo("Do you want to guess a

number?"))

{

target = random(100);

while(target!= guess)

{

PropDlgInit("Guess the Number");

PropDlgSetHeaderText("Guess the number

between 0 and 100.\nPress 'Cancel'

to stop.");

PropDlgAddInt(myText, "", guess, 0,100);

if(!PropDlgDoModal())

{

MessageOk("Canceled");

exit();

}

if (target > guess) myText = "Too low!

Guess again:";

else myText = "Too high! Guess again:";

}

MessageOk("\n Well done! You got it! \n");

}

The first while-loop in this macro lets the user keep playing the

game if he or she answers "Yes". The second while loop keeps on

bringing up a modal dialogue, but with variable text, asking the

user to guess again if he or she didn't get it right.

Note the following line:

if(!PropDlgDoModal()){...}

This does two things at once. First, it displays the dialogue by

calling PropDlgDoModal. Secondly, if the user clicks "Cancel",

PropDlgDoModal returns FALSE, which leads to the statement

Page 61: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 61/251

in brackets {} is executed: With the ! character we are checking

for a FALSE condition.

Page 62: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 62/251

1.7.3 Example: A Pocket Calculator with a while-loop

int a, tempResult, mathOperation, keepGoingFlag;

mathOperation = -1;

keepGoingFlag = 1;

string myText, operationText;

operationText = "Enter first number";

while (keepGoingFlag)

{

PropDlgInit("Calculator");

PropDlgSetHeaderText("Please enter a

number and select the mathematical

operation\nPress

'Cancel' to stop.");

PropDlgAddComboBox("Select mathematical

operation to be

performed",mathOperation,

"Add;Subtract;Multiply by;Divide by");

PropDlgAddInt(operationText, "", a, 0,0);

if(!PropDlgDoModal())

{

keepGoingFlag=0;

myText=format("Canceled - Final Result

is %d",tempResult);

}

switch( mathOperation )

{

case 0:

tempResult=tempResult+a;

operationText=format("%d (last

operation:Add)",tempResult);

break;

case 1:

tempResult=tempResult-a;

Page 63: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 63/251

operationText=format("%d (last

operation:Subtract)",tempResult);

break;

case 2:

tempResult=tempResult*a;

operationText=format("%d (last

operation:Multiply)",tempResult);

break;

case 3:

if (a)

{

tempResult=tempResult/a;

operationText=format("%d (last

operation:Divide)",tempResult);

}

else operationText=format("Temp

result: %d (Cannot divide by

zero)",tempResult);

break;

default:

operationText=format("Enter first

number:");

}

}

MessageOk(myText);

The macro above is an enhancement of our previous calculator

macro: It lets you keep adding numbers and perform arithmetic

operations until you press "Cancel", while storing and displaying

a temporary result. A variable keepGoingFlag is used to keep a

while loop going until the user presses "Cancel".

Please note that the line breaks in the above two programs would

generate an error message in the e:cue programmer. They are

added in the above programs for formatting reasons. Usually

statements cannot go on for several lines. You must remove

several line breaks in order to let the macro run correctly.

Page 64: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 64/251

1.8 More About Variables

Objectives

In this section you will learn about the following:

1. using global variables

2. how to make use of arrays of integer numbers

3. more about string variables

1.8.1 Global variables

If a variable name starts with an underline "_", it will be declared

as 'global', that means it persists even when the snippet has

ended. This is a great advantage if you want to keep track about

the state of something longer than the usual quite short runtime

of a e:script macro. Simply declare the variable with an

underline:

int _myGlobalInteger;

Unfortunately, there is a peculiarity in it, what makes handling of

global variables a bit tricky: If you start a snippet that created a

global variable a second time, you will get an error when the

macro reaches the line where the variable was declared the first

time. This is because you cannot declare the same variable more

than once.

To handle this situation, you have to query the existence of a

variable and, if it already exists, skip its redeclaration. The

function undefined returns true if the given variable does not

exist yet. Example:

if (undefined(_hello))

int _hello;

Page 65: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 65/251

That way only the first time that the macro runs, _hello will be

declared.

If you want to clear the global variables, the button in the

Automation->Macros window lets you delete all global

variables. To find it, simply press T to get into automation

and click the "Macros" tab. You can also use the macro

command "clear" instead.

1.8.2 Arrays

There are times when we need to store a complete list of numbers

or other data items. You could do this by creating as many

individual variables as you would need for the job, but this is a

hard and tedious process. For example, suppose you have five

numbers stored in variables and want to print them out in reverse

order. You could do it the hard way as:

int al,a2,a3,a4,a5;

a1 = 1;

a2 = 2;

a3 = 3;

a4 = 4;

a5 = 5;

printf ("%d \n", a5);

printf ("%d \n", a4);

printf ("%d \n", a3);

printf ("%d \n", a2);

printf ("%d \n", a1);

This does not look very pretty, and what if the problem was to

read in 100 or more values and print them in reverse order? What

we really need is some kind of variable set that we can easily use

within a loop. The solution for this problem is the special variable

Page 66: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 66/251

class array. An array is basically a list of variables accessible via a

list number. In e:script, only arrays of type int are allowed.

You have to declare an array before you use it - in the same way

you have to declare any kind of variable. Let us see what we have

to do to declare an array: For example,

int a[5];

declares an array called a with five elements. Please note: The

first element is a[0] and the last a[4] because e:script, just like

C, starts counting at zero. This might be a bit confusing to start

with, but you will adapt to it eventually. Do not forget the index!

It is necessary to use the index to indicate which element to work

on. Here is a formal definition to summarize the use of arrays:

int array[size];

declares an array of integers with size elements. The first array

element is array[0] and the last is array[size - 1].

Of course you can also declare arrays as global with an

underscore "_" just like you would do with standard integer

and string variables.

Using an array, the problem of reading in and printing out a set of

values in reverse order becomes simple:

int a[5];

int i;

for(i = 0; i < 5; i++)

{

a[i] = i + 1;

}

for(i = 4; i >= 0; i--)

printf("%d \n", a[i]);

Page 67: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 67/251

Using the control variable i as an array index in parallel is a plain

and practical way to solve this problem. Generally, the

combination of arrays and loops will be an often-used solution in

many scenarios.

1.8.3 Additional String Operations

You have already learned how to combine strings with other

strings or integers via the printf or format commands. But in

several cases, using format to manipulate a string is a bit unhandy

so we need some more possibilities to achieve this.

String Addition

The simplest way to combine two strings is to just use the +

operator to "add" them. Let us take a look at the following

example:

string a, b, c;

a = "part one ";

b = "part two\n";

c = a + b; // this attaches both

strings one to

another

printf(c);

This code produces the output "part one part two". As you can see,

in variable c, the combination of a and b is stored. You can also

combine more than two strings and there is no need to use

variables. Therefore, it is possible to use a statement like this:

a = "Test " + b + "\n";

Page 68: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 68/251

This combines string "Test ", variable b and string "\n" and

stores the result in variable a. It is not possible to attach integers

with strings this way, so if you want to do this, keep using the

format command.

String Comparison

It is very easy to compare two integer variables using logical

expressions (as seen in chapter 1.6.3). Unfortunately, you cannot

use these expressions to compare strings, but we have other

possibilities: The e:script macro language provides several macro

commands for this cause. To compare two strings a, b we use

strcmp or stricmp. Let us take a look at the command

description taken from the e:script Language Reference:

strcmp

int strcmp(string txt1,string txt2);

Compare two strings. The comparison is case

sensitive.

The return indicates the lexicographic relation

of string1 to string2.

<0 string1 less than string2

0 string1 identical to string2

>0 string1 greater than string2

Here is an example of how it works:

string a, b;

int i;

a = "a";

b = "b";

i = strcmp(a, b);

Page 69: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 69/251

The result of the string comparison performed will be less than

zero, just as we would have expected. But if we have different

strings, the result might differ from what you might think of.

Example:

string a, b;

int i;

a = "a";

b = "A";

i = strcmp(a, b);

Here, you might think that strcmp delivers a value less than zero

because "A" is a capital letter. But this is not how it works.

strcmp compares the ascii codes of the single chars from left to

right and if it finds a difference, it will return a value greater or

less then zero. While "A" has ascii code 65, "a" has code 97, so the

result stored in i will be greater than zero.

The command stricmp compares strings the same way but is

not case sensitive, so if you e.g. compare two strings "ECUE" and

"ecue", the result will be zero as stricmp will treat lowercase and

uppercase the same.

Page 70: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 70/251

String Intersection and Conversion

You have already learned a way to modify strings via string

addition or using the format command. However, you might also

want to cut a string into pieces, change several single letters or

insert some more words into a given string variable.

To cut a string into pieces, we will make use of the midstr

command. Here is the definition from the e:script Language

Reference:

midstr

string midstr(string src,int pos,int

count);

Return a substring of another string.

Parameters

src - source string

pos - Zero based start position of requested

sub string.

count - The length of the requested sub string

Example:

One important problem where it is necessary to get a partial

string is when you receive input from the serial port and you

want to process the data. Let us assume we have a device

connected to COM1 that delivers status information about a set of

LED matrices which you want to display. You can retrieve a

string coming from a serial interface using the command

GetSerialInput (More about serial IO will be discussed in a

later chapter. For this example, the only thing you have to know

is that GetSerialInput will deliver a string). For the following

code example, we arrange a simple pre-made string to simulate a

serial input:

Page 71: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 71/251

string serialInput, info;

string t1, t2, t3, t4;

serialInput = "M1:40;M2:32;M3:39;M4:41;"

// temperature of M1 – M4 in °C

t1 = midstr(serialInput, 3, 2);

t2 = midstr(serialInput, 9, 2);

t3 = midstr(serialInput, 15, 2);

t4 = midstr(serialInput, 21, 2);

Obviously, we have to know the structure of the given string

here. But what if the size of the string varies and the only thing

we know is e.g. the char right before and behind the values we

want to retieve? For this example, we know there are a colon right

before as well as a semicolon behind the particular values. To

solve this problem, we implement a so-called "parser" to analyze

the string. We will look at every single char and if we find a colon,

we will count the number of chars until the next semicolon in

order to find out how long the information in-between is.

We could use midstr for this, but there is another way. With the

command getchar, we can get the ascii code of a single char

inside a string. A colon’s ascii code is 58 while a semicolon has

code 59.

We will also make use of the command strlen, which delivers

the length of a given string. Let us have a look at the code:

Page 72: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 72/251

string serialInput;

int i, length, templen;

templen = 0;

serialInput = "M1:40;M2:32;M3:39;M4:41;" //

temperature of M1 – M4 in °C

length = strlen(serialInput);

for (i = 0; i < length; i++)

{

if (getchar(serialInput, i) == 58) // did

we find a ":"?

{

i++;

while(getchar(serialInput, i) != 59) //

run till a ";" is found

{

templen++; // count the

length

inbetween

i++;

}

}

if (templen > 0)

{

printf(midstr(serialInput, i –

templen, templen));

templen = 0;

}

}

Unfortunately, this is a lot more complicated, so we have to take a

closer look. The macro uses getchar to look at every char inside

the string (that is what the for-loop is for). If it finds one, the

while-loop will run, looking for the next semicolon and counting

the chars in between. When a semicolon is found, the while-loop

will terminate. At last, the variable templen is checked. If it is

greater than zero, this indicates that we have found a value. This

value is simply print out using the midstr command inside a

printf and the variable templen is reset to zero.

Page 73: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 73/251

This already has a nice functionality, but our temperature values

are just put out, with no possibility to further process the data.

For this cause, we need integer values. That is very easy to

achieve: The command val converts a string to an integer value.

In this example, it would be really nice to check if the

temperatures are below a given threshold, so we will store them

inside an array and check this matter. If any temperature is above

threshold we will use the alert command (which works just like

printf but will put a red warning text into the logbook) to put a

warning message into the logbook. Here is our final version of the

temperature control macro (If you want to copy the code into the

e:script editor, don’t forget to realign the rows which have been

separated due to formatting reasons):

string serialInput;

int i, length, templen, processedtemps,

threshold;

int temperatures[4];

templen = 0;

processedtemps = 0;

threshold = 55;

serialInput = "M1:40;M2:32;M3:39;M4:41;" //

temperature of M1 – M4 in °C

length = strlen(serialInput);

for (i = 0; i < length; i++)

{

if (getchar(serialInput, i) == 58) // did

we find a ":"?

{

i++;

while (getchar(serialInput, i) != 59) //

run till a ";" is found

{

templen++;

// count the length in-between

i++;

}

}

if (templen > 0)

Page 74: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 74/251

{

temperatures[processedtemps] =

val(midstr(serialInput,

i –

templen, templen));

templen = 0;

processedtemps++;

}

}

for (i = 0; i <4; i++)

{

if (temperatures[i] >= threshold)

alert("Temperature of tile %d is too

high! Should be less

than %d,

actual value is %d!\n", i,

threshold, temperatures[i]);

}

This macro might be executed every time when the programmer

receives serial input using a trigger. This would allow a

continuous temperature checking. Needless to say that in

practical use, you will have to implement your own string parsing

depending on the input you receive.

We used getchar to retrieve the ascii-code of an arbitrary char

inside a string. Using setchar or setuchar, we can do it

the opposite way: we can set any char in a string to the given

ASCII value.

Page 75: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 75/251

1.8.4 Bitwise Operations

Just like C, the e:script macro language offers various possibilities

to access or manipulate single bits of an integer variable. Though

this will not be needed in most cases, it can be a very practical

way to shorten your code or to make things more efficient.

Here, we will not go into detail what the binary numerical system

is and just give a little glimpse of how data is stored binary in a

computer. If you are not familiar with this, it is necessary to learn

about this before reading this chapter. Alternatively, you might

just move on to the next chapter, as this topic will be too tricky

without knowing the basics.

In computer technology, data is stored in binary strings. That

means that e.g. a single number like 37 is converted to its binary

representation and stored bit by bit. For number 37, that means it

is converted to 100101 and stored like this. This works the same

for single chars because a char is represented by its ASCII-code,

which is an 8-bit binary number. For example, a 'c' has ASCII-

code 99, which is in binary form 1100011.

The e:script language offers several possibilities of direct bit

access. The basic binary operators are as follows:

Operator Description

& bitwise and

| bitwise or

^ bitwise xor

<< bitwise left shift

>> bitwise right shift

We will first take a look at the logical operators. You already

know about the equivalent operators when comparing variables.

The bitwise formats of these work a little different. They compare

the particular variables (these have to be of type integer) bit by bit

and combine the single results of the bitwise comparisons. Let us

have a few examples for this matter:

Page 76: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 76/251

Operation Result

110 & 011 010

110 | 011 111

110 ^ 011 101

In addition, we have two bitwise shifting operations. Both are

used in the following way: You first write the variable or number

that you want to shift, and then write the desired shifting

operator followed by a number that indicates by how many bits

you want to shift. With both operators, the bits shifted out of

bounds will be dropped, while the released bit positions will have

a 0 assigned. Needless to say, you can store the result using the

assignment operator =.

Example: 10 >> 2 will give out 2 as result. This is because the

binary representation of 10 is 1010 and this shifted by 2 bits to the

right is a binary 10, which is a 2. Accordingly, the term 10 << 2

will result 40 because 1010 shifted 2 bits to the right is 101000 in

binary, which is a decimal 40.

Practical Use of Bitwise Operations

You can combine logical operations with shifting to access single

bits in an elegant way: A simple way is to shift the bit that you

want to access to the rightmost digit and afterwards perform a

bitwise AND with 1. This will cut off the bits left of the certain

digit, leaving only the information you want to have. The

following code shows this principle by printing out the eight

lowest bits of a variable:

Page 77: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 77/251

int i, a;

a = 151; // binary representation: 1001 0111

for (i = 0; i < 8; i++)

printf("Bit number %d is set to %d.\n", i,

(a >> i) & 1);

This code only prints out the bits one after another, beginning

with the rightmost bit. Instead, you could of course save the

variables for further processing.

Page 78: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 78/251

It is also possible to do it the other way round; i.e. to build up a

bit string. This might be needed if you have a device connected

that interprets data bit by bit so that you have to convert the

information to match the device's requirements. Note that

performing left shifts make it easier because you start with the

lowest digit. This way the only thing to do is to shift by one bit

and then simply add 1 to the shifted integer if you want to set the

rightmost bit to 1. Let us take a look at the code to make things

clear:

int i, bits;

int output[8]; // this array will store the

information for our bitstring

bits = 0;

output[0] = 1;

output[1] = 0;

output[2] = 0;

output[3] = 1;

output[4] = 0;

output[5] = 1;

output[6] = 1;

output[7] = 1;

for (i = 0; i < 8; i++)

{

bits = bits << 1;

bits += output[i];

}

printf("Variable 'bits' now holds the value

%d.\n", bits);

This works very simple: we have an array of eight Numbers

where each element holds the value that one of the bits of our

output variable named bits shall get. In the for-loop, first a shift

by one bit to the left is performed. Then simply the value the

array output holds for the current bit position is added to the

variable. The most important thing to pay attention to is to

arrange the bits in correct order. The leftmost bit has to be

Page 79: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 79/251

inserted first, the rightmost last (assuming that the bits are put in

from the right side, what is the only way that really makes sense

here).

Now you have got to know supposable the most important uses

of bitwise operations related to the e:script macro language. Here,

using these operations makes a lot of sense and shortens your

code significantly. You might encounter various other

circumstances where bitwise operations might be very useful,

some very easy, some a lot more complicated. The following

section will give a short glimpse of possibilities you have when

working with bitwise operations. This is an example of a more

complex use of these.

Page 80: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 80/251

Multiplication via Bit Shifting

It is possible to implement a multiplication of two integers using

only some bit shifting, a few additions and comparisons. This is

an algorithm called Ancient Egyption multiplication, which was

invented in ancient Egypt and represents a fast method to

perform a multiplication in computer hardware when a chip has

no dedicated multiplication units. The variables a and b will hold

the two factors while the variable c will receive the result. We

could have made a GUI for a nice factor input dialogue, but for

reason of simplicity, we just assign the factors inside the e:script

source. Let us take a look at the code:

int a, b, c;

c = 0;

a = 2;

b = 10;

while (b != 0)

{

if ((b & 1) != 0)

c += a;

a = a << 1;

b = b >> 1;

}

printf("The result is %d.\n", c);

Just accept this algorithm working correctly and focus on the

code. This is a nice example of using bitwise operations in

practice. While the implementation is of no real use in e:script, it

often comes into place when doing machine intimate

programming, in most cases using assembler languages.

Page 81: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 81/251

1.9 Functions

Objectives

In this section you will learn about the following:

1. how to create and call your own functions

2. the possibility of using return values in your functions

You have already become acquainted with several loop constructs

to shorten your macro code. However, this only works when you

want to repeat the same lines of code multiple times at the same

place of your e:script macro. When you have to use similar code

fragments at different places inside your script, you do not have

to copy the code multiple times: You can instead create a function,

which will work quite similar as the integrated e:script macro

commands. You call a function by writing its name followed by

two brackets () with appropriate parameters inside and the

particular lines of code will be executed (needless to say that also

a function call must be followed by a semicolon). The difference

mainly is that the return values can only be of type integer, but

this is not much of a restriction.

1.9.1 Creating your own Functions

In order to write a function, the first thing to do is write "function"

followed by an appropriate name and two brackets (). This way

the script interpreter will know that the following (compound)

statement forms a function with the given name. Now follows the

code that you want your function to execute, either a single

statement (which will in most cases make no sense) or a

compound statement, surrounded by a pair of curly braces {}. At

Page 82: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 82/251

this place, the code will not be executed as this is just a definition

for your function.

To give an example, we will create a simple function that will

display some text using printf:

function helloworld()

{

printf("Hello world!\n");

printf("This is the hello world e:script using a

function.\n");

}

This is a very simple example, so we do not have much code here.

To call our function, we simply write

helloworld();

to execute it one time. Like all e:script commands, our function

names are case sensitive, so there would be a difference between

helloworld and HelloWorld.

1.9.2 Return Values

Adding a return value is very easy: Simply add a statement return

x into your function code, where x is the return value. You can

return either a constant number or a variable with some value.

Getting back this return value works similar to standard macro

commands. A statement like

x = myfunc();

will assign the return value of myfunc to variable x. There is only

one restriction: You are limited to return values of type int. You

can work around this little restriction by using kind of a

"dedicated return variable": Just specify a string type variable as

to hold the result of the desired

Page 83: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 83/251

1.9.3 Parameters

To make a function as powerful as the integrated e:script

commands, the most important thing is being able to pass

parameters to our function. The syntax is nearly the same as

before, you only have to add a parameter list inside the brackets

behind your function name. Note that you are limited to integer

and string type variables, no arrays are allowed (Of course, you

can pass single array elements on function call). The following

example implements a "maximum"-function with three

parameters x, y and z. It will return the maximum over these

three values.

int max;

function maximum(x, y, z)

{

if (x > y)

if (x > z)

return x;

else

return z;

else

if (y > z)

return y;

else

return z;

}

max = maximum(12, 11, 7);

printf ("%d\n", max);

max = maximum(34, 0, 2);

printf ("%d\n", max);

On top, you can see the declaration of the function maximum. The

function uses the local variables x, y and z, calculate and returns

the maximum of the three values. We always call maximum with

Page 84: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 84/251

three parameters. The return value is saved into the variable max.

We call maximum two times, with different values.

This was easy. But wait... what is meant by the term "local

variable"? This means that the parameters used by a function are

just visible inside the function! If you want to make access to them

when you are not 'inside' the function, it will produce an error.

These circumstances can be very tricky, especially because it is

also possible to have variable with the same name inside the

function as well as outside. Take a look at the following code:

int x;

x = 1;

function intprinter(int x)

{

printf ("%d\n", x);

}

printf("%d\n", x);

intprinter(5);

printf("%d\n", x);

This code snippet will display 1 followed by 5, then 1 again.

Sounds strange, doesn't? Well, the printf commands outside the

function display the variable x that we declared at the beginning.

However, the printf inside the function intprinter also

displays the variable x, but it is the local x, visible only to the

function itself! It has the same name, but it is another variable.

This might be very confusing, so the best thing to do is to always

use variable names inside a function that differ from the names

outside.

Page 85: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 85/251

1.9.4 Recursions

Advanced programmers will definitely have heard of recursions,

as using recursions is a well-known powerful way of solving

several problems without too much code. There is no need to

know about this, so if it sounds too complicated for you, just skip

this section and move on to the next chapter.

The basic idea behind recursions is to let a function call itself

again. Why should we do that? A recursion allows us to split up a

'big' problem into several smaller ones. This concept is called

divide & conquer. The most common example for this is the

famous 'quicksort' algorithm, which sorts an array by dividing it

into smaller 'sub-arrays', one for values bigger and on for values

less than a certain "mid-value" and sorting those by dividing them

again until the sub-arrays consist of only two elements. This

might be a bit too complicated to start with, but if you are

interested, you can find many examples about quicksort in the

internet.

Instead of dealing with quicksort, we will keep things easy: As an

example for recursion, we will implement an exponentiation: Our

function exp needs at least two parameters, the base b and the

exponent x. It will return the result of bx. To do so, we will split

up the problem into several multiplications, in detail we need x

multiplications of the variable b. Look at the code:

int m, n;

function exp(int b, int x)

{

if (x > 0)

return b * exp(b, x - 1);

else

return 1;

}

m = 2;

n = 4;

Page 86: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 86/251

printf("The result of %d^%d is %d\n", m, n,

exp(m, n));

As you can see, exp calls itself with the exponent reduced by one,

and multiplies the return value with the base b. The break

condition is when the exponent reaches zero.

Once you have you have understood the basic concept of

recursions, you can make use of it every time where you can

divide a problem into several smaller ones.

Page 87: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 87/251

1.10 State Machines

Objectives

In this section you will learn the following:

1. why we need this concept and what a state machine is

2. how to make use of this concept

As we said before, the concept of an e:script macro is to be a small

code snippet with a short runtime. It is possible to create a more

complex macro with a long runtime, but first of all the macro

language was not designed for that (You have to manually adjust

the build-in runtime limit using SetRuntimeLimit. Do it on

your own risk). Second, running a macro will block the

programmer so that you can do nothing more but watch the

macro run. That makes long macros become very impractical.

We can easily avoid this problem using the concept of state

machines. First, we will explain what this concept means and how

we implement it with the e:cue Programmer.

1.10.1 The Basic Concept of State Machines

A state machine is an automaton that consists of different so-

called states. When the machine receives input, it reacts

depending on its current state and depending on the definition,

moving into another. Let us have a look at the following picture:

Page 88: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 88/251

This is an example of a state machine that receives single

characters as input. In detail, the machine starts at state one,

waiting for input. If it receives an n, it moves on to state two to

wait again. (If it receives a character that differs from n, it will

move to state six, a kind of "error-state", and halt. In state two, an

n would not help us because now, our machine wants an i to

move on to the next non-error-state. This whole process goes on

and on until the machine reaches either state six (error) or state

seven (success).

1.10.2 State Machines in the e:cue Programmer

The concept of state machines may sound really complicated and

theoretical, but you do not have to be scared. To make use of this

inside the e:cue Programmer is very easy.

Basically, we will declare some global variables. The current

assignments they have represent a certain state. Now here is the

trick: We can attach a macro to a cue so that it will run repeatedly

when we start the cuelist. The changes the macro will make to the

global variables while its calculation represent different state

Page 89: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 89/251

transitions. This is because changing a value of a global variable

will make the macro react differently on its next run.

Recapitulating, the only thing you have to understand is that we

will use global variables to "keep in mind" what has happened

before (the "state") and that we are calling a macro repeatedly that

will work with these variables (transitions). An example will

make things clearer, so have a look at the following section.

Page 90: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 90/251

1.10.3 Example: Pong

With the commands we learned so far, it is easy to write a "Pong"-

like macro that makes it appear as if a ball is moving around in a

matrix and bouncing off the walls. Our strategy is to create a kind

of state machine, with global variables forming the states. By

calling the macro repeatedly using a cuelist, we simulate state

transitions.

if (undefined(_pong))

{

int _pong;

int _bx, _by, _sx, _sy;

int _width;

int _height;

_width = 32;

_height = 24;

_bx = _width/2;

_by = _height/2;

_sx = 1;

_sy = 1;

}

int nx, ny, n;

nx = _bx + _sx;

ny =_by + _sy;

if (ny < 0)

{

ny = 0;

_sy = 1;

}

if (ny >= _height)

{

ny = _height-1;

_sy = -1;

}

if (nx < 0)

{

Page 91: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 91/251

nx = 0;

_sx = 1;

}

if (nx >= _width)

{

nx = _width - 1;

_sx = -1;

}

proClear();

n = nx * _height + ny + 1;

printf("Activating Unit #%d \n", n);

proSelectOut();

proSelectSingle(0, n);

ClearFx();

SetPosition(0xffff);

proLoadValue(0);

proLoadValue(1);

proLoadValue(2);

_bx = nx;

_by = ny;

If the global variable _pong is undefined, all the code in brackets

is executed, declaring global variables to hold position and speed

of the ball, width and height of the matrix. In addition, the ball is

put into the middle of the field with initial speed set to 1 on both

the horizontal and the vertical axis. Positive values will let the ball

move down/right, while negative values will move the ball

up/left.

After initialization, the new position of the ball is calculated by

adding the speed values to the old position. If the new position

exceeds the size of the matrix (that is if a coordinate is below zero

or above width/height) the particular speed values will be

inverted. That way, the ball will "bounce off the wall".

Page 92: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 92/251

Then, proClear clears the programmer view to get rid of the last

picture and the new ball position n inside the matrix is calculated.

The corresponding fixture is then selected and activated using

proSelectSingle, ClearFx (because we do not want any

effect but just a plain white pixel), SetPosition and

proLoadValue. Note that the value is set using hexadecimal

format – 0xFFFF = 65535.

Finally, the global variables get updated with the values

calculated in this round. This is what it is all about.

The last thing to do is to configure the programmer so that the

macro will be called repeatedly:

Record an empty cue in the first cuelist. Edit the cue properties

for that cue. First of all, set the timing to WAIT and put a time of

about 0.1 seconds. This is how often the macro is going to be

executed, and you can change that time according to how fast you

would like your ball to move. Then, click on the "Action#1" tab

and select "Call Macro" as an action. Put "Pong" (or whatever

name you gave to your macro) as a parameter name, as in the

example below:

Page 93: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 93/251

1.11 Event-driven Macro Execution Event-driven macro execution allows macros to turn hibernate

and be activated automatically when a particular event occurs.

The event triggers a macro function. When this function has run

through, the macro is set to sleep again until the event occurs

again. This way the macro will never stop running until

explicitely shut down and therefore remember not forget the

particular values that the variables hold. Unlike global variables,

these variables will only be known inside the macro. This avoids

conflicts between different macros.

To create an event-driven macro, perform the following steps:

1. Create a macro inside the macro window.

2. Inside the macro, register an event that you want to react

to, like e.g. When a key on a certain e:bus device has

been pressed. Through registration, the event also is

connected to a macro function. The corresponding

macro code will look as follows:

RegisterEvent(EbusKeyPress, OnEbusKey);

The first parameter is the event that the macro shall react

on, the second parameter is the name of the function that

shall be called when the event occurs. The name of that

function can be chosen freely. Both names must not be

put in quotation marks!

3. Create the function itself. Use the name that you chose in

the RegisterEvent-command. The most important thing

is that the function has to have the correct parameter

count and types. Both must correspond with the event

type that was chosen. In this case, the function needs to

have two parameters: an integer for the driver handle of

the e:bus device and another integer for the ID of the key

that was pressed. The function declaration will look as

follows:

Page 94: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 94/251

function OnEbusKey(int nDriverHandle, int

nKeyId)

{

...

}

Only variables that are declared outside the function

declaration are persistent through event-triggerings.

Variables that are declared inside the function are only

visible inside the function and only have a lifetime from

declaration to end of the function.

4. Design the function to handle the event in a way that

you want.

Event Types

The following list shows all different events that can be

registered:

Event Name

Occurance Parameters

Initialization When the

Programmer has been

started & when a new

show was loaded.

int p0, int p1, int p2

p0 = 0: Show was loaded.

p0 = 1: Reset occurred.

p1, p2: not used.

Periodic Every Minute. int p0, int p1, int p2

p0: day number (Sunday

= 0 … Saturday = 6)

p1: hour

p2: minute

Hourly Every Second. int p0, int p1, int p2

p0: hour

p1: minute

p2: second

Cuelist When a cuelist has

been started or

int p0, int p1, int p2

p0: cuelist number

Page 95: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 95/251

stopped; when a

cuelist has been idle

for some time.

p1 = 0: stop event

p1 = 1: start event

p1 = 2: idle event

p2: not used.

Faderunit When a Faderunit key

has been pressed.

int p0, int p1, int p2

p0: always 0

p1: always 1

p2 = key number that

was pressed.

MidiNoteOn When a MIDI note on

is received.

int p0, int p1, int p2

p0: channel number

p1: note number

p2: velocity

TimecodeEvent

When timecode starts

or stops.

int p0, int p1, int p2

p0 = 0: timecode starts

p0 = 1: timecode stops

p1, p2: not used.

Label When a label event is

triggered.

int p0, int p1, int p2

p0: label ID

p1, p2: not used.

TerminalEvent

When a terminal

event is received.

int p0, int p1, int p2

p0: serial port number

p1:

SerialPort When a message on a

serial port is received.

Only works when the

first byte is an ASCII

char, the second is

interpreted as a

number.

int p0, int p1, int p2

p0: ASCII character

p1: number

p2: not used.

MidiNoteOff When a MIDI note off

is received.

int p0, int p1, int p2

p0: channel number

p1: note number

p2: velocity

MidiControlChange

When a MIDI control

change is received.

int p0, int p1, int p2

p0: channel number

Page 96: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 96/251

p1: controller

p2: value

MidiProgramChange

When a MIDI

program change is

received.

int p0, int p1, int p2

p0: channel number

p1: program number

ActionPadEvent

When a mouse click is

performed, mouse

button released,

dragging is

performed, a page is

left, a page is

activated.

int p0, int p1, int p2

p0 – on MButton down,

up, drag: ID of the item

that is affected. -1 if no

item is involved.

p0 – on page present:

page that is coming in.

p0 – on page leave: page

that was left.

p1= 0: Mbutton down

p1= 1: Mbutton up

p1= 2: drag

p1= 3: page present

p1= 4: page leave

p2 - on Mbutton down,

up, drag: cursor position,

binary encoded (first 2

byte: Pos Y, last 2 byte:

Pos X).

Frame On every frame

(about 30 frames per

second)

-

UdpReceive When a UDP message

is retrieved by the

generic UDP driver.

int nDriverHandle

nDriverHandle: Handle

of the UDP driver.

EbusKeyPress

When an e:bus device

key is pressed.

int nDriverhandle, int

nKeyId

nDriverhandle: Handle

of the e:bus driver.

nKeyId: Key number of

the e:bus device.

EbusKeyRel When an e:bus device int nDriverhandle, int

Page 97: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 97/251

ease key is released. nKeyId

nDriverhandle: Handle

of the e:bus driver.

nKeyId: Key number of

the e:bus device.

EbusJogPress

When an e:bus device

jog is pressed.

int nDriverhandle, int

nJogId, int nPos

nDriverhandle: Handle

of the e:bus driver.

nJogId: ID of the Jog.

nPos: position where the

Jog was pressed.

EbusJogRelease

When an e:bus device

jog is released.

int nDriverhandle, int

nJogId, int nPos

nDriverhandle: Handle

of the e:bus driver.

nJogId: ID of the Jog.

nPos: position where the

Jog was released.

EbusJogMove

When an e:bus device

jog is moved.

int nDriverhandle, int

nJogId, int Delta

nDriverhandle: Handle

of the e:bus driver.

nJogId: ID of the Jog.

Delta: How far the move

was performed.

Key Mapping of e:bus Devices

The following drawings show the key mapping of the different

e:bus devices.

Page 98: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 98/251

When receiving an e:bus device event, these key IDs are delivered

to the function that has been called by the event.

Page 99: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 99/251

Example

Assume that we want a single Fixture to light up when a MIDI

note on event is received from a connected keyboard, and to

darken the fixture again when the subsequent note off event

occurs. We can put both events into one macro file to keep

everything clear and simple.

First, both events must be registered inside the macro.

RegisterEvent(MidiNoteOn, OnMidiNoteOn);

RegisterEvent(MidiNoteOff, OnMidiNoteOff);

We also have to fetch the fixture type ID of our Deskchannel

fixture to be able to access it.

int nTypeId;

nTypeId = GetFixtureTypeId("Dskch");

if (nTypeId < 0)

{

alert("Fixture Type does not exist!

Aborting...\n");

exit;

}

The most important part is calling the Suspend command to let

the macro lay itself to sleep.

Suspend();

Finally, the functions that are to be called must be written. Both

functions have to receive 3 int parameters. We're keeping it

simple here, so only one Desk Channel fixture will be altered.

Page 100: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 100/251

function OnMidiNoteOn(int p0, int p1, int p2)

{

proClear();

proSelectSingle(nTypeId, 1);

SetPosition(65535);

proLoadValue(0);

}

function OnMidiNoteOff(int p0, int p1, int p2)

{

proClear();

proSelectSingle(nTypeId, 1);

SetPosition(0);

proLoadValue(0);

}

Page 101: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 101/251

The complete macro therefore looks as follows:

RegisterEvent(MidiNoteOn, OnMidiNoteOn);

RegisterEvent(MidiNoteOff, OnMidiNoteOff);

int nTypeId;

nTypeId = GetFixtureTypeId("Dskch");

if (nTypeId < 0)

{

alert("Fixture Type does not exist!

Aborting...\n");

exit;

}

Suspend();

function OnMidiNoteOn(int p0, int p1, int p2)

{

proClear();

proSelectSingle(nTypeId, 1);

SetPosition(65535);

proLoadValue(0);

}

function OnMidiNoteOff(int p0, int p1, int p2)

{

proClear();

proSelectSingle(nTypeId, 1);

SetPosition(0);

proLoadValue(0);

}

Now all that has to be done is to start the macro.

You could of course make this example a lot more complex, like

processing the function parameters that are passed when a

function is executed. In this example you could switch on

different fixtures dependent on which note has been played.

Page 102: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 102/251

2 Automation & Device Access

Page 103: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 103/251

2.1 Accessing Cuelists

Objectives

In this section you will learn about the following:

1. Starting and stopping cuelists with e:script

2. Retrieving information about cuelists

3. Deleting cuelists

4. Recording new cues

2.1.1 Starting and Stopping Cuelists

Cuelists can be started and stopped with the two e:script

commands StartCuelist and StopCuelist.

The only thing to keep in mind is that those two commands

expect a zero-based parameter, so StartCuelist(0) will start

cuelist number 1, StartCuelist(1) will start cuelist number 2

etc.

The following short macro starts the first 5 cuelists:

StartCuelist(0);

StartCuelist(1);

StartCuelist(2);

StartCuelist(3);

StartCuelist(4);

Of course, we would handle that more elegantly with a for loop,

as shown below:

int i;

for (i=0; I <= 4; i++)

StartCuelist(i);

Page 104: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 104/251

If we want to stop all cuelists, we do not need to go to the trouble

of writing a macro such as -

int i;

for ( i=0; i < 1000; ++i)

if (GetCueCount(i)>0) StopCuelist(i);

Instead, we can just use ReleaseAll and this command will

stop all cuelists, delayed the particular release times, if existent.

Alternatively, ResetAll will stop all cuelists at once with all

release times set to 0.

Page 105: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 105/251

2.1.2 Retrieving Information about Cuelists

The e:script language also allows us to find out information about

what is currently happening with cuelists. First of all,

GetCuelistName simply returns the name of the particular

cuelist. The cuelist number is passed as a parameter to the

command. Note the parameter is zero-based again -

GetCuelistName(0); will return the name of Cuelist number

1. The statement printf(GetCuelistName(1)); will output

the name of cuelist number 2 to the logbook.

The command GetCurrentCue returns the number of the cue

which is currently running (also zero-based - so if that function

returns the value 33, it is actually cue 34 which is running at the

time), or –1 if the cuelist isn't running at the time. For more

advanced purposes we have GetCuelistStatus:

GetCuelistStatus

string GetCuelistStatus (int cuelist_id,int

par);

'id' is the zero based number of the cuelist.

The parameter 'par' selects the status field.

0: Play Status

1: Extended List Name

2: Submaster Position

3: Short List Name

The below macro checks the first 100 cuelists and prints the status

of all existing cuelists to the logbook:

Page 106: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 106/251

int i,j;

string myString;

for (i = 0; i < 100; i++)

{

myString = "";

if (GetCuelistHandle(i) != -1)

{

myString += format("Cuelist %d \n", i +

1);

for (j = 0; j < 4; j++)

{

myString += format("

Par %d: ", j);

myString += GetCuelistStatus(i,

j);

myString += format("\n");

}

myString += format("\n");

}

else myString += format("Cuelist %d does

not exist\n", i);

printf(myString);

printf("\n");

}

To understand the macro, first of all we need to know there are

two for-loops. The first for-loop runs through the first 100 cuelists.

It checks for every one of them if the cuelist actually exists by

invoking GetCuelistHandle (since we wouldn't want to run

GetCuelistStatus on a cuelist that doesn't exist - that could

give us an error message and terminate the macro). About

GetCuelistHandle - all we need to know for the moment is

that it returns –1 if the cuelist doesn't exist, so we can check if the

cuelist does exist with the statement

if(GetCuelistHandle(i)!=-1) {…} and everything inside

the braces {…} will only be carried out if the cuelist exists. Note

also the else {…} statement below these braces, which prints a

message that the cuelist does not exist. This might be taken out of

the macro using the comment symbols // because it might be

Page 107: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 107/251

very bothering to receive text for every cuelist that is not even

running.

Now, inside the braces there is a second for-loop. This one runs

GetCuelistStatus four times on the same cuelist, with a

different value for the second parameter. All the information is

added (nicely formatted) to a string variable myString. As we

can see, the operator += also works for string variables.

myString = "Hello, ";

myString += "World";

myString += "\n";

will lead to exactly the same result as myString = "Hello,

World\n".

At the end of the GetCuelistStatus macro, the variable

myString is put out to the logbook using printf and another

line break is added. Then the loop starts over again, myString is

cleared and filled with more information, etc. The output of the

macro in the logbook of the e:cue programmer would be similar

to this:

GetCuelistStatus

Cuelist 2

Par 0: <new cue> [K]

Par 1: QL2 background (1/1)

Par 2: Full

Par 3: QL2 background

Cuelist 4

Par 0: 0 [K]

Par 1: QL4 (1/3)

Par 2: Full

Par 3: QL4

GetCuelistStatus done in 0.020 sec

Page 108: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 108/251

Displaying Cuelist Information on an e:com Terminal

The following macro fragment uses GetCuelistStatus to

display information on an e:com terminal. For example, a user

could press buttons on an e:com and the e:cue programmer

would switch to a different cuelist, showing the name of that

cuelist in the display of the e:com. There were two macros

running in the Automation window: The first one was triggered

by e:com events, responding to a key press on the e:com. The

other one was triggered every second to refresh the e:com

display, and is shown below:

string myString;

myString = "-e:cue e:com Terminal-\n";

// myString += "Currently running:\n";

myString += GetCuelistStatus(_currentCuelist,

3);

myString +=

GetCueName(_currentCuelist,getCurrentCue(_

currentCuelist));

myString += "\nPress Button to Change.\n");

TerminalSend(0, 0, ""); // clear screen

on all terminals

TerminalSend(0, 1, myString); // send message

to all terminals

As you can see, this macro is doing basically the same thing as the

one before, with the difference that the information isn't put into

the logbook, but sent to an e:com terminal. Apart from that, note

there is a global variable, _currentCuelist, which is set up

and refreshed by the part of the macro which is not shown here.

This part will be dealt with in a later chapter which deals with

reading information from remote terminals. Note also that the

e:com Terminal can display four lines - this is why one of the lines

is removed with // to make room for another line which shows

the name of the current cue.

Page 109: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 109/251

Page 110: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 110/251

2.1.3 Deleting Cuelists

The command

FlushCuelist(int cuelist_id);

deletes all cues from the cuelist specified by cuelist_id (which

is zero-based).

2.1.4 Recording Cues

The command RecordCue does almost exactly the same as

pressing the record button in the e:cue Programmer. It takes two

parameters: First, the number of the cuelist which you want to

record the cue into. This has to be a zero-based number. Second, it

takes a string parameter for the name of the cue to be recorded.

Now it's very useful to be able to record a cue automatically, but

the question is, how can we use e:script to put stuff into the

programmer view in the first place? That is the question we want

to deal with in the next chapter.

Page 111: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 111/251

2.2 Accessing the Programmer View

Objectives

In this section you will learn about the following:

1. Inserting fixtures into the programmer view

2. Setting values for fixtures

3. Setting live FX

2.2.1 Manipulating Fixtures in the Programmer View

In this chapter we will only talk about fixtures that have already

been patched (we will deal with patching new fixtures in a later

chapter).

The approach taken by e:script is to mimic the user's behaviour ,

and follows this order:

First, fixtures are selected (into the programmer view) with

proSelectSingle or proSelectRange.

Second, a value between 0 (0%) and 65535 (100%) is stored

temporarily with SetPosition.

Third, that value is loaded into one of the channels of the

fixture with proLoadValue.

Finally, the result can be stored inside a cuelist with

RecordCue but for some purposes such as games etc. where

e:script has complete control, this isn't necessary – after all,

the programmer view has direct output.

(There is another way of directly accessing desk channels with the

LoadValue function, but this is more complicated and will be

dealt with later on.)

Page 112: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 112/251

The following very simple example takes all RGBFader elements

that are found in a show and sets them to white (i.e. 100% on all

three channels – Red, Green and Blue). To try it, simply patch any

number of RGBFader elements (from the Generic class in the

library) and run this macro:

int fix_type, fix_count, i;

fix_type = GetFixtureTypeId("RGBFader");

if (fix_type < 0)

{

MessageError("Fixture Type RGBFader not

found in show.");

exit;

}

fix_count = GetFixtureTypeCount(fix_type);

printf("This many fixtures in show: %d \n",

fix_count);

for (i=0; i <= fix_count; i++)

{

proSelectOut();

proSelectSingle(fix_type,i);

SetPosition(65535);

proLoadValue(0);

proLoadValue(1);

proLoadValue(2);

}

After declaring a few variables, the variable the fixture type ID of

our "RGBFader"s is assigned to fix_type by using

GetFixtureTypeId. If GetFixtureTypeId could not find any

"RGBFader"s it will return a value below zero, which is how we

can check for errors - we can present an error message to the user

and exit.

Next, the variable fix_count is assigned the number of

"RGBFader"s that are found in the show by using

GetFixtureTypeCount. This requires the fixture type as

parameter so we pass fix_type to it, and leave a little message

in the logbook as to how many fixtures were found.

Page 113: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 113/251

Lastly, a for-loop repeats the same sequence for all the fixtures

that were found. First of all, everything is deselected with

proSelectOut – so if the user had any selections before running

the macro it does not lead to any unexpected results. Then,

proSelectSingle receives the parameters for the type and the

ID number of the fixture to select. We are passing fix_type and

the variable i from the for-loop to it – this way, we can cycle

through all the fixtures. Now the programmer knows which

fixture we are accessing, so we can set a value that we would like

to load using SetPosition. Remember, the range is 0 to 65535

(100%). And finally, we use proLoadValue three times, thus

setting 65535 into the channels 1, 2 and 3. The parameter for

proLoadValue is also zero-based - which means if we want to

access the first channel, we write proLoadValue(0). Note that

in this example, we could have saved ourselves the for-loop by

using proSelectRange instead of proSelectSingle:

proSelectOut();

proSelectRange(fix_type, 0, fix_count);

SetPosition(65535);

proLoadValue(0);

proLoadValue(1);

proLoadValue(2);

As you can see, proSelectRange takes three parameters – the

fixture type and the first and the last fixture to select.

Setting LiveFX

We use the command SetFx to temporarily store FX settings. Just

as with SetPosition, the FX settings are loaded into a channel

by using proLoadValue. This means you can use SetPosition

and SetFx together, and afterwards load both the value and the

FX into a channel with a proLoadValue statement.

SetFx

int SetFx(int func_id,int size,int speed,int

Page 114: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 114/251

offset,int ratio);

Set LiveFX Values

func_id = number of required function (0=off)

size 100% = 4096, range [-5*4096 ... 5*4096]

= LiveFX Window: [-500% ... 500%]

speed 1Hz = 1000, range [-20000 ... 20000]

= LiveFX Window: [-20 ... 20]

offset 100% = 1000, range [-10000... 10000]

= LiveFX Window: [-1000% ... 1000%]

ratio 100% = 4096, range [0 ... 4096]

= LiveFX Window: [0 ... 100]

The first parameter, func_id, denotes the FX function you

would like to set. The value is not a zero-based number. The

following table shows function names.

1

2

3

4

5

6

7

Sin

Cos

Ramp

Rectangle

Triangle

Peek Up

Peek Down

8

9

10-13

14-29

30-34

34+

Ping Pong

Halloween

HalfRamp1-4

Equalizer Bands 1-16

Equalizer Bands X1-X4

Video and Screen Capture

Channels (not used)

The parameter size takes values from –20480 to 20480 (-500% to

500%). The speed parameter takes values from

-20000 to 20000. The following table helps estimating the values

you can set:

speed Hertz Passes per second

1000

10000

100

1 Hz

10 Hz

0.1 Hz

1

10

10 sec for a pass

The parameter offset sets a phase shift off the effect. If you have

two times the same LiveFX function with different values for

offset, they will oscillate out of sync.

Page 115: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 115/251

The ratio parameter "deforms" the mathematical function,

changing the scaling of the left part relative to the scaling of the

right part of the curve. For example, if you set a Rectangle

function and the value 2048 for ratio, there will be a balanced

relation between "on" and "off". The minimum and maximum

values are 0 and 4096 respectively.

ClearFx

With SetFx, remember that before starting on another channel,

you might want to erase the temporary value using ClearFx.

Unless you do ClearFx, any channel that has a value assigned

with proLoadValue also receives the effects. The example below

sets an effect and position value to channel 1, then sets 0% and no

effects to the two other channels:

SetPosition(32767);

SetFx(1, fx_size, -fx_speed, r,

fx_ratio);//f,size,speed,offset,ratio

proLoadValue(0);

ClearFx();

SetPosition(0);

proLoadValue(1);

proLoadValue(2);

2.2.2 Example: Making your own Effect Macro

Now that we got the tools to configure effects on fixtures using

the e:script macro language, we want to use this to make our first

effect creating macro. In the following example, we want to create

an effect where a wave starts in the middle of an LED matrix,

running to the outside, forming an increasing circle. We need to

Page 116: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 116/251

have some RGBfader patched, for now we assume that we have

set up a 32x32 LED matrix. If you want to use the macro on a

system with other dimensions, just change the width and

height variables to appropriate values. This example will be

more complex than the most we have done so far, so we build it

up from the scratch. First, we declare a big bunch of variables and

assign values to them:

int width, height, i, k, n;

int foffset, dx, dy;

int dropx, dropy;

int fix_type, fspeed, fratio, screen_id;

int brightness;

string fix_name, info;

width = 32;

height = 32;

fspeed = -400;

fratio = 4096;

brightness = 8192;

dropx = width/2;

dropy = height/2;

The variables width and height define the size of our matrix, so

if you want your effect to be on a matrix with a different size,

simply adjust the values. i and k will be used as control variables

for the loops we will be using later on, while n will hold the value

of the pixel currently addressed. fspeed and fratio will hold

the values for speed and ratio we will pass to the SetFx

command, with appropriate values assigned. dropx and dropy

will hold the position where we want our wave to start, in this

case the middle of our matrix. Finally, brightness holds our

desired value for the color brightness we want. Now let us move

on in the code:

Page 117: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 117/251

screen_id = 1;

fix_name = "RGBFader";

fix_type = GetFixtureTypeId(fix_name); //verify

the fixture type exists.

if (fix_type<0)

{

info=format("Fixture Type '%s' does not

exist.",fix_name);

MessageError(info);

exit;

}

In this part of the code, we make some formal preparations: The

variable screen_id defines at which fixture we want to start.

This is important if we have more than our LED matrix patched

so that our matrix's addressing does not start at screen ID one.

Here, we assume that our matrix starts at the first position, so we

set screen_id to 1.

We need the type id of the fixture type "RGBFader" because we

need it later on when we use proSelectSingle to select a single

fixture. We can get it with the command GetFixtureTypeId. If

we receive an id below zero, an error has occurred and we have to

exit our macro.

Now follows the most important part: We want a wave running

from the middle to the outside in a circle. But how can we

accomplish this? It is not as hard as you might think; the trick is to

use a little math. Using two for-loops, we will go through the

matrix, selecting a single fixture every time. With

dx = (i - dropy) * 100;

dy = (k - dropx) * 100;

we calculate the difference between the actual position and the

middle of the matrix for both the horizontal axis and the vertical

axis. We scale this difference by multiplying it with 100 (this has

to be done so that the results differ a lot for different positions).

Page 118: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 118/251

With the command radius we can calculate the straight distance

of our dx and dy to the centre of our coordinate system (the

middle of our matrix). But what is that for? Here is the trick:

Every fixture in our matrix will receive the same LiveFX with the

same values, with only one difference: The offset will be our

calculated distance from the middle of the matrix. A point further

away from the centre will receive a bigger offset than a point near

to the centre, which results in a more delayed display depending

on the position. This does exactly what we want to have. Let us

look at the code:

proClear();

for (k = 0; k < width; ++k)

{

for (i = 0; i < height; ++i)

{

n = k * height + i + screen_id;

proSelectOut();

proSelectSingle(fix_type, n);

dx = (i - dropy) * 100;

dy = (k - dropx) * 100;

foffset = radius(dx, dy);

SetPosition(brightness);

SetFx(9, 4096, fspeed, foffset,

fratio);

proLoadValue(0);

}

}

We first clear the Programmer view with proClear to make sure

that our effect is the only thing to be displayed. Then we calculate

our current fixture position depending on our control variables

and add screen_id to it.

We use the LiveFx "halloween" which will generate a nice

waveform. Remember that we assigned a negative value to

fspeed so that the wave will float from the middle to the outside

and not vice versa. Color value and effect will only be loaded to

channel zero of each fixture because we want the wave to have a

nice deep blue color.

Page 119: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 119/251

Now here is the complete macro written down in one piece:

int width, height, i, k, n;

int foffset, dx, dy;

int dropx, dropy;

int fix_type, fspeed, fratio, screen_id;

int brightness;

string fix_name, info;

width = 32;

height = 32;

fspeed = -400;

fratio = 4096;

brightness = 8192;

dropx = width/2;

dropy = height/2;

screen_id = 1;

fix_name = "RGBFader";

fix_type = GetFixtureTypeId(fix_name); //verify

the fixture type exists.

if (fix_type<0)

{

info=format("Fixture Type '%s' does not

exist.",fix_name);

MessageError(info);

exit;

}

proClear();

for (k = 0; k < width; ++k)

{

for (i = 0; i < height; ++i)

{

n = k * height + i + screen_id;

proSelectOut();

proSelectSingle(fix_type, n);

dx = (i - dropy) * 100;

dy = (k - dropx) * 100;

foffset = radius(dx, dy);

SetPosition(brightness);

SetFx(9, 4096, fspeed, foffset, fratio);

Page 120: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 120/251

proLoadValue(0);

}

}

Feel free to experiment with the values! Try to use other effects,

adjust the parameters and use different colors ore use another

centre of effect. This will create very nice looking effects in a

simple way.

Instead of using the radius command, you can also try the

command atan2. This will calculate the angle a point has

relative to a centre position. This way, you can create beacon-

like effects with a rotation going on.

2.2.3 Using LoadValue

The command LoadValue works similarly to proLoadValue.

However, instead of putting an item into the programmer view,

LoadValue directly accesses the output of the e:cue programmer,

as a cuelist would. Just like with proLoadValue though, first a

value needs to be stored using SetFx or SetPosition.

LoadValue requires the following parameters:

int LoadValue(int handle,int desk_id,int

fade_time,int delay_time,int htp);

Since LoadValue is very close to the core functions of the e:cue

programmer, and since it is exercising the same access rights like

a cuelist, LoadValue needs a currently running cuelist to get a

handle from. We can either make and start our own cuelist with

e:script or use one that is already there, and use

GetCuelistHandle to retrieve a handle. GetCuelistHandle

returns –1 if the cuelist isn't running, so we better make sure it

does.

Second, LoadValue needs a to access "desk channel". The desk

channel of any fixture can be retrieved with GetDeskChannel.

Page 121: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 121/251

For example, the following statement retrieves the base channel of

RGB Fader number eleven:

GetDeskChannel("RGBFader",11);

In the case of the RGBFader, which has three channels, we need to

add either 0, 1, or 2 to the result to get the correct desk channels

for Blue, Green, or Red. Note that the channels are exactly as they

are displayed when the fixture is put into the programmer view:

The parameters for fade_time and delay_time are values in

milliseconds. If you set a number bigger than zero for

fade_time, there will be a fade-in from the current status to the

value you were passing. delay_time will wait for the specified

time before the command is executed.

Finally, the htp parameter specifies whether you want the

command to be executed in the HTP (Highest Takes Priority) or

LTP (Latest Takes Priority). Set htp to 1 to use HTP, set it to 0 to

use LTP.

With HTP enabled, the highest value received gets priority

control. With LTP, the last value that has been sent gets priority

control. HTP cannot work if the channel has been explicitly

defined as LTP in the Library Editor.

In most cases, setting HTP to 1 will yield the highest possibility of

the macro to behave like you would expect because LTP can

produce some kind of "random" behavior".

Practical use of the LoadValue can be made whenever you want

to create an effect by yourself and want it to fade in smoothly.

This is not possible with proLoadValue while LoadValue

provides this possibility easily.

Page 122: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 122/251

Page 123: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 123/251

2.3 Accessing Cues

Objectives

In this section you will learn about the following:

1. Creating and deleting cues

2. Reading and setting cue properties

2.3.1 Creating and Deleting Cues

We have already seen that it is possible to record a cue with

RecordCue. Apart from that, it is also possible to delete cues

using DeleteCue. This function requires two parameters, the

cuelist id and the cue id – both zero-based. The statement

DeleteCue(0,4) will delete cue number 5 from cuelist number

1.

2.3.2 Reading and Setting Cue Properties

For retrieving information from cues, we use GetCueProperty.

This requires three parameters: The cuelist id and the cue id (both

zero-based) and the property that you want to read out. For

setting the parameters for cues we use SetCueProperty which

requires one additional parameter – the value that you want to

set.

Page 124: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 124/251

GetCueProperty and SetCueProperty

int GetCueProperty(int cuelist_id,int

cue_id,string property);

int SetCueProperty(int cuelist_id,int

cue_id,string property,int value);

property='Command':

0 = MANUAL

1 = Wait (Para0=Runtime[ms])

2 = Timecode (Para0=Timecode[ms])

3 = Until end of Cuelist (Para0=Cuelist

id)

property='Para0':

Set a parameter for the current command

property='InFadeTime':

Fade in time [ms]

Please note that there are many more possible values for the

property parameter, since you can access all cue settings. The

complete list can be found in the e:script Reference. But for the

moment, we are only interested in Command, Para0 and

InFadeTime. Let us assume for a moment you a programming a

simple show with a few color changes that is supposed to run

stand-alone. Because it is standalone, you do not want to have

any of the timings set to MANUAL since that would stop your

show. The following macro checks all cues. It is split into several

parts with some explanations inbetween:

Page 125: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 125/251

int i,k,count,manual_found,myProperty;

string message,list;

for (i=0; i<255; i++)

{

count=GetCueCount(i);

if (count>0)

{

for (k=0; k<count; k++)

{

if(GetCueProperty(i,k,"Command")==0)

{

manual_found=1;

list+=format("- Cuelist

%d (%s), Cue %d (%s)\n"

,i+1,GetCuelistName(i),k+1,GetCueName(i,k)

);

}

}

}

}

// SECOND PART OF THE MACRO

if (manual_found)

{

message="Manual timing found in the

following cuelists:\n\n";

message+=list;

MessageWarning(message);

}

else MessageOk("Show OK!\nNo manual timings

found.");

As the next step, we could offer the user to automatically replace

any manual timings by WAIT timings. Below is only the second

part of the macro.

Page 126: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 126/251

// SECOND PART OF THE MACRO

if (manual_found)

{

message="Manual timing found in the

following cuelists:\n\n";

message+=list;

message+="\nWould you like to set them to

WAIT=1 second?";

if(MessageYesNo(message))

{

for (i=0; i<255; i++)

{

count=GetCueCount(i);

if (count>0)

{

for (k=0; k<count;

k++)

{

if(GetCueProperty(i,k,"Command")==0)

{

SetCueProperty(i,k,"Command",1);

SetCueProperty(i,k,"Para0",1000);

}

}

}

}

}

else exit;

}

else MessageOk("Show OK!\nNo manual timings

found.");

For simplicity's sake, we just set the WAIT timing to one second -

we could have also offered the user a dialogue and asked him for

the WAIT timing he would have preferred. Note how there are

two SetCueProperty statements. The first one passes

"Command" as the property and sets the timing to WAIT by

passing 1 as the value (see function description above). The

Page 127: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 127/251

second one passes "Para0" as the property – a variable parameter

depending on the status of "Command". In this case the value

affects the timing, 1000 ms = 1 second. A few more examples of

how to use Command and Para0:

SetCueProperty(0,0,"Command",2);

SetCueProperty(0,0,"Para0",1000);

The above sets the timing of the first cue of the first cuelist to

SMPTE timecode 0:00:01.00.

SetCueProperty(0,0,"Command",3);

SetCueProperty(0,0,"Para0",1);

The above sets the timing of the first cue to "Until the end of

Cuelist 2".

Page 128: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 128/251

2.3.3 Example: The Generate Single Colors Macro

The following example uses what we have learned so far to

generate a color-changing cuelist. Note how, for simplicity, we

have set a lot of variables manually; we could also have added

some user interaction to ask the user for the variables they like.

int i, k, n, count;

int width, height;

int fix_type, target_list_id;

int fade_in_time, wait_time;

string info;

// Some parameters are set manually here for

simplicity,

// but we could also get them off the user:

width = 32;

height = 8;

fix_type = GetFixtureTypeId("RGBFader");

target_list_id = 0;

fade_in_time = 1000;

wait_time = 3000;

info = format("This macro will generate

colours.\nCuelist %d will be deleted.

Proceed?", target_list_id+1);

if(!MessageYesNo(info)) exit;

FlushCuelist(target_list_id);

ClearFx();

proClear();

for (k = 0; k < width; ++k)

{

for (i = 0; i < height; ++i)

{

n = k * height + i + 1;

proSelectOut();

proSelectSingle(fix_type,n);

SetPosition(0xffff);

Page 129: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 129/251

proLoadValue(1);

}

}

RecordCue(target_list_id,"Green");

proClear();

for (k = 0; k < width; ++k)

{

for (i = 0; i < height; ++i)

{

n = k * height + i + 1;

proSelectOut();

proSelectSingle(fix_type,n);

SetPosition(0);

proLoadValue(0);

SetPosition(0xffff);

proLoadValue(1);

proLoadValue(2);

}

}

RecordCue(target_list_id, "Yellow");

proClear();

for (k = 0; k < width; ++k)

{

for (i = 0; i < height; ++i)

{

n = k * height + i + 1;

proSelectOut();

proSelectSingle(fix_type, n);

SetPosition(0);

proLoadValue(0);

proLoadValue(1);

SetPosition(0xffff);

proLoadValue(2);

}

}

RecordCue(target_list_id, "Red");

proClear();

for (k = 0; k < width; ++k)

Page 130: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 130/251

{

for (i = 0; i < height; ++i)

{

n = k * height + i + 1;

proSelectOut();

proSelectSingle(fix_type, n);

SetPosition(0);

proLoadValue(1);

SetPosition(0xffff);

proLoadValue(0);

proLoadValue(2);

}

}

RecordCue(target_list_id, "Magenta");

proClear();

for (k = 0; k < width; ++k)

{

for (i = 0; i < height; ++i)

{

n = k * height + i + 1;

proSelectOut();

proSelectSingle(fix_type, n);

SetPosition(0);

proLoadValue(2);

SetPosition(0xffff);

proLoadValue(0);

proLoadValue(1);

}

}

RecordCue(target_list_id, "Cyan");

proClear();

count = GetCueCount(target_list_id);

if (count > 0)

{

for (i = 0; i < count; ++i)

{

SetCueProperty(target_list_id, i,

"InFadeTime", fade_in_time);

SetCueProperty(target_list_id, i,

"Command", 1);

Page 131: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 131/251

SetCueProperty(target_list_id, i,

"Para0", wait_time);

}

}

Page 132: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 132/251

2.4 Processing Input & Output

Objectives

In this section you will learn the following:

1. how to receive and to send serial input/output

2. how to send MIDI data

2.4.1 Serial I/O

In chapter 9.3.3, within the example about string intersection, we

processed a simulated serial input string. In this chapter, we

want to pick up this topic and explain how to receive real input,

as we already know how to analyze the received input.

To receive a serial input that arrived via RS232, we make use of

the command GetSerialString. Let us take a look at the

definition:

GetSerialString

string GetSerialString(int handle, int-ref

length);

handle – driver handle

Length - reference parameter and will be set to

the length of the received string or

-1 if input buffer was empty.

The most important thing to know is what the driver handle is

and how to retrieve it: In the e:cue Programmer, every device you

add to a show will get a unique handle which acts as an identifier

for that device. To retrieve it, you need the alias name of the

particular device. The command GetDriverHandle needs this

name as its single parameter and returns the handle related to the

device name.

Page 133: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 133/251

The return value of this command is obviously the received serial

input. The parameter length works like an additional return

value: GetSerialstring will write the length of the received

string into the parameter length. This will become very important

as we need to detect when an input signal has been completely

received (this will be explained below). But how do we recognize

when a serial input waits for us to be caught? This is easy as we

can build up a trigger rule that reacts on incoming data on a given

serial port You can find more about triggers inside the e:cue

Programmer system manual. The trigger will call our macro that

will then receive and process the input as we want to.

A serial input can consist of multiple lines, separated with the

control character '\r' (carriage return). GetSerialString will

only return one line each time it is called. To receive the complete

message, we must call the command repeatedly until the length

parameter becomes -1. As it is not possible to create a string array,

we have to process the input data line by line inside the loop (e.g.

convert it into an int if possible to store the data into an int array).

The following code shows a general structure of how to receive a

multiline input:

// This macro has to be triggered on serial

input

int length;

string input;

int handle;

int i;

handle = GetDriverHandle("serial#1");

i = 0;

while (i != -1)

{

input = GetSerialString(handle, i);

[…] // further process the

received input line

}

Page 134: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 134/251

We did already show how to process a string in chapter 9.3. As

the input depends on the device that sends the data and as you

have to know what you want to do with it, you have to work out

your own way of processing the input.

You can also send data to a serial port with SendString. The

syntax is as follows:

int SendString(int id,string message);

The parameter id specifies the port number you want to send the

data to. The parameter message contains the data itself.

SendString will return 1 if the sending succeeds, 0 if an error

happens. You see, this is simple. The only complicated thing

about this is how the message has to look like. This is because it

depends on the device you want to send the data to. Often, this

will look very cryptic and it also might be very complicated to

build up the string (you might have to use setchar to set up the

string one char after another).

2.4.2 MIDI

As well as sending and receiving serial input via RS232, it is also

possible to send MIDI data. As we do not want to digress from

our main topic, which still is macro programming, we suppose

that you know the basics about MIDI and what can be sent with

the MIDI protocol.

Standard MIDI Messages

There are several different ways to send data to a certain MIDI

port, mostly depending on what kind of data to send. The

simplest message is a simple note on message and can be

Page 135: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 135/251

accomplished with the command MidiNoteOn. Look at the

syntax in the following table:

MidiNoteOn

int MidiNoteOn(int midi_handle,int channel,int

note,int velocity);

midi_handle - Handle number for the midi output

device.

channel - Zero based midi channel, range

[0..15]

note - Note number, range [0..127]

velocity - Velocity value, range [0..127]

The parameter midi_handle specifies the device to which you

want to send the data. This concept is exactly the same as the one

you have met in the section about serial I/O: To retrieve the

handle, again we need the command GetDriverHandle. This

needs the device alias name as a parameter. The parameters

channel, note and velocity are self-explaining as long as you are

familiar with the MIDI standard: They specify the note, which

MIDI channel and what velocity to use. The return values of the

MidiNoteOn command are 1 for success and 0 otherwise.

To turn a certain note off, use MidiNoteOff. This works

equivalent with the same syntax, but will obviously turn off the

specified note.

The MIDI protocol allows program and control change messages.

Both can be done with e:script: the particular commands are

MidiSendProgChange and MidiSendCtrlChange. Let us first

reckon MidiSendProgChange:

Page 136: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 136/251

MidiSendProgChange

int MidiSendProgChange(int midi_handle,int

channel,int val);

midi_handle - Handle number for the midi output

device.

channel - Zero based midi channel, range

[0..15]

val - Program number, range [0..127]

Again, we need the handle to address a certain MIDI device. The

parameter channel specifies the MIDI channel while val

indicates the desired MIDI program number.

MidiSendCtrlChange works quite similar but has a little

differing parameters. Let us have a look at it:

MidiSendCtrlChange

int MidiSendCtrlChange(int midi_handle,int

channel,int val);

midi_handle - Handle number for the midi output

device.

channel - Zero based midi channel, range

[0..15]

low - Controller number, range [0..127]

high - Controller level value, range [0..127]

The parameters midi_handle and channel are the same like in

MidiSendProgChange. The parameters low and high specify

the desired controller number and controller level. Both

commands will return a 1 in case of a success and a 0 if any error

occurs.

Advanced MIDI Messages

To achieve a greater flexibility in MIDI messaging like hardware-

dependant system messages, e:script offers two general-purpose

MIDI message commands, MidiSend and MidiSendBinary.

Page 137: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 137/251

MidiSend dispatches a single unsigned byte to a given port, with

the simple syntax

int MidiSend(int midi_handle, int byte);

where midi_handle specifies the MIDI device and byte

contains the message itself.

MidiSendBinary sends a message of up to 255 characters to a

MIDI device. The following table contains the syntax:

MidiSendBinary

int MidiSendBinary(int midi_handle,string

message,int length);

midi_handle - Handle number for the midi output

device.

message - Binary coded midi message

length - Message length, range [1..255]

The parameter midi_handle does act as usual. The string

message holds the message you want to deliver and length

specifies the message length. To set up the message string, just set

the single bytes with setuchar. This is necessary especially

when you want to use control characters because the string will

not be interpreted like in printf but sent directly. As this is a

kind of general-purpose message, you will have to know what to

send and set up the message syntax by yourself to make sure the

receiver understands the message.

MidiSend and MidiSendBinary both return 1 in case of a

successful sending and 0 in case of an error, just like the other

MIDI related commands.

Page 138: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 138/251

2.5 Reading Arguments on Macro Call

Objectives

In this section you will learn about the following:

1. calling a macro from another macro with or without

parameters

2. how to read these arguments

3. special arguments passed via trigger calls

We have already discussed the use of triggers to be able to react

to certain events. Now we want to deepen this subject as we have

the possibility of some advanced use of triggers: When a macro

has been called by a trigger or by another macro, it can receive

multiple arguments.

2.5.1 Calling a Macro from another Macro

It is possible to execute a macro from within another macro.

When we do this, first the called macro will be executed and then

the rest of the macro that has called the other one. They will not

run simultaneously.

How do we call a macro from a running macro? Intuitively, we

have a macro command Call for this. The syntax of this

command is as follows:

int Call(string name, int arg1, int arg2, int

arg3);

The parameter name holds the name of the macro to be called. It

is very important do know that you can only call macros that are

stored within the current show file. If you have more than one

Page 139: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 139/251

macro with the same name, the call command will choose the

topmost macro inside the macro list. The three integer parameters

arg1, arg2 and arg3 are optional. These are the parameters the

called macro can receive (how to do this will be explained later

on). There is a rub in it: As said before, these parameters are

optional. However, you can only choose to use none or all of

them. This is no big problem because if you want to pass just one

or two parameters, you can fill up the rest with dummies.

Now that we know how to call a macro from another one and

how to pass parameters to it, the thing left to know is how to

make the called macro receive these parameters. This will be

explained in the next section.

It is possible to call another macro from an already called macro

but that is also the limit; a recursion depth of 3 is the

maximum. If you exceed this limit, the programmer will stop

the macro execution and write an error into the logbook. To

prevent this, always attend to this. Excessive cross-macro-

calling will also make the code much harder to understand.

2.5.2 Receiving Arguments in a called macro

To read the arguments passed to a macro we make use of the

command getarg. It is very simple: to get the first argument the

macro received, we say

a = getarg(0);

This will store the first argument into a given integer variable a.

The second and third parameters can be stored by changing the

parameter to 1 or 2 respectively.

Page 140: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 140/251

Let us take a look at a very simple example: First, we write a short

macro which will call another macro and pass three parameters.

The called macro will receive the parameters and simply put

them out via printf. Here we go:

// This macro will call a macro named "callme"

with 3 arguments passed

int a, b, c;

a = 1;

b = 2;

c = 3;

Call("callme", a, b, c);

Now let us view the macro that will be called from the macro

above:

// This macro will be called from another. It is

important to name it correctly.

int arg1, arg2, arg3;

arg1 = getarg(0);

arg2 = getarg(1);

arg3 = getarg(2);

printf("Received the following parameters: %d,

%d, %d\n", arg1, arg2, arg3);

When you start the first macro, it will call the second one, and the

output in the logbook will be "Received the following parameters:

1, 2, 3" along with some information about the current recursion

depth. As you can see, this works very simple and can be very

practical.

Page 141: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 141/251

2.5.3 Passing Arguments on Macro Call

When you call a macro using a cuelist or triggers, you can pass

parameters to it, too. To do so, simply attach the parameters to the

macro name, separated with commas. Take a look at the

following picture:

This example shows how to call a macro named "callme" with

three parameters 1, 2 and 3. Just like in the example before, the

called macro can retrieve these arguments with the command

getarg.

This way, you can pass up to 5 arguments to a macro you want to

call.

Page 142: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 142/251

2.5.4 Reading Arguments from Triggers

A very special case is a macro being called by a trigger. In this

case, arguments will be passed automatically, containing

information about the certain trigger that initiated its execution.

The following Table shows what information will be delivered on

the various trigger events.

Trigger getarg(0) getarg(1) getarg(2) getarg(3)

Initialization 0 0 0 0

Periodic 1 Day of

week

(0 – 6;

Sunday = 0)

Hours after

midnight

(0 – 23)

Minutes after

hour

(0 – 59)

Hourly 2 Minutes

after hour

(0 – 59)

Seconds after

minute

(0 - 59)

0

Cuelist 3 Zero based

cuelist id

(0 for

QL#1)

0=STOP

1=START

2=IDLE

(Idle

message are

generated

automati-

cally)

0

Faderunit 4 Source

Device

0= Fader

Unit

0=Key

released

1=Key

Pressed

Key Number

Midi Note

On

5 Midi Note

Number

(0 - 127)

Velocity

(0 – 127)

Zero based

Midi channel

(0 - 15)

Timecode

Event

6 0 0 0

Label 7 Zero based

label

number

0 0

Sun Event 1 Day of

week

(0 – 6;

Hours after

midnight

(0 – 23)

Minutes after

hour

(0 – 59)

Page 143: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 143/251

Sunday=0)

Every

Second

2 Minutes

after hour

(0 – 59)

Seconds after

minute

(0 - 59)

0

Terminal

Event

10 Terminal

ID

1 = Init

2 = Key

pressed

3 = Network

Parameter

Update

Key number

for key press

event (1 - 15),

otherwise

zero

Serial Port 11 Zero based

port

number

0 for

Serial1

1 for

Serial2

ASCII Code Decoded

Number

Value

Midi Note

Off

12 Midi Note

Number

(0 - 127)

Velocity

(0 - 127)

Zero based

Midi channel

(0 - 15)

Midi

Control

Change

13 Midi

Controller

Number

(0 - 127)

New

Controller

Value

(0 - 127)

Zero based

Midi channel

(0 - 15)

Midi

Program

Change

14 Midi

Program

Number

(0 - 127)

0 Zero based

Midi channel

(0 - 15)

Action Pad

Event

15 Item ID 0 = Key

Pressed

1 = Key

Released

2 = Dragging

Cursor

position

within the

Action Pad

Peer Event 16 Peer ID

(1 – 255)

Event Class Parameter

(1 – 255)

Page 144: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 144/251

The first argument will always deliver the trigger number with

each trigger type having a unique identification number. The

arguments two, three and four depend on the actual trigger that

called the macro: The various time-based triggers for example

deliver information about the time the trigger was activated. In

contrast, Triggers activated by incoming data like serial input or

MIDI events will give information about the received data. This

makes it easy to react on the data transmitted via macro

commands.

Example: You might want the Programmer to light up a certain

fixture depending on a note played on a connected MIDI

keyboard. To simplify this example, we assume that we do not

care about the actual MIDI channel and the velocity value as well.

We just have 128 fixtures patched, each to be lightened up when

the appropriate note is played and darkened again when the note

is released. We need two triggers to achieve this: One trigger has

to react on any Midi Note On input while the other one has to

react on a Midi Note Off. Both triggers are to call the same macro.

Inside the macro we will read out the delivered arguments and

depending on which trigger called the macro, we will lighten or

darken the appropriate fixture. We assume using RGBFader

fixtures. Below you can see the code of the macro, followed by

some explanation:

// This macro has to be called by Midi Note

triggers

string fix_name, info;

int fix_type, screen_id;

screen_id = 1;

fix_name = "RGBFader";

fix_type = GetFixtureTypeId(fix_name); //verify

that the defined fixture type exists

if (fix_type < 0)

{

info = format("Fixture Type '%s' does not

exist.",fix_name);

MessageError(info);

Page 145: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 145/251

exit;

}

int arg0, arg1;

arg0 = getarg(0);

arg1 = getarg(1);

proSelectOut;

switch(arg0)

{

case 5:

proSelectSingle(fix_type, arg1 +

screen_id);

SetPosition(65535);

proLoadValue(0);

proLoadValue(1);

proLoadValue(2);

break;

case 12:

proSelectSingle(fix_type, arg1 +

screen_id);

SetPosition(0);

proLoadValue(0);

proLoadValue(1);

proLoadValue(2);

break;

default:

alert("Macro has to be called by a Midi

Note trigger!\naborting…\n");

exit;

}

We first declare the needed variables and check if the defined

fixture type exists. If it does, we fetch the first two trigger

arguments and save them inside arg0 and arg1. All

functionality resides inside the switch: we first check the value of

arg0 and react depending on its value. In case of a Midi Note On

trigger (identified by a 5) we select the fixture appropriate to the

note played (this value can be found in arg1) and lighten it up. If

a Midi Note Off trigger (identified by a 12) called the macro the

fixture appropriate to the turned off note will be darkened. If arg0

Page 146: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 146/251

has neither value 5 nor 12 (that means the macro was not called

by a Midi Note trigger) the macro will abort and place an error

message into the logbook.

This is just a simple example of a practical use for reading

arguments from triggers. With more effort, very complex

behavior can be achieved.

Page 147: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 147/251

2.6 Accessing the Action Pad

Objectives

In this section you will learn the following:

1. how to access items within the Action Pad

2. manipulation of Action Pad items

The Action Pad is a very comfortable and flexible control interface

which can be set up without having to write macros. It is already

very powerful without the use of e:script macros but in

combination, especially when using triggers,, a lot more is

possible.

For this chapter, we imply that you know the basics of how to use

the action pad, in detail how to add some elements to an action

pad and add functionality.

2.6.1 Addressing single Elements

Several e:script commands exist to manipulate single elements

within the Action Pad. Before we go into detail, the first thing to

know is how these items are addressed. First of all, if you add any

item to the Action Pad, it automatically receives a member code.

The codes are assigned continuously, starting with a zero for the

first item. The numbers can only be seen in edit mode; you will

notice them easily as they are near the top of each item.

The second important aspect is that the Action Pad may consist of

several tabs. In each tab, the member codes reiterate. That means

that you will have items with the same identification number on

each tab, e.g. a single action button with ID 0 on tab one and an

auto text display with the same ID on tab two.

To address a specific Action Pad element, you will first have to

switch to the correct tab. This can be done in two ways: You can

Page 148: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 148/251

use apSetCurrTab to select the desired tab via its page number.

apSetCurrTab has only one parameter, that is, needless to say,

the page number itself. If you have named your tabs, it is possible

to select a tab with apGotoTab. This command needs a string as

a parameter, containing the name of the desired tab. It is not case

sensitive and if more than one tab with the same name exists, the

leftmost tab will be selected. When you are on the correct tab, you

are ready to manipulate single items, as shown in the next section.

In some cases, it might be useful to get to know which is the

active Action Pad tab. For this cause, you can use the

command apGetCurrTab. This will return the identification

number of the tab that is currently active.

2.6.2 Manipulating Action Pad items

The commands we will explain now all need the member code to

address a certain item. How to retrieve the member code for an

item has been explained above.

The most obvious manipulation done to an Action Pad item will

be to change the information text each item holds. To do so, we

use apSetItemText. In the following table, you can see the

syntax of this command:

apSetItemText

int apSetItemText(int member_code,string text);

member_code - Action pad item member code (The

small number on the top of the

item, visible in edit mode only)

text – the new item text for the selected

Action Pad item

The parameter member_code needs the appropriate ID to

address a designated item. The parameter text will hold the new

item text for the Action Pad item you want to change.

Page 149: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 149/251

It is also possible to change the background colors of the Action

Pad items and the text colors as well. Two colors exist for both:

One is the primary color that will come into place in most

instances. The secondary color takes place only in special

circumstances, e.g. when a flash button is pressed it will use the

secondary background and text colors. To change the colors, we

have two commands available: apSetBgColors and

apSetTextColors.

In the following table, you can see the syntax of the command

apSetBgColors. As apSetTextColors has exactly the same

syntax, there is no need for a table especially for that command:

apSetBgColors

int apSetBgColors(int member_code,int

col_t0,int col_t1);

member_code - Action pad item member code (The

small number on the top of the

item, visible in edit mode only)

col_t0 - 24 bit text color (can be created by

calling the function RGB)

col_t1 - 24 bit text color (can be created by

calling the function RGB)

The parameter member_code has the same function as we

already know from apSetItemText. The parameters col_t0

and col_t1 will hold the color values for both the primary and

the secondary color. You might have already noticed while

looking at the table that both parameters contain a single 24-bit

color value. This value has to be created by calling the command

RGB that will build up such a value of three 8-bit values for the

red, green and blue components a color has.

In combination with triggers, the ability to manipulate Action Pad

items can be very useful. You can display context sensitive

information, e.g. depending on some input the Programmer

receives and at the same time dynamically highlight designated

Page 150: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 150/251

information. This can often make the work with the Action Pad

much simpler.

2.6.3 Action Pad Auto Text

Nearly all Action Pad items implement the Auto Text feature.

Auto Text offers a dynamic interpretation of Action Pad item text

to display situation-based content without having to change the

information manually. Autotext is very powerful; you can display

most of the status information the Programmer delivers. This is

not an e:script feature, but as you might have expected, you can

make use of Auto Text with apSetItemText. To give a start, the

following table shows all possible information you can display:

category displayed text syntax additional

information

cuelist current cue <cuelist 1 current> The cuelist

number (here: 1)

is not zero based.

previous cue <cuelist 1 prev>

next cue <cuelist 1 next>

name <cuelist 1 name>

flags <cuelist 1 flags>

status <cuelist 1 status>

submaster <cuelist 1 submaster>

fader current cuelist

number

<fader 1> The fader

number (here: 1)

is not zero based. current cuelist

name

<fader 1 name>

current cue <fader 1 current>

next cue <fader 1 next>

flags <fader 1 flags>

status <fader 1 status>

submaster <fader 1 submaster>

mutual

exclude

group

current cuelist

number

<mutex 1> The mutual

exclude group

number (here: 1)

Page 151: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 151/251

current cuelist

name

<mutex 1 name> is not zero based.

current cue <mutex 1 current>

next cue <mutex 1 next>

flags <mutex 1 flags>

status <mutex 1 status>

submaster <mutex 1 submaster>

page name current <page current> Displays the

current, previous

or next Cuelist

Page.

previous <page prev>

next <page next>

grand

master

name <master 0 name> Master 0 is

always the

Grand Master. status <master 0 status>

versatile

master

name <master 1 name> Numbers from 1

to 63 address the

different

Versatile

Masters.

status <master 1 status>

time current

weekday

<nicetime %A> These are the

predefined menu

items for this. All

other nicetime

format

parameters are

also possible.

current time <nicetime %X>

current date <nicetime %x>

network network

parameter

<network 1> The first number

specifies the

network

parameter (Not

zero based).

With bit and bool

you can query a

single bit of the

particular

network

network

parameter bit

<network 1.0>

Page 152: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 152/251

parameter (This

works zero

based).

network

parameter

bool

<network 1.0 "TRUE"

"FALSE">

"TRUE" and

"FALSE" will

show up instead

of pure numbers.

Both can be

replaced with

other strings (e.g.

"On" "Off").

media media status <media status 0> This shows the

status of the

internal Media

Player.

driver name <driver "aliasname"

name>

The "aliasname"

has to be the

specified name

for the particular

device.

When querying

the logbook, the

negative number

specifies the line

to be given out.

A '-1' will

display the last

line, while a '-2'

will display the

line before, and

so on.

address <driver "aliasname"

address>

status <driver "aliasname"

status>

live property

int

<driver "aliasname"

int

"property_name">

live property

string

<driver "aliasname"

string

"property_name">

logbook <driver "aliasname"

logbook -1>

logbook main logbook <logbook main -1> The negative

number works

just like in the

logbook query of

the driver

category.

e:net logbook <logbook network -

1>

Page 153: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 153/251

special

char

'less than' \< Because the

characters are

used to indicate

Auto Text, you

need to use this

syntax.

'greater than' \>

To display the requested information, all you have to do is put the

particular Auto Text inside your string and assign it to the Action

Pad item you want using apSetItemText.

As a very simple example, we want to let the first Action Pad item

display information about the current cue, followed by the

current cuelist status, both of cuelist 1.

apSetItemText(0,"Status of cuelist 1: <cuelist 1

status>\n

Flags: <cuelist 1 flags");

As you can see, control characters like '\n' and additional text is

still possible; the Auto Text embeds itself perfectly.

Nicetime Format String Codes

The following table contains the information needed to build up a

time information string. This relates to the Auto Text time

commands.

%a Abbreviated weekday name.

%A Full weekday name.

%b Abbreviated month name.

%B Full month name.

%c Date and time representation appropriate for

locale.

%d Day of month as decimal number (01 ... 31).

%H Hour in 24-hour format (00 ... 23).

%I Hour in 12-hour format (01 ... 12).

Page 154: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 154/251

%j Day of year as decimal number (001 ... 366).

%m Month as decimal number (01 ... 12).

%M Minute as decimal number (00 ... 59).

%p Current locale“s A.M./P.M. indicator for 12-hour

clock.

%S Second as decimal number (00 ... 59).

%U Week of year as decimal number, with Sunday as

first day of week (00 ... 53).

%w Weekday as decimal number (0 .. 6; Sunday is 0).

%W Week of year as decimal number, with Monday

as first day of week (00 ... 53).

%x Date representation for current locale.

%X Time representation for current locale.

%y Year without century, as decimal number (00 ...

99).

%Y Year with century, as decimal number.

%z, %Z Time-zone name or abbreviation; no characters if

time zone is unknown.

%% Percent sign.

$H0 Twilight_AM Hour (00 ... 23).

$H0 Twilight_AM Minute (00 ... 59).

$H1 Sunrise Hour (00 ... 23).

$H1 Sunrise Minute (00 ... 59).

$H2 Noon Hour (00 ... 23).

$H2 Noon Minute (00 ... 59).

$H3 Sunset Hour (00 ... 23).

$H3 Sunset Minute (00 ... 59).

$H4 Twilight_PM Hour (00 ... 23).

$H4 Twilight_PM Minute (00 ... 59).

Page 155: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 155/251

2.7 Terminals

Objectives

In this section you will learn the following:

1. How to retrieve the input of a connected e:com

Terminal

2. Sending feedback to the Terminal

2.7.1 Retrieving Terminal Input

The e:script language offers a connection between the e:cue

Programmer and available e:com Terminals (including the

e:node). You already got acquainted with reading arguments

from triggers and this works just the same when dealing with

terminals: Add an e:com Terminal Device in your device

Manager, create a Trigger rule reacting on the desired Terminal

input (most common would be a key message). Then use the

command getarg to receive terminal ID, event class and key

number. As an example, the following macro will retrieve the key

numbers that have been pressed on the connected terminal and, if

one of the keys F1 – F10 has been pressed, start or stop the

associated cuelist (depending on its current status). The following

is a great and simple example for remotely controlling the ecue

Programmer via e:com Terminal:

Page 156: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 156/251

int key;

if (getarg(0) != 10) //if it is no terminal

event, abort

{

printf("Wrong Trigger ID. Aborting...\n");

exit;

}

if (getarg(2) != 2) //if it is no key pressed

event, abort

{

printf("Wrong Event Class.

Aborting...\n");

exit;

}

key = getarg(3);

if (key >= 6 && key <= 15) // test if an F-

Key has been pressed

{

key -= 6; // adjust key

number to cuelist number

if (!strlen(GetCuelistStatus(key, 0)))

StartCuelist(key);

else

StopCuelist(key);

}

At first, we verify that the macro has been called by the correct

trigger and event class (a terminal event delivers getarg(0) = 10, a

terminal key press event delivers getarg(2) = 2. For more details

about trigger parameters, go back to the chapter about reading

arguments from triggers, where you can find a complete list of all

trigger parameters).

with key = getarg(3); we retrieve the key number and store

it inside the variable key. As the key numbers of the F-keys go

from 6 to 15, we must subtract 6 so that the key number is in line

Page 157: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 157/251

with the Cuelist numbers. Also the rest has no magic behind it:

GetCuelistStatus will return an empty string if the cuelist is not

running, so if it does, we start the appropriate cuelist. If the string

is not empty, we stop it. That is it, with this short and simple

macro we added a practical remote functionality to our

Programmer.

2.7.2 Sending Information to the Terminal

Now that we know of the possibility to retrieve information from

a connected e:com Terminal device, we can do nearly all we want

with our terminal. But there is still a nice feature that might come

in handy: The e:com Terminals have LCD-Displays attached; you

can display status information there using e:script commands.

This allows feedback for users operating on a terminal device.

The e:script command that we need to write on the display is

TerminalSend. Its syntax is as follows:

int TerminalSend(int handle, int line_id,string

message);

The handle should be already well known. We retrieve it using

the command GetDriverHandle. The parameter line_id

needs the display line we want to write our message to. To clear

the display before writing the new message, set line_id to -1.

The string message obviously contains the message itself. Now

that we already have an existing macro for remote cuelist control,

we want to extend it so that the connected terminal device will

display Information about what happened. Here we go:

Page 158: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 158/251

int key, handle;

string info;

handle = GetDriverHandle("term#1");

if (getarg(0) != 10) //if it is no terminal

event, abort

{

printf("Wrong Trigger ID. Aborting...\n");

exit;

}

if (getarg(2) != 2) //if it is no key press

event, abort

{

printf("Wrong Event Class.

Aborting...\n");

exit;

}

key = getarg(3);

if (key >= 6 && key <= 15) // test if an F-

Key has been pressed

{

key -= 6; // adjust key

number to cuelist number

if (!strlen(GetCuelistStatus(key, 0)))

{

StartCuelist(key);

info = format("Started Cuelist #%d", key

+ 1);

TerminalSend(handle, -1, info)

}

else

{

StopCuelist(key);

info = format("Stopped Cuelist #%d", key

+ 1);

TerminalSend(handle, -1, info)

}

Page 159: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 159/251

}

else

TerminalSend(handle, -1, "");

Not much has changed: Whenever a cuelist starts or stops, we use

TerminalSend to inform the Terminal operator what just

happened. If a key apart from the F-keys has been pressed, the

display is cleared.

Page 160: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 160/251

2.8 Saving Variables to XML

When running in User and respectively in Kiosk Mode, an e:cue

Programmer show is considered as persistent, non-changeable

data. This is for safety reasons; in case that you want to grant

users limited control over a lighting installation (in most cases via

the Action Pad) but nothing more than that.

Nevertheless, there might be the need to save some status

information even in User/Kiosk Mode: As an example, assume

that you control the lighting of several rooms of a building using

Action Pad Faders and you want the lighting values to persist

after system shutdown/reboot without making changes to the

show file itself.

2.8.1 The Command Set

The e:script language features a set of commands to write

variables into an XML file for later use. At first, you have to use

XmlBegin to specify a filename and if you want to read from or

write into the particular file. The next step is to use the command

XmlExchange to read/write certain variables (this depends on

what you specified with XmlBegin). To "close" the file operation,

call XmlEnd. You can use XmlExchange multiple times inside

such an XmlBegin-/XmlEnd-block to read/write multiple

variables from/into one file.

Please note that a write operation will completely erase the

previous contents of the given file. So be careful to use the

correct filename. If no file with the given name exists, a new

file will be created.

In the following tables the you can find the complete syntax of the

three commands: XmlBegin

int XmlBegin(string filename,int mode);

Page 161: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 161/251

filename – Filename

mode –

0 = Load XML data from file

1 = Save XML data to file

return value: 1 for success, 0 otherwise

As a filename, you can either specify a simple filename (in that

case the file will take its place in the Programmer's main

directory) or a complete path along with the name of the file.

Hint: To use the "My Documents" folder of the current Windows

user you can write $(MyFiles) followed by subfolders (optionally)

and the desired filename.

Important Note: When specifying a complete path, you must not

use single backslashes \ as a separator because these are

interpreted as control characters. You can either use a double

backslash \\ or a single slash / as a separator.

XmlExchange

int XmlExchange(labelname variable);

variable – Name of existing variable

return value: 1 for success, 0 otherwise

Page 162: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 162/251

Depending on the mode (read or write) that you specified with

XmlBegin, the command XmlExchange either reads the value of

the given name into the quoted variable or it writes the data from

the variable into the file. In case you read out data from a file, the

variable must as well exist in the file and of course, be already

declared inside the macro. In the special case when you read out

an array, the array that was declared has also to be of exactly the

same size as the array that was saved into the file before.

When you write a variable into a file, the particular variable must

exist, of course.

XmlEnd

int XmlEnd();

return value: 1 for success, 0 otherwise

The command XmlEnd "finishes" a read/write operation. Please

note that a write operation will only occur when you use XmlEnd.

2.8.2 Example: Saving and Recalling Fader Values

Remember the example from the beginning of the chapter? To

save the position of Action Pad faders we have to query the status

of the associated Versatile Masters and save the particular values

into a file. Assume that for our purpose it is sufficient to save the

values of the first 12 Versatile Masters. The corresponding macro-

code is very short and easy:

Page 163: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 163/251

int vmaster[12];

int i;

for (i = 0; i < 12; i++)

{

vmaster[i] = GetSpeedMaster(i);

}

XmlBegin("$(myfiles)\\vmasters.xml", 1);

XmlExchange(vmaster);

XmlEnd();

As you can see, an array named vmaster is declared in order to

hold the values of the Versatile Masters. The values are received

using the command GetSpeedMaster inside a for-loop. The

contents of our array are then all together written into the file

"vmasters.xml" inside the current users "My Documents"-

directory.

What we have to do now is to write a macro that restores the

Fader values from the XML file. This is quite as easy as our first

macro and looks very similar to our previous code snippet:

int vmaster[12];

int i;

XmlBegin("$(myfiles)/vmasters.xml", 0);

XmlExchange(vmaster);

XmlEnd();

for (i = 0; i < 12; i++)

{

SetSpeedMaster(i, vmaster[i]);

}

You see, we first read out the contents of our XML file (note the 0

as parameter for XmlBegin) into our array. These values are then

applied to the particular Versatile Masters using the command

SetSpeedMaster.

Page 164: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 164/251

Using a Function for complex Data Exchange

For simple variable storage/recall operations involving only a few

variables, the example above works just fine. However, if you

want to exchange a big set of variables, maybe even several times,

it comes in very handy to write a function for the data exchange

operation. This simplifies the code and prevents errors like

forgetting a variable in an exchange operation as well. The

following macro code shows an example function exchanging

some sample variables:

function DataExchange(int do_save)

{

XmlBegin("vars.xml", do_save);

XmlExchange(int1);

XmlExchange(int2);

XmlExchange(int3);

XmlExchange(array1);

XmlExchange(string1);

XmlExchange(string2);

XmlEnd();

}

The above function DataExchange has one parameter named

do_save. This parameter specifies if you want to save or load the

particular variables. As for both kinds of operation the same

function is used, it can never occur that a variable is forgotten. To

save the set of variables specified inside the function, call the

function as follows:

DataExchange(1);

To restore a set of saved variables, write:

DataExchange(0);

Page 165: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 165/251

2.9 Peer Connectors

Objectives

In this section you will learn the following:

1. What Peer Connections offers

2. Peer Autotext Redirection

3. How to use Peer Inputs and Outputs

4. Sending Peer messages

5. How to perform e:script Redirection

6. How to work with Peer events

Using the "Peer Engine Connector" a PC running the e:cue

Programmer can establish a communication channel to a

Programmer running on another machine. This connection can

handle different tasks that all will be discussed in this chapter:

Auto Text redirection: Action Pad items can show Auto

Text information delivered from another machine.

Outputs and Inputs: Each Peer Connector can define up

to 1024 output channels that will show up on the

connected machine as inputs. Each input can be queried

via e:script commands.

'Exec Command' redirection: Single macro commands

can be redirected to a remote machine.

'Call Macro' redirection: Macro calls can be redirected to

run a macro remotely.

Peer Events: Peer events can set off trigger actions.

Page 166: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 166/251

To open a connection, you have to add a Peer Engine Connector

on both machines. This is done inside the Show Properties under

'Device Manager'. On both machines, you have to specify the IP

address of the computer that you want to connect to. For

example, assume you have two PCs running with IP addresses

192.168.123.20 for PC one and 192.168.123.30 for PC two.

On the first PC, add a Peer Engine Connector and in the field 'IP

Address', write 192.168.123.30 as this is the PC we want to

connect to. On the second PC, we go the other way round: We

there need the address of the first PC, so we write

192.168.123.20.

It is important to know that the Alias Names are the local names

of the remote PC. The name will be used to address a certain peer,

inside the e:script language and the Action Pad alike. We will go

in more detail about that later on. The following picture shows

the configuration dialogue for the first PC mentioned in the

example.

Programmer A Programmer B

Peer

Driver

Peer

Driver

Peer Connector

Page 167: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 167/251

In the picture, we have defined eight peer outputs. These will

automatically show up as inputs on second PC when the

connection has been established.

When you have finished the configuration, the new Peer Engine

Connector should show up inside the Device Manager like this:

Note that there is no master/slave-logic behind these connections;

communication takes place symmetrically and bidirectional with

equal rights. Nevertheless, it is up to you what tasks the different

peers handle.

Page 168: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 168/251

2.9.1 Auto Text Redirection

Although this topic is not directly related to e:script macro

programming, it is a very interesting feature that is worth to be

mentioned. We did already talk about the Action Pad Auto Text

feature, which permits to display dynamic information on several

Action Pad items. Since Programmer 3.8, which introduced the

Peer Connector feature, it is possible to retrieve remote

information from a connected peer machine. This can of course be

set via macro language, just as you would do with 'local' Auto

Text. But one after another: Let us first see how to redirect an

Auto Text to retrieve information from a connected peer. The

Syntax is simple; instead of just using the normal Auto Text

syntax, you have to prefix the text in the following way:

\\peer#1\<cuelist 1 current>

You see, the right side is familiar to you as this is just normal

Auto Text syntax. On the left side, starting with the two \\, we

write the alias name of the peer from which we want to take the

information. Right after the next backslash, the normal Auto Text

Syntax starts, just like you know it.

This leads to very complex possibilities: With Auto Text, you can

request the status of a connected device, e.g. a W+T Web-IO

Digital, which has a set of inputs and outputs and is being

connected via Ethernet. Combining this with a Peer Connector

Auto Text, this makes it possible to gain information over two

hops. The following picture shows an example for this matter:

Page 169: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 169/251

You see, in this example we have a W+T Web-IO Digital with a

bunch of sensors on it. It is connected to a Media Engine 2 via

Ethernet. The Media Engine is again connected to a second

machine that is running an e:cue Programmer on it. Both have a

connection established via Peer Connector. An Action Pad

displaying Auto Text completes the cycle, showing the status of a

certain sensor on the W+T Web-IO Digital. Sounds complicated,

does it not? Well, when you have established all connections

between the devices, the Auto Text itself will be easy. Here we go:

\\peer#1\<driver "wut#1" input 3 "ON" "OFF">

We address the certain peer that will, using Auto Text, display

information about the connected device "wut#1", in detail, the

status of input number three. Needless to say, we can use the

same syntax when we want to change Action Pad item text via

e:script.

W+T

Web-IO

Digital

PC 1:

e:cue Media

Engine 2

Ethernet

Ethernet

Auto

Text

PC 2:

e:cue

Programmer

3.8

Action Pad with

Auto Text

Display

Sensor

s

Peer

Driver

Page 170: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 170/251

2.9.2 Inputs and Outputs

We did already mention that each Peer Connector can define a

number of outputs that will be visible as inputs on the connected

machine. Via e:script, you can query available inputs as well as

set certain values to the existing output channels. The

input/output channels work with integer values. That means it

can hold any number from -2.147.483.648 to 2.147.483.647.

To set a peer output to a certain value, the command

DriverOutputSet exists. Let us take a look at the syntax:

DriverOutputSet

int DriverOutputSet(int handle, int port_id,

int value);

handle - Device driver handle

port_id - Zero based port number

value – The value that shall be transmitted

We already know about the handle technique from the chapter

about serial I/O. It works the same way here, use

GetDriverHandle to receive the appropriate driver handle. The

variable port_id defines the output port to which the value shall

be sent. The following code example shows the process of setting

a certain output to a desired value:

int handle;

handle = GetDriverHandle("peer#1");

DriverOutputSet(handle, 0, GetCueCount(0));

Here, we set the first output (zero-based) of "peer#1" to the

number of cues in the first cuelist. Once we have set it, the value

is persistent until it is changed again.

To receive the current input value of a certain peer, we use the

command DriverInputGet. It works just like the command

DriverOutputSet, except for that there is no parameter value.

Page 171: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 171/251

The command's return value is nothing more than the value of the

certain input port itself. The following code shows how to retrieve

the value of the first input port coming from 'peer#1'. Assume this

code is running on the machine to which we just sent the

information from the last code snippet:

int handle, cue_id;

handle = GetDriverHandle("peer#1");

cue_id = DriverInputGet(handle, 0);

printf("The peer#1 has currently %d cues in

cuelist 1.\n", cue_id);

We retrieve the input from the first port to 'peer#1', which (as we

assume) has been set to the number of cues in the first cuelist of

the remote machine.

The "receiving" macro lacks practical use as long as we have to

call it manually. Of course, we have several ways to add some

automation to this process. How to add some automation will be

discussed later in this chapter.

2.9.3 Sending Key and Init Messages

A simple way to exchange information between peers without

having to change the output ports is to use the command

SendKeyToPeer. This will more or less simulate an e:com

Terminal key press and send it to just the stated peer.

Furthermore, it will not activate Terminal Triggers because it has

its own "Trigger class" (more about that can be found later in this

chapter). The syntax is as follows:

int SendKeyToPeer(int handle, int key_id);

The parameter handle should be well known in the meantime; it

will work here like everywhere else. The parameter key_id

Page 172: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 172/251

needs the id of the certain key that you want to send. The

key_ids are similar to the ids sent when working with real e:com

Terminals or the Terminal Emulator.

2.9.4 e:script redirection

You already know of some different methods to call a macro or to

execute an e:script command. With Action Pad, Trigger and

Macro Actions can do both. Another possibility is command

execution via command line: On the lower-left side of the

Programmer window, you find a small prompt window where

you can execute macros and single e:script commands.

To execute a single e:script command via command line, just type

in the command as you would in an e:script macro. The only

difference is that you need to prefix the command with an

exclamation mark '!'. This way, the Programmer knows that the

following text is an e:script command. Example:

!printf("Command Line execution has been

successful!\n");

This will put the text "Command Line execution has been successful!"

into the logbook.

To execute a macro, just type in the macro name, followed by up

to five optional parameters separated with commas. Instead of

using a '!' as prefix, you will have to put a '$' before your macro

call. Example:

$CallMe, 4, 0, 7

This will execute a macro named "CallMe", passing three

parameters 4, 0 and 7.

The Peer Connector feature allows to remotely execute single

e:script commands as well as complete macros on a connected

Page 173: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 173/251

machine. In case of macro execution, this does not mean that local

macrocode will be transmitted to the remote machine; instead, the

macro with the given name must already exist there.

The syntax will look familiar to you:

!\\peer#1\printf("Remote e:script command

execution has been successful!\n);

will execute the printf command on the connected machine

'peer#1' while

$\\peer#1\CallMe, 4, 0, 7;

will call the macro 'CallMe' via remote, again on 'peer#1'.

Please note that both prefixes '!' and '$' are only necessary when

you perform the commands via command line. If you let the

remote commands be performed by any kind of Action (like a

Trigger Event Action) you do not have to use them.

Page 174: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 174/251

2.9.5 Peer events

The simplest way of automating the process of receiving peer

inputs would be to call an appropriate macro repeatedly via cue

action. To do so, record an empty cue into an arbitrary cuelist.

Change the control mode to 'wait' and insert the wait time you

want. Let the cue call your macro by creating a call action for this.

When you now run the cuelist, your macro will be called

repeatedly. This might not be the prettiest way to react on peer

input, but it works and makes sense in certain cases, e.g. if there is

a constant input flow between the peers to be worked on.

The other way of automatically reacting on peer input is a trigger

rule. You already know about that from our chapter about serial

input and it works just the same here. Just use "Peer Event" as a

trigger and apply the correct Peed ID In this case, this is not the

handle but the number behind the type specifier inside the Device

Manager.

You have four different event classes to choose from. To react on

changes on the input ports of a Peer Connector, use "Input Raise"

and "Input Fallback": An "Input Raise" will trigger whenever the

input of the certain port (specified under 'Parameter') changes to a

value not equal to zero while "Input Fallback" will trigger when a

change to zero occurs.

The other two possible event classes will trigger whenever a peer

key message and (respectively) a peer init message takes place.

Page 175: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 175/251

2.9.6 Example: Controlling Cuelists on a Peer Machine

A very handy example for using Peer Connectors is remote

controlling the Cuelists present on a connected PC. This is a very

easy task: On your local PC, create a cue and as a cue action, set

"Exec Command". Inside the box 'Text', you use the e:script

command StartCuelist, with the desired Cuelist number as

the single parameter. This command, of course, has to be

redirected to the desired Peer, so it has to be prefixed with the

familiar syntax: \\peer#1\StartCuelist(QL(1)) will start

the first Cuelist on the remote PC.

Page 176: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 176/251

Analog, you can stop the cuelist using StopCuelist instead:

\\peer#1\StopCuelist(QL(1)) will stop the first Cuelist on

the remote PC.

You could even start or stop a great number of Cuelists by

making use of a loop:

\\peer#1\int i; for (i=0; i<50; ++i)

StartCuelist(QL(100+i));

and equivalently

\\peer#1\int i; for (i=0; i<50; ++i)

StopCuelist(QL(100+i));

will start/stop the Cuelists from 100 to 150.

Page 177: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 177/251

2.10 I/O Boxes

Objectives

In this section you will learn the following:

1. Querying Status information

2. Changing the values of the Output Ports

The e:cue Programmer features support for several I/O Boxes

from different manufacturers. Drivers exist for e:cue's own

e:connect, the Moxa ioLogik E2210 and E2240, the W&T Web-IO

Digital and the Kiss-Box DI8 DO4. Additionally, the e:cue Media

Engine 2 Input Module, which works the same way, can be used.

The basic functionality of these boxes is in all cases the same,

differing only in detail. The box has to be connected via Ethernet,

with an own IP assigned. A box has several input and output

ports, in most cases digital, in some cases analog. The output

ports can be set to certain values while the inputs can be read out.

For more Details about this, please refer to the documentation of

the particular box that you want to use.

The e:cue Programmer's new driver model allows all boxes to be

accessed mainly the same way, using the same e:script

commands. This allows us to give a common introduction of basic

I/O access via e:script without having to go into detail for specific

boxes. Nevertheless, there are several syntactic differences

Between the different boxes. Here it will be assumed that a Moxa

E2210 I/O Box is connected and configured properly.

What to do with the inputs and outputs depends completely on

you and the devices connected to the I/O Box, respectively.

Possible uses might be to switch on/off devices, get status

feedback or communicate with a device for configuration or

control tasks. The following section will give an overview about

the different supported I/O Boxes along with detailed

configuration instructions.

Page 178: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 178/251

2.10.1 Overview

General Device Setup

The device-specific adjustments are made in the "Device Setup".

The main setting is the alias name. Please note that this alias name

must be unique! You use this name to access a device in the

automation, trigger list, e:script or action pad.

Device Properties

Special characteristics of the driver, like the condition of an input

and/or an output are e.g. represented in the "Device Properties"

below the "listing". You can query these "Device Properties" via

e:script instructions.

Page 179: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 179/251

Device Command

"Device Commands" can call special functions of the connected

equipment. The simplest way of a call is the use of the context

menu in the device manager. Clicking on the driver entry with

the right mouse button will open the menu.

Page 180: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 180/251

e:script

The Device Commands can be called via e:script. The command

"create e:script" simplifies this and will copy an appropriate

e:script code snippet into the clipboard for further use.

// Moxa ioLogik E2210#1 : Set Output Off, PORT_6

int handle;

handle=GetDriverHandle("term#1");

DriverSendCommand(handle, "OUTPUT_SET_OFF",

"PORT_6", 0);

// Print the Input States

int port_id;

int handle;

handle=GetDriverHandle("term#1");

for (port_id=0;

port_id<DriverInputGetCount(handle);

port_id++)

{

printf("Input %i: %i\n", port_id,

DriverInputGet(handle, port_id));

}

// Set all the Output States on false

int port_id;

int handle;

handle=GetDriverHandle("term#1");

for (port_id=0;

port_id<DriverOutputGetCount(handle);

port_id++)

{

DriverOutputSet(handle, port_id, 0)); //

0=false, 1=true

}

// Print the Output States

int port_id;

int handle;

Page 181: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 181/251

handle=GetDriverHandle("term#1");

for (port_id=0;

port_id<DriverOutputGetCount(handle);

port_id++)

{

printf("Output %i: %i\n", port_id,

DriverOutputGet(handle, port_id));

}

// Execute a Device Command, Port 0 will be set

to on state

int handle;

handle=GetDriverHandle("term#1");

DriverSendCommand(handle, "OUTPUT_SET_ON",

"PORT_0", 0);

// Get a Device Property, all Input values

string value;

int handle;

handle=GetDriverHandle("term#1");

DriverPropertyGetString(handle, "INPUT_ALL",

value);

printf("INPUT_ALL: %s", value);

Moxa E2210 Ethernet I/O Server

Features

12x Digital Input

8x Digital Output

www.moxa.com

Hardware Configuration

At first, an IP address and subnet mask must be assigned to the

MOXA E2210 box. This can be done using the provided MOXA

Page 182: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 182/251

IOAdmin configuration software. For use with the Programmer it

must be guaranteed that the box has no password protection, so

you have to deactivate any password protection.

The inputs must be configured as [DI] and the outputs as [DO].

The modes [EventCounter] and [PULSE] are not supported by the

Programmer.

Programmer Configuration

The communication between the e:cue Programmer and the Moxa

E2210 takes place exclusively via Ethernet.

Page 183: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 183/251

Device Setup

Property Value Description

Alias Name term#1 A unique device name. You can

access this driver using the alias

name. It will be used inside the

e:script and the event handler.

IP Address x.x.x.x The IP address of the Moxa Box.

Refresh Interval

Time

x An interval time in milliseconds,

in which regularly the box is

queried. The minimum interval

time is about 1000 ms. The lower

this value is, the more resources

the system will use.

Send Trigger

Events

on/off Determines whether a KeyPress

and/or a KeyRelease event is

sent upon change of the input

signal. The processing of trigger

events does consume system

resources.

Output Init Mode Default…/

Maintain

Value…

With "Default…" the outputs are

initialized with the defaults set

under "default output [DO] 0..7".

When using ‚Maintain…‛ the

current value of the box is used

upon initialization.

Default Output

Value [DO] 0..7

00 to FF Init value of the Outputs in

hexadecimal notation. This

value will only be set when you

set the "Output Init Mode" to

"Default Output Value".

e:script

Supported e:script commands:

Page 184: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 184/251

int DriverInputGetCount(int handle);

int DriverInputGet(int handle, int port_id);

int DriverOutputGetCount(int handle);

int DriverOutputGet(int handle, int port_id);

int DriverOutputSet(int handle, int port_id, int

set);

int DriverPropertyGetInt(int handle, string

prop_name, int-ref value);

int DriverPropertyGetString(int handle, string

prop_name, string-ref value);

int DriverSendCommand(int handle, string

command, string param1, int param2);

Moxa E2240 Ethernet I/O Server

Features

8x Analog Input

2x Analog Output

www.moxa.com

Hardware Configuration

At first, an IP address and subnet mask must be assigned to the

MOXA E2240 box. This can be done using the provided MOXA

IOAdmin configuration software. For the use with the

Programmer it must be guaranteed that the box has no password

protection, so you have to deactivate any password protection.

The inputs [AI] and the outputs [AO] must be configured to a

valid voltage or current range.

Page 185: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 185/251

Programmer Configuration

The communication between the e:cue Programmer and The

Moxa E2240 takes place exclusively via Ethernet.

Device Setup

Property Value Description

Alias Name term#1 A unique device name. You can

access this driver using the alias

name. It will be used inside the

e:script and the event handler.

IP Address x.x.x.x The IP address of the Moxa Box.

Refresh Interval

Time

x An interval time in milliseconds,

in which regularly the box is

queried. The minimum interval

time is about 1000 ms. The lower

this value is, the more resources

the system will use.

Send Trigger Events on/off Determines whether a KeyPress

and/or a KeyRelease event is sent

upon change of the input of

signal. The processing of trigger

events does consume system

resources.

Output Init Mode Default…/

Maintain

Value…

With "Default…" the outputs are

initialized with the defaults set

under "default output [DO] 0..7".

When using ‚Maintain…‛ the

current value of the box is used

Page 186: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 186/251

upon initialization.

Default Output

Value [AO] 0

0 to 4095 Init value of the Output A0

Channel 0. This value will be set

when you set the "Output Init

Mode" to "Default Output Value".

Default Output

Value [AO] 1

0 to 4095 Init value of the Output A0

Channel 1. This value will be set

when you set the "Output Init

Mode" to "Default Output Value".

Input #x Level

KeyPressed

x = 0..7

-32768 to

32767

Threshold value that must be

exceeded to trigger a KeyPress

event. This event only takes place

if:

‚Send Trigger Events‛

is activated.

The KeyRelease level

was fallen below

before.

or the KeyPress level

was exceeded for the

first time. This level

must be larger than the

level of KeyRelease!

Input #x Level

KeyReleased

x = 0..7

-32768 to

32767

Threshold value that must be

fallen below to trigger a

KeyRelease event. This Event

only takes place if:

‚Send Trigger Events‛

is activated.

The KeyPressed level

was exceeded before.

This level must be

smaller than the level

KeyPressed!

e:script

Supported e:script commands:

Page 187: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 187/251

int DriverInputGetCount(int handle);

int DriverInputGet(int handle,int port_id);

int DriverOutputGetCount(int handle);

int DriverOutputGet(int handle,int port_id);

int DriverOutputSet(int handle,int port_id,int

set);

int DriverPropertyGetInt(int handle,string

prop_name,int-ref value);

int DriverPropertyGetString(int handle,string

prop_name,string-ref value);

int DriverSendCommand(int handle,string

command,string param1, int param2);

Example:

Set the output [AO] 0 to the maximum value possible.

// Moxa ioLogik E2240#1 : Set Output Value,

PORT_0

int handle;

int value;

value = 4095; // 0..4095

handle=GetDriverHandle("term#1");

DriverSendCommand(handle, " OUTPUT_SET_VALUE ",

"PORT_0", value);

Page 188: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 188/251

W&T Web I/O 12xDigital-IO

Features

12x Digital Input

12x Digital Output

www.wut.de

Hardware Configuration

At first, an IP address and subnet mask must be assigned to the

W&T Web I/O Digital box. This can be done using the provided

Page 189: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 189/251

W&T WuTill configuration software. For the use with the

Programmer it must be guaranteed that the box has no password

protection, so you have to deactivate any password protection.

If the box already has a valid IP address, the configuration can be

made using a web browser. To do so, just type in the IP address of

the W&T box into the browser's address bar.

Configuration steps:

All following configuration steps refer to the following menu

structure. The blue marked entries are the ones to be worked on.

Config:

Login with "empty" password and then click "Administrator

Login"

Config\SessionControl\Profiles:

Page 190: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 190/251

choose "Binary socket access as peer without password

protection" and then click "Highlight profile".

Config\Device\Basic Settings\Binary 1:

choose"UDP Peer" and then click "Temporary Storage".

Config\Device\Basic Settings\Binary 1\UDP Peer:

Local Port = 45889,

Remote Port = 45889,

choose "Select All",

no Interval entry,

choose "Socket device"

and then click "Temporary Storace"

Config\Device\Output Mode:

choose Output Mask Binary 1 "Select all"

no "Safety Timeout" entry

deactivate "Load Control"

and then click "Temporary Storage"

Config\Session Control\Logout:

click "Save"

the W&T box now works in the UDP Peer Binary 1 mode.

Page 191: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 191/251

Programmer Configuration

The communication between the e:cue Programmer and The

W&T Web I/O 12xDigital-IO takes place exclusively via Ethernet.

Device Setup

Property Value Description

Alias Name term#1 A unique device name. You can

access this driver using the alias

name. It will be used inside the

e:script and the event handler.

IP Address x.x.x.x The IP address of the W&T Web

IO box

Refresh Interval

Time

x An interval time in milliseconds,

in which regularly the box is

queried. The minimum interval

time is about 1000 ms. The lower

this value is, the more resources

the system will use.

Send Trigger

Events

on/off Determines whether a KeyPress

and/or a KeyRelease event is

sent upon change of the input of

signal. The processing of trigger

events does consume system

resources.

Web IO Type 12x Digital Device Type. At this moment

there is only support for the 12x

Digital Box.

Output Init Mode Default…/

Maintain

Value…

With "Default…" the outputs are

initialized with the defaults set

under "default output [DO] 0..7".

When using ‚Maintain…‛ the

current value of the box is used

upon initialization.

Default Output

Value

0000 bis FFFF Init value of the Outputs in

hexadecimal notation. This

value will only be set when you

set the "Output Init Mode" to

"Default Output Value".

Page 192: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 192/251

e:script

Supported e:script commands:

int DriverInputGetCount(int handle);

int DriverInputGet(int handle,int port_id);

int DriverOutputGetCount(int handle);

int DriverOutputGet(int handle,int port_id);

int DriverOutputSet(int handle,int port_id,int

set);

int DriverPropertyGetInt(int handle,string

prop_name,int-ref value);

int DriverPropertyGetString(int handle,string

prop_name,string-ref value);

int DriverSendCommand(int handle,string

command,string param1, int param2);

Page 193: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 193/251

Kiss Box DI8 DO4

Features

8x Digital Input per Slot

4x Digital Output per Slot

www.kissbox.nl

Hardware Configuration

At first, an IP address and subnet mask must be assigned to the

Kiss Box DI8 DO4. This can be done using the provided KBEditor

configuration software.

The standard Factory Settings are set to IP 192.168.0.253 and

Subnet Mask 255.255.255.0.

The box can be reset to the factory settings by pressing the reset

button until the blue LED stops flashing. The IP address range is

from 2 to 254.

The Programmer communicates with the box via UDP. Therefore,

this has to be configured under "I/O".

Page 194: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 194/251

Here, the Destination address can be set to the IP address of the

Programmer PC, if only the Programmer is to be informed about

changes.

If the address is set on 255.255.255.255, then all devices in the

network are informed about a change. This can lead to

unnecessary network traffic. In most cases, the best option is to

just set up one communication partner by entering the

appropriate IP, for example the Programmer PCs IP address.

Programmer Configuration

The communication between the e:cue Programmer and the Kiss-

box takes place exclusively via Ethernet.

Page 195: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 195/251

Device Setup

Property Value Description

Alias Name term#1 A unique device name. You can

access this driver using the alias

name. It will be used inside the

e:script and the event handler.

IP Address x.x.x.x The ip address of the KISS box.

Port Send 9813 The KISS box sends the UDP

packages to the chosen

destination port.

Port Listen 9817 The programmer listens for UDP

packages from the KISS box at

this port.

Refresh Interval

Time

x An interval time in milliseconds,

in which regularly the box is

queried. The minimum interval

time is about 1000 ms. The lower

this value is, the more resources

the system will use.

Send Trigger Events on/off Determines whether a KeyPress

and/or a KeyRelease event is

sent upon change of the input of

signal. The processing of trigger

events does consume system

resources.

Slot #x Type

x = 1..8

Disabled

Input DI8-DC

Output DO4-

S

Depending on design, the Kiss

box offers up to eight Slots. Each

Slot can either be ‚Disabled‛, or

equipped with an ‚Input DI8-

DC‛ or an ‚Output DO4-S‛ -

module.

Slot #xDefault

Output Value x x=

1..8

0 bis F If a slot is equipped with an

‚Output DO4-S‛ – module, you

can define an init value here.

The init value is written in

hexadecimal notation.

Page 196: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 196/251

e:script

Supported e:script commands:

int DriverInputGetCount(int handle);

int DriverInputGet(int handle,int port_id);

int DriverOutputGetCount(int handle);

int DriverOutputGet(int handle,int port_id);

int DriverOutputSet(int handle,int port_id,int

set);

int DriverPropertyGetInt(int handle,string

prop_name,int-ref value);

int DriverPropertyGetString(int handle,string

prop_name,string-ref value);

int DriverSendCommand(int handle,string

command,string param1, int param2);

Examples:

// KISS-BOX DI8 DO4#1 : Set Output On Slot #2,

PORT_4

int handle;

handle=GetDriverHandle("term#1");

DriverSendCommand(handle, "OUTPUT_SET_ON_2",

"PORT_4", 0);

The e: script instructions DriverInputGet, DriverOutputGet,

DriverOutputSet all use port_id as parameter. Since the Kiss

box is arranged very flexible concerning its in- and outputs, the

following rule applies for port_id definition:

Inputs:

The first input module with begins with port_id = 0 and ends

with port_id = 7. The next would begin with 8 and end with

15 etc.

Outputs:

The first output module with begins with port_id = 0 and

ends with port_id = 3. The next would begin with 4 and end

with 7 etc. Look at the picture below. The ids in the brackets are

valid numbers for port_id.

Page 197: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 197/251

Page 198: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 198/251

2.10.2 Projection Devices

PJLink Projector

Features

9x RGB

9x Video

9x Digital

9x Storage

9x Network

PJLink is a protocol based on TCP/IP for the control of projector

devices. It was developed by a Japanese consortium and is used

by various Japanese manufacturers.

http://pjlink.jbmia.or.jp.

Hardware Configuration

At first, an IP address and subnet mask must be assigned to the

projector. In most cases, this is possible with a web interface. For

further information, take a look at the projector documentation.

Be sure that your projector does not use any kind of password

protection.

Programmer Configuration

The communication between the e:cue Programmer and PJLink

protocol projectors takes place exclusively via Ethernet.

Device Setup

Property Value Description

Alias Name term#1 A unique device name. You can

access this driver using the alias

name. It will be used inside the

Page 199: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 199/251

e:script and the event handler.

IP Address x.x.x.x The IP address of the PJLink

projector.

Refresh Interval

Time

x An interval time in milliseconds,

in which regularly the box is

queried. The minimum interval

time is about 1000 ms. The lower

this value is, the more resources

the system will use.

Device Commands

Command Name Param Description

POWER ON

OFF

INPUT RGB_x [1..9]

VIDEO_x [1..9]

DIGITAL_x [1..9]

STORAGE_x [1..9]

NETWORK_x [1..9]

MUTE_AUDIO_VIDEO MUTE_AUDIO_VIDEO

VIDEO_ON

AUDIO_OFF

AUDIO_ON

AUDIO_VIDEO_OFF

AUDIO_VIDEO_ON

e:script

Supported e:script commands:

int DriverPropertyGetInt(int handle,string

prop_name,int-ref value);

int DriverPropertyGetString(int handle,string

prop_name,string-ref value);

int DriverSendCommand(int handle,string

command,string param1, int param2);

Page 200: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 200/251

Panasonic PTD

Features

This driver can control various Panasonic projectors via RS232.

The driver was written for and has been tested with the Panasonic

PT-D3500E. According to manufacturer specifications, it should

also work with the devices PT-D7700/DW7000, PT-

D5600/DW5000 and PT-D5500. These models have not been

tested!

www.panasonic.com

Hardware Configuration

The projector must be connected to a valid COM port (RS232).

The COM port interface parameters must be configured inside the

projector and the Programmer as well.

Page 201: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 201/251

Programmer Configuration

The Programmer communicates with the projector via RS232.

Device Setup

Property Value Description

Alias Name term#1 A unique device name. You can

access this driver using the alias

name. It will be used inside the

e:script and the event handler.

Serial Port COM x The IP address of the Panasonic

PTD.

Refresh Interval

Time

x An interval time in milliseconds,

in which regularly the box is

queried. The minimum interval

time is about 1000 ms. The lower

this value is, the more resources

the system will use.

Device Commands

Command Name Param Description

POWER ON

OFF

Power on/off

INPUT RGB_x [1..3]

VIDEO_1

SVIDEO_1

DVI_1

AUX_x [1..3]

Video input

source

SHUTTER ON

OFF

Shutter on/off

FREEZE ON

OFF

Freeze the image

AUTOSETUP

MUTE_AUDIO_VIDEO MUTE_AUDIO_VIDEO

VIDEO_ON

AUDIO_OFF

AUDIO_ON

AUDIO_VIDEO_OFF

Page 202: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 202/251

AUDIO_VIDEO_ON

TEST OFF

WHITE

BLACK

CHECKER_1

CHECKER_2

WINDOW_WHITE

WINDOW_BLACK

CROSS_HATCH

COLOR_BAR

RAMP

Test images

OSD ON

OFF

On Screen

Display on/off

PICTURE_MODE NATURAL

STANDARD

DYNAMIC

CINEMA

GRASPHIC

Image

manipulation

COLOR_TEMP LOW

MIDDLE

HIGH

DYNAMIC

USER_1

USER_2

STANDARD

NATURAL

CINEMA

GRAPHIC

DEFAULT

Color

temperature

COLOR_INTENSITY PERCENT_x

VALUE [0..63]

Color intensity

CONTRAST PERCENT_x

VALUE [0..63]

Contrast

BRIGHTNESS PERCENT_x

VALUE [0..63]

Brightness

VOLUME PERCENT_x

VALUE [0..63]

Volume

TINT PERCENT_x

VALUE [0..63]

e:script

Page 203: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 203/251

Supported e:script commands

int DriverPropertyGetInt(int handle,string

prop_name,int-ref value);

int DriverPropertyGetString(int handle,string

prop_name,string-ref value);

int DriverSendCommand(int handle,string

command,string param1,int param2);

With dynamic value

// Panasonic PTD RS232#1 : Color Intensity,

0..63

int handle;

handle=GetDriverHandle("term#1");

int value;

value = 0; // 0...63

DriverSendCommand(handle, "COLOR_INTENSITY",

"VALUE", value);

With fixed value

// Panasonic PTD RS232#1 : Color Intensity, 100%

int handle;

handle=GetDriverHandle("term#1");

DriverSendCommand(handle, "COLOR_INTENSITY",

"PERCENT_100", 0);

2.10.3 Querying Status Information

Page 204: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 204/251

When we were dealing with device drivers, we always had to

obtain a driver handle for the certain device. When working with

I/O Boxes, there is no difference with that. Whenever you want to

address an I/O box, the first thing to do is to use the command

GetDriverHandle with the device alias name as parameter.

Though you should already be familiar with that, it can be seen

here again:

int handle;

handle = GetDriverHandle("term#1");

This code snippet finds out the driver handle of the device with

alias name "term#1" and saves it to the variable handle.

To query the status of single input/output ports, we have two

possibilities:

The commands DriverInputGet and DriverOutputGet both

need the driver handle and the designated input/output port as

parameters. Both commands will deliver the current value of the

given port, zero or one, as an integer. As an example, we will

query all output ports of our I/O box. To acquire the port count,

we use the command DriverOutputGetCount (an equivalent

command DriverInputGetCount also exists, of course):

int handle, count, i;

handle = GetDriverHandle("term#1");

count = DriverOutputGetCount(handle);

for (i = 0; i < count; i++)

printf("Status of Port %d is: %d\n", i,

DriverOutputGet(handle, i));

The other possibility is to use the commands

DriverPropertyGetString or DriverPropertyGetInt

with an appropriate property parameter. Let us look at the

syntax:

Page 205: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 205/251

DriverPropertyGetInt

Device drivers can return different status

values reflecting the status of the connected

device.

Prototype:

int DriverPropertyGetInt(int handle, string

prop_name, int-ref value);

Parameters:

handle - Device driver handle.

prop_name - The name of the property.

value - The property return value.

Return Value:

1 for success, 0 otherwise.

The properties themselves differ from device to device. For our

example with the Moxa E2210, the correct property name to query

a single output port would be OUTPUT_x, where x stands for the

desired port (zero based).

The parameter value will receive the particular property status,

in integer format. The command DriverPropertyGetInt

works the same way, but instead of having an integer reference

parameter, you have to pass a string which then will receive the

property status in string format.

Remember, we want to query the status of a certain output port.

Now that we got the tools, we should be able to fulfill this task:

Page 206: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 206/251

int handle, count, i, value;

string prop_name;

handle = GetDriverHandle("term#1");

count = DriverOutputGetCount(handle);

for (i = 0; i < count; i++)

{

prop_name = format("OUTPUT_%d", i);

DriverPropertyGetInt(handle, prop_name, value);

printf("Status of Port %d is: %d\n", i, value);

}

In this case, this is more complicated than using

DriverOutputGet. But with another property, we can make this

a lot easier (this is device dependant, but for most boxes,

equivalent properties exist). You can pass the property

OUTPUT_ALL to receive the status of all output ports at once.

When using DriverPropertyGetInt, the status will be

returned as a single integer, where each single bit represents the

status of a single port. To extract the information, the simplest

approach is to use bit operators (more about that can be found in

chapter 1.8.4). When using DriverPropertyGetString, a string will

be returned where each char holds either a zero or a one, again to

represent the status of the single ports. In the following code

examples, we will see both commands, as well as an attempt to

"decode" the input:

Page 207: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 207/251

int handle, count, i, int_val;

string prop_name;

handle = GetDriverHandle("term#1");

count = DriverOutputGetCount(handle);

DriverPropertyGetInt(handle, "OUTPUT_ALL",

int_val);

for (i = 0; i < count; i++)

{

printf("Status of Port %d is %d\n", i,

(int_val & (1 << i)) >> i);

}

Most of this code should be well known, but the code inside the

for loop needs further explanation, especially (int_val & (1

<< i)) >> i. We are going to work through the brackets from

inside to the outside. With 1 << i, we create the "ith" power of 2.

To understand this, think of the binary representation of 2 to the

power of i. This is always the ith bit set to one, while the others are

set to zero. To find out if the ith bit of our status variable int_val is

set to one, we now only have to make a bitwise AND-

interconnection with the number we just created and shift the

result back to the right by i bits. The best way to understand this

is to write down a simple example for a fixed input value and a

fixed i:

Assume the input value is 164 (Binary: 1010 0100) and we want to

analyze the 3rd bit. The bitwise And-interconnection will then be

10100100 AND 0000 0100, which results in 0000 0100. This, shifted

back by three bits to the right, results in 1, which means that the

status of the 3rd bit is 1.

Now let us watch the equivalent code for a status output of type

string:

Page 208: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 208/251

int handle, count, i, spacecount;

string prop_name, str_val;

handle = GetDriverHandle("term#1");

count = DriverOutputGetCount(handle);

DriverPropertyGetString(handle, "OUTPUT_ALL",

str_val);

printf(" %s\n", str_val);

for (i = 0; i < strlen(str_val); i++)

{

if (strcmp(midstr(str_val, i, 1), " ") ==

0)

spacecount++;

else

printf("Status of Port %d is %d\n", i -

spacecount, val(midstr(str_val, i, 1)));

}

What is mainly used here is some string intersection and

conversion, but there is a little rub in it, what makes everything a

bit more complicated: Every four chars, the string of numbers is

separated by a single space. Due to this, it is not possible to

directly map the ith character to the ith port because this will be

wrong after the first space occurred. To handle this, we let the

loop run through the complete string and every time we find a

space, we increase a designated counter variable. This counter

now has just to be subtracted from the current value of i to get

the appropriate port number.

2.10.4 Changing Values of the Output Ports

Working with an I/O Box would not be quite as useful without

being able to change the output ports from within the

Programmer. Like when we were querying the I/O-ports, again

we have two possibilities.

Page 209: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 209/251

The simplest approach is using the command

DriverOutputSet. The syntax is very similar to the commands

DriverOutputGet and DriverInputGet, with the difference

that you have to pass an output value for the certain port as well:

DriverOutputSet

Get the current status of a remote device

driver output.

Syntax:

int DriverOutputSet(int handle,int port_id,int

set);

Parameters:

handle - Device driver handle.

port_id - Zero based port number

set - 1 = activate the output, 0 = deactivate

the output

Return Value:

1 for success, 0 otherwise

As you can see, there is nothing big about it. To set a specific

output port to "on", pass a one to the set parameter, while

passing a zero will set the port to "off".

A practical use might be that you have an action pad with eight

buttons, each calling the same macro with one parameter passed.

The parameter should be the zero based port number so that the

macro knows which port to deal with. The macro itself will check

which value the certain output port has and then invert that

value:

int port, handle, status;

port = getarg(0);

handle = GetDriverHandle("term#1");

status = DriverOutputGet(handle, port);

DriverOutputSet(handle, port, status ^ 1);

Page 210: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 210/251

The variable status holds the current status of the certain port.

To shorten the e:script a bit, the inverting of the variable status is

done directly inside the command DriverOutputSet. It is done

using a bitwise XOR with 1.

The second possibility to change the values of certain output

ports is the use of Device Commands. The command

DriverSendCommand sends command strings followed by

context dependend parameters to the box. Let us look at the

command definition:

DriverSendCommand

Device drivers can send different commands with

parameters that are defined by the driver

Syntax:

int DriverSendCommand(int handle,string

command,string param1,int param2);

Parameters:

handle - Device driver handle.

command - Primary command string

param1 - First parameter for given command or

empty string, depending on command

type.

param2 - Secondary numerical parameter. Use

zero if the command requires no

secondary parameter.

Return Value:

1 for success, 0 otherwise

The command string is very similar to the principle of a property

string that you got to know in the last chapter. For our intention

to change the status of certain output ports, we will make use of

the command strings "OUTPUT_SET_ON" and

"OUTPUT_SET_OFF". The appropriate param1 for these are

"PORT_x" (where x defines the port number, zero based) and

"PORT_ALL" (This will address all ports at the same time). For

Page 211: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 211/251

both command strings, param2 is not needed, so it has just to be

set to zero. To show some practical use of it, we will take on the

example above and this time implement our macro by using

DriverSendCommand instead of DriverOutputSet:

int port, handle, status;

string info;

port = getarg(0);

info = format("PORT_%d", port);

handle = GetDriverHandle("term#1");

status = DriverOutputGet(handle, port);

if (status)

{

DriverSendCommand(handle,

"OUTPUT_SET_OFF", info, 0);

}

else

{

DriverSendCommand(handle, "OUTPUT_SET_ON",

info, 0);

}

This nearly works the same way as our previous macro, with the

only difference that we have to build up a parameter string to

specify the port, and that we cannot use an XOR to elegantly

invert the port status.

2.10.5 Overview of Device Properties and Commands

Page 212: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 212/251

In the examples above, we concentrated on the Moxa E2210 I/O-

box and just focused on a selection of the possible device

properties and commands. For completeness, the following tables

contain all available properties and commands that can be used

for the supported I/O-boxes, in conjunction with some further

information:

Moxa E2210 Ethernet I/O Server

Device Properties

Property Name Value Description

INPUT_ALL 0000 0000

0000

All states of the Input

Channels 0..11 as a binary

string. each number

stands for a single input

channel.

OUTPUT_ALL 0000 0000 All states of the output

channels 0..7 as a binary

string. Each number

stands for a single output

channel

INPUT_x true/false,

0/1

State of the Input

Channel x from 0 to 11

OUTPUT_x State of the Output

Channel x from 0 to 7

Page 213: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 213/251

Device Commads

Command Name Param Description

OUTPUT_SET_ON PORT_x Set the Output

Channel No x [0...7] on

true.

OUTPUT_SET_ON PORT_ALL Set all Output

Channels No x [0...7]

on true

OUTPUT_SET_OFF PORT_x Set the Output

Channel No x [0...7] on

false.

OUTPUT_SET_OFF PORT_ALL Set all Output

Channels No x [0...7]

on false

Moxa E2240 Ethernet I/O Server

Device Properties

Property Name Value Description

INPUT_x -32768 to

32767

All values of the Input

Channels 0..7

OUTPUT_x 0 to 4095 All values of the Output

Channels 0..1

Device Commands

Command Name Param Description

OUTPUT_SET_VALUE PORT_x

VALUE

Set the Output

Channel No x [0..7] to

a specific value.

Page 214: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 214/251

Page 215: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 215/251

W&T Web I/O 12xDigital-IO

Device Properties

Property Name Value Description

INPUT_ALL 0000 0000

0000

All states of the Input

Channels 0..11 as a binary

string. Each number

represents a single input

channel.

OUTPUT_ALL 0000 0000

0000

All states of the output

channels 0..7 as a binary

string. Each number

represents a single output

channel.

INPUT_x true/false,

0/1

State of the Input

Channel x from 0 to 11.

OUTPUT_x State of the Output

Channel x from 0 to 1.

Device Commads

Command Name Param Description

OUTPUT_SET_ON PORT_x Set the Output

Channel No x [0..11]

on true.

OUTPUT_SET_ON PORT_ALL Set all Output

Channels No [0..11] on

true

OUTPUT_SET_OFF PORT_x Set the Output

Channel No x [0..11]

on false.

OUTPUT_SET_OFF PORT_ALL Set all Output

Channels No x[0..11]

on false

Page 216: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 216/251

Kiss Box DI8 DO4

Device Properties

Property Name Value Description

INPUT_ALL_x 0000 0000 All states of the Input

Channels 1...8 of the slot

x from 1 to 8 as a binary

string. Each number

represents a single input

channel

OUTPUT_ALL_x 0000 All states of the Input

Channels 1...4 of the slot

x 1...8 as binary string.

Each number represents

a single input channel.

INPUT_x_y true/false,

0/1

State of the Input

Channel y from 1 to 8 of

the slot x from 1 to 8

OUTPUT_x_y State of the Output

Channel y from 1 to 4 of

the slot x from 1 to 8

Device Commads

Command Name Param Description

OUTPUT_SET_ON_x PORT_y Set the Output

Channel No y [1..4]

of the slot x to true.

OUTPUT_SET_ON_x PORT_ALL Set all Output

Channel of the slot x

to true.

OUTPUT_SET_OFF_x PORT_x Set the Output

Channel No y [1..4]

of the slot x to false.

OUTPUT_SET_OFF_x PORT_ALL Set all Output

Channel of the slot x

to false.

Page 217: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 217/251

2.11 Open Sound Control The Open Sound Control (OSC) is a message based protocol for

network-based communication between software or hardware

devices, mainly for sound-related purposes, flexible enough to

cover a great area of application. OSC is an open protocol and has

been developed at the University of California in Berkeley.

The e:cue Programmer can send messages to an OSC client using

macro language.

2.11.1 Basic Usage

The usage of the OSC protocol requires knowledge of the protocol

workflow. OSC is message based and every message needs to be

sent with an OSC address. The OSC address acts as an identifier

for the value that you send. When you send a value the OSC

address specifies what the receiver will do with that value, like

changing the volume, lighten up fixtures or a lot else, what ever

the client device supports.

Address Pattern

An example for the OSC address pattern is the e:cue emotion

software, which acts as an OSC client and can therefore receive

OSC messages. The syntax is as follows:

"emo/[object type]/[alias name]/pin/[pin name]/{x,y,z}"

Where the different elements have the following denotation (from

left to right):

1. /emo prefix

2. type of the requested object

layer,playlist,control,colorcorrection etc.

3. object's alias name

Page 218: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 218/251

4. /pin tag

5. desired pin name of the object

6. optional: x,y,z tag for vector input pins

This is the address pattern that has to be used when sending OSC

messages with the Programmer using e:script.

OSC & e:script

The following commands are used in e:script to send messages:

Command Description

OscDriverSendBool Sends a boolean message to an OSC

server.

OscDriverSendColor Sends a color message to an OSC

server.

OscDriverSendEvent Sends an event message to an OSC

server.

OscDriverSendFloat Sends a floating point message to an

OSC server.

OscDriverSendInteger Sends an integer message to an OSC

server.

OscDriverSendNil Sends a Nil message to an OSC server.

OscDriverSendString Sends a string message to an OSC

server.

The expected parameters are very similar and differ only in

details: The first parameter is the device handle of the OSC client.

The second one is the OSC address pattern while the third one (if

existent) is the value to be sent. Needless to say, the value type

depends on the command that is used.

Page 219: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 219/251

Example

The following e:script code sends two different commands via

OSC to a running e:cue emotion software. The explanation is

given as comments inside the code.

int hOscDeviceDriver;

hOscDeviceDriver = GetDriverHandle("term#1“);

// Sets the emotion Grandmaster to 0

OscDriverSendFloat(hOscDeviceDriver,

"/emo/colorcorrection/grandmaster",0);

// Sets layer#1 visible

OscDriverSendBool(hOscDeviceDriver,

"/emo/layer/layer#1/pin/show",1);

Page 220: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 220/251

2.12 Generic UDP Packets The Programmer has the ability to send and receive UDP packets

on an adjustable port. This is accomplished through a special

driver that can be added in the device manager. Both sending and

receiving require e:script macros to be written. Receiving UDP

packets make use of event-driven macro calls (refer to chapter

1.11 for more information on that topic).

Receiving UDP Packets

The basic setup is just like with any other event driven macro.

That means you have to register the appropriate event, create a

correct function definition and suspend the macro. This is the

basic layout:

RegisterEvent(UdpReceive, OnUdp)

Suspend();

function OnUdp(int nDriverHandle)

{

}

To receive a UDP packet, you must make use a binary object

(Bob). A Bob is a space of allocated memory that can be used to

store large amounts of data like a UDP packet. A Bob is created

easily:

int nBob;

nBob = BobAllocate(1500);

This Bob has already been configured to be large enough to hold a

complete UDP packet. Bobs are addressed using the Bobhandle,

which is a simple int variable (in this case, nBob). Now, when our

event driven macro triggers, we can use the command

Page 221: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 221/251

ReceiveFrom to put the complete UDP packet into our bob. The

syntax of the command is as follows:

int ReceiveFrom(int nDriverHandle, int

nBobHandle, string &sSrcAddress, int

&nSrcPort);

The return value is the length of the input. This can be used as a

control value to see if input really was received correctly. The

parameter nDriverHandle is the driver handle of the UDP driver.

Use the handle that was passed to the registered function.

nBobHandle is the handle of the Bob where the UDP packet shall

be put into. The parameters sSccAddress and nSrcPort are

reference parameters for IP address (as string) and port number.

After the function was called, the Bob should hold the data and in

sSccAddress and nSrcPort IP address and port should be found.

For simplicity, let us assume that the content of the packet is an

ASCII string. In this case, you can use the most simple way to

extract the content: The command BobGetString returns a string

of a certain length from a certain position out of a specific Bob. In

our case, it would look like this:

string sText;

sText = BobGetString(nBob, 0, 255);

This command returns the 255 byte from the first position of the

Bob into the string sText. The three parameters are the Bobhandle,

offset and length of the string that shall be extracted.

There are many other e:script commands available for extracting

data out of a Bob. The following table gives a short overview, also

of commands to put data into a Bob (this will be discussed later

this chapter) and additional helping commands. For more details

on the particular commands, please refer to the e:script language

reference.

Page 222: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 222/251

Command Description

BobAllocate Allocate a Bob.

BobFree Delete a Bob.

BobGetAt Get a single byte inside a Bob.

BobGetAt16 Get two bytes (one WORD) inside a

Bob.

BobGetAt32 Get four bytes (one DWORD) inside a

Bob.

BobGetSize Retrieve the size of a bob.

BobGetString Get a string of adjustable size.

BobSetAt Put a single byte into a Bob.

BobSetAt16 Put two bytes into a Bob.

BobSetAt32 Put four bytes into a Bob.

BobSetRange Set a specified area to a certain binary

value.

BobSetString Put a string into a Bob.

As a proof of concept, one might just display the received string

into the logbook using the printf command. The final macro to

receive and display a string out of a UDP package automatically

would look like this:

Page 223: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 223/251

RegisterEvent(UdpReceive, OnUdp)

int nBob;

nBob = BobAllocate(1500);

int nLen;

int nPort;

string sIpAddress;

string sText;

Suspend();

function OnUdp(int nDriverHandle)

{

nLen = ReceiveFrom(nDriverHandle, nBob,

sIpAddress, nPort);

if (nLen <= 0)

{

return;

}

sText = BobGetString(nBob, 0, 255);

printf("Incoming Message: %s\n", sText);

}

This macro is very nice, but also completely useless without any

sender who can deliver content. As another proof of concept and

to show how sending UDP data works, we will now create a

simple macro to send strings using UDP.

Sending UDP Packets

Most that we need is already well known from the previous topic,

so this is very easy. Once again we need a Bob. In this case, we

have to write the data that we want to send into the Bob using

BobSetString. And then use the command SendTo to send out the

data to an arbitrary IP address and port number. We also must

retrieve the UDP driver handle manually as this time we do not

Page 224: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 224/251

get it passed as an event function parameter. Here is the

corresponding macro code:

int nBob;

nBob = BobAllocate(1500);

int nHandle;

nHandle = GetDriverHandle("term#1");

string sMessage;

sMessage = "UDP Send and Receive Test!\n";

BobSetString(nBob, 0,255, sMessage);

SendTo(nHandle, nBob, 255, "172.22.122.92",

8080);

As you see, the command BobSetString works quite similar to the

BobGetString command. You pass the Bob handle, an offset,

length and the message itself and this construct will put the text

into the Bob. Then you use the command SendTo to send out the

data. The parameters are the UDP driver handle, the Bob handle,

length of the data that is to be sent, IP address (as string) and a

port number.

You can use these both macros on one machine and simply send

to your computer's IP address and the port of the UDP driver.

Then the server macro will automatically receive the messages

you send.

Page 225: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 225/251

3 The e*net Protocol

Page 226: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 226/251

3.1 Introduction

The totality of all protocols used by devices of the e:cue product

series is called e*net. Both the e:cue Media Engine and the e:cue

Programmer are able to communicate with connected terminals

using UDP messages. The whole communication takes place in

small standard UDP packets. Normally these packets are

broadcasted but they can also be sent to a certain IP. In most cases

an acknowledgement of the receiver does not occur.

All given code samples are written in c++ programming language.

The general structure of an e*net packet is as follows:

#pragma pack(1)

typedef struct

{

DWORD magic;

DWORD static_key;

DWORD device_status;

DWORD device_type;

DWORD device_version;

DWORD event_id;

DWORD event_par;

char filename[256];

char extra[249];

char link_status;

UCHAR mac[6];

} ECUE_BROADCAST;

#pragma pack()

Variables of type DWORD are defined as 32-bit unsigned int. In

other development environments or programming languages,

where DWORD is not available, it is important to use equivalent

types.

Page 227: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 227/251

3.2 General Information

The variable magic must be assigned with the constant

MAGIC_ECUE. This constant defines as follows:

#define MAGIC_ECUE 0x45435545

This is the hexadecimal interpretation of the chars ECUE.

The preprocessor-command

#pragma pack(1)

defines the structure as 'packed'. That is the compiler must not

insert empty blocks on its part to align single variables to

DWORD-borders. If you use development environments other

than Microsoft Visual Studio, you may have to adjust the

command or use an equivalent one.

All messages of type ECUE_BROADCAST are sent via Port 31772.

The Programmer and the Media Engine have to receive all

variables Intel-typical in little-endian format. So if you implement

any e*net messaging on a machine using big-endian memory

addressing (like PowerPC) or if you want to implement the

protocol in java (which also uses big-endian format), it is essential

to have the data arranged correctly.

The mac-address does not necessarily need to be specified. It is

sufficient to assign a zero into the particular variable instead.

Page 228: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 228/251

The following hex dump is a UDP packet recorded with the

network protocol analyzer software Wireshark (UDP header has

been grayed out):

0000 ff ff ff ff ff ff 00 e0 4c 7c 89 7e 08 00 45 00 ........L|.~..E.

0010 02 38 44 8b 00 00 80 11 b8 6c c0 a8 7b 15 ff ff .8D......l..{...

0020 ff ff 7c 1d 7c 1c 02 24 33 13 45 55 43 45 00 00 ..|.|..$3.EUCE..

0030 00 00 00 00 00 00 03 00 00 00 00 00 00 00 02 00 ................

0040 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

01a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

01c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

01d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

01e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................

0240 00 00 00 00 00 00 ......

All data inside the packet is ordered big-endian because the UDP

protocol will always arrange data this way. You can see this best

at position 0x2A, where the variable magic is positioned. As

mentioned before, this variable is always defined as "ECUE"

(ASCII) or 0x45435545 but in the UDP dump, it appears as

"EUCE" or 0x45554345.

Page 229: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 229/251

3.3 Sending a Status Broadcast

All e*net devices continuously send broadcast messages into the

net to indicate their presence. For that purpose a message of type

ECUE_BROADCAST is sent to the Ethernet. A status message

should be sent at least every 3 seconds but should also not be sent

sgnificantly more often to avoid unnecessary network traffic.

A device that shows the active e*net devices in a list should use a

timeout of 10 seconds. A good example for a device list is found

in the e:cue Programmer status window under 'Visible Network

Devices'.

For a status broadcast, the single struct members will receive the

following values:

magic MAGIC_ECUE

static_key 0

device_status 0

device_type 3 = e:com Terminal

device_version 0

event_id 0 = no event

event_par 0

filename 0

extra 0

link_status 1

mac the sender’s mac-address

Page 230: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 230/251

3.4 Sending a keyboard event

A keyboard event occurs e.g. if any key on an e:com Terminal has

been pressed or released. The e:com Terminal will send this event

as a broadcast to the network.

Other Systems can easily trigger e:cue System events by

simulating e:com keyboard events. On side of the e:cue system,

keyboard events can directly be associated to actions or be further

processed using macros.

magic MAGIC_ECUE

static_key 0

device_status bitmask with current

keyboard status

device_type 3

device_version 0

event_id 2 = a key has been

pressed

event_par key number

filename 0

extra 0

link_status 1

mac the sender’s mac-

address

The variable device_status is a DWORD (32-bit unsigned int),

acting as a bitmask. The lower 16 bit indicate which keys have

been pressed. The following 8 bit (from position 17 to 24) show

the status of the 8 Opto-Inputs each e:com Terminal has.

Obviously, setting a bit to ‘1’ stands for ‘key pressed’, while a ‘0’

reports the opposite.

The following table shows which bit a key is assigned to.

Bit Number (Lowest to

Highest):

Assigned Key:

1 Shift-Key

2 Up-Key

3 Down-Key

Page 231: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 231/251

4 Esc-Key

5 Enter-Key

6 Sel-Key

7 F1

8 F2

9 F3

10 F4

11 F5

12 F6

13 F7

14 F8

14 F9

16 F10

17 – 24 Opto-Inputs 1 – 8

25 – 32 not used

Page 232: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 232/251

The e:cue Programmer can react to keyboard events using

Triggers. To make use of this, open the Automation window

(Open ‘Engine’ menu and select ‘Automation’ or just press ‘T’ on

your keyboard). Click the ‘Add’-button and the following menu

will appear:

There are many options to specify which Terminal and which key

to react on and, of course, what to do. In this case, pressing the

selected key on a terminal will let the Programmer call a macro

named "KeyPressed" (Needless to say that the macro has to exist

inside the show).

Page 233: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 233/251

3.5 Network Parameter Set

When a greater quantity of values has to be transmitted, the

system of sending keyboard events may prove to be too inflexible

or complicated. For this cause the so-called Network Parameter

Set exists. This is an array of 1024 variables of type DWORD within

the Media Engine (and the e:cue Programmer respectively). You

can write into each variable via UDP.

Again, the frame type ECUE_BROADCAST will be used. Within the

packet, several NETWORK_PARAMETER structures can be passed

into the otherwise unused field ‘extra’:

typedef struct

{

DWORD parameter_id;

DWORD value;

} NETWORK_PARAMETER;

A NETWORK_PARAMETER consists of two values: parameter_id

names the variable number (0 to 1023) to be set in the Media

Engine/the Programmer. In value, the new value for this

variable is passed.

Up to 16 NETWORK_PARAMETER records can be passed inside a

single ECUE_BROADCAST packet.

magic MAGIC_ECUE

static_key 0

device_status 0

device_type 3 = e:com Terminal

device_version 0

event_id 3 = Network Parameter Set

event_par quantity of Network

Parameter Sets

filename 0

extra array of up to 16

structures of type

NETWORK_PARAMETER

link_status 1

mac the sender’s mac-address

Page 234: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 234/251

3.6 Remote Command Execution and Macro Calls

As you should know, the e:cue Programmer contains its own

macro language, the e:script. It is possible to remotely execute

single macro commands or a complete macro via UDP. To make

use of this feature, remote procedure call must be allowed within

the programmer. Furthermore, the e:cue Programmer will only

accept remote procedure calls of registered terminal devices. This

is for security reasons because it would be very dangerous to let

unknown devices use macro commands on remote machines.

We use the field extra to transmit the desired macro command:

magic MAGIC_ECUE

static_key 0

device_status 0

device_type 3

device_version 0

event_id 12 = execute macro

command

event_par 0

filename 0

extra macro command

link_status 1

mac the sender’s mac-

address

If we want to call a macro, again we make use of the field extra:

magic MAGIC_ECUE

static_key 0

device_status 0

device_type 3

device_version 0

event_id 13 = call macro

event_par 0

filename 0

Page 235: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 235/251

extra macro name

link_status 1

mac the sender’s mac-

address

Example:

To start the first cuelist via remote macro command execution, we

define a new structure of type ECUE_BROADCAST and allocate the

struct members as follows:

ECUE_BROADCAST eb;

eb.magic = MAGIC_ECUE;

eb.static_key = 0;

eb.device_status = 0;

eb.device_type = 3;

eb.device_version = 0;

eb.event_id = 12;

eb.event_par = 0;

eb.filename = “”;

eb.extra = “StartCueList(0)”;

eb.link_status = “1”;

eb.mac = “0”;

Page 236: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 236/251

4 Bundle of Tweaks and Tricks The following chapter includes some advanced tricks that might

be useful when working with the e:cue Programmer. Most of

them are pretty short and only usable in special situations.

Nevertheless, you might find some nice things while grubbing

through this chapter.

Page 237: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 237/251

4.1 Programmer Tuning via Toolbox

The e:cue Programmer contains a little configuration and

emergency repair software utility, called Toolbox. You can start it

from "Start\All Programs\e:cue Lighting Control\Application

Suite 5.1\Programmer".

There are four different options here: First of all, if you encounter

any problems using the e:cue Programmer, you can either try

restoring some critical settings (Restore Critical) or if this fails

restore all Programmer configuration options to their default

values (Restore Everything) for troubleshooting.

Under 'Simple Setup' you can find a slide control to change the

maximum number of universes the Programmer shall support

and another one to adjust the approximate CPU speed of your

machine. This will automatically tweak some internal settings to

let the Programmer make use of the provided CPU power.

If you want more control over the Programmer settings, click

'Expert Setup'. Here you can find the possibility to change several

registry configuration values concerning the e:cue Programmer.

You could change them directly inside the registry under

HKEY_CURRENT_USER\Software\ecue\e:cue Programmer

V5.1\Options

Page 238: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 238/251

but with the Toolbox, it is much easier. Please mind that tuning

up the values can also have negative side effects on the

performance. The e:cue Programmer default settings refer

roughly to a PC with 2GHz CPU speed and 512MB RAM.

In the following chapter, you can find a short explanation of the

particular settings.

If you experience any Problems, fall back to the default values!

No warranty of any kind!

4.1.1 Configuration Values

m_so.main_fps

Default Value: 30

Max: 35

Min: 10

This entry defines the Programmer GUI speed in frames per

second.

Higher values accelerate the e:cue Programmers user interface at

the cost of more CPU power. Lower values save CPU resources,

giving more power to the DMX engine. If you want the e:cue

Programmer to work with a very large number of universes and

DMX output devices, you may want to decrease this value to save

CPU resources.

Page 239: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 239/251

m_so.sonic_fps

Default Value: 35

Max: 35

Min: 1

This entry defines the DMX engine speed. That is how often per

second new DMX frames are calculated and sent to the DMX

output devices.

Lower values save CPU resources but result in a sticky DMX

output.

Higher values than 35 fps are not useful as DMX is not capable of

transferring more frames per seconds on all 512 channels.

m_so.universes_max

Default Value: 16

Min: 16

Max: 128

Defines the maximum number of DMX output universes.

Increasing this value costs a little of both CPU power and RAM.

This applies even if there are no fixtures mapped to all universes.

So you should only increase this value if you really have a

demand for it. Decreasing the value below the default value of 16

DMX universes is generally NOT useful and not recommended.

m_so.devices_max

Default Value: 16*170

Min: m_so.universes_max*170

Max: m_so.universes_max*512

This defines the maximum number of fixtures the e:cue

Programmer can handle.

Page 240: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 240/251

The default value is the number of universes multiplied by 170, as

you can map no more than 170 RGB faders to a DMX universe.

For the unlikely case that all your DMX universes are fully in use

and you want to use desk channels on all 512 channels the default

value may be too small. Normally this never will happen. But if

the case occurs, increasing the value will help.

m_so.overdrive

Default Value: 16

Do not change this Value!

m_so.handles_max

Default Value: 36

This defines the maximum number of simultaneous running

cuelist. Increasing this value costs a little more CPU power and

more RAM.

m_so.desk_channel_max

Default Value: 16*512

Defines the maximum number of desk channels. A desk channel

is not exactly the same like a DMX channel.

However, to keep things simple, you should always use

m_so.universes_max*512 here.

m_so.dmx_driver_max

Default Value: 20

Defines the maximum number of DMX output drivers, i.e. how

many DMX output devices can be addressed in the e:cue

Programmer device manager.

Page 241: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 241/251

4.1.2 The Quick Tune up Cookbook

Parameter Default

Value

Quick Formula

m_so.main_fps 30 30 normal, 15 for very large

installations to save CPU

power

m_so.sonic_fps 35 35 normal, 25 to save CPU

power. The latter results in a

sticker, slower DMX output.

m_so.universes_max 16 16 normal

32 no problem on a standard

PC (equiv. Pentium IV 3.0

GHz) 64 possible on a fast PC.

m_so.devices_max 16*170 Should be the number of

universes multiplied by 170

m_so.overdrive 16 Do not change.

m_so.handles_max 36 36 or higher. Max. Number of

simultaneous running cuelists

m_so.desk_channel_ma

x

16*512 Number of universes

multiplied by 512

m_so.dmx_driver_max 20 20 or higher. Depends on how

many DMX output devices

(e:link, e:node, butler...) you

have.

4.1.3 Troubleshooting

If e:cue Programmer should not start up or other problems occur

after tuning the values, you can do the following:

Close the e:cue Programmer, then press START / ecue Lighting

Control / Toolbox and press the button 'restore everything' to

delete all persistent e:cue Programmer settings from your

Windows registry. After this, all self-made settings from e:cue

Programmer / Application Options are reset to their defaults and

must be reconfigured.

Page 242: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 242/251

4.1.4 Tips and Tricks

The settings configured within the Toolbox expert setup are

stored inside the Windows registry. You can export your current

registry settings in a file by using the Windows Regedit

application.

In Regedit go to

HKEY_CURRENT_USER\Software\ecue\e:cue Programmer

V5.1\Options.

In the tree view, right click onto the word 'Options' and select

export from the context popup menu.

Regedit creates a normal text file that can easily be adjusted with

a normal Text editor like Windows Notepad. (Do not use Word or

WordPad for this job!)

You can reimport the settings from your exported file by simply

double clicking on the file. Windows will ask you whether you

want to reimport the settings to your registry again.

Please mind: Wrong usage of the

Windows Regedit tool can damage your

Programmer configuration and even

your complete Windows installation!

No warranty of any Kind!

Page 243: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 243/251

4.2 Tweaking your Workflow

4.2.1 Programmer View and Cues

As long as you hold down the SHIFT key, the logbook

will not be updated. If there is much output in a logbook

window, you can suppress updates for a while this way.

This simplifies reading the text.

You can merge multiple cues in the Programmer View

like this: Open the cuelist window, select a cue and press

the LOAD icon. Select another cue, hold the SHIFT key

and press the LOAD icon again. Now the content of both

cues is merged in the Programmer View and can be

saved as a new cue.

You can select multiple groups in the Programmer View

by holding the CONTROL key when selecting the

groups with the mouse.

You can move presets in the preset window by selecting

them and then pressing CONTROL and the cursor keys.

To modify channel values more slowly, hold down the

shift key when moving with the mouse. (At

"Application Options / Mouse", you can define the

mouse sensitivity).

To spread channel values select some fixtures and hold

the CONTROL key when modifying the channel's

values.

A channel value in the Programmer View, which is

loaded with a preset, will not change when turning any

of the wheels, except when you hold the ALT key on the

keyboard. This re-enables modification of the channel

value.

Page 244: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 244/251

4.2.2 Macro Text Editor

You can indent your current text selection by pressing

TAB.

You can remove indentation of your current text

selection by pressing SHIFT+TAB.

Page 245: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 245/251

4.3 Using the Video Wizard on multiple Sections

To use the e:cue Programmers Video Wizard on multiple

Sections, adhere to the following steps:

1) Call the Video Wizard.

2) Select the fixtures of section 1.

3) For the horizontal direction, enter Min = 0 % und Max =

33 %.

4) On the tab 'Action', set back the action type to '--' so that

no action will be executed.

5) Press OK. The first cue can now be found inside the

cuelist.

6) Call the Video Wizard a second time.

7) Select the fixtures of section 2.

8) For the horizontal direction, enter Min = 34 % und Max =

66 %.

9) On the tab 'Action', again set back the action type to '--'.

10) Press OK. The second cue can now be found inside the

cuelist.

11) Call the Video Wizard a third time.

12) Select the fixtures of section 3.

13) For the horizontal direction, enter Min = 67 % und Max =

100 %.

14) On the tab 'Action', again set back the action type to '--'.

15) Press OK. The second cue can now be found inside the

cuelist.

16) Highlight the first cue of the cuelist and load it into the

Programmer View by pressing the 'load' icon.

17) Highlight the second cue of the cuelist, hold the shift key

and load it additionally into the Programmer View by

pressing the 'load' icon.

18) Highlight the third cue of the cuelist, hold the shift key

and load it additionally into the Programmer View by

pressing the 'load' icon.

Page 246: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 246/251

19) Save the jointed cue as a new cue into the cuelist by

pressing 'record'.

20) Edit the cue (double-click the cue). Insert an appropriate

Media Play action.

21) Optional: Insert a Media Stop action into the cuelist as a

release action.

22) After approximately 30 minutes the cake is finished and

can, after cooling down a short time, be served with

whipped cream.

Page 247: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 247/251

5 Appendix

Page 248: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 248/251

5.1 ASCII Table

MF102 ASCII-Code Table Decimal Octal Hex Binary Value 000 000 000 00000000 NUL (Null char.)

001 001 001 00000001 SOH (Start of Header)

002 002 002 00000010 STX (Start of Text)

003 003 003 00000011 ETX (End of Text)

004 004 004 00000100 EOT (End of Transmission)

005 005 005 00000101 ENQ (Enquiry)

006 006 006 00000110 ACK (Acknowledgment)

007 007 007 00000111 BEL (Bell)

008 010 008 00001000 BS (Backspace)

009 011 009 00001001 HT (Horizontal Tab)

010 012 00A 00001010 LF (Line Feed)

011 013 00B 00001011 VT (Vertical Tab)

012 014 00C 00001100 FF (Form Feed)

013 015 00D 00001101 CR (Carriage Return)

014 016 00E 00001110 SO (Shift Out)

015 017 00F 00001111 SI (Shift In)

016 020 010 00010000 DLE (Data Link Escape)

017 021 011 00010001 DC1 (XON) (Device Control 1)

018 022 012 00010010 DC2 (Device Control 2)

019 023 013 00010011 DC3 (XOFF)(Device Control 3)

020 024 014 00010100 DC4 (Device Control 4)

021 025 015 00010101 NAK (Negative Acknowledgement)

022 026 016 00010110 SYN (Synchronous Idle)

023 027 017 00010111 ETB (End of Trans. Block)

024 030 018 00011000 CAN (Cancel)

025 031 019 00011001 EM (End of Medium)

026 032 01A 00011010 SUB (Substitute)

027 033 01B 00011011 ESC (Escape)

028 034 01C 00011100 FS (File Separator)

029 035 01D 00011101 GS (Group Separator)

030 036 01E 00011110 RS (Request to Send)(Record

Separator)

031 037 01F 00011111 US (Unit Separator)

032 040 020 00100000 SP (Space)

033 041 021 00100001 ! (exclamation mark)

034 042 022 00100010 " (double quote)

035 043 023 00100011 # (number sign)

036 044 024 00100100 $ (dollar sign)

037 045 025 00100101 % (percent)

038 046 026 00100110 & (ampersand)

039 047 027 00100111 ' (single quote)

040 050 028 00101000 ( (left/opening parenthesis)

041 051 029 00101001 ) (right/closing parenthesis)

042 052 02A 00101010 * (asterisk)

043 053 02B 00101011 + (plus)

044 054 02C 00101100 , (comma)

045 055 02D 00101101 - (minus or dash)

046 056 02E 00101110 . (dot)

047 057 02F 00101111 / (forward slash)

048 060 030 00110000 0

049 061 031 00110001 1

050 062 032 00110010 2

051 063 033 00110011 3

052 064 034 00110100 4

053 065 035 00110101 5

054 066 036 00110110 6

055 067 037 00110111 7

056 070 038 00111000 8

057 071 039 00111001 9

058 072 03A 00111010 : (colon)

059 073 03B 00111011 ; (semi-colon)

060 074 03C 00111100 < (less than)

Page 249: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 249/251

Decimal Octal Hex Binary Value 061 075 03D 00111101 = (equal sign)

062 076 03E 00111110 > (greater than)

063 077 03F 00111111 ? (question mark)

064 100 040 01000000 @ (AT symbol)

065 101 041 01000001 A

066 102 042 01000010 B

067 103 043 01000011 C

068 104 044 01000100 D

069 105 045 01000101 E

070 106 046 01000110 F

071 107 047 01000111 G

072 110 048 01001000 H

073 111 049 01001001 I

074 112 04A 01001010 J

075 113 04B 01001011 K

076 114 04C 01001100 L

077 115 04D 01001101 M

078 116 04E 01001110 N

079 117 04F 01001111 O

080 120 050 01010000 P

081 121 051 01010001 Q

082 122 052 01010010 R

083 123 053 01010011 S

084 124 054 01010100 T

085 125 055 01010101 U

086 126 056 01010110 V

087 127 057 01010111 W

088 130 058 01011000 X

089 131 059 01011001 Y

090 132 05A 01011010 Z

091 133 05B 01011011 [ (left/opening bracket)

092 134 05C 01011100 \ (back slash)

093 135 05D 01011101 ] (right/closing bracket)

094 136 05E 01011110 ^ (caret/cirumflex)

095 137 05F 01011111 _ (underscore)

096 140 060 01100000 `

097 141 061 01100001 a

098 142 062 01100010 b

099 143 063 01100011 c

100 144 064 01100100 d

101 145 065 01100101 e

102 146 066 01100110 f

103 147 067 01100111 g

104 150 068 01101000 h

105 151 069 01101001 i

106 152 06A 01101010 j

107 153 06B 01101011 k

108 154 06C 01101100 l

109 155 06D 01101101 m

110 156 06E 01101110 n

111 157 06F 01101111 o

112 160 070 01110000 p

113 161 071 01110001 q

114 162 072 01110010 r

115 163 073 01110011 s

116 164 074 01110100 t

117 165 075 01110101 u

118 166 076 01110110 v

119 167 077 01110111 w

120 170 078 01111000 x

121 171 079 01111001 y

122 172 07A 01111010 z

123 173 07B 01111011 { (left/opening brace)

124 174 07C 01111100 | (vertical bar)

125 175 07D 01111101 } (right/closing brace)

126 176 07E 01111110 ~ (tilde)

127 177 07F 01111111 DEL (delete)

Page 250: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the

e:cue advanced manual

© 2009 e:cue control GmbH 250/251

6 Imprint, Copyright

Editor: Christian Brink

Based on Manuscript by: Jan Schaten

Printing: Bonifatius GmbH, Paderborn

© 2007 Gmbh & Co. KG, Im Dörener Feld 11, 33100

Paderborn. http://www.ecue.tv. All Rights Reserved.

is a registered trademark of e:cue gmbh & co. kg. WYSIWYG

is a trademark of the CAST Lighting Limited, Toronto, Canada.

Windows is a trademark of the Microsoft Corporation, Redmond,

United States of America. All other company names and / or

product names are trademarks and / or registered trademarks of

their respective owner. Products may not exactly correspond with

the representation. Properties, capacity and technical data may

differ depending on the operating system and hardware.

Information is subject to change without notice. We cannot

guarantee that the information in this manual is 100% correct.

This manual might refer to an outdated version of the program or

hardware.

does not guarantee validity, marketability or usability of the

product(s) for a particular reason or purpose. It is not possible to

assert warranty claims to either legally or otherwise.

cannot be held responsible for damages or disadvantages

including, but not limited to: loss of sales, or caused

- by the use of the product

- by the loss of serviceability of the product

- by misuse, events, circumstances or actions that does have

no influence over, independently of whether the damages as well

as consequential damages were direct or indirect, whether they

are special or other damages, or whether the damage is caused by

the owner of the guarantee or third persons.

Page 251: System Manual -traxon-hk.testing.focus-global.com/get_pic/pdf/757-e:cue...language offers great possibilities for advanced control of the e:cue Programmer. Most of the features the