A HighC piece is stored in a file whose extension is ".upic" (or ".upiz" if stored in a compressed form). It contains the following items: a set of sounds, a duration, a set of waveforms, a set of envelopes, a set of patterns, some optional scale definitions and other properties, a set references to libraries, and the default audio rendering parameters to be used when playing back or exporting the piece to another format.
Sounds are either curves drawn in the time frequency domains, to which some rendering properties are attached, or groups of such sounds. They are stored as a simple list in the piece, and the detailed properties of sounds are detailed in the next section: What is a sound?
The duration is the length, in seconds, of the full piece. The duration can be viewed and set in the parameters toolbar. The piece always starts a 0 seconds, and ends at the set duration. Note that sounds can start before 0 and end after the piece's duration: this can be useful to know to create sound loops or when temporarily editing and moving sounds around. As a convenience to compute the length of a piece in seconds, the parameters toolbar lets you enter a numeric expression, such as: =16*80/4. In this case, if your piece consists in 16 bars of 4 beats each, played at 80bpm, the resulting duration will be computed for you.
Right now, the maximum duration is restricted to 1000 seconds. This is not a hard boundary, and nothing prevents you from writing longer pieces. However, when the piece gets very long, it can become difficult to edit its details and it can become very long to compute. Hence this soft boundary is meant to prevent potential input errors that would slow down the user interface.
The sound curves can be drawn from about 0.03 Hz to about 18kHz. This is far more than needed for most purposes, and yet, this is still a soft limit: you can perfectly describe sounds at higher or lower frequencies. The curves drawn in the frequency range below the hearing threshold (< ~20Hz) are not meant to be heard as sounds, but rather to serve as low frequency modulators for other curves. Of course, drawing sound curves above the hearing range won't result in audible sounds either, except artifacts due to aliasing effects. In general, drawing very high pitched sounds can result in aliasing effects. Those are generally unwanted and provisions can be taken to reduce them. Yet, some composers actually like to make use of aliasing, so HighC does not prevent in any way to create curves of a higher tone than the Nyquist frequency of the rendering process.
Envelopes are predefined curves that describe a loudness profile. Each simple sound will have at least one such profile assigned to it. A piece stores a number of those profiles, each with a unique name, and additional profiles can be created. Loudness profiles can also be imported from libraries referenced by the piece.
Waveforms describe the timbre used to render a sound. Like envelopes, each simple sound will have at least one such waveform profile assigned to it. A piece stores a number of those profiles, each with a unique name, and additional profiles can be created. Waveforms profiles can also be imported from libraries referenced by the piece. Contrary to loudness profile, "timbre" is a somewhat fuzzy notion. This is why there are multiple types of waveforms, which corresponds to broad classes of timbres and synthesis algorithms.
Patterns (sometimes also called templates) are a first mean of organizing groups of sounds that you might want to reuse throughout a piece, but want to enter only once. A pattern contains a list of simpler sounds. It can be instantiated at any position in the piece, which means the group will be heard as if you had cut and pasted all the sounds that compose it at the location you placed it. Patterns are a convenient way to produce rhythms, melodic phrases or chord sequences that you want to repeat and transpose at various locations in the piece. Most notably, they can be edited after having been instantiated, which allows you to test dramatic changes across the piece by performing only small edits on the pattern.
Libraries store predefined envelopes, waveforms, patterns and other elements that you would want to reuse in multiple pieces. Rather than copying a piece whose material you'd want to reuse, you can open any piece as a library inside a piece.
A piece also stores additional user interface state and audio rendering parameters, such as the time and pitch scales it is using. These are stored automatically as you use the software, and are meant as a convenience to let you retrieve your context of work more rapidly.