╔══════════════════════════════════════════════════╗ 
                                                             
                T H E    C F T    F I L E    F O R M A T     
              ════════════════════════════════════════════   
            ╚══════════════════════════════════════════════════╝ 

                 ┌────────────────────────────────────────┐ 
                 │ <shft> F1  =  Toggle to regular window │ 
                 └────────────────────────────────────────┘ 

    ┌──────────────────────────────────────────────────────────────────┐ 
                                                                     
          If you are reading this document for the first time and    
      are unfamiliar with the commands for scrolling the text, you   
      should be aware that <ctrl> ▲ (hold down the <ctrl> key and    
      push the cursor UP key) will scroll the text UP and <ctrl> ▼   
      will scroll the text DOWN.  You can also use the PageUp and    
      PageDown keys to scroll quickly through the document.          
                                                                     
    └──────────────────────────────────────────────────────────────────┘ 


 
1.1       A CFT file is a compression of a musical data set.  A musical 
      data set may consist of 

      (1) a single MPG file representing a single page of musical 
            notation, 
      (2) a directory containing one or more MPG files, or 
      (3) a set of directories, each containing one or more MPG 
            files.  
              
1.2       There are two advantages to having a compressed format for 
      musical data sets.  

      (1) Size.  A typical MPG file representing a full page page of 
      musical notation averages about 30,000 bytes in size.  The MPG 
      representation of a full score of a work such as J.S. Bach's 
      B-minor Mass, for example, requires about 9.3 megabytes.  The 
      CFT compression of the same work takes about 1.77 megabytes, 
      making the compression ratio between the two formats in this 
      case about 5.2 to 1.  Transmitting large data sets in the CFT 
      format takes about one fifth the time required to transmit the 
      same information in MPG file format.  

      (2) Simplicity.  A musical data set in MPG format could have 
      as many as two hundred directories and more than one thousand 
      separate MPG files.  Regardless of its size or complexity, the 
      CFT compression of a data set is always just one large file.  
      When storing or transmitting information, it is much easier to 
      deal with one large file than with many smaller files.  

1.3       For purposes of displaying and printing music, it is just as 
      easy to work from a CFT file as from a set of MPG files.  The 
      only reason to expand a CFT into its MPG component files is for 
      the purpose of editing the files (i.e., modifying the musical 
      notation).  A CFT file cannot be edited, because the compression 
      algorithm itself is content dependent.  Likewise, CFT files 
      cannot be subdivided or merged with other CFT files.  

1.4       Dmuse provides utilities for both compressing (to CFT format) 
      and expanding (to MPG format) musical data sets.  This means 
      that you can store your musical data efficiently (in CFT format) 
      and can also edit your musical data (in MPG format).  You may also 
      use the editor to create new MPG files and later compress them 
      to CFT format.  In this way, you can become an originator or  
      source of CFT files for publication on the internet.  


    ────────────────────────────────────────────────────────────────── 


