No user ID provided.

Software Documentation

Software Documentation

Firing SystemsDocumentation

Last updated: June 12, 2024

31 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.


Table 1 – File format and encoding

File format Extension Text encoding Field delimiter End-of-line
Text .csw ASCII | CRLF

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:


Table 2 – Special characteristics

Special characteristics Description
Sort order of rows Rows sorted ascending first by Sequenz (sequence), then by RelZeit (time).
What rows represent Rows 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.
Header If 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 characters If 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 cues None
Semi-automatic firing In 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-automatic 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 fully automatic 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.

Track labels In Finale 3D, the Track field holds the track number and the track label together, as in “01 Opening” or “02 Middle Section”.  The track number is the first number contained in the string, e.g., the number 1 in “01 Opening” or “Opening 01”.  The track label is the string itself after skipping over any leading number in the string and trimming whitespace.  For example, the track label of “01 Opening” is “Opening”; the track label of “Opening 01” is the same “Opening 01” because the string doesn’t begin with the number.

The best practice for representing track numbers and labels in the Track field in Finale 3D is to use a two digit number padded with a leading zero if necessary, followed by the track label.  The reason for the two digits and for putting the number first is to make it possible to sort the script window in Finale 3D by the Track column numerically.

Multi-hit pins Supported 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.
Slats Supported 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:


Table 3 – Specifications of script fields

Field name Description
Shownummer Show number from 0 to 15. Finale 3D writes 0.
Sequenz Sequence 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.
Flags Bit flags. Bit value 64 indicates the row is a sequence name; otherwise it is a cue.
RelZeit Time 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.
Modulnummer Module number, beginning with 1.
Einschaltdauer Duration 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?.
Kanalnummer Pin number, beginning with 1.
Gruppe Hazard class, a number 0 to 9. Finale writes the value from the “Hazard” field. The default value is 0.
Position The position name, max length 8 characters.
Name The effect name or sequence 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