Type any phrase to search documentation

Software Documentation

Exporting a firing system scriptDocumentation

Last updated: February 13, 2021

1 Pyroneo

To create and export a script for the Pyroneo (formerly SkyDirector) firing system, please follow these three steps:

  1. Design the show.
  2. Address the show (“Addressing > Address show”).
  3. Export the script (“File > Export > Export firing scripts“).

Step 3 creates the script file, which is a CSV file that you can import into your firing system.


Figure 1 – The Pyroneo firing system


The Pyroneo (formerly SkyDirector) script is a CSV-style text file that supports semi-automatic sequences, hazard classes, multi-hit pins, and pulse durations.

File formatExtensionText encodingField delimiterEnd-of-line

The script contains rows for the firing events, i.e., unique combinations of module, pin, and ignition-time. Multiple effects can be combined on a single cue. The special characteristics of the script are shown in the following table:

Special characteristicsDescription
Sort order of rowsRows sorted ascending first by Sequenz (sequence), then by RelZeit (time).
What rows representRows represent firing events, i.e., unique module-pin-ignition-time events. If multiple effects are triggered on the same cue, the effects are combined in name field, but the row is still just one row.
HeaderIf the script has music, it will begin with a header row of the form, #mTESTDIR\MUSIC, where TESTDIR\MUSIC is the path of the music file, without the file extension. Next is a comment row beginning with a semicolon, showing the column names in the same format as the CSV-style rows themselves.
Special charactersIf a field contains the character | or “, then the field will be enclosed in “ on both ends, and any internal “ characters will be doubled up, following the Excel quoting convention.
Minimum separation between cuesNone
Semi-autonomatic firingIn Finale 3D, the Track property in script rows indicates the section of the show to which the row belongs (please unhide the Track property in the script to use this feature). The rows in each section of a semi-autonomous script have time values relative to the first event in the section, which is always time zero. In the Finale 3D script, the sections can be in any order and can even have interwoven events, but generally people place the sections one after another in the Finale 3D script, with some space in between to tell the apart.

If you are scripting a non-semi-autonomous show, please ensure the Track values in the script are blank, because otherwise your show will be split up into zero-relative sections in the exported script. See semi-automatic-firing for further instructions.

Multi-hit pinsSupported in the script format and with manual addressing in Finale 3D, for non-pyro effects like flames and relays that can be triggered multiple times. Finale 3D handles multi-hit pins in the Pyroneo exporter the same as it handles single-hit pins — whatever pin address is in the script row in Finale 3D will be copied to the exported script row for Pyroneo, whether or not the pin address is unique. The standard pyro addressing functions in Finale 3D assign pins sequentially, so it may be easiest to address multi-hit pins in Finale 3D by editing the script table by hand and then locking the edited rows so the show can be re-addressed for pyro without affecting them.
SlatsSupported in Finale 3D using virtual slats. Virtual slats allow you to partition the channels of a module into separate slats for which you can assign addressing constraints to guarantee good pin assignments for your physical layout. For example, suppose you have one module with 20 pins that are distributed out to four launch positions on four physical “slats” or “rails” with five pins each. It would be important to have the addressing constraint that each slat is restricted to a single launch position, for otherwise you might have wires running from position to position. But the Pyroneo script format doesn’t have a notion of slats; each module simply has some number of pins, numbered incrementally, such as 1..20. To partition the pins into slats, create a custom module with a rail address template like #99-D-#5 to split the 20 pin modules into four 5-pin slats, A, B, C, D. Because these are virtual slats, even though their addresses appear in the format “2-B” and “3” for module 2, slat B, pin 3 (of slat B), the addresses are converted automatically in the exported script the contiguous pin range of the module. The virtual slat address “2-B” and “3” convert to module 2, pin 8 (pins 1-5 correspond to slat A, so the third pin in slat B is pin 8).

After the header, each row in the script has a number of fields separated by the vertical bar character. The names of these fields and their descriptions are the following:

Field nameDescription
ShownummerShow number from 0 to 15. Finale 3D writes 0.
SequenzSequence number for semi-automatic sequences, or 0 for fully automatic shows. In Finale 3D, the value of the “Track” field of script rows fills into this field in the exported script. All events in the same semi-automatic sequence should have the same “Track” field value, which must be greater than 0 and not in the range 4080 to 4089.
FlagsBit flags. Bit value 64 indicates the row is a sequence name; otherwise it is a cue. Finale 3D always writes 0, indicating the row is a cue.
RelZeitTime in milliseconds from the beginning of the sequence or beginning of the show (depending on the Sequenz field), at which the cue is energized. The first cue in a sequence always has a value 0, by definition.
ModulnummerModule number, beginning with 1.
EinschaltdauerDuration for which cue is to be energized, in milliseconds, from 10ms to 65000ms. Finale 3D writes the value 500, unless the cue contains an event whose Type field is flame, other_effect, or not_an_effect, in which case Finale 3D writes the duration of the event as shown in the script row (or 500ms if no duration is present). See Why is ‘Type’ important?.
KanalnummerPin number, beginning with 1.
GruppeHazard class, a number 0 to 9. Finale writes the value from the “Hazard” field. The default value is 0.
PositionThe position name, max length 8 characters.
NameThe effect name, max length 32 characters.

An example semi-autonomous script with two sections is shown below. Notice that each section begins with an event at time zero, since rows in sections are always relative to the first row in the section. Notice also that the last event in the script is a flame projector with an explicit pulse duration of the effect (410ms) rather than the 500ms default.

; Finale 3D Pyroneo export format v1.0
0|1|0|0|1|500|1|0|Pos-01|Green Chrysanthemum
0|1|0|1000|2|500|1|0|Pos-02|Green Chrysanthemum
0|1|0|2000|2|500|1|0|Pos-03|Green Chrysanthemum
0|1|0|3000|3|500|1|0|Pos-03|Green Chrysanthemum
0|1|0|4000|4|500|1|0|Pos-05|Green Chrysanthemum
0|2|0|0|5|500|1|0|Pos-06|Green Chrysanthemum
0|2|0|1000|6|500|1|0|Pos-07|Green Chrysanthemum
0|2|0|2000|7|500|1|0|Pos-08|Green Chrysanthemum
0|2|0|3000|8|500|1|0|Pos-09|Green Chrysanthemum
0|2|0|10728|4|410|2|0|Pos-05|Long Flame Projector Shot