2.1       Under normal circumstances, you would never have a reason 
      to examine the contents of a CFT file.  Since a CFT file is not 
      an ASCII (character based) file, you can only view it in HEX 
      format.  For those people interested, however, we include a 
      brief description of how a CFT file is organized.   

                      ┌───────────────────────┐ 
                      │ CFT file organization │ 
                      └═══════════════════════┘ 


      I. Title and Offset information 

          Field 1: (8 bytes)  Source of file    e.g., CCARH 

          Field 2: (4 bytes)  Version number (compression technique, etc) 

          Field 3: (4 bytes)  Checksum number (for file varification) 

          Field 4: (4 bytes)  Byte offset to File Organization section 

          Field 5: (4 bytes)  Byte offset to Data Group offsets 


     II. Header information (byte offset = 24 bytes) 

          Field 1:  byte 1:    length of field in bytes (up to 100) 
                    bytes 2..: composer 

          Field 2:  byte 1:    length of field in bytes (up to 100) 
                    bytes 2..: work 

          Field 3:  byte 1:    length of field in bytes (up to 50) 
                    bytes 2..: type of representation 

                                 e.g., Full Score 
                                       Complete Parts 
                                       Violin I 

          Field 4:  byte 1:    length of field in bytes (up to 50) 
                    bytes 2..: resolution 

                                 e.g., 300 dots/inch 
                                

    III. File Organization (offset contained in bytes 17..20 of file) 

          A CFT file may be one of three types.  

             1. It may be a compression of a single file 
                   (generally not used) 

             2. It may be a compression of a set of MPG page 
                   files from a single directory.  

                   e.g., the full score of a work with only 
                           one movement.  

             3. It may be a compression of <n> directories, each 
                   containing a set of MPG files.  

                   e.g., the full score of a work with <n> movements.  
                         the set of parts for <n> instruments.  
                         the part for one instrument, divided into 
                           <n> movements.  

          Field 1: (one byte)  0 = case 1 
                               1 = case 2 
                               2 = case 3 

          Case 1: 

             Field 2:  (one byte)  0x00 

             Field 3:  (one byte)  0x00 

             Field 4:  byte 1:    length (up to 100) 
                       bytes 2..: sub-divsion name (optional) 

                                    e.g. Movement 1 
                                    e.g. Violine I 

             Field 5:  byte 1:    length (up to 40) 
                       bytes 2..: note size 

                                    e.g. 14 dots per staff line 
                                         21 dots per staff line 
                                         14 and 21 mixed 

             Field 6:  (one byte)  0x00 

             Field 7:  (one byte)  <page number of this MPG file> 

             Field 8:  (two bytes) 0x0002 


          Case 2: 

             Field 2:  byte 1:    length (up to 13) 
                       bytes 2..: name of default path (directory) 
                                    for expansion 

             Field 3:  (one byte)  0x00  =  single sub-division name 
                                   0x01  =  multiple sub-division names 
                                   0x02  =  single sub-division name   
                                               plus a CONTENTS file 

             Field 4:  (case 0x00) 

                           byte 1:    length (up to 100) 
                           bytes 2..: sub-divsion name (optional) 
                     
                                        e.g. Movement 1 
                                        e.g. Violine I 
                       (case 0x01) 

                           bytes 1-2: <n> = number of sub-division names 
                           bytes 3-4: sequence number of CONTENTS file         
                                        (zero = no CONTENTS file) 
                           bytes 5-6: length of data string 
                           bytes 7..: data string 

                               data string = <n> repetitions of: 
                                             byte:    <k> = length of name 
                                             k-bytes: name 

                       (case 0x02) 

                           bytes 1-2: sequence number of CONTENTS file 
                           byte 3:    length (up to 100) 
                           bytes 4..: sub-divsion name (optional) 
                     
                                        e.g. Movement 1 
                                        e.g. Violine I 


             Field 5:  byte 1:    length (up to 40) 
                       bytes 2..: note size 

                                    e.g. 14 dots per staff line 
                                         21 dots per staff line 
                                         14 and 21 mixed 

             Field 6:  (one byte)  <p> pages (high order byte) 

             Field 7:  (one byte)  <p> pages (low order byte) 

             Field 8:  (two bytes) 0x0002 


          Case 3: 

             Field 2:  byte 1:    length (up to 13) 
                       bytes 2..: name of default path (directory) 
                                    for expansion 

             Field 3:  (one byte) <n> (1 to 255) number of 
                                    sub-directories 

             Fields 4..8:  are repeated <n> times 

                Field 4:  byte 1:    length (up to 100) 
                          bytes 2..: sub-divsion name 

                                       e.g. Movement 1 
                                       e.g. Violine I 

                Field 5:  byte 1:    length (up to 40) 
                          bytes 2..: note size 

                                       e.g. 14 dots per staff line 
                                            21 dots per staff line 
                                            14 and 21 mixed 

                Field 6:  byte 1:    length (up to 13) 
                          bytes 2..: name of default path 
                                       (sub-directory) for expansion 

                Field 7:  (one byte)  <p> pages 

                Field 8:  (two bytes) data group number of first page 


     IV. Data group offsets and lengths (offset contained 
             in bytes 21..24 of file) 

           Each offset/length pair is stored in two 4-byte groups.  
              Offsets are measured from the beginning of the file.  

           Case 1:  There are only only 2 data groups: i.e. the 
                      compression key and the page data 

           Case 2:  There are <p> + 1 data groups: i.e the 
                      compression key, and data for <p> pages 

           Case 3:  There are       \ <n> 
                                SUM  |     <p(i)>  +  1  data groups: 
                                    /i = 1 

                      i.e., the compression key, and the sum of all of 
                            the pages from all of the sub-directories 


      V.  Data groups 

           The first data group is always the cypher.  

           Each subsequent data group represents a page of music.  

           Each page data group begins with three header fields.  

              Field 1:  byte 1:    byte length of field 
                        bytes 2..: name of file (for expansion purposes) 

              Field 2:  4 bytes:   number of data records in file 

              Field 3:  4 bytes:   length of data in bits.  

                                   This field is required, because 
                                   the compression is binary.  


          If this description of the CFT format seems confusing, don't 
      worry about it.  We repeat what we said earlier; you probably will 
      never have recourse to look inside one of these files.  


    ──────────────────────────────────────────────────────────────────