Understanding/Using System Variables – part 2


In a first blog about System variables I offered a free table with description an references for all system variables. If you didn’t get that table yet, please get it from that article. That older post described shortly all caregories. It had focus on the variable categories s which are read only, and how they can be used to show information in a course and/or for editing/debugging reasons (like cpInfoCurrentFrame).  Not treated in that first part was the Quizzing category because I already had a detailed explanation in this blog post.

Here the focus is on that very special category ‘Movie Control‘. It is special because those variables cannot be inserted for viewing in a course.  More important is that they can be controlled, changed by the developer on runtime which is not possible for any variable for the other categories. Learning how to control these variables can be a good step up to getting started with advanced or shared actions: more complicated actions than the simple actions which you find in the dropdown list on the Actions tab of an interactive object.


Since this post is meant for users starting with variables, I want to explain some terms that are important expecially when working with system variables of the Movie Control category. You can skip this part is it sounds familiar to you.

Slides versus Frames

In questions on the forum I often see confusion between those two terms. A normal cptx project is slide-based. That leads many users to suppose that Captivate is functioning like Powerpoint, but that is not true. Essentially Captivate will lead to a movie, not to a sequence of slides which is typical for a presentation. That movie is more than a simple video, because interactivity is based on offering control to the user and to do so you need to  pause the movie. This is not the case with a video: the learner can pause the video, but the developer has no influence of therm with the exception of the interactive videos. I use the term interactive movie for a fully interactive published Captivate file. An interactive video is not better at all, more of a hype at this moment, because is interactivity is more limited. Although a PPT can have animations with some duration and seqeuence, it is not a real movie unless you capture it as a movie.

Any video/movie is played at a certain ‘speed’. The speed is defined in frames per second or FPS. The default speed of a published cptx file is set to 30FPS (but a video demo at 15FPS). If you keep the default length of a slide in CP, which is 3 seconds, that means that you have 90 frames in that slide.

I explained these terms already many times. As you can see in the table, several system variables in the Movie Control category are linked to navigation between slides or frames. Understanding the difference is required.

Boolean variable

A variable can have any value in Captivate: a text (often called string) or a number. When you look in the table you will see the typical values of the system variables. Many of them also aren:  from the ‘Boolean’ type. That is a variable that will have only two possible values: 0 or 1, true or false. You can interchange them easily, I prefer using the numbers 0/1 because it is less typing.  In the Movie control category many variables are indicated as Boolean: cpCmndCC, cpCmndMute, cpCmndNextSlide, cpCmndPause, cpCmndPlaybarMoved (pretty useless, internal), cpCmndPrevious, cpCmndResume, cpCmndShowPlaybar, cpCmndTOCVisible and cpCmndLockTOC.

Like other variables Booleans have a default (or start) value which you find also in the table. Often it is 0, which means the situation described by the variable is turned OFF. But there are exceptions. Some examples:

  • cpCmndMute: default value = 0, which means that audio is playing
  • cpCmndPause: default value = 0, which means the course is not paused
  • cpCmndShowPlaybar: default value = 1, which means that the playbar is visible
  • cpCmndTOCVisible: default value = 0, which means that the TOC in overlay is not visible


When used as a verb, this means ‘switch between two situations’.  I didn’t use the word ‘state’ to avoid confusion with states in a multistate object. You can toggle a playbar between the visible and hidden situation, audio between muted and not muted, a TOC in overlay between expanded and collapsed, any object or group between visible and invisible. There is a close relation between Boolean variables and toggling. For that reason a couple of versions ago the new command/action Toggle’ appeared in the dropdown list of the Actions tab, and in the advanced actions dialog box.

Some people also use Toggle to indicate a Toggle button. That is a button which allows to switch between two situations£. Several buttons on the Captivate playbar are toggle buttons: turning CC on/off, play or mute audio, pause or continue the movie.

Use Cases

Toggle buttons

CC on/off

If you use custom buttons instead of a playbar, which is recommended for any non-linear project, you can create a toggle button to turn Closed Captioning on/of. Beware: in versions before CP2017, Closed Captioning was always turned off when the course started. That is the reason why the default value of cpCmndCC  is still indicated as O. With the new more elaborated features for CC, you also have the possibility to turn CC on for a project. In that case the variable will have the value 1.  To create a toggle button for this feature you can use a shape button on the main master slide (no need for pausing) if you are in a non-responsive project. For a responsive project with fluid boxes, using the main master slide is a bad idea (no fluid boxes possible), you’ll have to use the other master slides. Use guides for the creation of the footer fluid box, so that it is consistent for all the master slides.

