INTERMEDIATE FILES FOR MUSIC PRINTING November 28, 1990 (revised 5-28-93) (revised 11-11-93) (revised 9-15-94) (revised 9-27-94) (revised 2-25-95) (revised 8-28-02) (revised 1-06-04) (revised 4-26-05) (revised 3-18-06) I. File Structure Variable length ASCII records Fields separated by blanks II. Types of I-files The first step is to generate an I-file for each individual part. These "linear" I-files are non-page-specific; i.e. the clef, key and time signatures occur only at the beginning of the file, and there are no line breaks or page breaks. The reason for this type of representation is that we may want to generate a printed part, or we may want to generate a score. The generation of a single part will lead to a page-specific I-file for this part. The generation of a full score will lead to a page-specific I-file for the score. There will be some slight variation in representation for these page-specific files: 1. Lines will be broken and located on the page. 2. Clef, key and time signatures will be placed at the begining of every line. 3. The hyphens betwen syllables of text underlay locations. 4. Ties, slurs and extended hyphens will be continued across line and page boundaries. III. Record Types Linear Files Page Specific (additional) ------------ -------------------------- Music Lines Systems Objects Music Lines (page specific) Sub-objects End of Music Line Text (form of sub-object) System Bar Words (form of sub-object) Page Text Attribute (form for sub-object) Super-objects Q-records (linear only) Tag records (linear only) IV. Record Formats -- Linear Files A. Music Lines Field 1: Identifier = L (or small l = single line staff, e.g., for triangle) Field 2: 0 = single staff; # = vertical offset of second staff Field 3: vertical displacement of text line Field 4: notesize (zero if not specified) Field 5: part name (ASCII string) B. Objects Field 1: Identifier = J Field 2: type of object B = bar line C = clef K = key signature T = time signature D = directive (e.g. time word, etc) S = other symbol N = note R = rest G = grace note Q = cue note F = figures I = isolated directive or symbol (not associated with a note, rest, or figure) M = mark (mostly for superobjects) Field 3: object code Bar line: x = measure number if there be one, else zero Clef: x = clef code Key: x = key code Time sig: x = time code (100 * tnum + tden) Directive: 0 = print always (parts and score) bit 0 set = print in parts bit 1 set = print in score bit 2 set = print if top part in score bit 3 set = print if bottom part in score (bit 1 over-rides bits 2 and 3) Symbol: 0 = not identified 4 = extended rest 6 = whole measure rest From the standpoint of typesetting for a score the major difference between a directive and a symbol is that a symbol will always be printed whether or not the part stands alone or is part of a score (e.g., letter dynamics), whereas a directive can be "made invisible" in parts that are not at the top or the bottom of a score (e.g., the segno sign). Notes: x = note type Rests: x = rest type Grace note: x = note type Cue note: x = note type Figure: 0 Isolated: same as for Directives Mark: 0 Field 4: horizontal displacement measured in 32-bit precision from beginning of piece For objects which are groups of notes (chords), the x co-ordinate is the position of the notes which fall on the proper side of the stem. For stem up, the object's position is that of the note heads to the left of the stem; for stem down, the object's position is that of the note heads to the right of the stem. Field 5: vertical displacement from top staff line For objects which are groups of notes (chords), the y co-ordinate is the position of the note which is farthest from the note-end of the stem (and hence closest to a beam, if there be one). This is impor- tant for the proper setting of beams at print time. For objects to be placed on the second (or greater) staff of the grand staff, 1000 (2000) will be added to the displacement. This means that the print program must check the range of the displacement before placing the object. For Bar type objects, which always have a y co-ordinate of 0, this field contains instead the bar line code: 1 = single light bar 2 = single heave bar 3 = dotted bar 5 = double light bar 6 = light-heavy double bar 9 = heavy-light double bar 10 = heavy-heavy double bar In case the bar object extends to more than one staff an amount equal to 1000 times (n-1) where n is the number of staves is added to the bar line code Note: If the stage2 source file contains a print suggestion modifying how mskpage deals with the music in the measure following a bar line, this suggestion is communicated to the mskpage program in this field. The suggestion code is multiplied by 1,000,000 (one million) and added to Field 5. Print suggestions for dealing with music in a measure: 1 = do not modify the spacings in this measure when justifying a line of music in a score (used only by mskpage). 3 = same thing If the stage2 source file contains a print suggestion requesting that a particular bar line within a movement should be right justified, this suggestion is communicated to the mskpage program in this field by adding 10,000,000 (ten million) to Field 5. These print suggestions apply only to non-page-specific files and are removed by mskpage (and mkpart) after they are utilized. They do not appear in the page-specific output. Field 6: print code (or if < 32, number of sub-objects) Field 7: space node number 1. Multiple rests -- number = measures of rest 2. Everything else -- number = division number This number will indicate the division within the measure to which the object belongs. The measure is divided into 6912 (27 x 256) parts. Divisions run from 1 to 6912. It is possible for several objects to have the same space node number. These objects will have separate numbers in the page- specific format. Field 8: distance increment flag. This flag describes the distance from the preceding object, as well as an attribute of the node: 0 = preceding distance should remain fixed at print time # = preceding distance may vary at print time; parameter is the duration of the preceding node, measured in units such that 576 = quarter note. 10000 = object will be centered between bar lines (used only with whole measure rests) Field 9: number of super-objects associated with this object Fields 9a,b...,: super-object numbers C. Sub-objects (these must follow directly after their associated objects) Field 1: Identifier = K (or k for "silent" Sub-objects) Field 2: horiz. displacement, relative to object co-ordinate Field 3: vertical displacement, relative to object co-ordinate Field 4: print code of sub-object D. Text (a form of sub-object attached to note or rest) Field 1: Identifier = T Field 2: horizontal displacement of text, relative to object Note: Non-page-specific i-files may have a second parameter attached to field 2 (separated by the "|" character). The second parameter is the "ideal" displacement of text, relative to the object note under the assumption that we don't have to worry about clashes with adjacent notes. Field 3: vertical code (text line number, between 1 and 10) The vertical code may be followed by the "|" character and a y offset. The interpretation of the offset is a displacement from the normal position of the line (see page-specific lines below). Field 4: ASCII string If this field = "~", this means that this note is the termination of a forward underline. Field 5: indication of forward hyphen or underline character - = forward hyphen _ = forward underline character . = " " " followed by . , = " " " " " , : = " " " " " : ; = " " " " " ; ! = " " " " " ! ? = " " " " " ? * = nothing Field 6: space taken up by ASCII string E. Words (a form of sub-object attached to symbol) Field 1: Identifier = W Field 2: horizontal displacement of word(s), relative to directive or symbol object Field 3: vertical displacement Field 4: font number Field 5: ASCII string (including font designations) F. Attributes (a form of sub-object attached to notes/rests) The purpose of attributes is to communication information about an object that is not represented precisely by purely graphical information. An example is the duration of tuplets. The tuplet super-object (H . X) references only the end points of a tuplet; there is no precise way to determine the remaining objects whose duration might be effected by the tuplet. When converting page specific i-files to SCORE pmx files, we need to know the precise duration of all notes. The only foolproof way to convey this information is in an attribute. Attributes are ignored in the printing process. Field 1: Identifier = A Field 2: type of attribute 1. D = duration Field 3: numerator of duration Field 4: denominator of duration Duration is represented as a proper fraction. 1/4 = quarter note 1/2 = half note etc. In terms of divisions (from stage2 source representation) the numerator is the number of divisions, and the denominator is four times the divisions per quarter. Field 5: tie (if present) (no field) = situation not determined (older files) 0 = no tie 1 = tie to following note 2 = tie appended to selected pitches (multiple pitches only) Note: In the case of a rest, field 5 may be used (optionally) to indicate that the next duration in this track is also a rest (a tied rest, in effect) NOTE: Field 5 was introduced in Feb-2006 and might be absent from some older i-files. 2. P = pitch Field 3: track number (normally 1) Field 4: base-40 pitch number (C4 = 163) (0 = rest) Field 5: tie (in case of multiple pitches and ties) 0 = no tie 1 = tie to following note NOTE: In case of multiple pitches, there will be multiple A P ... records. A P ... records should not precede A D ... records G. Super-objects (these are things whose shapes depend on the locations of more than one object. They generally follow after all of their associated objects have been described Field 1: Identifier = H Field 2: super-object number Field 3: type of super-object B = beam T = tie S = slur (dotted slur) X = tuple/bracket W = wedge D = word plus dashes E = ending R = long trills V = octave transposition F = figure extension N = null super-object (no action) Fields 4--: depend on the super-object type G-1. Beams (type = B) Fields 4 and 5: Case I: Non-page-specific i-files Field 4: 0 = beam above first object 1 = beam below first object Note: If the stage2 source file contained a print suggestion for modifying the length of the first stem of a beam, this suggestion will be communicated to the mskpage program in this field. a) If the stem is to be lengthened (regardless of whether it goes up or down), the suggested amount of the change (in units of 1/10 of a staff line distance) is multiplied by 100 and added to Field 4. b) If the stem is to be shortened (regardless of whether it goes up or down), the suggested amount of the change (in units of 1/10 of a staff line distance) is multiplied by 10000 and added to Field 4. These print suggestions apply only to non-page-specific files and are removed by mskpage (and mkpart) after they are utilized. They do not appear in the page-specific output. Field 5: 0 or 1 = stem directions are all the same > 1 = binary representation of stem direction. If field 4 = 0, then bit set = stem up; if field 4 = 1, then bit set = stem down; Example: if field 4 = 1, then 101001010 = down, up, down, up, up, down, up, down, up Case II: Page-specific i-files Field 4: length of first stem (positive = stem up) Field 5: slope of beam Field 6: font number Field 7: number of associated objects Fields 7a, b,... beam codes beam code = up to 6 digit number 0 = no beam 1 = continue beam 2 = begin beam 3 = end beam 4 = forward hook 5 = backward hook 6 = single stem repeater 7 = begin repeated beam 8 = end repeated beam 1's digit = eight level beams 10's digit = 16th level beams 100's digit = 32nd level beams 1000's digit = 64th level beams 10000's digit = 128th level beams 100000's digit = 256th level beams G-2. Ties (type = T) Fields 4--6: locations of note heads to be tied Field 4: vertical position of tied notes (position measured in dots (300/inch) from top staff line) For ties on a virtual (second) staff, 1000 will be added to this value. Field 5: horizontal displacement of first note head from associated object (non-zero only with chords) Field 6: horizontal displacement of second note head from associated object (non-zero only with chords) Fields 7--9: Meaning depends on value of reset parameter (Field 11) If reset parameter is 0 Field 7: (from print suggestion) horizontal displacement of the left end of the tie relative to the default computed position. Tie length will be changed. Field 8: (from print suggestion) vertical displacement. In most cases, displacement will be relative to the default computed position. Adding 10000 (ten thousand) to the number will make the displacement relative to the tied note, itself. Field 9: (from print suggestion) horizontal displacement of the right end of the tie relative to the default computed position. Tie length will be changed. If reset paramter is > 0 Field 7: horizontal displacement from note head one Field 8: vertical displacement from note head one Field 9: font number Field 10: situation flag interference tips down tips up stem staff space line space line ----- ----- ----- ---- ----- ---- no yes 1 5 9 13 no no 2 6 10 14 yes yes 3 7 11 15 yes no 4 8 12 16 Field 11: reset parameter flag (used in cases where post-editing has specified non-standard parameters) value action ----- ------ 0 recompute position and font (normal setting) 1 do not recompute position 2 do not recompute font 3 do not recompute position or font G-3. Slurs (dotted slurs) (type = S) Field 4: situation flag bit clear bit set -------------- ------------- bit 0: full slur dotted slur bit 1: stock slur custom slur bit 2: first tip down first tip up (*) bit 3: second tip down second tip up (+) bit 4: compute stock slur hold stock slur bit 5: print slur don't print slur (*) used on custom slurs only (+) used on stock slurs only Field 5--8: position fields: For stock slurs, these are displacements added to the note positions before the slur number is calculated. Displacements are measured in dots (300/inch). Horizontal positive is forward to the right; vertical positive is down. For custom slurs, these displacements are the actual starting point and ending points of the slur relative to the first and second objects. Field 5: (extra) horizontal displacement from associated object one Field 6: (extra) vertical displacement from associated object one Field 7: (extra) horizontal displacement from associated object two Field 8: (extra) vertical displacement from associated object two Field 9--10: parameter fields: Stock slurs: Field 9: post adjustment to curvature Field 10: beam flag 1 = set slur above beam 2 = set slur below beam Custom slurs: Field 9: vertical height parameter Field 10: length of flat portion as a percent of span between end points Field 11--12: more parameters Stock slurs: Field 11: post adjustment to x-position negative = left; positive = right Field 12: post adjustment to y-position negative = up; positive = down G-4. Tuplets/brackets (type = X) Field 4: situation flag bit clear bit set -------------- ------------- bit 0: no tuplet number tuplet number bit 1: no bracket bracket bit 2: tips down tips up bit 3: 0 tuplet aligns with beam bit 4: tuple near notes tuple near beam (bit 4 has meaning only if bit 3 is set) bit 5: break bracket for number bracket is continuous (bit 5 has meaning only if bit 0 is set) bit 6: number outside bracket number inside bracket (bit 6 has meaning only if bit 5 is set) bit 7: bracket is square bracket is curved (bit 7 has meaning only if bit 1 is set) Field 5: tuplet number: value = 1000 * [second number] + first or single number Fields 6--10: parameters Case I: bit 3 of sitflag = 0 (tuple not aligned with beam) or bit 3 of sitflag = 1 and bit 4 of sitflag = 0 (tuple aligned with notes of beam) Field 6: horizontal displacement from associated object one Field 7: vertical displacement from associated object one Field 8: horizontal displacement from associated object two Field 9: vertical displacement from associated object two Field 10: not used Case II: bit 3 of sitflag = 1 (tuple aligned with beam) Field 6: horizontal post adjustment to tuple Field 7: vertical post adjustment to tuple Field 8: horizontal post adjustment to tuple Field 9: vertical post adjustment to tuple Field 10: beam super-object number with which tuplet aligns G-5. Wedges (type = W) Field 4: wedge size at left end Field 5: wedge size at right end Field 6: horizontal displacement from associated object one Field 7: vertical displacement from top of staff Field 8: horizontal displacement from associated object two Field 9: vertical displacement from top of staff G-6. Word(s) plus dashes (type = D) Field 4: horizontal displacement from associated object one Field 5: horizontal displacement from associated object two Field 6: vertical displacement from staff lines Field 7: spacing parameter Field 8: font designator G-7. Endings (type = E) Field 4: situation flag 0 = ending with no number 1 = first ending 2 = second ending 3 = third ending 4 = fourth ending The display/printing of ending superobjects is normally suppressed for all staff lines below the top staff line in a score. That is, the superobjects may be there, but they are not displayed/printed. Adding 10 to the situation flag will force the display/printing of an ending superobject. For example: 11 = force the display/printing of first ending 12 = force the display/printing of second ending Field 5: horizontal displacement from associated object one Field 6: horizontal displacement from associated object two Field 7: vertical displacement from staff lines Field 8: length of left vertical hook Field 9: length of right vertical hook G-8. Long trills (type = R) Field 4: situation 1 = no trill 2 = trill with no accidental 3 = trill with sharp 4 = trill with natural 5 = trill with flat 6 = trill with sharp following New 11/05/05 7 = trill with natural following " 8 = trill with flat following " Field 5: horizontal displacement from associated object one Field 6: horizontal displacement from associated object two Field 7: vertical displacement from associated object one G-9. Octave transposition (type = V) Field 4: situation 0 = 8ve up, 1 = 8ve down 2 = 15 up, 3 = 15 down Field 5: horizontal displacement from associated object one Field 6: horizontal displacement from associated object two Field 7: vertical displacement from associated object one Field 8: length of vertical hooks G-10. Figure extension (type = F) Field 4: level 1,2,3 or 4 Field 5: horizontal displacement from associated object one Field 6: horizontal displacement from associated object two Field 7: additional vertical displacement from default height H. Q-records (linear only) Field 1: Identifier = Q (one field only) A Q-record is used to force MSKPAGE to make a page break. At the moment, these are not incerted by AUTOSET; they must be added by hand to a linear i-file. I. Tag records (linear only) Field 1: Identifier = Y Tags are incerted into linear i-files by AUTOSET. Their purpose is pass instructions and information to MSKPAGE. They are not propogated into page-specific i-files. Field 2: type of tag P = print abbreviated part name U = line control I-1. Part name (type = P) This tag signals MSKPAGE that from this point in the score (until cancelled), MSKPAGE is to append the designated abbreviated part name to the left of the staff line containing this part. Field 3: font number (0 = turn this feature off after typesetting the current line) Field 4: ASCII string (includine font designations) I-2. Line control (type = U) This tag sends MSKPAGE instructions to help it determine whether or not to DELETE this part from a particular system. MSKPAGE starts by typesetting (logically) all parts in the system. It then uses these tags to determine which parts in a particular system are "extraneous." Field 3: control code 0 = nullify the previous control code (i.e., return to normal rules) 1 = tag the current and all subsequent measures as type-1 2 = tag the current and all subsequent measures as type-2 Type-1 measure: Delete a line of music if every one of its measures is type-1. This is used to suppress a "dominant" representation of a part. Type-2 measure: Delete a line of music if any one of its measures is type-2. This is used to suppress a "non-dominant" representation of a part. The "dominant" version of a part is the one which contains the most or greatest variety of information. For example, when a section (e.g., Violin I) divides into two sections (divisi) and is represented on two staves, this becomes the "dominant" version of the part, because on a system-line basis it over-rides and must replace the single line version of the part. The divisi parts will be flagged as type-1 up to the point where they diverge (or where the music engraver definitely wants them on two staves). The single line part will be normal (considered printable) up to the point where the divisi parts take over and will be flagged as type-1 thereafter. At the point where the divisi goes away, the divisi parts are again flagged as type-1 and the type-2 designation for the single line is cancelled. V. Record Formats for Page Specific Record Types A. Systems Field 1: Identifier = S Field 2: 0 Field 3: x co-ordinate of system on page Field 4: y co-ordinate of system on page Field 5: horizontal length of system Field 6: vertical length of system Field 7: number of lines in system Field 8: control string in double quotes (null string allowed) The control string describes how the lines of the system are bound together on the left, and where bar lines stop and start between the staff lines. The control string consists of the following elements: [ = start bracket ] = end bracket { = start brace } = end brace ( = start bar line ) = end bar line . = part with a single staff line : = part with a grand staff (piano) What defines a system (holds it together) is a single vertical line on the left. To the left of this line can appear an arrangement of brackets and braces, which help the reader group the lines in the system. The bar lines in a system have their own (vertical) pattern of starting and stopping. These are indicated in the control string by the placement of the '(' ')' characters. The '(' character indicates the start of a bar line on the top staff line of the part indicated by the next dot (.:,;); and the ')' character indicates the end of a bar line on the bottom staff line of the part indicated by the previous dot (.:,;). Examples: (.) creates a bar line through one set of staff lines (:) creates a bar line through a grand staff (two sets staff lines) (..) creates a bar line which starts at the top of the first staff line and ends at the bottom of the second staff (i.e., two independent parts with a bar line connecting them together). (.)(.) creates a bar line through each of the staff lines separately, with no connection between them. All segments of a system bar line must be specified. The control string "{..}" will produce a a brace on the left, but no bar lines will appear. In this case, one must either specify "{(.)(.)}", meaning two bar lines with no connection, or "{(..)}", meaning one bar line crossing both staff lines. The control string "(....)(.):{..}..." would produce the funny looking result of having no bar lines in the piano part or in the (string) parts below them. As a short cut for convenience, the '[' character also doubles as a '(' character, and the ']' character also doubles as a ')' character. This allows one to write "[....]" as a shortcut for "[(....)]". Shortcuts are handy, but they can have unintended side affects. In the example above, modifying control string with outside square brackets (i.e., "[(....)(.):{..}...]" ) will produce bar lines for all staff lines, but may not connect the staff lines in a manner the user intends. This control string will produce a solid bar line from the fifth staff line through to the bottom. If this were the control line for a score of a piano concerto with four woodwinds, timpani, piano and strings, it might have the following form. "[(....)(.)(:)({..}...)]" The staff lines in a system are normally of the same size, but it is possible to combine staff lines of different sizes in the same system. When this is done, the print and display software must decide what font size to use for printing the various bar lines, braces, and brackets. At the moment, the decision is made in the following way: 1. The left line, and all braces and brackets are printed using the same font size. The default is to use the font size from the bottom staff line. If the size from a different staff line is desired, this should be indicated by replacing the dot for that staff line with a comma, or in the case of the grand staff replacing the colon with a semi-colon. If more than one comma/semi-colon appears, the largest of the indicated sizes will be used. 2. As stated above, bar lines can run through one or more staff lines, and they can be printed in different sizes (widths). (a) If a bar line runs through only one staff, then it is printed in the font size of that staff. (b) If a bar line runs through multiple staves of the same font size, then it is printed in that font size. (c) If a bar line connects staves of different font sizes the default size for the bar line is given by the size of the bottom staff. If the size of another staff is desired, this is indicated by replacing the dot for that staff line with a comma, or in the case of the grand staff replacing the colon with a semi- colon. If more than one comma/semi-colon appears, the largest of the indicated sizes will be used. 3. These rules will work in most situations, but there are some limitations. In cases 2(a) and 2(b) you cannot use a font size different from that of the staff size to print bars. You cannot, for example, use one font size to print all segments of a bar line in the case where the segments span staff sets of different sizes. It is possible to remove these limitations, but this would require a more elaborate definition of the control string (such as allowing the font size for each bar segment to be specified explicitly). At this stage of development, such an elaboration seems excessive and unnecessary. B. Music Lines (page specific) Field 1: Identifier = L (or small l = single line staff, e.g., for triangle) Field 2: y off-set in system Field 3: text off-set(s) from line (separated by |) Fields 4--7: parameters carried over from previous line Field 4: dyoff(s) Field 5: uxstart(s) Field 6: backloc(s) Field 7: xbyte(s) (length of field = number of text lines) Field 8: y off-set to virtual staff line (0 = none) Field 9: notesize (optional; 0 = none) Field 10: additional vertical off-set for figured harmonies (0 = none) Note: Field 10 cannot exist without Field 9 C. End of Music Line Field 1: Identifier = E Field 2: xbyte(s) at end of line (length of field = number of bytes) D. System Bar Field 1: Identifier = B Field 2: bar type Single bars Double Bars ----------- ----------- 1 = simple 5 = double light 2 = heavy 6 = light-heavy 3 = dotted 9 = heavy-light 10 = heavy-heavy 25 = heavy-light with 99 = no bar repeat dots Field 3: x off-set from beginning of line Field 4: number of breaks in line (to avoid interference with text and other designations) Fields 5--: parameter pairs, beginning and ending of breaks E. Page Text Field 1: Identifier = X Field 2: font number Field 3: x co-ordinate of beginning of text Field 4: y co-ordinate of text line Field 5: ASCII text The ASCII text may contain font change instructions. The sequence is the "!" character, followed by a two digit number (which at the moment must be between 30 and 48), followed optionally by the "|" character, which serves as a terminator to the font change instruction. The need for a terminator arises because in the future we may not want to restrict the font change number to exactly two digits. If the display software finds a "|" following a string of digits following the "!" character, it will consider this a terminator and remove it from the text along with the font change command. To print/display the "|" character immediately following a font change, use the "|" twice. Special case: If the page text record has only two fields, the letter X and a number, then the number is interpreted as a new value for notesize. This record has meaning only when multiple print sizes are being used, i.e., "multiflag" is set to 1 in pskpage, eskpage, dskpage, etc. F. Tagged Page Text Field 1: Identifier = Y Field 2: font number (if this = 0, then no print/display) Field 3: x co-ordinate of beginning of text Field 4: y co-ordinate of text line Field 5: ASCII text In addition to the font change instructions in "X" records, these "Y" records also support a system of tagged fields. Listed below are the tagging sequences and their functions. \< = begin tag structure. A tag structure has two components: the tag, and the data field being tagged. The tag comes first and may contain any ASCII characters except the "|" character, which is interpreted as "End of Tag." Immediately following the "|" is the data field. This is terminated by the "end tag structure" sequence. \> = end tag structure. \] = break tag structure. It is possible for a tag data field to continue over to a line or page boundary. In this case, the tag structure must be broken at the end of the line and restarted at the beginning of the next line. \[ = restart tag structure. A tag structure can only be restarted if it was broken on the previous line (or last line of the previous page). It is a requirement that the tag (first component of the tag structure) be restated. In theory, the software could reconstruct the tag, but in the case where the data field extends over several lines, this could prove cumbersome. Therefore, following the "\[" sequence comes the tag, followed by the "|" character, followed by a continuation of the data field. Under this structure, it is possible to have nested tags. This feature could prove useful. For example, suppose we are interested in tagging names, and suppose we are also interested in knowing the first name and the last name. We could implement this with three tags: name, fname, and lname. Now suppose we want to tag the name in the line of text "According to Lowell Lindgren," The Y record might appear as follows: Y 37 50 140 According to \<name|\<fname|Lowell\> \<lname|Lindgren\>\>, (highlighted in green is the "outer" or "primary" tag, with its endpoints; highlighted orange are two "inner" or "secondary" tags with their endpoints. If this structure were broken across a line boundary, it might look like this Y 37 50 140 According to \<name|\<fname|Lowell\>\] Y 37 50 180 \[name|\<lname|Lindgren\>\>, there was a cantata What this allows the software to know is that the first name "Lowell" and the last name "Lindgren" are part of the same name, even though they occur on separate lines. G. Meta-data records Field 1: Identifier = @ This line is ignored by the display/print software, but may contain important information related to the description or structure of the data. Some uses of @-records: 1. Source ID. Field 2: "SOURCE:" Field 3: <File ID> Filed 4: <[md5sum: ... ]> The idea is to represent all of the sources that contributed to making this page (or musical example). The Source ID records should normally follow the Z-header records. In cases where there are no Z-header records, the Source ID record should appear before the first system (and before any @ SYSTEM: records). 2. Movement ID. + Info Field 2: "MVT:" Field 3: Type of data N = name Field 4: = movement name P = part Field 4: = part number Field 5: = <sub-part numbers> enclosed in carrot brackets numbers separated by commas, null-set allowed Field 6: = part name L = line Field 4: = line index number Field 5: = <part numbers for each track> enclosed numbers separated by commas, no null set allowed If the first field inside the <..> string is an "x", this indicates a keyboard part, which is non-divisible and multi-track. The numbers that follow, e.g., "<x,#,#,..>" are the part numbers assigned to the various keyboard tracks. Field 6: = line name Note: "part" means any part or group of parts. If there are two oboes, then there are likely to be three parts: oboe-1, oboe-2, and oboes. "line" means any line compiled by AUTOSET for purposes of making a score. For the bass strings, there are often three lines: cello, basso, and cello + basso. These three lines never appear in the same system; either the cello and basso appear as separate lines, or they appear combined on the same, single line. 3. System ID. Field 2: "SYSTEM:" Field 3: ASCII string The purpose of this record is to identify the composer, work, and movement to which this system belongs. This information (if present) will be used by the search program to identify "hits." This record should be located just above the System record to which it applies. There is an option to include a bar line number in this ASCII string. If this is to be used, the number must occur at the beginning of the string, and must be enclosed in < > brackets, e.g., <28>, with no space following. 4. Line ID. Field 2: "LINE:" Field 3: line index number (for joining lines between systems) Field 4: ASCII string The purpose of this record is to identify the instrument(s) or the voice represented on this staff line. This information (if present) will be used by the search program to identify "hits." This record should be located just above the Line record to which it applies. 5. Line Text(s) Field 2: "TEXT:" Field 3: ASCII string The purpose of this record is to provide a searchable ASCII string containing the text (underlay) represented on the line. This record should be located just below the Line record to which it applies. In cases where there is multiple text underlay (e.g., some Bach chorals), there will be mulitple @ TEXT: records. 6. Comment. Field 2: "COMMENT:" Field 3: ASCII string 7. Grid data. (scribe program) Field 2: "GRID:" Field 3: Command Set (includes grid units per measure) Field 4: Notation represented by one grid unit, e.g. 7 = quarter note Field 5: Minumum grid spacing The purpose of this record is to provide the scribe program with parameters it needs to implement cursor movement along the grid This record, if it exists will alway be at the top of the file. 8. Pointer data. (scribe program) Field 2: "POINTERS:" Field 3: pointer to the next note (or rest) object (index into pointers array) Field 4: pointer to the previous note (or rest) object (index into pointers array) The purpose of this record is to store various pointers used by the scribe program. The values have meaning only in the context of that program and of the working pointers it creates. The @POINTERS: record, if it exists will always following directly after the object record to which it refers.