Create this simple action to be triggered by the Success event of the button:

Since you don’t need this button to pause the slide, you have to uncheck the option ‘Pause Project until user clicks’.

Audio on/off, Playbar on/off, Overlay TOC expand/collapse, TOC lock/unlock

The workflow is exactly the same as for the CC toggle button. In the screenshot you see that the appropriate system variables show up and can be selected.

It is of course possible to replace a toggle button by two  buttons. Example: a button to show the overlay TOC  and another one to hide it. In that case you could use the commands ‘Show TOC’ (same result as Assign cpCmndTOCVisible with 1) and ‘Hide TOC’ (same result as Assign cpCmndTOCVisible with 0). This is  an alternative for the tiny expand/collapse buttons attached top left of the slide. A toggle button saves space on the slide, easier to manage.

Two buttons are also possible for Playbar on/off  (Show Playbar/Hide Playbar) and for locking/unlocking the TOC for navigation (Lock TOC/Unlokc TOC).

For Audio on/off you do NOT find such simple actions in the Actions tab.  ‘Play Audio’ is meant only to play an audio clip, but has no effect on slide audio, object audio, nor background audio. Similar with ‘Stop Triggered Audio’ which can only stop clips started with the command ‘Play Audio’. If you want two buttons, you will need to use the system variable cpCmndMute, with the Assign command:

  1. Assign cpCmndMute with 1    will mute audio
  2. Assign cpCmndMute with 0     will have it play again

To create a toggle button with a different look when the situation is toggled, you’ll need an advanced or shared action. Have a look at:

Multiple Toggle Buttons with one Shared Action

Shape category ‘Buttons’ – Challenge

Being a tutorial for newbie (no advanced/shared actions, I will not explain using the navigation system variables for two reasons:

  1. You probably never will use the slide navigation variables  for navigation between slides. It is intuitive to use ‘Go to Next Slide’, muc more than ‘Assign cpCmndNextSlide with 1’
  2. The navigation variable cpCmndGotoFrame is  very important in micro-navigation but that is a more advanced topic that needs the use of advanced/shared actions. If you are interested, have a look at: Intro to Micro-Navigation

However I have a challenge for you! The shape dialog box has a special category labeled ‘Buttons’.

Typical for these shapes: the option ‘Use as button’ is checked off (no pausing point by default). They will trigger an action, which for most buttons is a simple action. You will see that the Mute button  is assigning “1” to the system variable cpCmndMute. The three buttons marked in the screenshot trigger an advanced action: the Home button and the Start button (both marked in red) use the advanced action ‘startSlide‘, the End button (marked in green) uses ‘endSlide‘.  You can open th action in the Advanced Actions dialog box,  by clicking the Browse icon:

Look at the use of the system variables in startSlide :

  • Assign cpCmndGotoSlide with 0          this means: go to the first slide (index starts with 0)
  • Assign cpCmndResume with 1              is the same as Continue

Can you explain the script ‘endSlide’?


A lot more is possible when using the movie control variables in advanced or shared actions. I already posted some links before. Here is a link to a blog post about ‘Replay Slide‘ where you’ll find different scenarios. It will help to understand the importance of frames: if you only get back to the first frame of the slide, reset will not happen if this is done by an On Enter action, or if you have Text Entry Boxes/Drag&Drop slide.

For newbies I plan a third article about user variables and simple use of them (still without advanced/shared actions). Would love to get some comments.

The post Understanding/Using System Variables – part 2 appeared first on eLearning.

Understanding/Using System Variables – part 1


Many years ago I did write out some tutorials explaining how to use variables. They are still available in Adobe’s Knowledge base, but of course the screenshots are outdated since they were created in Captivate 4 and 5. Inspired by a recent thread in the forums, where it took a while to explain the use of variables, I want to write out some posts about Variables. This first article will focus on System variables and include a downloadable table which you can use as reference for them.

What is a Variable?

If you ‘google’ to find a definition of a variable you will get thousands of results. I would say that it is a container identified by a name and the content can change or be changed (is variable). It is a term used in programming languages and applications. It makes them more flexible, powerful. If you are a maths lover, compare this equation: 5 + 6 = 11 with  a + b = c. The a, b, c are variables, and the second equation allows you to create tons of small sums. The first equation uses ‘literals’, and you have only one sum.

Captivate’s System Variables

Captivate has by default 6 categories of System variables and 2 automatically defined user variables. This article is only about system variables, they are available for your use in any project. All the system variables start with the characters ‘cp’. Lables are, as usual in Captivate, unique for each variable and they are case sensitive. It may be confusing that the two  user variables,  created for each new project (cpQuizInfoStudentName and cpQuizInfoStudentID) also start with the same characters..  When you open the dialog box  Project, Variables the type ‘user’ is automatically selected, and you see only those 2 variables. Be sure: those are NO system variables, they are necessary for the workflow of Internal Server reporting, but can also be used with many LMS’s. The certificate interaction uses  cpQuizInfoStudentName as well.

Categories –  table

You can download the free explanatory table from  SysVars

Captivate has 6 categories of system variables. To see them switch to System type in the dialog box:

  1. Movie control: is a very special category, which I will explain in a later article.  They offer a way to control your course by changing a system variable. This is not a normal behavior of variables, and can be considered as a, add-on to more complicated advanced/shared actions. These system variables are also different from those of category 2-5 because their value cannot be displayed in Captivate output.
  2. Movie Information: typical for this movie are the number of slides/frames, the speed (FPS), which frame/slide you are at this moment, etc… All variables of this category are read only. Their value can be used by the developer, they can be displayed in a Captivate file, during Preview and after publishing. I will point out some examples later on that could save you time while developing. In the table you’ll find some references as well.
  3. Movie Metadata: you can add metadata to a course, lot of it can be done using File, Project Info.  The behavior and usefulness are similar to the previous category. More tips below the examples below.
  4. System Information: data about present Date, Time, or which OS you are using if watching on a mobile device are in this category. Like 2-3 these variables are read only but can be used in the same way as those from Movie Information and Movie MetaData. Look in the table for examples.
  5. Quizzing: will not expand on this category because I already posted a blog about using Quizzing System variables
  6. Mobile: has only one system variable which is exceptional because it stores 3 numbers. It cannot be displayed in a course, only be used in actions.

This blog has focus on categories 2-3: they are very useful when you insert them in a course, either during debugging or to be able to show their value in output.  The workflow is the same for all variables that can be displayed (not category 1n nor 6).

Display a variable

The best way to insert a variable to be displayed is this workflow:

  • Create a text container: either a caption or a shape on the slide
  • Go into edit mode, by double clicking or using the function key F2.
  • You’ll get the Character part in the Properties panel. Find tesee three buttons

    First button inserts a symbol, last button a hyperlink, but you need to click the second button to insert a Variable
  • Switch from the default User type, to System.
  • Choose a category under the dropdown list which has by default ‘All’ as choice
  • Select the wanted variable.
  • The ‘length’ is set by default to 50 characters, but you can edit this number. It is essential to do so if you expect the value to be greater than 50 characters (spaces included).
  • Confirm the insertion with the OK button.
  • While editing the variable will appear as in this first screenshot, between double $$. When previewing or after publishing that placeholder is replaced by the value (second screenshot)

Edit and Runtime view

Some examples

1. Slide counter: Slide X/Y

You use two system variables from the category Movie Information: cpInfoCurrentSlide and cpInfoSlideCount. Insert this text on the first slide of your course, and display it for the rest of the project.  Do not forget to check off ‘Always on top’ for the text container.

2. Author name in Theme

You will use the variable cpInfoAuthor from the category Movie Metadata. While creating a custom theme to be used in multiple courses, insert this variable in a text container on the main master slide. Master slides are part of the theme. Do not forget to warn your colleagues to fill in the fields under File, Project Info.

3. Course name in Theme

If you use a Title master slides, you can insert the variable cpInfoCourseName on that master slide as title. That variable also blelongs to the category Movie Metadata. Same comment: Project Info has to be defined by the developer. You can also use this variable in a footer of course.

4. Debugging Timeline

As I mentioned many times, understanding how to pause the timeline, and its consequences on objects is very important. I always recommend to insert a text container with the variable cpInfoCurrentFrame to watch pauses while Previewing the project. It is a variable from the category Movie information. You can see that I apply this recommendation myself in this movie:
Captivate’s Timeline

You’ll certainly find more examples. When used in combination with advanced or shared actions, lot more is possible but that is beyond the scope of this introduction.  One example: to show the elapsed time on the course (the real time spent, not the developer’s time based on slide durations), you cannot just insert the variable cpInfoElapsedTimeMS (from Movie Information) because it is defined in milliseconds. You need to do some simple maths to make it readable to the learner, and that means …. advanced action.

The post Understanding/Using System Variables – part 1 appeared first on eLearning.

Reflective Practitioner – A Learning Curve – Experiment #7


Two weeks ago I was approached by a Curriculum Design Specialist (CDS) on our team who wanted to make use of a very long interview that she had recorded. Initially she wished to splice the audio file into several podcasts but was grappling with the idea of making her learners do more than just listen. We came up with an idea for integrating other events of instruction, namely: THINK-LISTEN-COMPARE. In order to promote a more active listener during independent study, asking a learner to reflect on material covered/his experiences prior to the listening process should be a part of the exercise. Three (3) relevant questions would be asked and a learner would have the opportunity to enter their succinct responses (550 characters or less) in a space provided eg: text-entry boxes. Once completed, they would then move on to listening to the podcast. After listening, that they would view a summary of their responses alongside those raised by the speaker in the interview – prompting a compare and contrast reflection for future course activities or assessments.

Scripted Content (Screen Shot)

As with most of these multimedia instructional design exercises, I often have to insist that the core content is specified by the subject matter expert (SME). To do this, I designed a content planning template and helped the CDS to script the main ideas. I was later able to tweak the appropriate messaging for the potential learning object, and asked another team member to provide us with a voice narration. I intended to take on a full audio challenge with Captivate. Scripting would also help in implementing the closed captioning option (as it turned out though, we did not include closed captioning in this iteration).

I have storyboarded the project below based on the template I created. I will use this storyboard to discuss the Reflective Practitioner Project as Learning Curve #7.

Storyboard of Reflective Practitioner Project

Project Details

Canvas Size: 1024 x 768 px; Time: 6.0 mins, 31.2 secs; 11736 frames; 10 slides; 9.5MB; Responsive Design: Yes.

Published Project Demonstration (Click Here) 

Initial Concerns

The interview/audio file was over 16 mins long (9M so i immediately had a red flag raised for the project size. Added to this complication was my grand idea to use guided audio narration instead of text captions in this project. In past projects I have played around with the slide properties option to add audio there but it extended the length of my slide and as I was trying to avoid that, I knew I had to find another way to insert narration. I also didn’t want Captivate clipping the audio to the length of the slide. Further to that, I didn’t want the audio files starting up again when a user re-visited the branching menus.

Design Process

I opt to create as much as the visual design outside of Captivate using background slides that handle basic aesthetics. It’s my version of a cheap trick that you can try too. You can do much better (I am sure) but my real interest here was to work through the functionality. I typically place objects, avatars, text captions, interactions on these background slides. In a sense, it makes it easier to swap out images and make cosmetic changes outside of Captivate while preserving the functionality I have programmed.

I edited all the audio files myself and used background music tracks to kill some of the awkward pauses, bird noises and other white noise from my colleagues’ narration.

Development Process

1. Title Slide

It contains one object (the arrow shape) which is “used as a button” on the properties panel.  When I previewed the project, the button worked but I also realized that if the user clicked anywhere on the slide it also advanced. This is not something I wanted but raises a good lesson for everybody new to Captivate.

Fix your button properties> On success: Go to the Next Slide> Number of attempts: infinite
I circumvented the challenge I outlined in Initial Concerns by executing an advanced action scripted as “Title” which simply runs the command Play Audio for the selected file that i imported into the project library. Drum roll!  This is a strategy I used for all of the slides with guided narration expect the actual podcast.

2. Introduction Slide

It contains an object with text and another navigation arrow. This slide functions more or less like the Title Slide. Text will always vary per course, module or unit as course developers may choose to highlight the unit objectives etc. This is a question of content rather than functionality though.

What is different about this slide’s properties are the ON ENTER and ON EXIT executing advanced actions. I’ve learned in previous projects that it’s better to do this ahead of a slide with lots of re-visits.

>On Enter – I am playing another audio file “Introduction”

>On Exit – I am setting up the value of my variables (var_listened; var_reflected; Q1; Q2; Q3) to a value of 0, as well as enabling and disabling buttons for the upcoming slides and menus.

This is needed because the CDS specifically does not want the learner to move to the podcast without performing initial reflection around three questions.

3. Main Menu Slide

In addition to the obvious 3 objects “used as buttons” to jump “on success” to various slides, the main lesson here is one of variables and setting up a branching menu. When you are working through your functionality make sure you have your variables displayed (use the eye symbol in the right properties panel close to the re-naming form). This helps you see if your slide is measuring things like you want it to.

I wanted the following:
  • When my user first accesses the main menu, all existing variables should return a value of 0, the guided audio should play, the only active item on the menu should be the “think” button.
  • When my user re-visits the main menu (after having clicked think and performed there), var_reflected should return a value greater than or equal to 3. This is because there are three questions that a user can attempt more than once. The main menu should show that he has attempted that first option and reflecting is no longer available to him, the next active button is “listen” so he moves on. It should also NOT play the guided audio again.
  • When my user re-visits the main menu (after having listened to the podcast), it should show that he has attempted the first two components and they are no longer available to him, so he moves on to the “compare” activity. Once again, no guided audio needs to play here.

I used changing states on the three objects that are “used as buttons” (Reflection_Launch_Button; Podcast_Launch_Button; Summary_Launch_Button). These states are: rollover (inbuilt), down (inbuilt), normal (inbuilt) and attempted (new).

I am executing a conditional action in response to the situation I described above.

4. Reflective Question Menu

This slide contains 3 text caption boxes and 3 objects “used as buttons” which each jump to an individual reflective slide in the project. There is an avatar named “Thinking Tyrell”. There is also a hidden object as a continue button that only show up when all three questions are attempted. There are three variables on this question menu: Q1, Q2 and Q3 which are initially set at a value of 0 but will increment by 1 every time a user submits/resubmits a reflection. In my case, the 0 is more important than the number of times the user decides to change his reflection.

Like the slide before, this menu contains audio instructions that play the first time he accesses it. I do not want it repeating every time he returns to answer another question. Similarly, I only want the user to access the main menu when he was completed or attempted all three questions. I have locked down the navigation in this project.

5. Reflection Slides: Using Text-Entry Boxes, Variables & Variable Length.

As a slide, each one has the following ON ENTER and ON EXIT Properties:

Each slide contains a text entry box. A text-entry box in Captivate will carry a variable name. You can edit it to suit your project. This is useful because I want to display user input on my summary slide so that he can compare his initial reflections with the default answers given by the interviewer.

The style option for my text entry boxes in all 3 cases are set to: RETAIN TEXT, SHOW TEXT BOX FRAME, and in options I allowed a maximum character length of 550,  All cases (lower and upper) as well as numbers. I did not allow auto submit. The user must hit a default submit button to trigger my variables Q1, Q2 and Q3 available on the Questions Interface.

The Text Box itself has actions that can be programmed. I am executing some standard actions for each related text box:

There is another option “On focus lost” for text-entry boxes. This does not apply to my needs, so I did not assign any action there.

6. The Podcast Slide: implementing a play/pause button

This is the only slide in which I used the option to attach an audio file on the slide properties panel. As expected it lengthened the slide and increased the frame count. The audio file was now an automated part of the Captivate movie.

Given that the podcast itself was lengthy, I knew I would have to give users the option to pause/play while listening. I wanted to do this without having them rely on the play bar. I looked at several tutorials hoping to play and toggle audio within an advanced action, but soon realized that in this case, such a script created a stop/restart effect. This was definitely not what i wanted. I needed it to resume right where it had stopped.

Lilybiri had a useful solution using system variables: cpCmndPause and cpCmndResume in a conditional action. I had initially hoped to call them from an advanced action but I realized that they were not available to me when I was developing the script with a statement to Play Audio.

cpCmndPause and cpCmnd Resume work with the overall slide and progress of the project, hence the reason I had to attach the audio to the slide. I added in a design suggestion by Paul Wilson to manipulate the state of my play/pause button instead of using two buttons. When the user clicks pause, it changes the state to play in order to prompt the user to click again to pick back up and so forth. This worked out well.

7. Summary Slide

This slide should not be much of a mystery now. It used some of the same design strategies for playing audio, an exit button, and text captions to call all three text-entry box variables. The thing to remember is to specify the variable length here again. By default it is set to 50 so I extended this to 550 to display the full response of the learner.

Conclusion: Learning is for a lifetime

The “Reflective Practitioner” as a multimedia instructional design activity was another opportunity for me to learn about programmable responses in Adobe Captivate. If you enjoy a challenge, give yourself one today and build something, anything.

Until next time, cvsankars out!