<<<<<<< iabc_autodoc.xml
<?xml version="1.0"?>
<?xml-stylesheet href="iabc_autodoc.xsl" type="text/xsl"?>
<PROJECT>
<FILE value="abcrules.cpp" dir="iabc">
</FILE>
<FILE value="abcrules.h" dir="iabc">
<CLASS value="parser_state_info">
<DESCRIPTION>
 This is a static class (utility class) that keeps track of the state
 of some things in the parser that are global.  Like how many '(' we've
 matched so far and what the note duration is.  Usually this state lasts
 throught out the course of a single file.
</DESCRIPTION>
</CLASS>
<CLASS value="duration_rule">
<DESCRIPTION>
 There are 3 ways to represent
 a duration.  One is as a fraction, e.g. "1/4" for a 1/4 note.
</DESCRIPTION>
</CLASS>
<CLASS value="duration_specifier_rule">
<DESCRIPTION>
 This is the whole duration specifier in abc.  It also
 contains the default duration, which all duration
 rules use in case the duration is not specified.
 Note that the default duration for a note is handled internally
 in this abc parser.  When a duration is read the value is
 computed in terms of the current default, which is handled
 in the parser.
</DESCRIPTION>
</CLASS>
<CLASS value="index">
<DESCRIPTION>
 X: \d+
 describes an index field.  This maps titles to tunes.
</DESCRIPTION>
</CLASS>
<CLASS value="copyright_rule">
<DESCRIPTION>
 C: By Aaron Newman (c) 2003
</DESCRIPTION>
</CLASS>
<CLASS value="history_rule">
<DESCRIPTION>
 H: This class was written last Tuesday
 while Aaron was supposed to be doing the
 dishes.
</DESCRIPTION>
</CLASS>
<CLASS value="title">
<DESCRIPTION>
 T: the title rule.  Describes a title.  Add to the current
 title if we are still in the same tune (which you can tell by
 looking at the last index)
</DESCRIPTION>
</CLASS>
<CLASS value="meter_header_rule">
<DESCRIPTION>
 The M: header rule
</DESCRIPTION>
</CLASS>
<CLASS value="tempo_header_rule">
</CLASS>
<CLASS value="meter_specifier_rule">
<DESCRIPTION>
 The meter specifier in ABC.  This also acts
 as the source of the current meter in ABC.  ALso,
 I frequently call 'meter' 'time signature'.
</DESCRIPTION>
</CLASS>
<CLASS value="Voice">
<DESCRIPTION>
 This is the voice change that can be at the start of a
 line of music.
</DESCRIPTION>
</CLASS>
<CLASS value="letter_note_rule">
<DESCRIPTION>
 The letter note rule is part of the pitch.
</DESCRIPTION>
<DESCRIPTION>
 An octave as defined by '' or ,,.  We'll need
 to add the octave header somewhere too.
</DESCRIPTION>
</CLASS>
<CLASS value="part_header_rule">
<DESCRIPTION>
 A part is a section of music called out by a letter or number
 above the music.
</DESCRIPTION>
</CLASS>
<CLASS value="key_header_rule">
<DESCRIPTION>
 The entire key header rule in one take.  We need to know the key
 before we know the pitch since we will adjust the accidental
 accordingly.
</DESCRIPTION>
<METHOD value="convert">
<DESCRIPTION>
 Get the key the user wants, and return the number
 of characters that should be skipped to get to the
 next thing.
</DESCRIPTION>
</METHOD>
<METHOD value="parse_extra_stuff">
<DESCRIPTION>
 Get the key=value pairs that can trail a key
 declaration.
</DESCRIPTION>
</METHOD>
<METHOD value="construct_expressions_if_required">
<DESCRIPTION>
 We occasionally delete the key regular expressions since
 the take lots of memory.  Construct them before use.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="accidental_rule">
<DESCRIPTION>
 The accidental that can preceed a note.
</DESCRIPTION>
</CLASS>
<CLASS value="pitch_rule">
<DESCRIPTION>
 A pitch is a letter note, possibly combined with
 an octave and an accidental.
</DESCRIPTION>
</CLASS>
<CLASS value="bar_line_rule">
<DESCRIPTION>
 The end of line, which could be a repeat, bar line, etc.
</DESCRIPTION>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="inline_header_rule">
<DESCRIPTION>
 Return true if there is a match of a header inline a piece of
 music.
</DESCRIPTION>
</CLASS>
<CLASS value="note_info_rule">
<DESCRIPTION>
 A note_info is a pitch and a duration. If no duration
 is given the default one is used.
</DESCRIPTION>
<METHOD value="matched_pitch">
<DESCRIPTION>
 Sometimes the pitch was not changed but we received an inline
 header instead.  Return false in this case.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="multi_note_rule">
<DESCRIPTION>
 many notes, glommed together.  Used to put together
 chords and also single notes.
</DESCRIPTION>
</CLASS>
<CLASS value="note_info_or_inline_header_rule">
<DESCRIPTION>
 Both the header rule and the note info rule can be
 enclosed in [].  Figure out which here.
</DESCRIPTION>
</CLASS>
<CLASS value="chord_info_rule">
<DESCRIPTION>
 A chord in abc is a single note or multiple notes within
 a pair of square brackets.
</DESCRIPTION>
</CLASS>
<CLASS value="hornpipe">
<DESCRIPTION>
 The hornpipe rule is a funny little abc'ism.  The fraction
 produced by this rule is interpreted as follows:
 multiply the default duration by 1/2^#, where # is the
 number of  &lt;  or  &gt; s.
 For  &lt;  ( &gt; ) Add that to the LHS(RHS) and subtract it from
 the RHS(LHS).  This usually (always?) results in a dotted rhythm
</DESCRIPTION>
</CLASS>
<CLASS value="cparen_rule">
<DESCRIPTION>
 For some reason abc allows a space between the closing note
 in a beam group and a closing paren.  Have a rule that does that.
</DESCRIPTION>
</CLASS>
<CLASS value="cparen_rule">
<DESCRIPTION>
 For some reason abc allows a space between the closing note
 in a beam group and an opening paren.  Have a rule that does that.
</DESCRIPTION>
</CLASS>
<CLASS value="dynamic_string">
<DESCRIPTION>
 The dynamics that ABC knows about that can be displayed on the
 screen or via midi.
</DESCRIPTION>
</CLASS>
<CLASS value="bang_rule">
<DESCRIPTION>
 some things are defined within the '!' fenceposts
 We glom these together under the bang rule.
</DESCRIPTION>
<METHOD value="convert">
<DESCRIPTION>
 We have found a match for the rule, which means we have matched a
 expression in the language.  Do whatever that expression tells us to.
</DESCRIPTION>
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="abc_quoted_string">
<DESCRIPTION>
 abc allows space after quotes and before the chords they accompany.
 Handle it.
</DESCRIPTION>
<METHOD value="convert">
<DESCRIPTION>
 We have found a match for the rule, which means we have matched a
 expression in the language.  Do whatever that expression tells us to.
</DESCRIPTION>
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="post_chord_stuff">
<DESCRIPTION>
 This is the stuff that can occur between the notes in a chord
 or at the end of a chord.
</DESCRIPTION>
</CLASS>
<CLASS value="multi_chord_rule">
<DESCRIPTION>
 This rule will match almost everything in legal abc that is
 expressed as multiple chords run together, except xlets.
 Note: here is where we start counting paren's for slurs/ties
</DESCRIPTION>
</CLASS>
<CLASS value="voice_definition_rule">
<DESCRIPTION>
 The V: command, which does many things like we said before
</DESCRIPTION>
</CLASS>
<CLASS value="voice_header">
<DESCRIPTION>
 Matches a voice header.
</DESCRIPTION>
</CLASS>
<CLASS value="voice_rule_all_inclusive">
<DESCRIPTION>
 Depending on whether or not we're allowing text-based
 voice rules, proxy to the correct object.
</DESCRIPTION>
</CLASS>
<CLASS value="beam_group_rule">
<DESCRIPTION>
 In abc a beam group is defined as any set of chords without a
 space.
</DESCRIPTION>
</CLASS>
<CLASS value="words_rule">
<DESCRIPTION>
 These are the words that actually go below the music.
</DESCRIPTION>
</CLASS>
<CLASS value="words_rule">
<DESCRIPTION>
 These are the words that are written free-hand
 below the music.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="array.cpp" dir="iabc">
</FILE>
<FILE value="array.h" dir="iabc">
<DESCRIPTION>
 Classes to handle arrays of arbitrary types.
</DESCRIPTION>
<CLASS value="array_data">
<DESCRIPTION>
 The array class uses the smart pointer pattern.  
 The memory allocated for the array is handled here.  Clients
 of the array classes should use array &lt;  &gt;  and not array_data.
</DESCRIPTION>
</CLASS>
<CLASS value="array">
<DESCRIPTION>
 A parameterized array class that allows effecient assignement and
 shallow copying.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the array.
 Args are optional.  No argmunts creates an empty array.
 int the_initial_size, the number of (un-initialized) elements in the array
 at creation time.  the_grow_size is the number of elements that we add when we
 expand the array.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 dereference the underlying data, when all references have been removed the data
 will be deleted.
</DESCRIPTION>
</METHOD>
<METHOD value="expand_to">
<DESCRIPTION>
 Create un-initialized elements until the array is the_index+1 elements.
</DESCRIPTION>
</METHOD>
<METHOD value="expand">
<DESCRIPTION>
 create num_elems additional un-initialzied elements in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="get_size">
<DESCRIPTION>
 return the number of elements (get_number_elements would have been a better name)
</DESCRIPTION>
</METHOD>
<METHOD value="T &amp; ">
<DESCRIPTION>
 return the element at the_index'th position.
</DESCRIPTION>
</METHOD>
<METHOD value="ctor">
<DESCRIPTION>
 dereference my data and reference the data of the_other.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_all">
<DESCRIPTION>
 remove all the elements and set the size of the array to 0
</DESCRIPTION>
</METHOD>
<METHOD value="remove_from_end">
<DESCRIPTION>
 Remove the last element of the array, effectively shrinking the array size by one.
</DESCRIPTION>
</METHOD>
<METHOD value="deep_copy">
<DESCRIPTION>
 copy all elements of the array from the_intput to the_output.
 Assumption is that the underlying arrays are not the same.
</DESCRIPTION>
</METHOD>
<METHOD value="do_to_all">
<DESCRIPTION>
 Invoke the_predicate(the_list[i]) for each element in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="add_to_end">
</METHOD>
</CLASS>
</FILE>
<FILE value="beamer.cpp" dir="iabc">
</FILE>
<FILE value="beamer.h" dir="iabc">
<CLASS value="beamer">
<DESCRIPTION>
 Beamer draws beams and flags on notes.  A note tells the
 beamer its coordinates as it is drawn, and the beamer computes
 the coordinates and shape of the beam and stem.
</DESCRIPTION>
<METHOD value="beamer">
<DESCRIPTION>
 Call the base class figure constructor with the screen dimensions.
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Since we beam according to note heads, we can't just map our points
 to another space; we need to actually clone the note heads first.
  virtual figure* clone(const rect &amp;  r1,const rect &amp;  r2,const size &amp;  ppi);
</DESCRIPTION>
</METHOD>
<METHOD value="beam_me">
<DESCRIPTION>
 When a note figure knows its coordinates, it calls this method to tell
 the beamer to add this note head to the beam group.  If there is no beam
 group then this note receives a stem but no beam.
</DESCRIPTION>
</METHOD>
<METHOD value="get_absolute_ul">
<DESCRIPTION>
 Unlike other figures, beamers know where they're really supposed to
 go.  Return that absolute point, and everything else is relative
 to that.  This makes it easier to move around
</DESCRIPTION>
</METHOD>
<METHOD value="get_xlet_points">
<DESCRIPTION>
 Get the points where the little xlet descriptions are supposed to go.
</DESCRIPTION>
</METHOD>
<METHOD value="get_upness_value/high_poitn/low_point/tail_width">
<DESCRIPTION>
 Get some geometry information about the figure so that we might draw it 
 correctly.
</DESCRIPTION>
</METHOD>
<METHOD value="force_direction">
<DESCRIPTION>
 For some notes, like with SATB parts, we like to force the beam to go a certain
 way.
</DESCRIPTION>
</METHOD>
<METHOD value="should_beam">
<DESCRIPTION>
 Return true if the value is either less than the level of the beam,
 or is a dotted level of the beam.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 The figure virtual method.  The window wants to draw the beam so its time
 to render the shape.
</DESCRIPTION>
</METHOD>
<METHOD value="create_xlet">
<DESCRIPTION>
 Draw the little number and the bracket associated with triplets and 
 other xlets.
</DESCRIPTION>
</METHOD>
<METHOD value="is_dotted">
<DESCRIPTION>
 return true if this value is a dotted version of the_base.  
 These have different flags than triplety things.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 The figure virtual method.
 Most figures use a bogotwip coordinate system based on PostScript.  But this
 shape is drawn to absolute screen coordinates, so set the linear xform
 for this polygon to 1:1.
</DESCRIPTION>
<METHOD value="point">
<DESCRIPTION>
 Get the highest connection point in our beam group.
</DESCRIPTION>
</METHOD>
<METHOD value="get_lowest_point">
<DESCRIPTION>
 Get the lowest connection point in our beam group.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_beam_segment">
<DESCRIPTION>
 A helper function to create_beam, that actually draws the beam and makes
 create_beam a little less complicated.  The draw_half variable indicates
 whether we draw the segment all the way to p2, or only 1/2 way.  the_left
 says we are drawing from left to right.
  
     --------                  ---------
     |--     |                 |    ----|
     |       |                 |        |
     |       |                 |        |
    0       0                  0        0
    half = true, left = true  half = false, left = false 
</DESCRIPTION>
</METHOD>
<METHOD value="create_tail">
<DESCRIPTION>
 If we need to put a tail on a single unbeamed 8th note,
 do that
</DESCRIPTION>
</METHOD>
<METHOD value="create_head_offset">
<DESCRIPTION>
 Offset the connection points depending on whether the
 stem goes up or down.
</DESCRIPTION>
</METHOD>
<METHOD value="set_hi_low">
<DESCRIPTION>
 figure out where the high and low points are.
</DESCRIPTION>
</METHOD>
<METHOD value="create_stems">
<DESCRIPTION>
 Create the stem going either to the beam or just up.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="int">
<DESCRIPTION>
 The depth in pixels of the beaming figure between note heads.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Beams always go up.  If the beam is actually down we need to start it below
 the note.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Where the note goes on the staff, sometimes used to determine the 'upness'
 of the note head.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Some interesting things about the geometry of the figure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_connection_points:array &lt; point &gt; ">
<DESCRIPTION>
 This is the place where the note heads go.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_beam_points:array &lt; point &gt; ">
<DESCRIPTION>
 This is the place where the beams go.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_original_beam_points">
<DESCRIPTION>
 This is for clone
 array &lt; point &gt;  my_original_beam_points;
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_xlet_values:array &lt; int &gt; ">
<DESCRIPTION>
 The xlet values that will be beamed under/over the beam groups
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_xlet_points">
<DESCRIPTION>
 Keep track of where the descriptions of the xlets are supposed
 to go.  We can't draw them because we don't know about fonts and
 windows and stuff.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_upness_values">
<DESCRIPTION>
 Indicate whether the beams go up or down.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_forced_upness">
<DESCRIPTION>
 1 or -1 if we are forced to beam up or down, otherwise it stays at
 0
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_durations">
<DESCRIPTION>
 Keep track of the durations of notes so we can beam them
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 The note head that goes on the note.
</DESCRIPTION>
<ATTRIBUTE value="my_is_grace">
<DESCRIPTION>
  True if this is a grace note.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="debug.h" dir="CVS">
</FILE>
<FILE value="dispatch.cpp" dir="CVS">
</FILE>
<FILE value="dispatch.h" dir="CVS">
<CLASS value="wd_command">
<DESCRIPTION>
 The command we are trying to send to the window will be 
 embedded in a wd command class.  A derived version of
 this class will actually be called in the correct thread.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 The dispatcher requires a window to send the command to.
</DESCRIPTION>
</METHOD>
<METHOD value="command_add_ref">
<DESCRIPTION>
 Implement reference counting so the window gets destroyed
 when everybody's done with it and not before.
</DESCRIPTION>
</METHOD>
<METHOD value="get_default_canvas">
<DESCRIPTION>
 We assume that there's always 1 'main' window that is always available to
 dispatch your commands for you, if you need to dispatch something but don;e
 know about a particular window class (which is often the case with dialog
 boxes).
</DESCRIPTION>
</METHOD>
<METHOD value="do_command">
</METHOD>
</CLASS>
<CLASS value="dispatcher">
<DESCRIPTION>
 A dispatcher takes a set of wd_command objects and queues them
 up and sends them to the correct thread.  If we are already in the
 correct thread and blocking is on then we execute it right then and 
 there.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="drawtemp.cpp" dir="CVS">
</FILE>
<FILE value="drawtemp.h" dir="CVS">
</FILE>
<FILE value="draw_figure.cpp" dir="CVS">
</FILE>
<FILE value="draw_figure.h" dir="CVS">
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="event.cpp" dir="CVS">
</FILE>
<FILE value="event.h" dir="CVS">
<DESCRIPTION>
 Classes to handle events safely and efficiently
</DESCRIPTION>
<CLASS value="event_handler_if">
<DESCRIPTION>
 The interface to an event handler, that an event
 source knows about.  This breaks up the circular
 dependency between source and handler using the
 obserer pattern.
</DESCRIPTION>
<METHOD value="Add/Remove">
<DESCRIPTION>
 Event Handlers and event sources need to keep reference
 counts to each other very carefully.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_event">
<DESCRIPTION>
 A source object call this instance of a handler that
 it knows about.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="EventSource">
<DESCRIPTION>
 A class that represents an event that could occur.  It is capable
 of notifying  event handlers that the event has occured.
</DESCRIPTION>
<METHOD value="add_event_handler">
<DESCRIPTION>
 An event handler wants to be informed if this event fires;
 Add it to the list of events we notify in the event of an event.
</DESCRIPTION>
</METHOD>
<METHOD value="RemoveEventHandler">
<DESCRIPTION>
 The event handler no longer cares about this event.  Remove it from
 the list.
</DESCRIPTION>
</METHOD>
<METHOD value="NotifyHandlers">
<DESCRIPTION>
 The event has occured!  Notify all event handlers that the event has
 occured.
</DESCRIPTION>
</METHOD>
<METHOD value="pre/post">
<DESCRIPTION>
 Before and after the event handler adds the event, there may be special things
 that we need to do, like set a timer in the case of a timer for example.
</DESCRIPTION>
</METHOD>
<METHOD value="AddEventHandlerToList">
<DESCRIPTION>
 Protected method that actually adds the handler to the linked list.
</DESCRIPTION>
</METHOD>
<METHOD value="PopulateHandlerList">
<DESCRIPTION>
 We need threadsafe access to our internal list, but we can't block while
 we're notifying events.  So we just deep copy our internal list and we don't
 have to worry about the list changing underneath us.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="EventHandler">
<DESCRIPTION>
 An event handler can block on events until they occur.  Many event
 handlers can be or'd together so that we can wait on the first of many
 things at once.
</DESCRIPTION>
<METHOD value="operator|">
<DESCRIPTION>
 Add the_other to the list of events in this event
 chain.
</DESCRIPTION>
</METHOD>
<METHOD value="wait">
<DESCRIPTION>
 Set the event source for all the events in the chain, and
 then pend on the semaphore that indicates that the event has
 occured.
</DESCRIPTION>
</METHOD>
<METHOD value="get_event_source">
<DESCRIPTION>
 This is the part that must be derived.  Each instance of an event
 handler should know how to get an instance of the source that it
 can wait on.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_event">
<DESCRIPTION>
 This is called when the event source fires.  The event chain will
 then be torn down and the thread that was waiting on the event will
 be allowed to continue.
</DESCRIPTION>
</METHOD>
<METHOD value="Rearm">
<DESCRIPTION>
 Allow an event to be reused.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_source">
<DESCRIPTION>
 This is the actual source that I am waiting on.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="set_event_source">
<DESCRIPTION>
 The generic logic that calls GetEventSource.  An excpetion
 is thrown here if the event source already exists.
</DESCRIPTION>
</METHOD>
<METHOD value="add_handler_to_chain">
<DESCRIPTION>
 the_next is an event handler in the chain.  This is used\
 when setting up the 'or' chain.
</DESCRIPTION>
</METHOD>
<METHOD value="pass_event_to_first">
<DESCRIPTION>
 Only one event in a chain is the 'first', which is the one
 that ends on blocking.  Make sure we always release the block
 from that point to assure deterministic behavior.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 The pending has ended.  The event has fired.  Tear down the event
 chain.
</DESCRIPTION>
<METHOD value="zero/add/remove">
<DESCRIPTION>
 When handling events in chains, the actual values can be zeroed
 out underneath us when the chain is released.  Prevent the events
 and sources from being released prematurely.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_sem">
<DESCRIPTION>
 The semaphore that we are pending on.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_next/last">
<DESCRIPTION>
 The other events in the chain.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="event_log.cpp" dir="CVS">
</FILE>
<FILE value="event_log.h" dir="CVS">
<DESCRIPTION>
 Log all kinds of events and changes in program state.  Not
 to be confused with events, which are a specific concurrent
 type.
</DESCRIPTION>
<CLASS value="base_event_data">
<DESCRIPTION>
 Most events have this data in common so we have a
 class for it to save some typeing.
</DESCRIPTION>
</CLASS>
<CLASS value="base_event_log">
<DESCRIPTION>
 A container for event log data.  Methods used for
 printing, logging.  The data that is actually in
 the log is implementation-specific
</DESCRIPTION>
<METHOD value="base_event_log">
<DESCRIPTION>
 Initialize the common data.  the_size is the
 number of events and the_num_params is the number
 of parameters in each event.
</DESCRIPTION>
</METHOD>
<METHOD value="get_first_event_index">
<DESCRIPTION>
 When printing out the events, we use get_first_event_index to
 get the index of the oldest event in the circular queue
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_event_index">
<DESCRIPTION>
 When printing out the events, we use get_last_event_index to
 get the index of the most recent event in the circular queue
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_size">
<DESCRIPTION>
 Return the number of events in this particular log.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Print the log entry into a character buffer in human-readable format.
</DESCRIPTION>
</METHOD>
<METHOD value="print_log">
<DESCRIPTION>
 Dump the entire log file to the stream f.
</DESCRIPTION>
</METHOD>
<METHOD value="get_timestamp">
<DESCRIPTION>
 return the timestamp for an event log.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_size">
<DESCRIPTION>
 the number of events in this log
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_index">
<DESCRIPTION>
 the current index into the circular buffer.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_wrapped">
<DESCRIPTION>
 true if the event log has wrapped.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_num_params">
<DESCRIPTION>
 The number of parameters in a single event.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="event_log_template">
<DESCRIPTION>
 Most event logs are exactly the same except for the
 strings used to describe the numerical parameters and
 the number of parameters per event.  This template handles
 all of those types of events.
</DESCRIPTION>
<DESCRIPTION>
 The title is printed out before the entire log is dumped.
</DESCRIPTION>
<METHOD value="log_event">
<DESCRIPTION>
 Store an event in the event log array.  The enumeration is
 one of the types of events defined for EventType
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="char_log_template">
<DESCRIPTION>
 Some event logs have variable-sized events.  Each event generates
 some text that is variable size and some numerical events that are
 of fixed size.
</DESCRIPTION>
<METHOD value="log_event">
<DESCRIPTION>
 Log the event.  The first parameter is the variable-sized part,
 which is represented as a character string.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="the_event_array">
<DESCRIPTION>
 the log of event data.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_byte_array">
<DESCRIPTION>
 the array for the variable-sized character data.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="windows_event_data">
<DESCRIPTION>
 A single windows event.  The interface allows the template class
 event_log_template to manage these events.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="dispatch_event_data">
<DESCRIPTION>
 A single dispatch event.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="doc_event_data">
<DESCRIPTION>
 The lifetime of a document and things that happen to it.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="figure_event_data">
<DESCRIPTION>
 A figure (e.g. a picture of a note) has changed.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="event_event_data">
<DESCRIPTION>
 Data to log a single event.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="parser_event_data">
<DESCRIPTION>
 A single parser event.
</DESCRIPTION>
<ATTRIBUTE value="my_event">
</ATTRIBUTE>
<ATTRIBUTE value="my_data">
<DESCRIPTION>
 This is some data that is common to all events
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="parser_event_data">
<DESCRIPTION>
 A single parser event.
</DESCRIPTION>
<ATTRIBUTE value="my_event">
</ATTRIBUTE>
<ATTRIBUTE value="my_data">
<DESCRIPTION>
 This is some data that is common to all events
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="factory.cpp" dir="CVS">
</FILE>
<FILE value="factory.h" dir="CVS">
<CLASS value="factory">
<DESCRIPTION>
 Define a template for a function that returns an instance of a class
 where the actual create function is defined at link time.
</DESCRIPTION>
</CLASS>
<CLASS value="globalton">
<DESCRIPTION>
 Define a static instance that is guaranteed to be created at the
 right time if it is referenced before 'main'.  Good for class factories.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="figure.cpp" dir="CVS">
</FILE>
<FILE value="figure.h" dir="CVS">
<CLASS value="figure">
<DESCRIPTION>
 Define a renderable thing.  The abstract method render_poly must be
 overridden to define the point in the polygon.  Additional
 virtual method control scaling, composite objects and other goodies.
</DESCRIPTION>
</CLASS>
<CLASS value="draw_command &lt; figure,point &gt; ">
</CLASS>
<CLASS value="point_figure_pair">
<DESCRIPTION>
 This will come in handy to describe a figure and the point where it is to
 be rendered.
</DESCRIPTION>
<METHOD value="figure(cost">
<DESCRIPTION>
 Since rendering in abcmacs is done in bogotwips (100*twips),
 we need to make sure that we know how many pixels to an inch.
 The figures work out best if we transform to screen coordinates
 when rendering the figure rather than rendering in twips and
 fixing it later.
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Create a new figure based on this figure
</DESCRIPTION>
</METHOD>
<METHOD value="rescale">
<DESCRIPTION>
 Reset the scale.  Since we render on a scale-specific canvas,
 that means re-rendering the polygon.  Note that, since many figures
 are shared between many clients, re-scaling a figure could have
 strange results if everything else isn't rescaled, also.
</DESCRIPTION>
</METHOD>
<METHOD value="add/remove">
<DESCRIPTION>
 Handle reference counting
</DESCRIPTION>
</METHOD>
<METHOD value="get...point">
<DESCRIPTION>
 Get the extreme points (leftmost, etc) points
 in a figure.
</DESCRIPTION>
</METHOD>
<METHOD value="get_size_in_pixels">
<DESCRIPTION>
 Returns size in pixels and ul in terms of offset from starting point
</DESCRIPTION>
</METHOD>
<METHOD value="get_bounding_box">
<DESCRIPTION>
 Return the bounding box of the rectangle if it were drawn at the
 given point.
</DESCRIPTION>
</METHOD>
<METHOD value="get_middle">
<DESCRIPTION>
 return the middle point of the bounding box that surrounds the figure.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 You can get this from the size one, but its useful by itself
</DESCRIPTION>
<METHOD value="dispatch_draw_self">
<DESCRIPTION>
 Draw the figure in the window thread at the point the_origin on the
 window w.
</DESCRIPTION>
</METHOD>
<METHOD value="get_extreme_point">
<DESCRIPTION>
 Returns the topmost, leftmost, etc. actual point.  Good for
 connecting figures together.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Remove references to contained figures.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 method called by dispatcher template class.  This method
 will always be called in the windows thread.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="render_poly">
<DESCRIPTION>
 Render the polygon, either so it can be drawn or for sizing.
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_ppi">
<DESCRIPTION>
 The pixels per inch that we use to reference our points.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_scale">
<DESCRIPTION>
 The scaling constant we use when deciding how big things are.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_poly">
<DESCRIPTION>
 The polygon that defines the figure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_polygon_rendered">
<DESCRIPTION>
 True if we have rendered, so we only have to do it once.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_count">
<DESCRIPTION>
 reference count, delete this when 0.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="set_pen_width">
<DESCRIPTION>
 set the pen width for drawing this figure before rendering.
</DESCRIPTION>
</METHOD>
<METHOD value="calculate_scaled_pen_width">
<DESCRIPTION>
 Sometimes, especially for outlined objects, its good to get 
 the pend width based on the scale and ppi of this object.  Do
 that here.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_pen_width">
</ATTRIBUTE>
<ATTRIBUTE value="my_is_scaled">
<DESCRIPTION>
 Indicates the pen width is scaled.  I added this when I realized
 that cloned_figure broke my scaled_figure inheritance, but left
 the scaled_figure class out of laziness.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="scaled_figure">
<DESCRIPTION>
 A figure that uses a pen width based on the
 current scale.
</DESCRIPTION>
</CLASS>
<CLASS value="cloned_figure">
<DESCRIPTION>
 A cloned figure uses the polygons from a figure class
 but maps the points to a different rectangle.  We have
 to re-render the polygon in order to handle the different
 scaling without aliasing.
</DESCRIPTION>
<METHOD value="create_poly">
<DESCRIPTION>
 ctor
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="figure_factory.cpp" dir="CVS">
</FILE>
<FILE value="figure_factory.h" dir="CVS">
<CLASS value="figure_factory">
<DESCRIPTION>
 Create and manage figures that are fixed.  that is,
 they have the same set of points regardless of where the
 center of the figure is.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="gm.cpp" dir="CVS">
</FILE>
<FILE value="gm.h" dir="CVS">
<DESCRIPTION>
 Geometry Management. Stand-alone functions that compute coordinates of 
 things in relation to a staff, but didn't belong any place else.
 Basically these functions will compute the correct spot to place a note
 given some basic information about the note and the staff.
</DESCRIPTION>
<DESCRIPTION>
 Compute the coordinate to place the figure, if you want it to represent
 the_note place on the_staff.
</DESCRIPTION>
<DESCRIPTION>
 Find the height of the note, if the staff height is the_staff_heigh and the
 center of the staff is center_line.  Value is offset from the center of 
 the staff.
</DESCRIPTION>
<DESCRIPTION>
 Get the vertical placement of the given pitch, if the given staff is
 the_staff_height.
</DESCRIPTION>
</FILE>
<FILE value="iabc.h" dir="CVS">
</FILE>
<FILE value="iabc_media.cpp" dir="CVS">
</FILE>
<FILE value="iabc_media.h" dir="CVS">
<CLASS value="iabc_media">
<DESCRIPTION>
 This class reads in an abc file, and converts it to the
 universal internal format.  Then it sends this internal music
 to the media for the music to be realized.
</DESCRIPTION>
<METHOD value="iabc_media(ctor)">
<DESCRIPTION>
 Store the file that we will open later and try to parse.
</DESCRIPTION>
</METHOD>
<METHOD value="parse(media &amp; ">
<DESCRIPTION>
 parse the input file and tell the media what we've found so the
 music can be realized somehow.
</DESCRIPTION>
</METHOD>
<METHOD value="set_modified">
<DESCRIPTION>
 The buffer has been modified.  Set up the last modified time as the current time.
</DESCRIPTION>
</METHOD>
<METHOD value="get_start_line_of_tune">
<DESCRIPTION>
 Return the line that the tune we just partsed started on.
</DESCRIPTION>
</METHOD>
<METHOD value="present_all">
<DESCRIPTION>
 We have parsed a file.  Now display all the music.
</DESCRIPTION>
</METHOD>
<METHOD value="get_points">
<DESCRIPTION>
 We have changed parts so we weren't reading the music in in order.
 Get the points we saved the last time, and save the current point
 of measure and chord for when we change back to this part/voice.
</DESCRIPTION>
</METHOD>
<METHOD value="get_current_tune">
<DESCRIPTION>
 Get the current tune selection from the GUI, and also save that in the
 registry for next time we open the file.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_has_parsed">
<DESCRIPTION>
 Indicates whether or not we have parsed a file already so we can
 display different parts of a file without reloading the file, which
 can take a long time if the file is big.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 The number of tunes in the parser, used to see if we need to
 re-parse the file.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="iabc_media_manager.cpp" dir="CVS">
</FILE>
<FILE value="iabc_media_manager.h" dir="CVS">
<DESCRIPTION>
 This is it.  There is where the parser is created and the window
 that the parser draws on is created.  It must know about all things
 including wxWindows stuff because it creates things explicitly
</DESCRIPTION>
<CLASS value="wx_tune_list_control">
<DESCRIPTION>
 Display a list of tunes that the media read in.  We need to use
 the tune box to do this.
</DESCRIPTION>
</CLASS>
<CLASS value="iabc_media_manager">
<DESCRIPTION>
 Allow a user to open and parse and iabc file, then display it on a window
 somewhere.  Also handles printing and midi.
</DESCRIPTION>
<METHOD value="click">
<DESCRIPTION>
 someone has clicked on the area of the window that
 contains this document.
</DESCRIPTION>
</METHOD>
<METHOD value="ctor">
<DESCRIPTION>
 Do many things.
</DESCRIPTION>
</METHOD>
<METHOD value="entry_point">
<DESCRIPTION>
 Handle the entry point of the thread.  The parsing and construction of the music is
 done in this thread.
</DESCRIPTION>
</METHOD>
<METHOD value="rescale">
<DESCRIPTION>
 Handle where the user has chosen a different rendering scale.
</DESCRIPTION>
</METHOD>
<METHOD value="print">
<DESCRIPTION>
 send it to the printer in wxWindows
</DESCRIPTION>
</METHOD>
<METHOD value="attach_canvas">
<DESCRIPTION>
 Someone has created a document and is now attaching it to a window.  Let the window know
 that we exist and keep track of it so that we can draw on something.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 The document is closing or has closed.  Its no good anymore so remove all references to it.
</DESCRIPTION>
<METHOD value="restart">
<DESCRIPTION>
 Start the thread and parse the same file again.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Indicates that the parse is still on-going so we can't respond to the drawing commands yet.
</DESCRIPTION>
<DESCRIPTION>
 Document method that returns what part of the window a page in a document occupies. Used
 in printing.
</DESCRIPTION>
<METHOD value="open">
<DESCRIPTION>
 Open the following abc file and parse it.
</DESCRIPTION>
</METHOD>
<METHOD value="play">
<DESCRIPTION>
 Create a midi file based on the current tune.
</DESCRIPTION>
</METHOD>
<METHOD value="close">
<DESCRIPTION>
 Close the file we were just looking at and free all resources.
</DESCRIPTION>
</METHOD>
<METHOD value="has_page">
<DESCRIPTION>
 Usually for printing, return this information
</DESCRIPTION>
</METHOD>
<METHOD value="choose_tune">
<DESCRIPTION>
 Choose a tune from the file we have already opened.
</DESCRIPTION>
</METHOD>
<METHOD value="refresh_current_tune">
<DESCRIPTION>
 The user wants to refresh a tune that he is editing.
 PARAMS:
 the_last_cursor - the last cursor position.  We'd like to restore
 this after the system has finished rendering the image so the user
 doesn't have to scroll back on every redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_tick">
<DESCRIPTION>
 We check and update some things every so often on a tick from the
 GUI.
</DESCRIPTION>
</METHOD>
<METHOD value="get_screen_pos_from_text_line">
<DESCRIPTION>
 Get the screen position in pixels from the location of the cursor in the text buffer
</DESCRIPTION>
</METHOD>
<METHOD value="transpose-selection">
<DESCRIPTION>
 transpose the selected text the given number of 1/2 steps (or letters if it is diatonic)
 PARAMETERS:
 the_steps - the number of steps (1/2 or diatonic) to transpose
 the_diatonic - true if we transpose letter values only.
 the_start - the start place of the selection in the buffer
 the_stop  - the stop place of the selection in the buffer
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_names">
<DESCRIPTION>
 Return the list of voice names for the GUI.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_status">
<DESCRIPTION>
 Get the on/off voice status of the voices in the tune.
</DESCRIPTION>
</METHOD>
<METHOD value="set_voice_on_map">
<DESCRIPTION>
 Set the voice map when the user has edited it from the menu.
</DESCRIPTION>
</METHOD>
<METHOD value="print_page">
<DESCRIPTION>
 This is something we owe document.  We assume that
 the printing is already set up, and we just need
 to tell the page to print itself.
</DESCRIPTION>
</METHOD>
<METHOD value="setup_pages">
<DESCRIPTION>
 Set up the page settings and stuff.
</DESCRIPTION>
</METHOD>
<METHOD value="rerender">
<DESCRIPTION>
 We are printing.  Don't read in the music again but render
 the music again.  Make sure the scale is 1/1
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_view_canvas">
<DESCRIPTION>
 This is the wxWindow instance where the music drawing occurs.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="map &lt; int,bool &gt; ">
<DESCRIPTION>
 keep track of the 'voice on map' when we are refreshing
 the tune.  This will tell the tune which voices to turn
 on in the new tune.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_abc_window">
<DESCRIPTION>
 This is the iabc-defined window, which contains a view-canvas window
 and interacts with classes like figure and text_figure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_list_box">
<DESCRIPTION>
 This is the actual wx object that the tune list gets drawn into.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_tune_list">
<DESCRIPTION>
 This is the gadget that we pass to the iabc_media that accepts all
 the tunes that it creates.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_is_parsing">
<DESCRIPTION>
 Set this to indicate that we are still parsing this file, os
 we should not try and open a new file.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_is_changing_tunes">
<DESCRIPTION>
 True if we are opening a new tune in a collection, so we need to
 set the buffer position to the start point of the new tune.
 Otherwise we preserve the existing buffer position.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_media">
<DESCRIPTION>
 This is where the music information gets displayed.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_print_media">
<DESCRIPTION>
 This is where the print information gets displayed.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_source">
<DESCRIPTION>
 The thing that parses the abc file and makes the music data structures.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_can_restart">
<DESCRIPTION>
 We set this to true when we have finished displaying the music and the
 parsing thread exits, so that we cna restart.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_filename">
<DESCRIPTION>
 This lets us tall the iabc source which file to open.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_text_position">
<DESCRIPTION>
 the last positition within the text buffer that we were.  Used to
 reposition the cursor after refreshes.  Unless we're changing tunes,
 then we don't want to replace the cursor since the program will change
 the cursor position.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_text_y">
<DESCRIPTION>
 This is used to center the screen on a redraw around the part of the
 tune that we were last editing.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_redraw_time">
<DESCRIPTION>
 We set this every time we redraw something so we don't have to
 redraw when nothing's changed.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="midi_media*">
<DESCRIPTION>
 The midi output place.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wx_text_buffer &amp; ">
<DESCRIPTION>
 The buffer where the ABC text lives.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_text_pointer">
<DESCRIPTION>
 This is the last place we drew the handy text pointer.  Note that
 this is a pointer to the GUI music that indiates where the text is,
 not a pointer to the text window itself.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="iabc_parse.cpp" dir="CVS">
</FILE>
<FILE value="iabc_parse.h" dir="CVS">
<DESCRIPTION>
 Drive the parser rules that define the abc language, at least as iabc
 understands them.
</DESCRIPTION>
<CLASS value="abc_parseable_unit">
<DESCRIPTION>
 Keep track of a line or so of an abc file and the musical
 information that came out of it from the parser.  This can keep us
 from having to re-parse an unchanged line of abc.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Parse this line of text, update the parser state and store all of the
 musical information.
</DESCRIPTION>
</METHOD>
<METHOD value="check_match">
<DESCRIPTION>
 return true if this string matches the string that I was
 created with,  or if the timestamp is earlier than the
 last time I was created.
 If this returns true, the_info and the_start_voice will contain
 the voice and parser_info that were present at the end
 of this line when it was first parsed.
</DESCRIPTION>
</METHOD>
<METHOD value="clear_match_text">
<DESCRIPTION>
 Indicate that check_match() has returned false.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="void">
<DESCRIPTION>
 This is called by the constructor and actually performs the work
 of parsing the line of code we were fed when we were created.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="parse_words">
<DESCRIPTION>
 Parse the w: header.
</DESCRIPTION>
</METHOD>
<METHOD value="put_chords_into_array()">
<DESCRIPTION>
 Put the chords into an array (they are stored in list format)
 so that we may put the words to them.
</DESCRIPTION>
</METHOD>
<METHOD value="advance_array">
<DESCRIPTION>
 Also used when putting words with the chord infos.
 RETURNS:
 true if the array still has stuff left in it.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="string">
<DESCRIPTION>
 The line that I was created with
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 Keep track of the first measure of the last line, which is where we start putting the
 words.
</DESCRIPTION>
<ATTRIBUTE value="array &lt; measure_or_header::match_type &gt; ">
<DESCRIPTION>
 The array of all the matches.  The match type will indicate
 whether the current match type is a header, measure, or whatever
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="list &lt; header_rule_info &gt; ">
<DESCRIPTION>
 The header rules that we created from parsing our string
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="list &lt; measure_rule_info &gt; ">
<DESCRIPTION>
 the match rules that we created from parsing our string.  The
 parser state info could change during any
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="parser_state_info">
<DESCRIPTION>
 Each rule is matched in the context of a parser state.  Keep track of the
 parser state at the start of this line, if the line is same and the parser
 state is the same then the line is unchanged so all the misical information is
 also unchanged.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="bool">
<DESCRIPTION>
 Indicates that we have a match.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 This is the line number of the text file that was matched.  We keep
 track of this so that we can track the music with the text in the GUI.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="time_t">
<DESCRIPTION>
 Don't even bother looking at the line if the buffer hasn't changed since
 my_modified_time.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="iabc_parse">
<DESCRIPTION>
 This class invokes the pre-processor to get a line of text
 and then adds the music to the supplied media_source object.
</DESCRIPTION>
</CLASS>
<CLASS value="tune_index_info">
<DESCRIPTION>
 Keep the index in to the file for quickly finding a tune.
</DESCRIPTION>
<METHOD value="iabc_media(ctor)">
<DESCRIPTION>
 Store the file name that we will open later and try to parse.
</DESCRIPTION>
</METHOD>
<METHOD value="get_start_line_of_tune">
<DESCRIPTION>
 retunr the starting line of the tune that we just parsed.
</DESCRIPTION>
</METHOD>
<METHOD value="parse(media &amp; ">
<DESCRIPTION>
 parse the input file and tell the media what we've found so the
 music can be realized somehow.  Get the tune from the file, based
 in the tune at the given index.
</DESCRIPTION>
</METHOD>
<METHOD value="quick_parse">
<DESCRIPTION>
 Do a parse of just the T: and the X: headers
</DESCRIPTION>
</METHOD>
<METHOD value="parse_measure(medai &amp; ,int &amp; ,preprocess &amp; )">
<DESCRIPTION>
 get the next measure and deal with it from the abc file.  Some
 measures are split across several lines so send the file in too,
 and keep track of the measure number.
 ARGS:
 int the_measure - the last measure we read in
 bool read_in_music - true if we've read in some music and we need
           a line break
 preprocess &amp;  the_file - the file we're reading in.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="string">
<DESCRIPTION>
 Get the next line of text.  This can actually be more than
 one line of text, if there are words that are associated with this
 line of abc stuff.  Also get the line number of the file so that we
 can associate it with this spot in the music.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="is_there_text_left">
<DESCRIPTION>
 return true if there is text left to read in the current tune.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="bool">
<DESCRIPTION>
 Because of the way we associate words with chord_info structures, we have to
 parse the word header (w:) outside if the state machine rules as well as
 in the word rule itself.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="void">
<DESCRIPTION>
 Read through all the lines of the file, and feed each line to a new
 parseable unit for parsing.  But, if we already have a parseable unit in the list that
 has parsed this line then don't bother reparsing.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="update_measure_line_pair">
<DESCRIPTION>
 We want to make the lowest measure in a line be the key for that line
 for playing and indicating the place in the music.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_measure_match(measure_rule &amp; ,media &amp; ,int &amp; ,fraction &amp; )">
<DESCRIPTION>
 We've found a measure's worth of music.  Handle it and update the
 current measure and beat.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_header_change(media &amp; ,header_rule &amp; ,const">
<DESCRIPTION>
 We have received a header at the given score point.  Record it and make any
 required changes.  Also reset the_measure_index to 1 if we are on a new
 tune.
</DESCRIPTION>
</METHOD>
<METHOD value="get_measure_from_voice">
<DESCRIPTION>
 Return the last measure we read from the_voice.  If this is the
 first one, we return 0.
</DESCRIPTION>
</METHOD>
<METHOD value="update_measure_from_voice">
<DESCRIPTION>
 We have just changed voices, so update the new measure since it may
 be different than the last voice was.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="string">
<DESCRIPTION>
 Keep track of the last line that we read in from the scanner, if there are
 words in this line then we combine it with earlier lines into one parseable
 unit.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_line_number">
<DESCRIPTION>
 Keep track of the last line number that we read in from the user.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_start_line_of_tune">
<DESCRIPTION>
 Keep track of the line in the text buffer that a song starts on
 so that we can scroll to there if we like.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_voice_measure">
<DESCRIPTION>
 When we switch voices in the parse, we need to keep track of what
 measure index we were on last time.  Keep that information here.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_songwords">
<DESCRIPTION>
 map of words that go below the staff, to the point in the music where they go.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_tunes">
<DESCRIPTION>
 Tunes that we get in a quick parse of an abc file.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 Keep track of the first measure of the last line, which is where we start putting the
 words.
</DESCRIPTION>
<ATTRIBUTE value="my_text_buffer">
<DESCRIPTION>
 text buffer for input
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="reset">
<DESCRIPTION>
 Reset all the internal state things that I keep track of for a fresh parse of
 a file.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Keep track of which line corresponds to which line of
 text for GUI magic later on.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="iabc_preferences.cpp" dir="CVS">
</FILE>
<FILE value="iabc_preferences.h" dir="CVS">
</FILE>
<FILE value="key_sig.cpp" dir="CVS">
</FILE>
<FILE value="key_sig.h" dir="CVS">
<CLASS value="key_sig">
<DESCRIPTION>
 Handle all the logic and resources associated with drawing a key
 signature on a staff.
</DESCRIPTION>
<METHOD value="key_sig">
<DESCRIPTION>
 Just populate variables.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 draw yourself on the page, on the staff supplied.  Draw the ending bar if this is
 an inline key change.
</DESCRIPTION>
</METHOD>
<METHOD value="get_number_figures">
<DESCRIPTION>
 gets the number of sharps or flats
</DESCRIPTION>
</METHOD>
<METHOD value="get_number_naturals">
<DESCRIPTION>
 If this is an inline key change, indicate how many naturals to put down
 if we are going to a more-natural key.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="line_of_music.cpp" dir="CVS">
</FILE>
<FILE value="line_of_music.h" dir="CVS">
<CLASS value="line_of_music">
<DESCRIPTION>
 A line_of_music is a container for all the stuff that gets drawn on one line
 of music.  It also takes care of drawing fixtures of the staff (like
 the key signature) and the staff itself.
 Aside from that, the line_of_music does the horizontal justification that
 keeps the notes evenly spaced.
</DESCRIPTION>
<METHOD value="line_of_music">
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Free all the graphical resources we use to draw ourselves.
</DESCRIPTION>
</METHOD>
<METHOD value="add_measure">
<DESCRIPTION>
 Add another measure to this staff.  Future notes will be added to that measure.
</DESCRIPTION>
</METHOD>
<METHOD value="add_nth_ending">
<DESCRIPTION>
 Add an 1st, 2nd etc. ending bracket over the music between the given measures.
</DESCRIPTION>
</METHOD>
<METHOD value="add_slur_from">
<DESCRIPTION>
 add a slur from the previous point in the music.  The point in the music
 where we're slurring to will be added later.
</DESCRIPTION>
</METHOD>
<METHOD value="add_slur_to">
<DESCRIPTION>
 Finish the slur that was last added with add_slur_from
</DESCRIPTION>
</METHOD>
<METHOD value="get_start_measure">
<DESCRIPTION>
 get the measure that we start with
</DESCRIPTION>
</METHOD>
<METHOD value="get_end_measure">
<DESCRIPTION>
 get the measure that we end with
</DESCRIPTION>
</METHOD>
<METHOD value="get_number_measures">
<DESCRIPTION>
 just subtract the from and the to.
</DESCRIPTION>
</METHOD>
<METHOD value="render">
<DESCRIPTION>
 This draws everything.
</DESCRIPTION>
</METHOD>
<METHOD value="does_rect_overlap">
<DESCRIPTION>
 Return true if the rectangle overlaps any of the regions of the
 staff.  Used by the page manager (window_media) to draw page
 fixtures without ruiing the music.
</DESCRIPTION>
</METHOD>
<METHOD value="add_note_figure">
</METHOD>
<METHOD value="add_crescendo">
<DESCRIPTION>
 Add a creschendo/dimenuendo to the staff from/to the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_dynamic">
<DESCRIPTION>
 This adds a dynamic change (pp, p, etc) to the list for later rendering
</DESCRIPTION>
</METHOD>
<METHOD value="get_high_point">
<DESCRIPTION>
 Get the highest y coordinate, which is the lowest point on the screen tha this
 staff takes up.
</DESCRIPTION>
</METHOD>
<METHOD value="add_y_offset">
<DESCRIPTION>
 We decided this staff needs an offset different that the y
 coordinate.  Change the y coordinate of the origin.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_info">
</METHOD>
<METHOD value="get_lowest_score_point">
<DESCRIPTION>
 return the lowest musical point on this staff, good for making hashtables.
</DESCRIPTION>
</METHOD>
<METHOD value="render_ornaments">
<DESCRIPTION>
 We need to add the ornaments after we draw all the notes cause then
 we know which way the beams go.  This should be called after the notes
 are rendered or nothing will happen.
</DESCRIPTION>
</METHOD>
<METHOD value="operator">
<DESCRIPTION>
 A lot of fixtures need some basic information about a staff before
 rendering themselves.  This is information about this staff for figures
 to use when drawing themselves.  It also reflects my current position
 horizontally as I'm drawing from left to right.
</DESCRIPTION>
</METHOD>
<METHOD value="get_width_of_words">
<DESCRIPTION>
 get the width of the words below the notes.  If they are wider
 than the note head, use this for the width.
</DESCRIPTION>
</METHOD>
<METHOD value="render_figures">
<DESCRIPTION>
 render the notes into figures.
</DESCRIPTION>
</METHOD>
<METHOD value="render_words">
<DESCRIPTION>
 render the words for the first time.
</DESCRIPTION>
</METHOD>
<METHOD value="render_part">
<DESCRIPTION>
 render the 'part' string, which is the letter marking
 used at different places in the music.
</DESCRIPTION>
</METHOD>
<METHOD value="render_dynamics">
<DESCRIPTION>
 render the dynamics.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_time_signature">
<DESCRIPTION>
 draw the time signature on the point at the given location.  Update
 the point based on my width.
</DESCRIPTION>
</METHOD>
<METHOD value="get_time_signature">
<DESCRIPTION>
 return the time signature for the given measure.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_beginning_repeat">
<DESCRIPTION>
 If there is a repeat sign at the beginning of the measure, draw that.
</DESCRIPTION>
</METHOD>
<METHOD value="render_bar_at">
<DESCRIPTION>
 Draws the end-of-measure figures
</DESCRIPTION>
</METHOD>
<METHOD value="get_note_pixels">
<DESCRIPTION>
 We try to spread out the notes on a staff as much as possible.  If we
 do this in a uniform way, this guarantees that we will always line up
 parts from the same points of a score, if we can.
 RETURNS:
 The number of points that this note figure should take up.  This will
 always be at least the width of the figure.
 ASSUMPTIONS:
 We assume that the get_leftover_pixels() has already been run, as this
 will use my_rhs_overlap and my_spare_pixels
</DESCRIPTION>
</METHOD>
<METHOD value="get_leftover_pixels">
<DESCRIPTION>
 Go through all the figures in this staff, and figure out how many
 pixels they would take up.  Fill in some class information about
 how many pixels in all so we can justify the notes.
</DESCRIPTION>
</METHOD>
<METHOD value="get_pixels_from_duration">
<DESCRIPTION>
 Get the number of pixels a note of this duration shoudl take
 up, given the number of pixles and number of beats in this
 staff.
</DESCRIPTION>
</METHOD>
<METHOD value="count_measure_pixels">
<DESCRIPTION>
 Count the numer of pixels taken by measure end things.  We use
 this to justify the music
</DESCRIPTION>
</METHOD>
<METHOD value="draw_ledger_lines">
<DESCRIPTION>
 Determine if we need ledger lines and draw them.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_little_numbers">
<DESCRIPTION>
 Draws the little measure numbers on the left hand side
</DESCRIPTION>
</METHOD>
<METHOD value="get_barline_width">
<DESCRIPTION>
 Get the width of the barline figure for the end of measure x.
</DESCRIPTION>
</METHOD>
<METHOD value="get_bar_width">
<DESCRIPTION>
 Get the width of bar in pixels, once its been drawn.  Assumes that the
 bar points have been populated already.
</DESCRIPTION>
</METHOD>
<METHOD value="get_bar_width">
<DESCRIPTION>
 Get the width of bar in pixels, once its been drawn.
</DESCRIPTION>
</METHOD>
<METHOD value="create_chord_symbol">
<DESCRIPTION>
 Create the text figure that goes above/(and somdeday below) the note and
 compute its x coordinate.  The y location is computed when we have rendered
 the chord and we know where its supposed to go.
</DESCRIPTION>
</METHOD>
<METHOD value="render_chords">
<DESCRIPTION>
 We figure out the chord symbols, but we can't actually render the chords
 until we have drawn the figures and beamed them all.  Go through the 
 my_chord_symbols and print them all out.
</DESCRIPTION>
</METHOD>
<METHOD value="render_voice_info">
<DESCRIPTION>
 Add the description of the voice information to the staff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_top/bottom">
<DESCRIPTION>
 Get the top and bottom note on the staff to deterine if the
 ledger lines are needed
</DESCRIPTION>
</METHOD>
<METHOD value="get_measure_end_figure">
<DESCRIPTION>
 Get the appropriate figure for the give figure ending.
</DESCRIPTION>
</METHOD>
<METHOD value="get_height_of_first_note">
<DESCRIPTION>
 We need to put something near the first beat of a measure, make sure it
 doesn't run into a note.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_figure_list">
<DESCRIPTION>
 Render the figures into a list first so we can move them down
 to a different page if we want to.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="cleanup">
<DESCRIPTION>
 We create lots of intermediate things when creating the figures.  We don't 
 need any of it now so release all the resources.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_is_complete">
<DESCRIPTION>
 Indicate that all of the fixtures have been added to the staff, no more
 should be added.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_offset">
<DESCRIPTION>
 the offset where this staff is to be drawn.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_start_measure">
<DESCRIPTION>
 the measure number I start on.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_end_measure">
<DESCRIPTION>
 my last measure
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_should_center">
<DESCRIPTION>
 keep track of whether or not we should try and justify
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="page">
<DESCRIPTION>
 where it all happens...
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_show_name">
<DESCRIPTION>
 true if we need to show the name on top of the staff, i.e. we're in
 score mode
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="map &lt; staff_point,note_figure* &gt; ">
<DESCRIPTION>
 Map each point in the score with a figure to draw on the staff.
 We keep 2 around, so we can re-render things fast if we already
 know where stuff goes.  We also store the x location of the words since
 we compute that at the same time as the note locations
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="map &lt; int,points &gt; ">
<DESCRIPTION>
 Keep track of the places where the barlines go so we don't have to
 keep recomputing those.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="fraction">
<DESCRIPTION>
 Keep track of the time signature.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="key_sig*">
<DESCRIPTION>
 A key signature can draw itself on my.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="point">
<DESCRIPTION>
 We keep track of the UL part of ourselves, and then we increment the x part
 as we render the staf from left to right.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="point">
<DESCRIPTION>
 This is the original origin.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="array">
<DESCRIPTION>
 We compute the x location of the chord symbols and the y location at 
 different times, to avoid chords and beams colliding.  Save the figures
 in an array and then render them all after the notes have been rendered.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="pitch">
<DESCRIPTION>
 Keep track of which is the center pitch for this cleff.  That is used to determmine
 things like beam directions, etc.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Keep track of how many pixels are left for notes, after drawing the key sig
 and stuff.  This helps us justify correctly.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_rhs_overlap">
<DESCRIPTION>
 Keep track of how many pixels over the right edge we'll be going,
 so we can 'borrow' from wider notes on a later pass.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_leftover_pixels">
<DESCRIPTION>
 Keep track of how many 'spare' pixels we have for each note so we
 can 'borrow' if there is overlap.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="beamer*">
<DESCRIPTION>
 Keep track of the last beamer so that we can add notes to the current
 beam group as they come in from the parser.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="beamer*">
<DESCRIPTION>
 We beam grace notes seperately, so keep track of those too.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="slurer*">
<DESCRIPTION>
 There is one slur object per staff that contains all slurs on that staff.
 This should allow us to do complex things with slurs like slur around
 notes.  For now we just try to draw it as best we can.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="double">
<DESCRIPTION>
 a constant scaling the drawing routines so we can fit more/less stuff on
 the screen.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_rect_map">
<DESCRIPTION>
 When we add figures to the staff, we want to keep them from bumping
 into the important things like notes.  So make an array of all the rectangles
 of the figures that we have drawn.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="double">
<DESCRIPTION>
 Page width in inches
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="A">
</ATTRIBUTE>
<ATTRIBUTE value="my_begin_barlines">
<DESCRIPTION>
 If a measure begins with a repeat, and its the first in a line,
 this is what we draw.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="nth_ending_info">
<DESCRIPTION>
 This is all the stuff that is required to draw an nth ending.
 We populate the number ending and begin/end type when we 
 add the measure to the staff, and the other stuff gets
 populated after we have rendered all the measures.
</DESCRIPTION>
<METHOD value="render_nth_endings">
<DESCRIPTION>
 Make the figures that constitue nth endings.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="dynamic_marking">
<DESCRIPTION>
 Keep track of dynamics that we need to spell out,
 and crescendos.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_has_rendered">
<DESCRIPTION>
 Return true, this will let a client know that no more music should
 go on this page.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_draw_part_first">
<DESCRIPTION>
 If the first measure is the first measure in a new part,
 we need to be told that so that we can draw it.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_voice_info_map">
<DESCRIPTION>
 General stuff about the current key, staff, etc.  Mapped per
 measure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_hi/lo">
<DESCRIPTION>
 Keep track of the high and low point so we can adjust our size
 for vertical justification.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_accidentals">
<DESCRIPTION>
 keep track of a running total of the accidentals
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_accidentals">
<DESCRIPTION>
 Keep track of which accidentals are being used in which measure
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="list.cpp" dir="CVS">
</FILE>
<FILE value="list.h" dir="CVS">
<DESCRIPTION>
 This is a bidirectional list with the default node
 serving as the head of the list.  The 'data' part of the
 default node is not valid and is never refereneced. The
 default node always exists (even in an empty list) and is used
 in comparisons to end-of-list
</DESCRIPTION>
<CLASS value="list_node">
<DESCRIPTION>
 List node is the data plus the pointers
 of a linked list.
</DESCRIPTION>
</CLASS>
<CLASS value="list_data">
<DESCRIPTION>
 list_data does all the work of the container interface for lists.
</DESCRIPTION>
</CLASS>
<CLASS value="list_iterator">
<DESCRIPTION>
 This iterates through a list, and also is used to add or remove
 elements (which in STL is a list function).  This is always referenced
 as a nested iterator within list (e.g. list &lt; T &gt; ::iterator = my_list.first)
</DESCRIPTION>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a reference.
</DESCRIPTION>
</METHOD>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a copy.
</DESCRIPTION>
</METHOD>
<METHOD value="T*">
<DESCRIPTION>
 Allow the list to be checked for validity in the pointer way, 
 e.g.:
 if (my_iterator) {       // check for end of list.
 tmp_data = *my_iterator; // now this is safe
</DESCRIPTION>
</METHOD>
<METHOD value="operator=">
<DESCRIPTION>
 shallow, reference counted copy.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="list">
<DESCRIPTION>
 list is an extra layer of indirection so that we can
 pass const lists and still access the methods needed to 
 perform const-type operations (like copying a list)
 It also allows us to assign the lists by value and lets
 the reference counting for list_data work transparently.
</DESCRIPTION>
<DESCRIPTION>
 these are a bunch of predicates to find special elements of a 
 list using find_predicate function.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="list_box_control.cpp" dir="CVS">
</FILE>
<FILE value="list_box_control.h" dir="CVS">
</FILE>
<FILE value="map.cpp" dir="CVS">
<METHOD value="T*">
<DESCRIPTION>
 Allow the list to be checked for validity in the pointer way, 
 e.g.:
 if (my_iterator) {       // check for end of list.
 tmp_data = *my_iterator; // now this is safe
</DESCRIPTION>
</METHOD>
<METHOD value="least">
<DESCRIPTION>
 get the item that maps to lowest ordinal in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="most">
<DESCRIPTION>
 Get the item that maps to the greatest ordinal in the map.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="map.h" dir="CVS">
<CLASS value="kv_pair">
<DESCRIPTION>
 A key-value pair template class.  The key is some type of 
 ordinal type, and the value is something associated with the key.
 It's used as an element of a map.
</DESCRIPTION>
</CLASS>
<CLASS value="list_data">
<DESCRIPTION>
 list_data does all the work of the container interface for lists.
</DESCRIPTION>
</CLASS>
<CLASS value="map_match_type">
</CLASS>
<CLASS value="map_equality_pred">
<DESCRIPTION>
 Create a predicate for map searches.
</DESCRIPTION>
</CLASS>
<CLASS value="map_iterator">
<DESCRIPTION>
 Allow a user to iterate through a map from some start point
 to some end point, using the get_item method of map.
</DESCRIPTION>
<METHOD value="get_item">
<DESCRIPTION>
 get the item that maps to the_key, or return a NULL iterator.
</DESCRIPTION>
</METHOD>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a reference.
</DESCRIPTION>
</METHOD>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a copy.
</DESCRIPTION>
</METHOD>
<METHOD value="T*">
<DESCRIPTION>
 Allow the list to be checked for validity in the pointer way, 
 e.g.:
 if (my_iterator) {       // check for end of list.
 tmp_data = *my_iterator; // now this is safe
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="map">
<DESCRIPTION>
 If there's a place you need to go, it'll get you there I know.
 Map a set of keys to a set of values.
 
 There's a couple of things that make this class special.  First off,
 the map follows a 'worst possible' matching algorithm, which means
 for example, that the lt (less-than) match type will always return the greatest
 ordinal for which the lt constraint holds.
 Second, the map contains an iterator, which always points to the last
 thing selected.  This means that copying one map to another will be an
 O(n) operation.  Frequently the map iterator will be used instead of creating
 a seperate iterator class.
</DESCRIPTION>
<METHOD value="get_iterator">
<DESCRIPTION>
 Allow the client to iterate through the list.  I'm not sure that I like
 this since it allows the user to delete an item and not my_last_cursor.
 But it allows the user to easily dereference all the pointers from a map.
 The assumption is that this is only used before the list is destroyed.
 list &lt; kv_pair  &lt; ordinal,T &gt;   &gt; ::iterator
     get_iterator(){return (my_list.first());}
</DESCRIPTION>
</METHOD>
<METHOD value="add_pair">
<DESCRIPTION>
 Add a new pair to the map, with the_key mapping to the_item
</DESCRIPTION>
</METHOD>
<METHOD value="get_item">
<DESCRIPTION>
 get the item that maps to the_key, or return a NULL iterator.
</DESCRIPTION>
</METHOD>
<METHOD value="least">
<DESCRIPTION>
 get the item that maps to lowest ordinal in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="most">
<DESCRIPTION>
 Get the item that maps to the greatest ordinal in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="remove">
<DESCRIPTION>
 Safely remove an item.
</DESCRIPTION>
</METHOD>
<METHOD value="clear">
<DESCRIPTION>
 Clear out all the element in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="get_size()">
<DESCRIPTION>
 Get the size of the list of keys/values
</DESCRIPTION>
</METHOD>
<METHOD value="init_my_current">
<DESCRIPTION>
 It is possible for this class to be populated entirely by a copy of this
 map class, in which case my iterator's my_current pointer will be null.
 This is never a valid case since even an empty list has the seed element.
 So perform this initializtion one time if required.
</DESCRIPTION>
</METHOD>
<METHOD value="get_inverse_map">
<DESCRIPTION>
 Return map &lt; key,value &gt;  give map &lt; value,key &gt; .  Note that
 not all maps will have an inverse.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="media.cpp" dir="CVS">
</FILE>
<FILE value="media.h" dir="CVS">
<DESCRIPTION>
 Classes that define how iabc handles media.  A media is a thing
 that the music is presented on.  Probably the most common media
 is a window on the screen, but it will include other types.  The
 media is populated with information about the music from a media
 source, which could be something like an abc parser.
</DESCRIPTION>
<CLASS value="score_point">
<DESCRIPTION>
 A score point is an ordinal type that represents a particular
 beat in a particular measure in a particular voice.
</DESCRIPTION>
</CLASS>
<CLASS value="score_time">
<DESCRIPTION>
 Sometimes we need to sort by voice last instead of
 first, like when we're playing all the voices back at once.
 To do this we use the score_time class as an ordinal.
</DESCRIPTION>
</CLASS>
<CLASS value="tune">
<DESCRIPTION>
 Contains all the information that can make a tune,
 including all the music, voices, key changes, etc.  A single
 abc file could contain many small tunes, or one big one.
</DESCRIPTION>
<METHOD value="extract_music_from_tune_point">
<DESCRIPTION>
 Sometimes its nice to have all the streams of music
 information into one map for easy iteration.  This 
 function combines the maps in a tune into on supermap.
 This function sorts by score_point.
</DESCRIPTION>
</METHOD>
<METHOD value="extract_music_from_tune_voice">
<DESCRIPTION>
 Extract the music from the tune for the given voice only.
</DESCRIPTION>
</METHOD>
<METHOD value="extract_music_from_tune_time">
<DESCRIPTION>
 same as the other extract, except sorts by score_time
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="voice_map_source">
<DESCRIPTION>
 The media needs to get a list of voices that we want to display.
 There may be more voices in the source.  Create an abstract
 class for this.
</DESCRIPTION>
</CLASS>
<CLASS value="media">
<DESCRIPTION>
 Media represents a place where the music is presented to the user.  The
 media source populates the media with information about the music.  The
 media presents it to the user.
</DESCRIPTION>
<METHOD value="media">
</METHOD>
<METHOD value="~media">
</METHOD>
<METHOD value="setup">
<DESCRIPTION>
 Get any resources and parameters neccessary to display the music
 on the media
</DESCRIPTION>
</METHOD>
<METHOD value="complete">
<DESCRIPTION>
 Notify the media that that's all the music there is.
</DESCRIPTION>
</METHOD>
<METHOD value="present">
</METHOD>
<METHOD value="present">
</METHOD>
<METHOD value="present">
</METHOD>
<METHOD value="present">
<DESCRIPTION>
 This only applies to visual renderings of the music.  Typically abc programs
 use this parameter to display information about dynamics and stuff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_info">
<DESCRIPTION>
 A part info is a bunch of static information that applies to the music, but
 could change at anytime.  One example is the key signature.  Get the current
 set of information for this point in the music.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="map &lt; int,bool &gt;  &amp; ">
<DESCRIPTION>
 Keep track of the voices in the tune, and allow people to
 change whether or not they are on/off
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="is_voice_turned_on">
<DESCRIPTION>
 Return true if this voice has not been turned off.
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the music to the user
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the end of the measure
 to the user
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="repeat_info">
<DESCRIPTION>
 information about a particular repeat, including which measure its
 located in, and nth endings around the repeat.
</DESCRIPTION>
<ATTRIBUTE value="my_repeat_info">
<DESCRIPTION>
 A map of measures to repeat infos.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="populate_repeat_info">
<DESCRIPTION>
 Go through the tune and figure out which repeats go where in the
 song.
</DESCRIPTION>
</METHOD>
<METHOD value="count_voices">
<DESCRIPTION>
 Count the number of voices in the tune.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="tune_chooser">
<DESCRIPTION>
 Encapsulate a list of tunes, and provide an interface
 for allowing a user to choose one from a user interface of
 some kind...
</DESCRIPTION>
<METHOD value="add_tune">
<DESCRIPTION>
 Add a tune to the list of tunes.
</DESCRIPTION>
</METHOD>
<METHOD value="clear_tunes">
<DESCRIPTION>
 Clear the music out of the tunes, but leave the
 title and index of each tune.
</DESCRIPTION>
</METHOD>
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that gets the current tune choice from the user.
</DESCRIPTION>
</METHOD>
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that clears the list for new parsing.
</DESCRIPTION>
</METHOD>
<METHOD value="operator[]">
<DESCRIPTION>
 Allow the client to treat the list like an array to get or
 modify elements.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="is_dirty">
<DESCRIPTION>
 This indicates whether or not we need to repopulate the
 box, if data has changed.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="media_source">
<DESCRIPTION>
 A media source is a thing that defines the music that a media object presents to the
 user.  The most common example would be an abc parser.
</DESCRIPTION>
<METHOD value="add_music_feature">
<DESCRIPTION>
 Add a music feature (e.g. a note) to the current tune on the given beat.
</DESCRIPTION>
</METHOD>
<METHOD value="add_music_feature">
<DESCRIPTION>
 Add a measure feature (e.g. a bar line) to the current tune on the given beat.
</DESCRIPTION>
</METHOD>
<METHOD value="set_line_break">
<DESCRIPTION>
 Look up the measure feature for the last beat before this measure and make
 it a line break.
</DESCRIPTION>
</METHOD>
<METHOD value="add_words">
<DESCRIPTION>
 add a word to the chord at the given time, in the current tune and voice.
</DESCRIPTION>
</METHOD>
<METHOD value="add_songwords">
<DESCRIPTION>
 These are the words that show up after the music.
</DESCRIPTION>
</METHOD>
<METHOD value="change_voice_info">
<DESCRIPTION>
 The state of the music that is being played/displayed has changed in some way,
 for example the key signature.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_info">
<DESCRIPTION>
 Get the voice info for as close to the given point in the
 score as we can.
</DESCRIPTION>
</METHOD>
<METHOD value="get_tune">
<DESCRIPTION>
 We have read in some tunes.  Get the tune at index the_index,
 and return an empty string when there are no more.
</DESCRIPTION>
</METHOD>
<METHOD value="clear_tunes">
<DESCRIPTION>
 Clear the music out of each tune.  This is done to prepare for a 
 new parsing.  Leave the title and index number in each tune
 so we don't have to redo the quick parse.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_all_tunes">
<DESCRIPTION>
 Remove all tunes from the tune list.  This is
 done to prepare a modified file for new parsing.
</DESCRIPTION>
</METHOD>
<METHOD value="get_next_non_rest">
<DESCRIPTION>
 Start looking at the_measure, the_beat in the current tune,
 and iterate through the music until a non-rest is recovered.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="message_box.cpp" dir="CVS">
</FILE>
<FILE value="message_box.h" dir="CVS">
</FILE>
<FILE value="midi_media.cpp" dir="CVS">
</FILE>
<FILE value="midi_media.h" dir="CVS">
<CLASS value="midi_media">
<DESCRIPTION>
 Output to a midi file, and hopefully someday play
 midi file as well.
</DESCRIPTION>
<METHOD value="setup">
<DESCRIPTION>
 Get any resources and parameters neccessary to display the music
 on the media
</DESCRIPTION>
</METHOD>
<METHOD value="complete">
<DESCRIPTION>
 Notify the media that that's all the music there is.
</DESCRIPTION>
</METHOD>
<METHOD value="store_data_for_voice">
<DESCRIPTION>
 Store all the track data for the given voice in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="update_chords_for_ties">
<DESCRIPTION>
 Fix the chords so that tied notes actually sound like one note.
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the music to the user
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the end of the measure
 to the user
</DESCRIPTION>
</METHOD>
<METHOD value="count_outstanding_grace">
<DESCRIPTION>
 The music for grace notes is stored somewhat deceptively: we give grace
 notes some time, even though they're sort of 'out of time' to make
 them display properly.  But we need to compensate for grace notes, put
 them before the next beat and subtract the delta time.
</DESCRIPTION>
</METHOD>
<METHOD value="check_voice_info_change">
<DESCRIPTION>
 If the voice info has changed (tempo, meter, etc.)
 send an midi meta-event to handle that.
</DESCRIPTION>
</METHOD>
<METHOD value="count_beats">
<DESCRIPTION>
 Count the beats from the_start to the_end.
</DESCRIPTION>
</METHOD>
<METHOD value="write_header">
<DESCRIPTION>
 Make sure we write the midi header if we haven't already.
</DESCRIPTION>
</METHOD>
<METHOD value="store_time_signature">
<DESCRIPTION>
 Store the time signature in the music array as a midi
 meta-event.
</DESCRIPTION>
</METHOD>
<METHOD value="store_time_signature">
<DESCRIPTION>
 Store the tempo in the music array as a midi
 meta-event.
</DESCRIPTION>
</METHOD>
<METHOD value="store_track_end">
<DESCRIPTION>
 Store the track end magic cookie in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="store_program_change">
<DESCRIPTION>
 Store the program change for the given voice in the given
 stream.
</DESCRIPTION>
</METHOD>
<METHOD value="write_absolute">
<DESCRIPTION>
 Write the given value in midi variable-sized format
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_next_note_off">
<DESCRIPTION>
 Keep track of where the next note off point goes,
 if the point we're currently talking about is beyond that.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="handle_note_off">
<DESCRIPTION>
 Go through the array of note off events pending and see if we owe the
 world any note off events.  Spit them out to the file, and return
 the point where we ended up before any deltas.
</DESCRIPTION>
</METHOD>
<METHOD value="pitch_to_midi">
<DESCRIPTION>
 Convert the internal pitch format to the midi format
</DESCRIPTION>
</METHOD>
<METHOD value="duration_to_midi">
<DESCRIPTION>
 convert the internal duration format to a the number of midi
 ticks.  Use the current tempo as a guide.
</DESCRIPTION>
</METHOD>
<METHOD value="get_tempo_from_time_signature.">
<DESCRIPTION>
 Some files don't declare a tempo; here we guess what the tempo is based
 on the time signature that is used through most of the piece.  E.g.
 cut time tunes go twice as fast.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_midi_data">
<DESCRIPTION>
 Store the midi data in an array so that we can size if and incorporate
 that stuff into the MTrk part
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_music_map">
<DESCRIPTION>
 Keep track of all the music in one map so we don't have to
 keep switching maps.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_original_music">
<DESCRIPTION>
 The music part of the tune.  We need to change this for
 midi reasons, but we should restore the original after we
 have constructed the midi part.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="music_info.cpp" dir="CVS">
</FILE>
<FILE value="music_info.h" dir="CVS">
<DESCRIPTION>
 This contains information about the music that's not particular
 to any single medium and isn't about the notes (note stuff is in
 note info)
</DESCRIPTION>
<CLASS value="measure_feature">
<DESCRIPTION>
 information to describe a particular measure, including the number
 and the endpoint
</DESCRIPTION>
<ATTRIBUTE value="nth_repeat">
<DESCRIPTION>
 1st, 2nd ending etc.  usually 0.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="part_point">
<DESCRIPTION>
 A part point represents a particular beat in a particular measure.
 Each chord in each voice belongs to a particular part_point
</DESCRIPTION>
</CLASS>
<CLASS value="voice_info">
<DESCRIPTION>
 Information about a particular part, which in ABC would be
 called a voice.
</DESCRIPTION>
<ATTRIBUTE value="my_index">
<DESCRIPTION>
 This is the voice number or part number.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="music_info">
<DESCRIPTION>
 This is a union of all things that can be in a tune that are
 related to the music at any given point.  The idea is that you
 can construct a big supermap of this to make it easy to iterate
 through the music for midi and display output.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="mutex.cpp" dir="CVS">
</FILE>
<FILE value="mutex.h" dir="CVS">
<CLASS value="mutex_interface">
<DESCRIPTION>
 The abstract interface to the platform-specific object.  The generic
 mutex proxies to this object, that allows us to create mutex objects
 automatically.
 IMPORTANT NOTE:
 See IMPORTANT NOTE below...
</DESCRIPTION>
</CLASS>
<CLASS value="mutex">
<DESCRIPTION>
 A proxy to the real mutex object.  The is called the proxy pattern.
 IMPORTANT NOTE:
 This mutex may behave differently than some other mutex objects you may
 have heard tell of.  So here is how it works:
 If you seize the mutex and you don't own it, you block.
 If you release the mutex and you own it, then you don't own it anymore.
 If you seize a mutex and own it, NOTHING happens, no count is increased.
 If you release a mutex and you don't own it, nothing happens.
 If this behavior is surprising to you, then you probably want semaphore or
 lock (see below)
</DESCRIPTION>
</CLASS>
<CLASS value="lock">
<DESCRIPTION>
 Allow stackable locking and unlocking of a mutex.  This allows you
 to implement re-entrant methods.  Usage:
 void my_safe_function(){
 lock tmp_lock(my_mutex);
 ... access shared stuff
 }
</DESCRIPTION>
</CLASS>
<CLASS value="atomic_counter">
<DESCRIPTION>
 Implement a threadsafe decrement-and-read operation.  This avoids
 nasty race conditions when implementing reference counters across multiple
 threads.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="note_figure.cpp" dir="CVS">
</FILE>
<FILE value="note_figure.h" dir="CVS">
<CLASS value="note_figure">
<DESCRIPTION>
 Draws the actual note part.  Also updates beam group.
</DESCRIPTION>
<METHOD value="get_width;">
<DESCRIPTION>
 Return the width of the rendered figure so that the staff can do
 justification.
</DESCRIPTION>
</METHOD>
<METHOD value="get_head_offset">
<DESCRIPTION>
 Return the offset of the head, which isn't always in
 the left hand side.
</DESCRIPTION>
</METHOD>
<METHOD value="ctor">
<DESCRIPTION>
 none.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Dereference all my stuff.
</DESCRIPTION>
</METHOD>
<METHOD value="render">
<DESCRIPTION>
 Actually draw self in correct thread.  Honor the_should_block,
 which should be set the first time so drawing occurs properly.
 Also activate beams and slurs and stuff.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Allow the beamer to get set, so I can beam self when drawing self.
</DESCRIPTION>
<DESCRIPTION>
 Accessor functions.
</DESCRIPTION>
<METHOD value="more">
<DESCRIPTION>
 We need to keep track of the  absolute bounding box once we've
 rendered these so that we can draw other figures right next to
 them.
</DESCRIPTION>
</METHOD>
<METHOD value="rescale">
<DESCRIPTION>
 We are now on a different scale so all of our beamers and figures
 are no good.  So get new ones.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_ornaments">
<DESCRIPTION>
 Handle any ornamentation on the note, like tenuto
 or slurs.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Figure out what type of note head to draw and get that from the factory.
</DESCRIPTION>
<DESCRIPTION>
 Keep track of the high and low point of this note and beam group.
</DESCRIPTION>
<DESCRIPTION>
 Figure out what type of accidental to draw, and get that from the factory.
</DESCRIPTION>
<METHOD value="set_rest">
<DESCRIPTION>
 Figure out which rest figure we need and get it from the factory.
</DESCRIPTION>
</METHOD>
<METHOD value="get_num_dots">
<DESCRIPTION>
 Reverse-engineer the number of dots on the note from its duration.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Update the slurer for this channel with the location of the note.
</DESCRIPTION>
<ATTRIBUTE value="my_head,">
<DESCRIPTION>
 A whole bunch of figures for rendering beams, etc.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_scale">
<DESCRIPTION>
 We use this to determine what the scaling factor of all those figures is.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 The page on which we draw ourselves.
</DESCRIPTION>
<ATTRIBUTE value="my_key">
<DESCRIPTION>
 This tells us whether or not we need to draw accidentals.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_note">
<DESCRIPTION>
 This is the chord that we are representing.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_origin">
<DESCRIPTION>
 Where we park.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_accidental_width">
<DESCRIPTION>
 We keep track of this so we can tell how big the whole
 figure is.  This is used when justifying.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="need_to_beam">
<DESCRIPTION>
 Keep track of whether or not we have drawn the beam and stuff.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 The array of accidentaly, maybe one for each note
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="note_info.cpp" dir="CVS">
</FILE>
<FILE value="note_info.h" dir="CVS">
<DESCRIPTION>
 This file contains classes that represent the notes and chords
 in the music.
</DESCRIPTION>
<CLASS value="note_info">
<DESCRIPTION>
 A note info consists of a pitch and a duration.  We also keep an extra
 flag to indicate whether or not this note is a rest.
</DESCRIPTION>
<METHOD value="starts_slur">
<DESCRIPTION>
 You can slur to and from a chord to another chord.  Allow
 getting and setting of this attribute
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="chord_info">
<DESCRIPTION>
 In ABC you can use a chord almost anywhere you can use a note, so
 a chord is the main abstraction that represents music.  A chord
 info is an array of note_infos, plus some additional information
 about how the music is to be played and notated.
</DESCRIPTION>
<METHOD value="clone">
<DESCRIPTION>
 Return a copy of this note, including a deep-copy of the array.
 A shallow copy of the array happens during copy ctor or = operator.
</DESCRIPTION>
</METHOD>
<METHOD value="is_beamable">
<DESCRIPTION>
 Return true if this note is short enough to beam
</DESCRIPTION>
</METHOD>
<METHOD value="get_duration">
<DESCRIPTION>
 In order to figure out what beat we're on, we need to give each
 chord a concept of a duration.  We say that the shortest duration
 note in a chord is the true duration, since that should determine
 where the next beat in a measure will fall.
</DESCRIPTION>
</METHOD>
<METHOD value="change_length">
<DESCRIPTION>
 Change the length of each note in the chord by multiplying by
 product and adding sum.
</DESCRIPTION>
</METHOD>
<METHOD value="get_high_note">
<DESCRIPTION>
 Get the highest note in the chord
</DESCRIPTION>
</METHOD>
<METHOD value="get_next_in_beam">
<DESCRIPTION>
 When we connect 2 chords in a beam we create a 2-directional list,
 so we can get the next and last in the beam group.
 (so if foo.get_next_in_beam() == foo there's no subsequent notes.)
</DESCRIPTION>
</METHOD>
<METHOD value="get_size">
<DESCRIPTION>
 the number of notes in the chord.
</DESCRIPTION>
</METHOD>
<METHOD value="as_string">
<DESCRIPTION>
 Return a string representation of the chord, for debugging
</DESCRIPTION>
</METHOD>
<METHOD value="operator[]">
<DESCRIPTION>
 Treat a chord info like an array of chords.
</DESCRIPTION>
</METHOD>
<METHOD value="operator=,">
<DESCRIPTION>
 We want a chord to be treated like a simple type
 with regard to assignment and concatenation
</DESCRIPTION>
</METHOD>
<METHOD value="set_embellishment">
<DESCRIPTION>
 A chord can have an embellishment like an accent.  Allow setting
 and getting of that.
</DESCRIPTION>
</METHOD>
<METHOD value="get/set_description">
<DESCRIPTION>
 A chord can have a description, for example [CEG] can be
 C.  Allow the chord to save its description.
</DESCRIPTION>
</METHOD>
<METHOD value="starts_slur">
<DESCRIPTION>
 You can slur to and from a chord to another chord.  Allow
 getting and setting of this attribute by looking at the
 contained notes of the chord
</DESCRIPTION>
</METHOD>
<METHOD value="get/set">
<DESCRIPTION>
 Return true if this is a grace note
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_embellishment">
<DESCRIPTION>
 stacatto, etc.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_description">
<DESCRIPTION>
 A textual description of the chord, e.g. 'Am7'.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_words">
<DESCRIPTION>
 words that go along with this particular beat.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_notes">
<DESCRIPTION>
 The notes that make me a chord
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_first_in_beam">
<DESCRIPTION>
 true if this chord is the first in a beam group
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 true if this is the last note in a beam group.
</DESCRIPTION>
<ATTRIBUTE value="my_xlet_value">
<DESCRIPTION>
 Indicates that it's supposed to be grouped with a number,
 like a triplet is.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_is_grace">
<DESCRIPTION>
 pretty self-explanatory
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="null_media.h" dir="CVS">
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the end of the measure
 to the user
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the music to the user
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="parse.cpp" dir="CVS">
</FILE>
<FILE value="parse.h" dir="CVS">
<METHOD value="pre_match">
<DESCRIPTION>
 This is useful for debugging, since the match method of most
 of the classes will be overridden, this will allow you to
 debug other classes by overriding this method.
</DESCRIPTION>
</METHOD>
<CLASS value="null_rule">
<DESCRIPTION>
 A null rule always matches.  It is handy when optimizing 
 the sequence of rules in an 'or' and making optional params.
</DESCRIPTION>
</CLASS>
<CLASS value="loser_rule">
<DESCRIPTION>
 A loser rule is like a null rule, except that it always fails.
</DESCRIPTION>
</CLASS>
<CLASS value="terminal">
<DESCRIPTION>
 A terminal is a regular expression, like a variable name
</DESCRIPTION>
</CLASS>
<CLASS value="non_terminal">
<DESCRIPTION>
 A non-terminal rule is made up of other terminal or non-terminal rules.
 We want to overload the  &amp;  and | operators to use them in the usual way so
 we don't make non_terminal be of type 'rule'.  Instead we make non_terminal
 its own class that can be constructed with a rule or another non_terminal.
</DESCRIPTION>
</CLASS>
<CLASS value="compound_rule">
<DESCRIPTION>
 Some rules are made up of other rules.  When constructing these
 rules its more efficient if you just set up your parse tree
 one time during the lifetime of the rule, and then just keep
 resetting it everytime you use it.
</DESCRIPTION>
<METHOD value="match">
<DESCRIPTION>
 Construct the compound rule if we have to, and then run it.
 Call convert() if there's a match and return true.
</DESCRIPTION>
</METHOD>
<METHOD value="is_matched">
<DESCRIPTION>
 return true if I matched last time I tried
</DESCRIPTION>
</METHOD>
<METHOD value="convert">
<DESCRIPTION>
 We have found a match for the rule, which means we have matched a
 expression in the language.  Do whatever that expression tells us to.
</DESCRIPTION>
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the 
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="the">
</ATTRIBUTE>
</CLASS>
<CLASS value="iterative_rule">
<DESCRIPTION>
 A '1 or more' compound rule.  Calls repeat_match until the match
 fails, and return true if there was at least 1 match and
 no syntax_error was raised.
</DESCRIPTION>
<METHOD value="match">
<DESCRIPTION>
 Try repeat_match 1 more more times, then call convert
 if there is a match.  Keep going until the match fails.
</DESCRIPTION>
</METHOD>
<METHOD value="reset">
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We are iterating through the_iteration and we need to make sure that the
 arrays have been created up to this level, if we have never been at this level
 before.  We also need to make sure we've reset the rules at this level before
 we try the match.
</DESCRIPTION>
</METHOD>
<METHOD value="repeat_match">
<DESCRIPTION>
 We have matched on the_iteration.  Extract any information we need from the 
 rules before going on to the next step.
</DESCRIPTION>
</METHOD>
<METHOD value="repeat_match">
<DESCRIPTION>
 This is where we call the actual match.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_terminals">
<DESCRIPTION>
 These are the non-terminal rules that make up this rule.  They are an array
 such that the n'th iteration refers to the n-1th rule.  The array is populated
 by calls to create_complete_rule.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="quoted_string_rule">
<DESCRIPTION>
 This matches a string delemited by matching characters.  Probably
 the most famous of these is a quoted string.
</DESCRIPTION>
</CLASS>
<CLASS value="word_rule">
<DESCRIPTION>
 A word, in other words not spaces
</DESCRIPTION>
</CLASS>
<CLASS value="key_rule">
<DESCRIPTION>
 key = something, chop off the '=' part
</DESCRIPTION>
</CLASS>
<CLASS value="nv_rhs">
<DESCRIPTION>
 name-value right hand side, either a word or a 
 quoted string.
</DESCRIPTION>
</CLASS>
<CLASS value="nv_pair">
<DESCRIPTION>
 name-value pair, for example:
 NAME = VALUE
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="percentage_meter.cpp" dir="CVS">
</FILE>
<FILE value="percentage_meter.h" dir="CVS">
</FILE>
<FILE value="pitch.cpp" dir="CVS">
<METHOD value="get_accidental_from_array">
</METHOD>
</FILE>
<FILE value="pitch.h" dir="CVS">
<CLASS value="pitch">
<DESCRIPTION>
 Representation of a pitch.  Consists of a letter note, accidental,
 and octave.
</DESCRIPTION>
<METHOD value="as_string">
<DESCRIPTION>
 Returns a string representation of the pitch, but not an ABC string
 use abc_string for that.
</DESCRIPTION>
</METHOD>
<METHOD value="string_value">
<DESCRIPTION>
 Returns the pre-parsed value of the string.  Used for transposing ..toABC things 
</DESCRIPTION>
</METHOD>
<METHOD value="add_accidental">
<DESCRIPTION>
 These can be used by clients keeping track of accidentals
 to decide what needs to be displayed/played based on what
 has been played thus far in the measure and the common rules
 of music notation
</DESCRIPTION>
</METHOD>
<METHOD value="change_accidental">
<DESCRIPTION>
 Change the accidental to compensate for the key or the forced
 accidental.  The assumption is that the changed accidental is 
 already added to the map.
</DESCRIPTION>
</METHOD>
<METHOD value="get_accidental_from_array">
</METHOD>
<METHOD value="has_accidental_changed">
<DESCRIPTION>
 return true if the accidental for my_letter in the map is 
 different than my_accidental, or if the accidental doesn't
 appear in the map at all.
</DESCRIPTION>
</METHOD>
<METHOD value="is_accidental_in_array">
<DESCRIPTION>
 Return true if there is an accidental for my_letter in the 
 map.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="polygon.cpp" dir="CVS">
</FILE>
<FILE value="polygon.h" dir="CVS">
<DESCRIPTION>
 Represents an arbitrary shape that can later be
 rendered on some type of device.  Most of the operations
 that can be performed on this objects are derived from the
 postscript language (loosely).
</DESCRIPTION>
<CLASS value="linear_xform">
<DESCRIPTION>
 A polygon can be transformed the same way a window can.
 When we transform a polygon we only apply the transform to
 future drawing operations.  If you want to change the transform
 of the whole polygon you need to apply the transform and then
 redraw all the points
</DESCRIPTION>
<METHOD value="linear">
<DESCRIPTION>
 Allow the user to set up the zoom and offset in x and y directions
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="fill_point">
<DESCRIPTION>
 This class is used to represent a point in the drawing of the
 polygon where the drawing actually occurs.  This lets us represent
 more complex shapes in one polygon.
</DESCRIPTION>
<METHOD value="get_...">
<DESCRIPTION>
 returns the extreme points of the polygon. 
</DESCRIPTION>
</METHOD>
<METHOD value="operator[]">
<DESCRIPTION>
 Allow the polygon to be treated like an array of points.
</DESCRIPTION>
</METHOD>
<METHOD value="get_next_fill_point">
<DESCRIPTION>
 Many figures are actually multiple sub-figures.  The sub-figures are either
 filled or outlined at a certain index into the array.
</DESCRIPTION>
</METHOD>
<METHOD value="fill_poly">
<DESCRIPTION>
 This sets the next fill point at the current index (the index that was added last).
</DESCRIPTION>
</METHOD>
<METHOD value="outline_poly">
<DESCRIPTION>
 This sets the next outline point at the current index (the index that was added last).
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Follow the same set of commands that was used to build 'o', when
 creating a new polygon.  This can be used to render polys on a
 different scale (like on a printer).
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="poly_command">
<DESCRIPTION>
 this is used by clone()
</DESCRIPTION>
<METHOD value="expand_points">
<DESCRIPTION>
 handle expandable array.  We figure that this object will be rendered seldom
 but referenced many times, so an expandable array will be best.
</DESCRIPTION>
</METHOD>
<METHOD value="must_add_current">
<DESCRIPTION>
 return true if we must add the current point in a lineto or 
 curveto operation.  We need to do this is the last thing was
 a moveto or moveto relative.
</DESCRIPTION>
</METHOD>
<METHOD value="make_midpoints">
<DESCRIPTION>
 Implement Bezier curve by replacing a n point array with
 n + 1 midpoints.  Return false if we can't bisect the
 midpoints because they're too close together.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_ul_offset,">
<DESCRIPTION>
 Keep track of the size and some special points of the
 polygon
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_need_to...">
<DESCRIPTION>
 Keep track of whether or not we need to recalculate things.  This speeds
 things up when referencing the size of a polygon many times.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="posixmutex.cpp" dir="CVS">
</FILE>
<FILE value="posixmutex.h" dir="CVS">
</FILE>
<FILE value="posixsemaphore.cpp" dir="CVS">
</FILE>
<FILE value="posixsemaphore.h" dir="CVS">
</FILE>
<FILE value="posixthreads.cpp" dir="CVS">
</FILE>
<FILE value="posixthreads.h" dir="CVS">
</FILE>
<FILE value="preprocess.cpp" dir="CVS">
</FILE>
<FILE value="preprocess.h" dir="CVS">
<CLASS value="text_buf">
<DESCRIPTION>
 Abstract the behavior of a file so that it could work on any text
 buffer, such as a text editing window.
</DESCRIPTION>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
<METHOD value="sync_contents_to_buffer">
<DESCRIPTION>
 Make sure the contents of the text_file object match the contents of the
 underlying buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="buffer_setpos">
<DESCRIPTION>
 set cursor position to l
</DESCRIPTION>
</METHOD>
<METHOD value="open">
<DESCRIPTION>
 Open the text buffer for reading.
</DESCRIPTION>
</METHOD>
<METHOD value="getpos">
<DESCRIPTION>
 Return the current position of the pointer into the text buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
<METHOD value="refresh()">
<DESCRIPTION>
 Refresh the text buffer with the persistent representation.
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_modify_time">
<DESCRIPTION>
 returns the last time the buffer was changed, so you'll know
 if you need to reparse it.
</DESCRIPTION>
</METHOD>
<METHOD value="get_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="set_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="file_buf">
<DESCRIPTION>
 A stdio file implementation of text_buf.  Used for unit testing and
 development.
</DESCRIPTION>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
<METHOD value="getpos">
<DESCRIPTION>
 Return the current position of the pointer into the text buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="preprocess">
<DESCRIPTION>
 Preprocess an abc file.  Scan through the comments and return
 completed lines, including lines seperated with '\'.
</DESCRIPTION>
<METHOD value="set_line">
<DESCRIPTION>
 Move to the position of the given line number.
</DESCRIPTION>
</METHOD>
<METHOD value="get_pos_from_line">
<DESCRIPTION>
 Get the offset (for getpos, etc.) that we corresponds to
 the beginning of the given line.
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_modify_time">
<DESCRIPTION>
 return true if the file has changed since this was opened.
</DESCRIPTION>
</METHOD>
<METHOD value="index_file">
<DESCRIPTION>
 Count the lines, and create the line to position map for the buffer.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_lines_to_fpos">
<DESCRIPTION>
 Keep track of which index is which line, so we can
 get there fast.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="registry.cpp" dir="CVS">
</FILE>
<FILE value="registry.h" dir="CVS">
<DESCRIPTION>
 Classes that implement a simple platform-independent
 persistent registry for 
 a program, that manage a list of name-value pairs
 from a .ini file.  This can be used to store preferences,
 program state, etc.
 The form of the registry is:
 [category]
 key1=value1
 key2=value2
 key3.subkey = value3
</DESCRIPTION>
<CLASS value="registry_key">
<DESCRIPTION>
 A registry key is a set of strings that can be associated
 with a value.  The strings are arranged in a heirarchy so that
 we can sort them and peruse them.
</DESCRIPTION>
<METHOD value="ctor,">
</METHOD>
<METHOD value="ctor,">
</METHOD>
<METHOD value="op=,">
</METHOD>
<METHOD value="copy">
</METHOD>
<METHOD value="default">
</METHOD>
<METHOD value="get_subkey_from_string">
<DESCRIPTION>
 Parse the string to split on the '.', which allows entries like: LASTFILE.1=foo.abc
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="registry_entry">
<DESCRIPTION>
 registry_entry is a registry_key + a string value.
 An entry can be put into the registry and looked up later,
 based on the key.
</DESCRIPTION>
<METHOD value="registry_entry">
<DESCRIPTION>
 construct a registry entry based on the strings.
</DESCRIPTION>
</METHOD>
<METHOD value="registry_entry">
<DESCRIPTION>
 construct a registry entry based on the key an a value.
</DESCRIPTION>
</METHOD>
<METHOD value="registry_entry">
<DESCRIPTION>
 construct an empty registry entry.
</DESCRIPTION>
</METHOD>
<METHOD value="copy">
</METHOD>
<METHOD value="op=">
</METHOD>
<METHOD value="op=,">
<DESCRIPTION>
 change the value of the existing key.
</DESCRIPTION>
</METHOD>
<METHOD value="is_persistent">
<DESCRIPTION>
 Indicate whether or not this registry entry should be written to disk 
 when a flush() is performed on the registry.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="registry">
<DESCRIPTION>
 Allow the user toe store key/value pairs persistently between releases.
 It is similary to a windows .ini file, hence the name, but it works cross-
 platforms.
</DESCRIPTION>
<METHOD value="registry">
<DESCRIPTION>
 Create a new registry instance, and initialize it with values from
 the_filename.  Future flushes of this buffer will also be written to
 this filename.
</DESCRIPTION>
</METHOD>
<METHOD value="get_entry">
<DESCRIPTION>
 look up the registry and return the value associated with the given key,
 or an empty string if no such value is found.
</DESCRIPTION>
</METHOD>
<METHOD value="get_entry">
<DESCRIPTION>
 look up the registry and add or replace the given entry.
</DESCRIPTION>
</METHOD>
<METHOD value="flush">
<DESCRIPTION>
 write all values marked as persistent to the file
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="registry_defaults.cpp" dir="CVS">
</FILE>
<FILE value="registry_defaults.h" dir="CVS">
</FILE>
<FILE value="resource.h" dir="CVS">
</FILE>
<FILE value="scan.cpp" dir="CVS">
</FILE>
<FILE value="scan.h" dir="CVS">
<DESCRIPTION>
 All the class needed to implement a semi-functional, extremely slow
 regular expression scanner
</DESCRIPTION>
<DESCRIPTION>
 In order to get all of the state machine creators created we need
 to explicitly reference them somewhere.  Do it here, for the linker's
 benefit.
</DESCRIPTION>
<CLASS value="scan_state">
<DESCRIPTION>
 We will construct a state machine to implement our regular expression scanner.
 Each state in the machine will implement the following interface.
</DESCRIPTION>
<METHOD value="scan_state">
<DESCRIPTION>
 We construct a scan state with 2 variables:  the previous state,
 which could be used for things like wildcard matches, and the group
 number, which can be used to remember previous matches
</DESCRIPTION>
</METHOD>
<METHOD value="match">
<DESCRIPTION>
 This is the main public module for a scan state.
 Match the_string starting at the_index.  If this state matches the
 string at the_index, increment the_index by the size of the string we
 matched and return true.  Otherwise the match failed, return false
 and leave the_index unchanged.
</DESCRIPTION>
</METHOD>
<METHOD value="get_length()">
</METHOD>
<METHOD value="get_group_number">
<DESCRIPTION>
 Parts of a regular expression can be grouped.  The groups are assigend indices
 and can be referenced if they are all matched.  States are assigned group numbers
 when they are created.  Return the group number we were assigned.
</DESCRIPTION>
</METHOD>
<METHOD value="get_min_length">
<DESCRIPTION>
 return the minimum that this state can match and be satisifed.  If the remainin
 string is less than that, we know we're done.
</DESCRIPTION>
</METHOD>
<METHOD value="get_match">
<DESCRIPTION>
 Return the matched string, or an emptry string if no match was found.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 This actually implements the match in the derived class
</DESCRIPTION>
<METHOD value="reset">
<DESCRIPTION>
 Some states have internal state that must be reset before another
 expression can be matched.  This does that.
</DESCRIPTION>
</METHOD>
<METHOD value="private_get_length">
<DESCRIPTION>
 return the length of the string that this state has matched.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="scan_state_creator">
<DESCRIPTION>
 The state machine is constructed based on an input string.  So we have
 to scan the input string before we have a state machine.  This class will
 construct a scan state based on the input string.  For example, the '\d'
 input string will construct a digit-matching scan state.
</DESCRIPTION>
<METHOD value="create_state">
<DESCRIPTION>
 Static method.
 Regexp can call this to create the next state in the input string.
</DESCRIPTION>
</METHOD>
<METHOD value="match_input">
<DESCRIPTION>
 This will return a state if the next input token on the input string matches the
 string the scan_state that I know how to create.
 Note when implementing this method in a derived class, make sure that you increment
 the_index if you create a state, or you will loop forever.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 match A-z or 0-9 or an _
</DESCRIPTION>
<METHOD value="match_input">
<DESCRIPTION>
 Make \w match a word character.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="semaphore.cpp" dir="CVS">
</FILE>
<FILE value="semaphore.h" dir="CVS">
</FILE>
<FILE value="simple.cpp" dir="CVS">
</FILE>
<FILE value="simple.h" dir="CVS">
<DESCRIPTION>
 Define some simple types that are useful, like point
 and line and stuff.
</DESCRIPTION>
<CLASS value="point">
<DESCRIPTION>
 A 2 dimensional point, and some usefule
 operations
</DESCRIPTION>
</CLASS>
<CLASS value="point_ordinal">
<DESCRIPTION>
 In order to create an ordinal type out of 'point',
 assign the y value arbitrary importance.
</DESCRIPTION>
</CLASS>
<CLASS value="size">
<DESCRIPTION>
 same as point
</DESCRIPTION>
<DESCRIPTION>
 Define a fraction as 2 int's, and some useful
 operations
</DESCRIPTION>
</CLASS>
<CLASS value="scale">
<DESCRIPTION>
 a floating point version of size
</DESCRIPTION>
</CLASS>
<CLASS value="line">
<DESCRIPTION>
 A line is just 2 points.
</DESCRIPTION>
</CLASS>
<CLASS value="rect">
<DESCRIPTION>
 A rectangle is 2 points also, but it's treated differently
</DESCRIPTION>
<DESCRIPTION>
 These functions are used to map a point from one rectangle to one
 of a different size.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="slurer.cpp" dir="CVS">
</FILE>
<FILE value="slurer.h" dir="CVS">
<CLASS value="slurer">
<DESCRIPTION>
 Handles all the slur points for a single staff.  This will allow it
 (in theory) to keep the slurs from running into each other.
 We discover slurs by matching open/closed parens in a LIFO way.
 Each time we get a new to point, we match it with the last 'from'
 point and add it to the map.  Then we draw the map from left to
 right.
</DESCRIPTION>
<METHOD value="normalize">
<DESCRIPTION>
 We try to normalize around 0,0.  That way we can draw the
 slurer on the page where it starts instead of having
 it always offset from absolute 0,0.  Makes the page logic
 simpler since 0,0 is always on page 1.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="staff.cpp" dir="CVS">
</FILE>
<FILE value="staff.h" dir="CVS">
</FILE>
<FILE value="staff_info.h" dir="CVS">
</FILE>
<FILE value="string.cpp" dir="CVS">
</FILE>
<FILE value="string.h" dir="CVS">
<METHOD value="chop">
<DESCRIPTION>
 remove the last character
</DESCRIPTION>
</METHOD>
<METHOD value="clear">
<DESCRIPTION>
 Clear out the string
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="text_figure.cpp" dir="CVS">
</FILE>
<FILE value="text_figure.h" dir="CVS">
<DESCRIPTION>
 Allow a string to be drawn on the given window in the correct
 thread.  Handle the dispatching to the GUI thread and the
 correct placement
</DESCRIPTION>
<METHOD value="get_current_rect">
<DESCRIPTION>
 This gets the current rectangle from the current string.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_words">
<DESCRIPTION>
 Do the same things with words.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="calculate_text_info">
<DESCRIPTION>
 Calculate all the size info about this string in this font.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_should_calculate">
<DESCRIPTION>
 This is true if we need to call calculate text info
</DESCRIPTION>
</ATTRIBUTE>
</FILE>
<FILE value="threads.cpp" dir="CVS">
</FILE>
<FILE value="threads.h" dir="CVS">
</FILE>
<FILE value="time_sig.cpp" dir="CVS">
</FILE>
<FILE value="time_sig.h" dir="CVS">
<METHOD value="ctor">
</METHOD>
</FILE>
<FILE value="wd_data.cpp" dir="CVS">
</FILE>
<FILE value="wd_data.h" dir="CVS">
<DESCRIPTION>
 Template files for handling notification of concurrent
 things.  This is various interpretations of the observer
 pattern.  
</DESCRIPTION>
<CLASS value="wd_data">
<DESCRIPTION>
 Encapsulate a multi-type container.  This class acts as a 
 proxy to another derived wd_data, which contains an instance
 of some type, possible a built in type, which is passed as
 a parameter to a dispatcher function.
</DESCRIPTION>
</CLASS>
<CLASS value="wd_data_dx">
<DESCRIPTION>
 A derived wd_data, with the parameterized type which detemrines
 what the real type is.  It can be used in the place of a
  &lt; type1 &gt;  parameter to a dispatcher call.
</DESCRIPTION>
</CLASS>
<CLASS value="selection_handler">
<DESCRIPTION>
 Abstract class that allows a client to get reports of GUI things to him
 using the observer pattern.
</DESCRIPTION>
</CLASS>
<CLASS value="selection_handler_dx_data">
<DESCRIPTION>
 This is a template class that allows the client to be
 a selection handler (e.g. receive selection events) 
 without having to inherit from selection_handler himself.
 But he needs to implement the handle_selection method.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 create the class with the object that is getting notified
 as the parent.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
</METHOD>
<METHOD value="select">
<DESCRIPTION>
 This is the method the widget calls to get the events to the user.
 This is what calls the handle_selection method.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_paremt">
<DESCRIPTION>
 The client class that we notify.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="selection_handler">
<DESCRIPTION>
 This is the type that the client creates.  Usage:
 my_tree_ctrl- &gt; add_selection_handler(selection_handler_dx &lt; my_type &gt; (*this));
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the data that is reference counted and initiaze
 it with this parent.  If the parameter is another
 instance, add ref to my data object.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Remove the reference count and delete the object if 
 need be.
</DESCRIPTION>
</METHOD>
<METHOD value="select">
<DESCRIPTION>
 Call the select method of the data object.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="wd_temp.cpp" dir="CVS">
</FILE>
<FILE value="win32mutex.cpp" dir="CVS">
</FILE>
<FILE value="win32mutex.h" dir="CVS">
</FILE>
<FILE value="win32semaphore.cpp" dir="CVS">
</FILE>
<FILE value="win32semaphore.h" dir="CVS">
</FILE>
<FILE value="win32threads.cpp" dir="CVS">
</FILE>
<FILE value="win32threads.h" dir="CVS">
</FILE>
<FILE value="window_feature.h" dir="CVS">
</FILE>
<FILE value="window_figure.h" dir="CVS">
</FILE>
<FILE value="window_media.cpp" dir="CVS">
</FILE>
<FILE value="window_media.h" dir="CVS">
<CLASS value="music_window_iterator">
<DESCRIPTION>
 Iterate through the music and populate the graphical interface.  We use
 a template because the iteration actually uses different clients depending
 on whether we're in score mode or not, but everything else is the same.
</DESCRIPTION>
<DESCRIPTION>
 There will be other media types, such as: midi device output,
 printer output, midi file output,
 but for now the only one is window output.  As other media types are
 added they will be moved into their own files.  This accepts musical
 features from a media source and renders them on some type of window
 device.
</DESCRIPTION>
<METHOD value="setup">
<DESCRIPTION>
 This is supposed to be where the media gets set up to receive
 the music, but it doesn't really apply to a window getting
 music.
 This didn't really work....
</DESCRIPTION>
</METHOD>
<METHOD value="complete">
<DESCRIPTION>
 This is called when all the music has been added to the media.
 It's a sign for the media to start drawing itself.  Here we just
 render the music one page at a time.
</DESCRIPTION>
</METHOD>
<METHOD value="consolidate_long_rests">
<DESCRIPTION>
 If we are in part mode, consolitdate all the rests into blocks where possible.
</DESCRIPTION>
</METHOD>
<METHOD value="sort_staffs_in_y_order">
<DESCRIPTION>
 Sort the staffs in order from lowest to highest on the
 screen
</DESCRIPTION>
</METHOD>
<METHOD value="adjust_staff_height">
<DESCRIPTION>
 Move all the staffs so that they don't overlap one another.
</DESCRIPTION>
</METHOD>
<METHOD value="add_margins_stuff">
<DESCRIPTION>
 Add the header and footer to the given page.
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 Make the musical feature come alive on the window.  Usually this creates a note
 figure and puts it on the correct line_of_music.
</DESCRIPTION>
</METHOD>
<METHOD value="render_measure_feature">
<DESCRIPTION>
 render a feature that revolves around a measure, such as a bar line or repeat sign.
</DESCRIPTION>
</METHOD>
<METHOD value="transpose_chord">
<DESCRIPTION>
 Transpose the note up or down the given number of half-steps
</DESCRIPTION>
</METHOD>
<METHOD value="transpose_key">
<DESCRIPTION>
 Transpose the note up or down the given number of half-steps
</DESCRIPTION>
</METHOD>
<METHOD value="render_music">
<DESCRIPTION>
 We've read in the music, and stored it, so now its time to render the music.
 RETURNS:
 the number of the next page; 0 if this is the last page.
</DESCRIPTION>
</METHOD>
<METHOD value="render_words">
<DESCRIPTION>
 Handle the big 'W'.  Just draw the words centered in the window at the
 end of the song part.
</DESCRIPTION>
</METHOD>
<METHOD value="render_all_staffs">
<DESCRIPTION>
 We've put together a bunch of staffs and added the music to them, now
 go and do the drawing of them all at once.
</DESCRIPTION>
</METHOD>
<METHOD value="set_dynamics">
<DESCRIPTION>
 Set the dynamics in the staff, if they've changed.
</DESCRIPTION>
</METHOD>
<METHOD value="add_figures_to_page">
<DESCRIPTION>
 Add the staffs to the pages, compensating for the offset and
 adding new pages when necessary.
</DESCRIPTION>
</METHOD>
<METHOD value="get_staves_per_system">
<DESCRIPTION>
 If we are in score mode, return the number of voices.
 Otherwise, return 1.
</DESCRIPTION>
</METHOD>
<METHOD value="add_music_feature_to_staff">
<DESCRIPTION>
 Create a note figure from a note info and add it to the staff.
</DESCRIPTION>
</METHOD>
<METHOD value="add_measure">
<DESCRIPTION>
 We have rendered all the notes in the measure, now complete the
 measure by adding the figure that goes at the end, and the figure
 that starts the next measure (e.g. a begin repeat) to the appropriate
 staff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_or_create_line_of_music">
<DESCRIPTION>
 We keep a map of places in the music to the staff objects that go with it.  Look up
 the staff in the map that is less than or = to this point in the score.  If this is
 the first such request there are no staffs for this voice,
 create the initial staff and return it.
</DESCRIPTION>
</METHOD>
<METHOD value="get_previous_staff">
<DESCRIPTION>
 To keep the staffs from running into one another, compare the points
 to the previous staff.
</DESCRIPTION>
</METHOD>
<METHOD value="add_nth_endings">
<DESCRIPTION>
 Figure out which nth endings go on the staff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_points">
<DESCRIPTION>
 We have changed parts so we weren't reading the music in in order.
 Get the points we saved the last time, and save the current point
 of measure and chord for when we change back to this part/voice.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 x and y scale and page size
</DESCRIPTION>
<ATTRIBUTE value="my_staff_names[]">
<DESCRIPTION>
 an array names that contain the voice header name information
 (e.g. trumpet2).  There may be one of these for each page.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="get_vertical_offset">
<DESCRIPTION>
 We have a line_of_music.  We want to see what the offset is info this window so that we
 can put it in the right place.
</DESCRIPTION>
</METHOD>
<METHOD value="create_new_staff">
<DESCRIPTION>
 Handle the work of creating a new staff instance given a
 point of music.  We assume that the client wants to actually create the
 line_of_music if they call this function; no check is made to see if it
 already exists.
</DESCRIPTION>
</METHOD>
<METHOD value="in_score_mode">
<DESCRIPTION>
 Return true if we are in score mode.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="window*">
<DESCRIPTION>
 This is where we do our thing...
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="rect">
<DESCRIPTION>
 Used to determine whether or not a thing is in the window range
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 A map of staffs to parts/measures
</DESCRIPTION>
<DESCRIPTION>
 Keep track of the staffs as we draw them so we can
 space them properly
</DESCRIPTION>
<ATTRIBUTE value="my_staffs_to_render">
<DESCRIPTION>
 Keep track of the staffs and then render them all at once.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_staffs_to_render">
<DESCRIPTION>
 Keep track of the staffs that we have started so far.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_pages">
<DESCRIPTION>
 These keep track of the pages.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_rendered_score_point">
<DESCRIPTION>
 The last point I rendered, used to update the system a little at a time.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_music_map">
<DESCRIPTION>
 Keep track of all the music in one map so we don't have to
 keep switching maps.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_score_map">
<DESCRIPTION>
 This is the map we use if we are displaying in score mode.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_lines_to_score_point">
<DESCRIPTION>
 Keep track of which screen lines the staff is on so we
 can do GUI magic later.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="winres.cpp" dir="CVS">
</FILE>
<FILE value="winres.h" dir="CVS">
<DESCRIPTION>
 Generic window classes.  We want this to be as portable as possible
 so we make the base classes do as much of the work as possible
</DESCRIPTION>
<CLASS value="window_res">
<DESCRIPTION>
 A generic resource associated with a windowing system.  This could
 be a font, a pen or a window itself.
</DESCRIPTION>
<METHOD value="res_add_ref">
<DESCRIPTION>
 Keep a reference count so it gets deleted at the
 correct time.
</DESCRIPTION>
</METHOD>
<METHOD value="res_remove_ref">
<DESCRIPTION>
 Decrement the reference count and delete if its
 zero
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="caster">
<DESCRIPTION>
 A template class that will cast a window resource to
 its derived type, or return null
</DESCRIPTION>
</CLASS>
<CLASS value="canvas">
<DESCRIPTION>
 A canvas is really a window, but we use it to get around the
 circular dependency between a window and the resources that
 can draw stuff in it.  We make the assumption that it doesn't
 really make any sense to have a pen, color, whatever unless
 there's a window to go with it.
</DESCRIPTION>
</CLASS>
<CLASS value="pen">
<DESCRIPTION>
 A pen that can draw on a window.
</DESCRIPTION>
<METHOD value="clear_all_pens_for_canvas">
<DESCRIPTION>
 We create pens and fonts based on a particular
 window.  Avoid memory leaks by derefing all pens still owned
 by this canvas.  Hopefully by now any clients that keep
 pens around have been removed.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="font">
<DESCRIPTION>
 A font class that can write text to a window
</DESCRIPTION>
</CLASS>
<CLASS value="font_data">
<DESCRIPTION>
 font_data allows you to specify a font in a generic way, and
 then get the font for a specific system.
</DESCRIPTION>
<METHOD value="get_font_from_list">
<DESCRIPTION>
 get the font from the list of fonts that this window knows about, or return
 NULL if this font has not been created yet.  This can be called from outside
 the windows thread and will not switch threads.
</DESCRIPTION>
</METHOD>
<METHOD value="get_rect">
<DESCRIPTION>
 Return the bounding rectangle that you get if you draw the_string
 using this font.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="document">
<DESCRIPTION>
 This is like the windows view/document architecture.  A document
 gives the window something to nofity when its state changes, so that
 the document can render itself in the window properly
</DESCRIPTION>
<METHOD value="redraw">
<DESCRIPTION>
 redraw the rectangle the_rect in the window, as this part has changed
</DESCRIPTION>
</METHOD>
<METHOD value="click">
<DESCRIPTION>
 someone has clicked on the area of the window that
 contains this document.
</DESCRIPTION>
</METHOD>
<METHOD value="attach_canvas">
<DESCRIPTION>
 attach a canvas, which is really a window, to a document
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Detach a document from a window, so that we can destroy the window
 or the document.
</DESCRIPTION>
<METHOD value="print_page">
<DESCRIPTION>
 Print the given page
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="window">
<DESCRIPTION>
 Finally we have enough information to define a window.  Mostly a window object
 represents a real system window, and the methods transform from the logical
 space of the application to the 'real' space.  The interface also allows almost
 all drawing to occur in a generic window without any real system specific stuff.
</DESCRIPTION>
</CLASS>
<CLASS value="window::linear_xform">
<DESCRIPTION>
 A linear transform on a thing that consists of multiplying by a
 scalar and adding a scalar offset
</DESCRIPTION>
</CLASS>
<CLASS value="window::display_context">
<DESCRIPTION>
 A display context is the current linear transform that operates on
 stuff that gets drawn in the window, and the current point (the
 turtle) that we're drawing on.
</DESCRIPTION>
<METHOD value="get_window">
<DESCRIPTION>
 Each window has a name, you can get a particular window by knowning its name
 and calling this static function.
</DESCRIPTION>
</METHOD>
<METHOD value="get_font">
<DESCRIPTION>
 create or get the font that has this typeface as a family name (e.g. Times).
</DESCRIPTION>
</METHOD>
<METHOD value="get_pen">
<DESCRIPTION>
 Get the pen that draws in this color and has this width and drawn
 on this window.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 pixels_per_inch return the pixels per inch that can be drawn
 on the current window.  This is used by things that render shapes
 on the screen.
</DESCRIPTION>
<METHOD value="refresh">
<DESCRIPTION>
 This can be used to refresh a region; also it is called by the OS when
 the screen is refreshed.  Otherwise known as redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="refresh">
<DESCRIPTION>
 Refreshes the whole screen.
</DESCRIPTION>
</METHOD>
<METHOD value="add_document">
<DESCRIPTION>
 Sets my document to the_document.  Also notify the document that its got a windoow, things
 are gonna be different from now on...
</DESCRIPTION>
</METHOD>
<METHOD value="shutdown">
<DESCRIPTION>
 Used when the document is being destroyed.  Remove my reference to it, and set my_document
 to 0 so we ignore any pending events.
</DESCRIPTION>
</METHOD>
<METHOD value="scale_point_size">
<DESCRIPTION>
 Scale the point size such that it is proportional to the size of the window.  We need to do
 this since the mapping mode we used is pixel-based.
</DESCRIPTION>
</METHOD>
<METHOD value="set_center_of_y_scroll">
<DESCRIPTION>
 make the given point the central point visible on the screen.  Make it
 virtual but not pure virtual so printing doesn't have to fake it out.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="win_page.cpp" dir="CVS">
<METHOD value="remove_text_figures">
<DESCRIPTION>
 Remove all text figures at the given point
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="win_page.h" dir="CVS">
<DESCRIPTION>
 Classes to help manage the dimensions of the pages, without any windows-specific
 stuff in it.
</DESCRIPTION>
<CLASS value="figure_container">
<DESCRIPTION>
 This is the interface that describes how the pages hold the figures.
</DESCRIPTION>
<METHOD value="add_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.  Note that the point may not be
 the same as the UL location where the figure is located on the window, since
 some figures have the absolute coordinates and some have relative.  The point
 where the figure is to be drawn is in the point part of the point-figure pair.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure with the given string, and sort on the given point.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="figure_container">
<DESCRIPTION>
 Allow other classes to act like a page class. This allows us to
 implement the same interface as a page without having to inherit from
 anything.
</DESCRIPTION>
</CLASS>
<CLASS value="page_settings">
<DESCRIPTION>
 A structure to keep track of the settings of one page.  By settings I mean
 page size, things like that.
</DESCRIPTION>
</CLASS>
<CLASS value="page_contents">
<DESCRIPTION>
 This is all the figures in a page, along with information about
 the page itself.
</DESCRIPTION>
<METHOD value="add_title">
<DESCRIPTION>
 Add the title to this page.
</DESCRIPTION>
</METHOD>
<METHOD value="add_copyright">
<DESCRIPTION>
 Add the copyright information to the page.
</DESCRIPTION>
</METHOD>
<METHOD value="add_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.  Note that the point may not be
 the same as the UL location where the figure is located on the window, since
 some figures have the absolute coordinates and some have relative.  The point
 where the figure is to be drawn is in the point part of the point-figure pair.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure with the given string, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="redraw">
<DESCRIPTION>
 Redraw all figures who's bounding rectangle intersects the_rect.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_figures">
<DESCRIPTION>
 Remove all figures at the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_text_figures">
<DESCRIPTION>
 Remove all text figures at the given point
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Re-render all the figures on the given window, by stretching/
 compacting the figures based on the source and target rectangles.
</DESCRIPTION>
</METHOD>
<METHOD value="allow_erase">
<DESCRIPTION>
 Disallow erasing the image before draw, as on a print.
</DESCRIPTION>
</METHOD>
<METHOD value="add_offset">
<DESCRIPTION>
 Add the offset to the figures before they're drawn, as on a redraw.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_should_erase">
<DESCRIPTION>
 True if we should erase before redrawing.  False on
 printing since there's nothing to erase on a blank
 page.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="page">
<DESCRIPTION>
 This is the interface to page_contents, which includes copy
 operators and reference counting.
</DESCRIPTION>
<METHOD value="add_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.  Note that the point may not be
 the same as the UL location where the figure is located on the window, since
 some figures have the absolute coordinates and some have relative.  The point
 where the figure is to be drawn is in the point part of the point-figure pair.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="redraw">
<DESCRIPTION>
 Redraw all figures who's bounding rectangle intersects the_rect.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Based on an absolute pixel offset, figure out which page we're on, or vise versa.
 Return the important parts of a page like the title rectangle
</DESCRIPTION>
<METHOD value="add_page">
<DESCRIPTION>
 Add the page to the array, if it doesn't exist.
</DESCRIPTION>
</METHOD>
<METHOD value="get_stuff">
<DESCRIPTION>
 Given a page number, 
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Create all new page objects using the target window and
 scale to get the dimensions to draw on.
</DESCRIPTION>
</METHOD>
<METHOD value="get_more">
<DESCRIPTION>
 We can also take a point and figure out which page we're on.
</DESCRIPTION>
</METHOD>
<METHOD value="refresh">
<DESCRIPTION>
 Iterate through all the pages, and refresh any pages that intersect
 with the_rect
</DESCRIPTION>
</METHOD>
<METHOD value="print_page">
<DESCRIPTION>
 Render the page, but fix the UL to be 0,0
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="wx_dispatch.cpp" dir="CVS">
</FILE>
<FILE value="wx_dispatch.h" dir="CVS">
</FILE>
<FILE value="wx_frame.cpp" dir="CVS">
</FILE>
<FILE value="wx_frame.h" dir="CVS">
<CLASS value="wx_view_frame">
<DESCRIPTION>
 This is the main application window.  All the events that
 can happen in iabc come through this class.
</DESCRIPTION>
<METHOD value="wx_view_frame">
<DESCRIPTION>
 The main window is divided up into 3 panes, for the music, the tune
 list and the abc text.  This mostly created those and also creates
 the main sub objects and timers that define the application.
</DESCRIPTION>
</METHOD>
<METHOD value="init">
<DESCRIPTION>
 Make debuggin a little easier by putting the init stuff into a different function.
</DESCRIPTION>
</METHOD>
<METHOD value="OnAbout">
<DESCRIPTION>
 Prints the version.
</DESCRIPTION>
</METHOD>
<METHOD value="OnDumpLog">
<DESCRIPTION>
 We provide a menu option to allow the user to dump the event log to
 a file.  This helps me debug problems that occur.
</DESCRIPTION>
</METHOD>
<METHOD value="OnHelp">
<DESCRIPTION>
 This will attempt to start a web browser that points to the
 included documentation.  But the online docs are probably better.
</DESCRIPTION>
</METHOD>
<METHOD value="OnNew">
<DESCRIPTION>
 The user wants a clean document.  Handle save issues and create a 
 generic tune.
</DESCRIPTION>
</METHOD>
<METHOD value="OnOpen">
<DESCRIPTION>
 Open a new file.  gets the file name from the user and sends the
 parameter to the iabc_media_manager to handle.
</DESCRIPTION>
</METHOD>
<METHOD value="OnScoreMode">
<DESCRIPTION>
 The user has requested to display the music in 'score' mode.
</DESCRIPTION>
</METHOD>
<METHOD value="OnViewPreferences">
<DESCRIPTION>
 Display the 'view preferences' dialog that allows the user to
 set a variety of display parameters.
</DESCRIPTION>
</METHOD>
<METHOD value="OnABCPreferences">
<DESCRIPTION>
 Allow the user to set up some parameters regarding the ABC language and
 how the parser works.
</DESCRIPTION>
</METHOD>
<METHOD value="OnViewPreferences">
<DESCRIPTION>
 Display a dialog for changing the editor font.
</DESCRIPTION>
</METHOD>
<METHOD value="OnSave">
<DESCRIPTION>
 Save the current document.
</DESCRIPTION>
</METHOD>
<METHOD value="ProcessEvent">
<DESCRIPTION>
 iabc dispatch model uses the wxWindows event pump.  This is the
 system entry points for events that are dispatched to the windows
 thread or other threads.
</DESCRIPTION>
</METHOD>
<METHOD value="OnRefresh">
<DESCRIPTION>
 The user has pressed the ctrl-L combination.  This will call the function
 in iabc_media_manager that re-parses the file and refreshes the tune.
 Also save the current cursor position so that the user is in the same
 place after the refresh.
</DESCRIPTION>
</METHOD>
<METHOD value="OnPlay">
<DESCRIPTION>
 Play zha midi, ja.
</DESCRIPTION>
</METHOD>
<METHOD value="OnSetPlayer">
<DESCRIPTION>
 Handle the logic to set the midi player, for the OnPlay command.
</DESCRIPTION>
</METHOD>
<METHOD value="OnExport">
<DESCRIPTION>
 Allow the user to export the document to midi.
</DESCRIPTION>
</METHOD>
<METHOD value="OnPrint">
<DESCRIPTION>
 Print the current tune using OS-specific methods.
</DESCRIPTION>
</METHOD>
<METHOD value="OnCut">
<DESCRIPTION>
 Handle the Ctrl-x character sequence.  This gets sent to the
 text buffer window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnCopy">
<DESCRIPTION>
 Handle the Ctrl-c character sequence.  This gets sent to the
 text buffer window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnPaste">
<DESCRIPTION>
 handle the Ctrl-v character sequence.  This gets sent to the 
 text buffer window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnUndo">
<DESCRIPTION>
 Handle the 'undo' command - poorly.  This needs some work.
</DESCRIPTION>
</METHOD>
<METHOD value="OnCloseWindow">
<DESCRIPTION>
 The big 'X' has been clicked, or exit from the menu.
</DESCRIPTION>
</METHOD>
<METHOD value="OnWindowCreate">
<DESCRIPTION>
 This is called one time during creation, we just use the
 generic windows code.
</DESCRIPTION>
</METHOD>
<METHOD value="OnSize">
<DESCRIPTION>
 Recalculate the sizes of the window parts.  Someday I'd
 like to allow the user to undock different parts of the 
 window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnTick">
<DESCRIPTION>
 We try to keep the music and the text in sync as the user
 is typing.  Every tick we check for changed text to move the
 cursor and do some other periodic things.
</DESCRIPTION>
</METHOD>
<METHOD value="OnTranspose">
<DESCRIPTION>
 The user has selected some text and chosen to transpose it.  Call
 the code that handles this.
</DESCRIPTION>
</METHOD>
<METHOD value="OnVoice">
<DESCRIPTION>
 Setup voice options.  The dialog box doesn't do anything yet but this
 will let the user show/hide voices.
</DESCRIPTION>
</METHOD>
<METHOD value="OnShowTuneList">
<DESCRIPTION>
 Show or hide the window pane with the tune list in it.
</DESCRIPTION>
</METHOD>
<METHOD value="really_exit">
<DESCRIPTION>
 Confirm save before exit.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_key_event">
<DESCRIPTION>
 Some key events that get received in the key area don't get handled
 by the text buffer object, but have a global effect and must be
 handled here.
</DESCRIPTION>
</METHOD>
<METHOD value="get_current_line_position">
<DESCRIPTION>
 Returns the point in the text buffer where the cursor is.
</DESCRIPTION>
</METHOD>
<METHOD value="do_open">
<DESCRIPTION>
 Documents can be opened a couple of different ways, this performs
 the actual open.
</DESCRIPTION>
</METHOD>
<METHOD value="do_close">
<DESCRIPTION>
 remove the object and close the window.
</DESCRIPTION>
</METHOD>
<METHOD value="get_midi_command_string">
<DESCRIPTION>
 This constructs the command line string that we use to 
 launch the midi player.
</DESCRIPTION>
</METHOD>
<METHOD value="get_random_filename">
<DESCRIPTION>
 Utility function to generate a random file name.
</DESCRIPTION>
</METHOD>
<METHOD value="create_menu">
<DESCRIPTION>
 create the main window's menu bar.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_handle_size">
<DESCRIPTION>
 true if we are initialized enough to handle window events.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_media">
<DESCRIPTION>
 This is where all the music-rendering and parsing action 
 goes on.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 handle the 500ms tick.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="wx_list_box.cpp" dir="CVS">
</FILE>
<FILE value="wx_list_box.h" dir="CVS">
<DESCRIPTION>
 These files all have to do with GUI artifacts used to get information
 from the user to an application.  
</DESCRIPTION>
<METHOD value="add/remove">
<DESCRIPTION>
 Don't do this because we will delete these explicitly since its a widows
 resource.
</DESCRIPTION>
</METHOD>
<CLASS value="wx_list_box_control">
<DESCRIPTION>
 A nested list of things, a widget that really everyone
 else calls a tree (and maybe someday I will too)
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="wx_percentage_meter.cpp" dir="CVS">
</FILE>
<FILE value="wx_percentage_meter.h" dir="CVS">
</FILE>
<FILE value="wx_pp.cpp" dir="CVS">
<DESCRIPTION>
 helper functions to convert values from dialog boxes into
 globals of various types
</DESCRIPTION>
</FILE>
<FILE value="wx_pp.h" dir="CVS">
<DESCRIPTION>
 Stuff to handle property pages.  A property page
 is just a way to get preferences from the user.
</DESCRIPTION>
</FILE>
<FILE value="wx_pp_temp.cpp" dir="CVS">
</FILE>
<FILE value="wx_pp_temp.h" dir="CVS">
</FILE>
<FILE value="wx_splitter.cpp" dir="CVS">
</FILE>
<FILE value="wx_splitter.h" dir="CVS">
</FILE>
<FILE value="wx_text_buffer.cpp" dir="CVS">
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
<METHOD value="sync_contents_to_buffer">
<DESCRIPTION>
 Update the text contents with the contents of the underlying
 wxTextCtrl buffer
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="wx_text_buffer.h" dir="CVS">
<CLASS value="key_handler">
<DESCRIPTION>
 We need a way to pass some key events to the menu frame so we can
 bind 'hotkeys' to menu items.  This abstract class allows us to do
 that.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_text_control">
<DESCRIPTION>
 This is our derivation of the text control class.  Right now we just
 update the cursor position when the user presses a character control.
 Someday maybe we will do some brief-style formatting.
</DESCRIPTION>
<DESCRIPTION>
 Update the cursor position in the status bar.
</DESCRIPTION>
<DESCRIPTION>
 Some key events we handle and don't pass to the default handler.  Return
 true if that's the case.
</DESCRIPTION>
<DESCRIPTION>
 Call the default handler and return
 true if this is an event that has changed the buffer.
</DESCRIPTION>
<DESCRIPTION>
 Keep track of the last time the buffer was modified so
 we know when to require a redraw.
</DESCRIPTION>
<ATTRIBUTE value="my_frame">
<DESCRIPTION>
 Lets us update the status text based on cursor position change.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wx_key_handler*">
<DESCRIPTION>
 give the main window first dibs on keyboard events.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wx_text_buffer">
<DESCRIPTION>
 A buffer class that implements text_buf, which has
 pretty much the same interface as FILE* stdio.  This is
 so our preprocess class can treat this like a file text
 buffer.
</DESCRIPTION>
<METHOD value="getpos">
<DESCRIPTION>
 Return the current position of the pointer into the text buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
<METHOD value="load">
<DESCRIPTION>
 Load the contents of the file and refresh the internal string.
</DESCRIPTION>
</METHOD>
<METHOD value="get_filename">
<DESCRIPTION>
 return the file name that I was opened with.
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_modify_time">
<DESCRIPTION>
 Get the last time this control was modified by the user.  We
 return the lesser of the modify/redraw time, since what the
 user really wants to know is: have the contents changes since
 last I redrew everything?
</DESCRIPTION>
</METHOD>
<METHOD value="refresh">
<DESCRIPTION>
 Update the status bar with the new position.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_ref">
<DESCRIPTION>
 There to satisfy dispatcher
</DESCRIPTION>
</METHOD>
<METHOD value="get_insertion_point">
<DESCRIPTION>
 Return the point of the 'carat' in the text field.
</DESCRIPTION>
</METHOD>
<METHOD value="set_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="get_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="reset_modify_time">
<DESCRIPTION>
 Set the modify time of the underlying file to match the underlying
 file's modify time (so we don't keep reloading the file)
</DESCRIPTION>
</METHOD>
<METHOD value="has_underlying_file_changed">
<DESCRIPTION>
 Returns true if the file underlying the control
 has been changed since my_last_modify_time.
</DESCRIPTION>
</METHOD>
<METHOD value="has_changed">
<DESCRIPTION>
 Return true if the contents have changed.
</DESCRIPTION>
</METHOD>
<METHOD value="load_if_newer">
<DESCRIPTION>
 Load the file if it has modified since we last read it in, or if
 we never read it in yet.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 GUI thread method to interact with windows.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 GUI thread method to insert the carat in the file.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_control">
<DESCRIPTION>
 The underlying windows object.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_has_underlying_file_changed">
<DESCRIPTION>
 The scanning thread sets this to true if the underlying file
 has changed beneath the buffer.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_should_exit">
<DESCRIPTION>
 used to control the exit of the scanning thread.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_position">
<DESCRIPTION>
 This stuff is kept track of so we can access it outside the
 windows thread.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_file_modify_time">
<DESCRIPTION>
 The modify time of the underlying file.  Use this to keep
 track of when we need to load the file into the buffer.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_redraw_time">
<DESCRIPTION>
 The last time we've redrawn the graphical music.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="display_to_buffer_map">
<DESCRIPTION>
 Under MS windows, the control has an extra character for each
 return character, so handle that here.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="wx_winres.cpp" dir="CVS">
</FILE>
<FILE value="wx_winres.h" dir="CVS">
<CLASS value="wx_canvas">
<DESCRIPTION>
 A place holder to break the dependency between resources like wxFonts and the
 windows who love them.
</DESCRIPTION>
</CLASS>
<CLASS value="font_creator">
<DESCRIPTION>
 Create a font in the correct windows thread.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_font">
<DESCRIPTION>
 wxWindows implementation of the font concept.
</DESCRIPTION>
<METHOD value="get_rect">
<DESCRIPTION>
 Return the rectangle that would contain the given string.  This
 method can be called from any thread, since the geometry data associated
 with a font is not stored when the font is created.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="wx_pen">
<DESCRIPTION>
 A pen to draw on a window.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_view_canvas">
<DESCRIPTION>
 We need to derive from the wxWindow object to handle the events like
 scrolling and screen updates, event though we have our own window object
 that does all the real window stuff.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_dc">
<DESCRIPTION>
 Proxy for the wxWindows device context, which needs to
 be established whenever we draw something on the screen
 or print something.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_window">
<DESCRIPTION>
 This is the actual window that we draw on.  It also acts
 as the event source for events and dispatches.
</DESCRIPTION>
<METHOD value="wx_window">
<DESCRIPTION>
 Constructor.  Give wx_window its drawing area.
</DESCRIPTION>
</METHOD>
<METHOD value="show()">
<DESCRIPTION>
 show/hide the window.
</DESCRIPTION>
</METHOD>
<METHOD value="pixels_per_inch_x/y">
<DESCRIPTION>
 Gets the window dimensions.
</DESCRIPTION>
</METHOD>
<METHOD value="get_dc">
<DESCRIPTION>
 Get the DC that we need to draw on.  This allows us to handle the DC where we
 are printing and the one where we're not.  This needs to be public as fonts and
 pens need to use the DC as well.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 The reference count has expired us and we are gone.
</DESCRIPTION>
</METHOD>
<METHOD value="set_pens">
<DESCRIPTION>
 Sets up the DC to draw with the selected pens.
</DESCRIPTION>
</METHOD>
<METHOD value="set_raw_size">
<DESCRIPTION>
 The contents of the document have changed such that the size of the virtual
 window needs to be updated.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_draw_rect">
<DESCRIPTION>
 Draw a rectangle on the screen with the given pen.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_draw_line">
<DESCRIPTION>
 Draw a line.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_draw_text">
<DESCRIPTION>
 Draw a string in the current location.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 METHOD:
 Draw the polygon in the current location.
</DESCRIPTION>
<METHOD value="raw_refresh">
<DESCRIPTION>
 Redraw the window in the given rectangle.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_get_visible">
<DESCRIPTION>
 return the absolute visible rectangle.
</DESCRIPTION>
</METHOD>
<METHOD value="initialize">
<DESCRIPTION>
 not used.
</DESCRIPTION>
</METHOD>
<METHOD value="get_drawable_rect">
<DESCRIPTION>
 Determine whether or not we are printing and get either the
 visible or printable area.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_ppi">
<DESCRIPTION>
 Store the ppi so we don't have to re-render it all the time
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wx_drawing_window">
<DESCRIPTION>
 This is a class that is used for drawing on the screen, in that it
 can handle scrolling.  It needs a specailly derived instance of
 wxWindow for scrolling and handling scroll events.
</DESCRIPTION>
<METHOD value="set_scroll_point">
<DESCRIPTION>
 Move the scroll thing so tha the given position is where the
 top of the scroll point is.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_update_thumb_scroll_size">
<DESCRIPTION>
 The document calls this when the contents of the document have changed such that
 the scroll bars need to be re-sized.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_refresh">
<DESCRIPTION>
 Redraw the window in the given rectangle.
 virtual void raw_refresh(const rect  &amp; tmp_rect);
</DESCRIPTION>
</METHOD>
<METHOD value="initialize">
<DESCRIPTION>
 not used.
</DESCRIPTION>
</METHOD>
<METHOD value="get_dc">
<DESCRIPTION>
 Get the DC that we need to draw on.  This allows us to handle the DC where we
 are printing and the one where we're not.  This needs to be public as fonts and
 pens need to use the DC as well.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="wx_printing_window">
<DESCRIPTION>
 Like the scrolling window, but does not accept
 callbacks since it doesn't get redrawn.
</DESCRIPTION>
<METHOD value="get_dc">
<DESCRIPTION>
 Get the DC that we need to draw on.  This allows us to handle the DC where we
 are printing and the one where we're not.  This needs to be public as fonts and
 pens need to use the DC as well.
</DESCRIPTION>
</METHOD>
<METHOD value="prepare_to_print">
<DESCRIPTION>
 This is set when we are prepared to print.
</DESCRIPTION>
</METHOD>
<METHOD value="start_printing">
<DESCRIPTION>
 set the print object to be the_printout and defer rendering for
 awhile until the pages have all been prepared.
</DESCRIPTION>
</METHOD>
<METHOD value="end_printing">
<DESCRIPTION>
 Set the printout object to NULL and do all future rendering on the
 screen DC.
</DESCRIPTION>
</METHOD>
<METHOD value="print_page">
<DESCRIPTION>
 Get the rectangle that describes the supplied page, and redraw that page.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_get_visible">
<DESCRIPTION>
 return the absolute visible rectangle.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="wxPrintout*">
<DESCRIPTION>
 The printout object that we will be printing on if we will
 be printing on something.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_printing_rect">
<DESCRIPTION>
 If my_printing rect has some area to it, accept drawing
 commands over that area.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wx_printout">
<DESCRIPTION>
 Derive from the wxPrintout and do the stuff we need
 to.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="doc.cpp" dir="CVS">
</FILE>
<FILE value="doc.h" dir="CVS">
</FILE>
<FILE value="docview.cpp" dir="CVS">
</FILE>
<FILE value="docview.h" dir="CVS">
</FILE>
<FILE value="main.cpp" dir="CVS">
<DESCRIPTION>
 Defines the entry point for the application.
</DESCRIPTION>
<CLASS value="MyApp">
<DESCRIPTION>
 Every application needs to create a derivation
 of hte wxApp class as an entry point.
 Define a new application
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the main appplication window frame, and initialize
 all of the pre-ordained dialog box objects.
</DESCRIPTION>
</METHOD>
<METHOD value="OnInit">
<DESCRIPTION>
 This is called when the main window is created.  We
 make the window visible here.
</DESCRIPTION>
</METHOD>
<METHOD value="OnExit">
<DESCRIPTION>
 Do some garbage collection and other cleanup, if you are debugging for
 memory leaks this may be useful.
</DESCRIPTION>
</METHOD>
<METHOD value="MainLoop">
<DESCRIPTION>
 Boilerplate stuff for the windows message pump.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="frame">
<DESCRIPTION>
 the frame is the main application window.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="resource.h" dir="CVS">
</FILE>
<FILE value="resources.cpp" dir="CVS">
</FILE>
<FILE value="resources.h" dir="CVS">
</FILE>
<FILE value="StdAfx.cpp" dir="CVS">
</FILE>
<FILE value="StdAfx.h" dir="CVS">
</FILE>
<FILE value="system_dirs.cpp" dir="CVS">
</FILE>
<FILE value="system_dirs.h" dir="CVS">
</FILE>
<FILE value="view.cpp" dir="CVS">
</FILE>
<FILE value="view.h" dir="CVS">
</FILE>
<FILE value="wx24_resources.cpp" dir="CVS">
</FILE>
<FILE value="wx24_resources.h" dir="CVS">
<DESCRIPTION>
 Define most of the dialog boxes and similar gadgets that are defined in this
 program.
</DESCRIPTION>
<CLASS value="wxTextQuerySizer">
<DESCRIPTION>
 A text widget in a dialog box.  Acts just like a wxTextCtrl combined with a sizer.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the widget and bind it to the parent window
</DESCRIPTION>
</METHOD>
<METHOD value="~ctor">
<DESCRIPTION>
 release the resources
</DESCRIPTION>
</METHOD>
<METHOD value="wxSizer*()">
<DESCRIPTION>
 Act just like a sizer to the client
</DESCRIPTION>
</METHOD>
<METHOD value="SetValue">
<DESCRIPTION>
 Set the value of the widget
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="wxStaticText*">
<DESCRIPTION>
 The label for the control
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wxTextCtrl*">
<DESCRIPTION>
 the control itself
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wxBoxSizer*">
<DESCRIPTION>
 the parent sizer
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wxBooleanQuerySizer">
<DESCRIPTION>
 Act just like a sizer, allow the user to make boolean choices.  Implemented
 as a checkbox probably
</DESCRIPTION>
</CLASS>
<CLASS value="wxIntSpinSizer">
<DESCRIPTION>
 Allows the user to choose a number with arrows up/down that increment
 /decrement the values.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_percentage_dialog">
<DESCRIPTION>
 Just displays progress for a long operation
</DESCRIPTION>
</CLASS>
<CLASS value="wx_window_media_pp:public">
<DESCRIPTION>
 The dialog box that contains all of the display
 choices like page size, etc.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_window_media_pp:public">
<DESCRIPTION>
 The dialog box that contains all of the display
 choices like page size, etc.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_abc_options_dialog">
<DESCRIPTION>
 A dialog box that allows the user t ochoose some
 options that affect the parser.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_midi_options_dialog">
<DESCRIPTION>
 Allows the user to choose midi player, etc.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="StdAfx.cpp" dir="CVS">
</FILE>
<FILE value="StdAfx.h" dir="CVS">
</FILE>
<FILE value="ut_concur.cpp" dir="CVS">
</FILE>
<FILE value="containut.cpp" dir="ut_contain">
</FILE>
<FILE value="StdAfx.cpp" dir="CVS">
</FILE>
<FILE value="StdAfx.h" dir="CVS">
</FILE>
<FILE value="doc.cpp" dir="CVS">
<CLASS value="wx_view_frame">
<DESCRIPTION>
 Each major window in wxWindows consists of a frame and a canvas.
 Define the frame.  The canvas is described in wx_winres.cpp.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="doc.h" dir="CVS">
</FILE>
<FILE value="StdAfx.cpp" dir="Release">
</FILE>
<FILE value="StdAfx.h" dir="Release">
</FILE>
<FILE value="ut_parse.cpp" dir="Release">
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that gets the current tune choice from the user.
</DESCRIPTION>
</METHOD>
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that clears the list for new parsing.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="StdAfx.cpp" dir="Release">
</FILE>
<FILE value="StdAfx.h" dir="Release">
</FILE>
<FILE value="ut_string.cpp" dir="Release">
</FILE>
</PROJECT>
=======
<?xml version="1.0"?>
<?xml-stylesheet href="iabc_autodoc.xsl" type="text/xsl"?>
<PROJECT>
<FILE value="abcrules.cpp" dir="iabc">
</FILE>
<FILE value="abcrules.h" dir="iabc">
<CLASS value="parser_state_info">
<DESCRIPTION>
 This is a static class (utility class) that keeps track of the state
 of some things in the parser that are global.  Like how many '(' we've
 matched so far and what the note duration is.  Usually this state lasts
 throught out the course of a single file.
</DESCRIPTION>
</CLASS>
<CLASS value="duration_rule">
<DESCRIPTION>
 There are 3 ways to represent
 a duration.  One is as a fraction, e.g. "1/4" for a 1/4 note.
</DESCRIPTION>
</CLASS>
<CLASS value="duration_specifier_rule">
<DESCRIPTION>
 This is the whole duration specifier in abc.  It also
 contains the default duration, which all duration
 rules use in case the duration is not specified.
 Note that the default duration for a note is handled internally
 in this abc parser.  When a duration is read the value is
 computed in terms of the current default, which is handled
 in the parser.
</DESCRIPTION>
</CLASS>
<CLASS value="index">
<DESCRIPTION>
 X: \d+
 describes an index field.  This maps titles to tunes.
</DESCRIPTION>
</CLASS>
<CLASS value="copyright_rule">
<DESCRIPTION>
 C: By Aaron Newman (c) 2003
</DESCRIPTION>
</CLASS>
<CLASS value="history_rule">
<DESCRIPTION>
 H: This class was written last Tuesday
 while Aaron was supposed to be doing the
 dishes.
</DESCRIPTION>
</CLASS>
<CLASS value="title">
<DESCRIPTION>
 T: the title rule.  Describes a title.  Add to the current
 title if we are still in the same tune (which you can tell by
 looking at the last index)
</DESCRIPTION>
</CLASS>
<CLASS value="meter_header_rule">
<DESCRIPTION>
 The M: header rule
</DESCRIPTION>
</CLASS>
<CLASS value="tempo_header_rule">
</CLASS>
<CLASS value="meter_specifier_rule">
<DESCRIPTION>
 The meter specifier in ABC.  This also acts
 as the source of the current meter in ABC.  ALso,
 I frequently call 'meter' 'time signature'.
</DESCRIPTION>
</CLASS>
<CLASS value="Voice">
<DESCRIPTION>
 This is the voice change that can be at the start of a
 line of music.
</DESCRIPTION>
</CLASS>
<CLASS value="letter_note_rule">
<DESCRIPTION>
 The letter note rule is part of the pitch.
</DESCRIPTION>
<DESCRIPTION>
 An octave as defined by '' or ,,.  We'll need
 to add the octave header somewhere too.
</DESCRIPTION>
</CLASS>
<CLASS value="part_header_rule">
<DESCRIPTION>
 A part is a section of music called out by a letter or number
 above the music.
</DESCRIPTION>
</CLASS>
<CLASS value="key_header_rule">
<DESCRIPTION>
 The entire key header rule in one take.  We need to know the key
 before we know the pitch since we will adjust the accidental
 accordingly.
</DESCRIPTION>
<METHOD value="convert">
<DESCRIPTION>
 Get the key the user wants, and return the number
 of characters that should be skipped to get to the
 next thing.
</DESCRIPTION>
</METHOD>
<METHOD value="parse_extra_stuff">
<DESCRIPTION>
 Get the key=value pairs that can trail a key
 declaration.
</DESCRIPTION>
</METHOD>
<METHOD value="construct_expressions_if_required">
<DESCRIPTION>
 We occasionally delete the key regular expressions since
 the take lots of memory.  Construct them before use.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="accidental_rule">
<DESCRIPTION>
 The accidental that can preceed a note.
</DESCRIPTION>
</CLASS>
<CLASS value="pitch_rule">
<DESCRIPTION>
 A pitch is a letter note, possibly combined with
 an octave and an accidental.
</DESCRIPTION>
</CLASS>
<CLASS value="bar_line_rule">
<DESCRIPTION>
 The end of line, which could be a repeat, bar line, etc.
</DESCRIPTION>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="inline_header_rule">
<DESCRIPTION>
 Return true if there is a match of a header inline a piece of
 music.
</DESCRIPTION>
</CLASS>
<CLASS value="note_info_rule">
<DESCRIPTION>
 A note_info is a pitch and a duration. If no duration
 is given the default one is used.
</DESCRIPTION>
<METHOD value="matched_pitch">
<DESCRIPTION>
 Sometimes the pitch was not changed but we received an inline
 header instead.  Return false in this case.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="multi_note_rule">
<DESCRIPTION>
 many notes, glommed together.  Used to put together
 chords and also single notes.
</DESCRIPTION>
</CLASS>
<CLASS value="note_info_or_inline_header_rule">
<DESCRIPTION>
 Both the header rule and the note info rule can be
 enclosed in [].  Figure out which here.
</DESCRIPTION>
</CLASS>
<CLASS value="chord_info_rule">
<DESCRIPTION>
 A chord in abc is a single note or multiple notes within
 a pair of square brackets.
</DESCRIPTION>
</CLASS>
<CLASS value="hornpipe">
<DESCRIPTION>
 The hornpipe rule is a funny little abc'ism.  The fraction
 produced by this rule is interpreted as follows:
 multiply the default duration by 1/2^#, where # is the
 number of  &lt;  or  &gt; s.
 For  &lt;  ( &gt; ) Add that to the LHS(RHS) and subtract it from
 the RHS(LHS).  This usually (always?) results in a dotted rhythm
</DESCRIPTION>
</CLASS>
<CLASS value="cparen_rule">
<DESCRIPTION>
 For some reason abc allows a space between the closing note
 in a beam group and a closing paren.  Have a rule that does that.
</DESCRIPTION>
</CLASS>
<CLASS value="cparen_rule">
<DESCRIPTION>
 For some reason abc allows a space between the closing note
 in a beam group and an opening paren.  Have a rule that does that.
</DESCRIPTION>
</CLASS>
<CLASS value="dynamic_string">
<DESCRIPTION>
 The dynamics that ABC knows about that can be displayed on the
 screen or via midi.
</DESCRIPTION>
</CLASS>
<CLASS value="bang_rule">
<DESCRIPTION>
 some things are defined within the '!' fenceposts
 We glom these together under the bang rule.
</DESCRIPTION>
<METHOD value="convert">
<DESCRIPTION>
 We have found a match for the rule, which means we have matched a
 expression in the language.  Do whatever that expression tells us to.
</DESCRIPTION>
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="abc_quoted_string">
<DESCRIPTION>
 abc allows space after quotes and before the chords they accompany.
 Handle it.
</DESCRIPTION>
<METHOD value="convert">
<DESCRIPTION>
 We have found a match for the rule, which means we have matched a
 expression in the language.  Do whatever that expression tells us to.
</DESCRIPTION>
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="post_chord_stuff">
<DESCRIPTION>
 This is the stuff that can occur between the notes in a chord
 or at the end of a chord.
</DESCRIPTION>
</CLASS>
<CLASS value="multi_chord_rule">
<DESCRIPTION>
 This rule will match almost everything in legal abc that is
 expressed as multiple chords run together, except xlets.
 Note: here is where we start counting paren's for slurs/ties
</DESCRIPTION>
</CLASS>
<CLASS value="voice_definition_rule">
<DESCRIPTION>
 The V: command, which does many things like we said before
</DESCRIPTION>
</CLASS>
<CLASS value="voice_header">
<DESCRIPTION>
 Matches a voice header.
</DESCRIPTION>
</CLASS>
<CLASS value="voice_rule_all_inclusive">
<DESCRIPTION>
 Depending on whether or not we're allowing text-based
 voice rules, proxy to the correct object.
</DESCRIPTION>
</CLASS>
<CLASS value="beam_group_rule">
<DESCRIPTION>
 In abc a beam group is defined as any set of chords without a
 space.
</DESCRIPTION>
</CLASS>
<CLASS value="words_rule">
<DESCRIPTION>
 These are the words that actually go below the music.
</DESCRIPTION>
</CLASS>
<CLASS value="words_rule">
<DESCRIPTION>
 These are the words that are written free-hand
 below the music.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="array.cpp" dir="iabc">
</FILE>
<FILE value="array.h" dir="iabc">
<DESCRIPTION>
 Classes to handle arrays of arbitrary types.
</DESCRIPTION>
<CLASS value="array_data">
<DESCRIPTION>
 The array class uses the smart pointer pattern.  
 The memory allocated for the array is handled here.  Clients
 of the array classes should use array &lt;  &gt;  and not array_data.
</DESCRIPTION>
</CLASS>
<CLASS value="array">
<DESCRIPTION>
 A parameterized array class that allows effecient assignement and
 shallow copying.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the array.
 Args are optional.  No argmunts creates an empty array.
 int the_initial_size, the number of (un-initialized) elements in the array
 at creation time.  the_grow_size is the number of elements that we add when we
 expand the array.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 dereference the underlying data, when all references have been removed the data
 will be deleted.
</DESCRIPTION>
</METHOD>
<METHOD value="expand_to">
<DESCRIPTION>
 Create un-initialized elements until the array is the_index+1 elements.
</DESCRIPTION>
</METHOD>
<METHOD value="expand">
<DESCRIPTION>
 create num_elems additional un-initialzied elements in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="get_size">
<DESCRIPTION>
 return the number of elements (get_number_elements would have been a better name)
</DESCRIPTION>
</METHOD>
<METHOD value="T &amp; ">
<DESCRIPTION>
 return the element at the_index'th position.
</DESCRIPTION>
</METHOD>
<METHOD value="ctor">
<DESCRIPTION>
 dereference my data and reference the data of the_other.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_all">
<DESCRIPTION>
 remove all the elements and set the size of the array to 0
</DESCRIPTION>
</METHOD>
<METHOD value="remove_from_end">
<DESCRIPTION>
 Remove the last element of the array, effectively shrinking the array size by one.
</DESCRIPTION>
</METHOD>
<METHOD value="deep_copy">
<DESCRIPTION>
 copy all elements of the array from the_intput to the_output.
 Assumption is that the underlying arrays are not the same.
</DESCRIPTION>
</METHOD>
<METHOD value="do_to_all">
<DESCRIPTION>
 Invoke the_predicate(the_list[i]) for each element in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="add_to_end">
</METHOD>
</CLASS>
</FILE>
<FILE value="beamer.cpp" dir="iabc">
</FILE>
<FILE value="beamer.h" dir="iabc">
<CLASS value="beamer">
<DESCRIPTION>
 Beamer draws beams and flags on notes.  A note tells the
 beamer its coordinates as it is drawn, and the beamer computes
 the coordinates and shape of the beam and stem.
</DESCRIPTION>
<METHOD value="beamer">
<DESCRIPTION>
 Call the base class figure constructor with the screen dimensions.
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Since we beam according to note heads, we can't just map our points
 to another space; we need to actually clone the note heads first.
  virtual figure* clone(const rect &amp;  r1,const rect &amp;  r2,const size &amp;  ppi);
</DESCRIPTION>
</METHOD>
<METHOD value="beam_me">
<DESCRIPTION>
 When a note figure knows its coordinates, it calls this method to tell
 the beamer to add this note head to the beam group.  If there is no beam
 group then this note receives a stem but no beam.
</DESCRIPTION>
</METHOD>
<METHOD value="get_absolute_ul">
<DESCRIPTION>
 Unlike other figures, beamers know where they're really supposed to
 go.  Return that absolute point, and everything else is relative
 to that.  This makes it easier to move around
</DESCRIPTION>
</METHOD>
<METHOD value="get_xlet_points">
<DESCRIPTION>
 Get the points where the little xlet descriptions are supposed to go.
</DESCRIPTION>
</METHOD>
<METHOD value="get_upness_value/high_poitn/low_point/tail_width">
<DESCRIPTION>
 Get some geometry information about the figure so that we might draw it 
 correctly.
</DESCRIPTION>
</METHOD>
<METHOD value="force_direction">
<DESCRIPTION>
 For some notes, like with SATB parts, we like to force the beam to go a certain
 way.
</DESCRIPTION>
</METHOD>
<METHOD value="should_beam">
<DESCRIPTION>
 Return true if the value is either less than the level of the beam,
 or is a dotted level of the beam.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 The figure virtual method.  The window wants to draw the beam so its time
 to render the shape.
</DESCRIPTION>
</METHOD>
<METHOD value="create_xlet">
<DESCRIPTION>
 Draw the little number and the bracket associated with triplets and 
 other xlets.
</DESCRIPTION>
</METHOD>
<METHOD value="is_dotted">
<DESCRIPTION>
 return true if this value is a dotted version of the_base.  
 These have different flags than triplety things.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 The figure virtual method.
 Most figures use a bogotwip coordinate system based on PostScript.  But this
 shape is drawn to absolute screen coordinates, so set the linear xform
 for this polygon to 1:1.
</DESCRIPTION>
<METHOD value="point">
<DESCRIPTION>
 Get the highest connection point in our beam group.
</DESCRIPTION>
</METHOD>
<METHOD value="get_lowest_point">
<DESCRIPTION>
 Get the lowest connection point in our beam group.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_beam_segment">
<DESCRIPTION>
 A helper function to create_beam, that actually draws the beam and makes
 create_beam a little less complicated.  The draw_half variable indicates
 whether we draw the segment all the way to p2, or only 1/2 way.  the_left
 says we are drawing from left to right.
  
     --------                  ---------
     |--     |                 |    ----|
     |       |                 |        |
     |       |                 |        |
    0       0                  0        0
    half = true, left = true  half = false, left = false 
</DESCRIPTION>
</METHOD>
<METHOD value="create_tail">
<DESCRIPTION>
 If we need to put a tail on a single unbeamed 8th note,
 do that
</DESCRIPTION>
</METHOD>
<METHOD value="create_head_offset">
<DESCRIPTION>
 Offset the connection points depending on whether the
 stem goes up or down.
</DESCRIPTION>
</METHOD>
<METHOD value="set_hi_low">
<DESCRIPTION>
 figure out where the high and low points are.
</DESCRIPTION>
</METHOD>
<METHOD value="create_stems">
<DESCRIPTION>
 Create the stem going either to the beam or just up.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="int">
<DESCRIPTION>
 The depth in pixels of the beaming figure between note heads.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Beams always go up.  If the beam is actually down we need to start it below
 the note.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Where the note goes on the staff, sometimes used to determine the 'upness'
 of the note head.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Some interesting things about the geometry of the figure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_connection_points:array &lt; point &gt; ">
<DESCRIPTION>
 This is the place where the note heads go.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_beam_points:array &lt; point &gt; ">
<DESCRIPTION>
 This is the place where the beams go.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_original_beam_points">
<DESCRIPTION>
 This is for clone
 array &lt; point &gt;  my_original_beam_points;
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_xlet_values:array &lt; int &gt; ">
<DESCRIPTION>
 The xlet values that will be beamed under/over the beam groups
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_xlet_points">
<DESCRIPTION>
 Keep track of where the descriptions of the xlets are supposed
 to go.  We can't draw them because we don't know about fonts and
 windows and stuff.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_upness_values">
<DESCRIPTION>
 Indicate whether the beams go up or down.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_forced_upness">
<DESCRIPTION>
 1 or -1 if we are forced to beam up or down, otherwise it stays at
 0
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_durations">
<DESCRIPTION>
 Keep track of the durations of notes so we can beam them
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 The note head that goes on the note.
</DESCRIPTION>
<ATTRIBUTE value="my_is_grace">
<DESCRIPTION>
  True if this is a grace note.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="debug.h" dir="CVS">
</FILE>
<FILE value="dispatch.cpp" dir="CVS">
</FILE>
<FILE value="dispatch.h" dir="CVS">
<CLASS value="wd_command">
<DESCRIPTION>
 The command we are trying to send to the window will be 
 embedded in a wd command class.  A derived version of
 this class will actually be called in the correct thread.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 The dispatcher requires a window to send the command to.
</DESCRIPTION>
</METHOD>
<METHOD value="command_add_ref">
<DESCRIPTION>
 Implement reference counting so the window gets destroyed
 when everybody's done with it and not before.
</DESCRIPTION>
</METHOD>
<METHOD value="get_default_canvas">
<DESCRIPTION>
 We assume that there's always 1 'main' window that is always available to
 dispatch your commands for you, if you need to dispatch something but don;e
 know about a particular window class (which is often the case with dialog
 boxes).
</DESCRIPTION>
</METHOD>
<METHOD value="do_command">
</METHOD>
</CLASS>
<CLASS value="dispatcher">
<DESCRIPTION>
 A dispatcher takes a set of wd_command objects and queues them
 up and sends them to the correct thread.  If we are already in the
 correct thread and blocking is on then we execute it right then and 
 there.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="drawtemp.cpp" dir="CVS">
</FILE>
<FILE value="drawtemp.h" dir="CVS">
</FILE>
<FILE value="draw_figure.cpp" dir="CVS">
</FILE>
<FILE value="draw_figure.h" dir="CVS">
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="event.cpp" dir="CVS">
</FILE>
<FILE value="event.h" dir="CVS">
<DESCRIPTION>
 Classes to handle events safely and efficiently
</DESCRIPTION>
<CLASS value="event_handler_if">
<DESCRIPTION>
 The interface to an event handler, that an event
 source knows about.  This breaks up the circular
 dependency between source and handler using the
 obserer pattern.
</DESCRIPTION>
<METHOD value="Add/Remove">
<DESCRIPTION>
 Event Handlers and event sources need to keep reference
 counts to each other very carefully.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_event">
<DESCRIPTION>
 A source object call this instance of a handler that
 it knows about.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="EventSource">
<DESCRIPTION>
 A class that represents an event that could occur.  It is capable
 of notifying  event handlers that the event has occured.
</DESCRIPTION>
<METHOD value="add_event_handler">
<DESCRIPTION>
 An event handler wants to be informed if this event fires;
 Add it to the list of events we notify in the event of an event.
</DESCRIPTION>
</METHOD>
<METHOD value="RemoveEventHandler">
<DESCRIPTION>
 The event handler no longer cares about this event.  Remove it from
 the list.
</DESCRIPTION>
</METHOD>
<METHOD value="NotifyHandlers">
<DESCRIPTION>
 The event has occured!  Notify all event handlers that the event has
 occured.
</DESCRIPTION>
</METHOD>
<METHOD value="pre/post">
<DESCRIPTION>
 Before and after the event handler adds the event, there may be special things
 that we need to do, like set a timer in the case of a timer for example.
</DESCRIPTION>
</METHOD>
<METHOD value="AddEventHandlerToList">
<DESCRIPTION>
 Protected method that actually adds the handler to the linked list.
</DESCRIPTION>
</METHOD>
<METHOD value="PopulateHandlerList">
<DESCRIPTION>
 We need threadsafe access to our internal list, but we can't block while
 we're notifying events.  So we just deep copy our internal list and we don't
 have to worry about the list changing underneath us.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="EventHandler">
<DESCRIPTION>
 An event handler can block on events until they occur.  Many event
 handlers can be or'd together so that we can wait on the first of many
 things at once.
</DESCRIPTION>
<METHOD value="operator|">
<DESCRIPTION>
 Add the_other to the list of events in this event
 chain.
</DESCRIPTION>
</METHOD>
<METHOD value="wait">
<DESCRIPTION>
 Set the event source for all the events in the chain, and
 then pend on the semaphore that indicates that the event has
 occured.
</DESCRIPTION>
</METHOD>
<METHOD value="get_event_source">
<DESCRIPTION>
 This is the part that must be derived.  Each instance of an event
 handler should know how to get an instance of the source that it
 can wait on.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_event">
<DESCRIPTION>
 This is called when the event source fires.  The event chain will
 then be torn down and the thread that was waiting on the event will
 be allowed to continue.
</DESCRIPTION>
</METHOD>
<METHOD value="Rearm">
<DESCRIPTION>
 Allow an event to be reused.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_source">
<DESCRIPTION>
 This is the actual source that I am waiting on.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="set_event_source">
<DESCRIPTION>
 The generic logic that calls GetEventSource.  An excpetion
 is thrown here if the event source already exists.
</DESCRIPTION>
</METHOD>
<METHOD value="add_handler_to_chain">
<DESCRIPTION>
 the_next is an event handler in the chain.  This is used\
 when setting up the 'or' chain.
</DESCRIPTION>
</METHOD>
<METHOD value="pass_event_to_first">
<DESCRIPTION>
 Only one event in a chain is the 'first', which is the one
 that ends on blocking.  Make sure we always release the block
 from that point to assure deterministic behavior.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 The pending has ended.  The event has fired.  Tear down the event
 chain.
</DESCRIPTION>
<METHOD value="zero/add/remove">
<DESCRIPTION>
 When handling events in chains, the actual values can be zeroed
 out underneath us when the chain is released.  Prevent the events
 and sources from being released prematurely.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_sem">
<DESCRIPTION>
 The semaphore that we are pending on.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_next/last">
<DESCRIPTION>
 The other events in the chain.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="event_log.cpp" dir="CVS">
</FILE>
<FILE value="event_log.h" dir="CVS">
<DESCRIPTION>
 Log all kinds of events and changes in program state.  Not
 to be confused with events, which are a specific concurrent
 type.
</DESCRIPTION>
<CLASS value="base_event_data">
<DESCRIPTION>
 Most events have this data in common so we have a
 class for it to save some typeing.
</DESCRIPTION>
</CLASS>
<CLASS value="base_event_log">
<DESCRIPTION>
 A container for event log data.  Methods used for
 printing, logging.  The data that is actually in
 the log is implementation-specific
</DESCRIPTION>
<METHOD value="base_event_log">
<DESCRIPTION>
 Initialize the common data.  the_size is the
 number of events and the_num_params is the number
 of parameters in each event.
</DESCRIPTION>
</METHOD>
<METHOD value="get_first_event_index">
<DESCRIPTION>
 When printing out the events, we use get_first_event_index to
 get the index of the oldest event in the circular queue
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_event_index">
<DESCRIPTION>
 When printing out the events, we use get_last_event_index to
 get the index of the most recent event in the circular queue
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_size">
<DESCRIPTION>
 Return the number of events in this particular log.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Print the log entry into a character buffer in human-readable format.
</DESCRIPTION>
</METHOD>
<METHOD value="print_log">
<DESCRIPTION>
 Dump the entire log file to the stream f.
</DESCRIPTION>
</METHOD>
<METHOD value="get_timestamp">
<DESCRIPTION>
 return the timestamp for an event log.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_size">
<DESCRIPTION>
 the number of events in this log
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_index">
<DESCRIPTION>
 the current index into the circular buffer.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_wrapped">
<DESCRIPTION>
 true if the event log has wrapped.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_num_params">
<DESCRIPTION>
 The number of parameters in a single event.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="event_log_template">
<DESCRIPTION>
 Most event logs are exactly the same except for the
 strings used to describe the numerical parameters and
 the number of parameters per event.  This template handles
 all of those types of events.
</DESCRIPTION>
<DESCRIPTION>
 The title is printed out before the entire log is dumped.
</DESCRIPTION>
<METHOD value="log_event">
<DESCRIPTION>
 Store an event in the event log array.  The enumeration is
 one of the types of events defined for EventType
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="char_log_template">
<DESCRIPTION>
 Some event logs have variable-sized events.  Each event generates
 some text that is variable size and some numerical events that are
 of fixed size.
</DESCRIPTION>
<METHOD value="log_event">
<DESCRIPTION>
 Log the event.  The first parameter is the variable-sized part,
 which is represented as a character string.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
<METHOD value="get_log_entry">
<DESCRIPTION>
 Implementation of the interface described above.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="the_event_array">
<DESCRIPTION>
 the log of event data.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_byte_array">
<DESCRIPTION>
 the array for the variable-sized character data.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="windows_event_data">
<DESCRIPTION>
 A single windows event.  The interface allows the template class
 event_log_template to manage these events.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="dispatch_event_data">
<DESCRIPTION>
 A single dispatch event.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="doc_event_data">
<DESCRIPTION>
 The lifetime of a document and things that happen to it.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="figure_event_data">
<DESCRIPTION>
 A figure (e.g. a picture of a note) has changed.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="event_event_data">
<DESCRIPTION>
 Data to log a single event.
</DESCRIPTION>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="parser_event_data">
<DESCRIPTION>
 A single parser event.
</DESCRIPTION>
<ATTRIBUTE value="my_event">
</ATTRIBUTE>
<ATTRIBUTE value="my_data">
<DESCRIPTION>
 This is some data that is common to all events
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="parser_event_data">
<DESCRIPTION>
 A single parser event.
</DESCRIPTION>
<ATTRIBUTE value="my_event">
</ATTRIBUTE>
<ATTRIBUTE value="my_data">
<DESCRIPTION>
 This is some data that is common to all events
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="the_event_strings">
<DESCRIPTION>
 The strings that describe the events and their parameters.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="factory.cpp" dir="CVS">
</FILE>
<FILE value="factory.h" dir="CVS">
<CLASS value="factory">
<DESCRIPTION>
 Define a template for a function that returns an instance of a class
 where the actual create function is defined at link time.
</DESCRIPTION>
</CLASS>
<CLASS value="globalton">
<DESCRIPTION>
 Define a static instance that is guaranteed to be created at the
 right time if it is referenced before 'main'.  Good for class factories.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="figure.cpp" dir="CVS">
</FILE>
<FILE value="figure.h" dir="CVS">
<CLASS value="figure">
<DESCRIPTION>
 Define a renderable thing.  The abstract method render_poly must be
 overridden to define the point in the polygon.  Additional
 virtual method control scaling, composite objects and other goodies.
</DESCRIPTION>
</CLASS>
<CLASS value="draw_command &lt; figure,point &gt; ">
</CLASS>
<CLASS value="point_figure_pair">
<DESCRIPTION>
 This will come in handy to describe a figure and the point where it is to
 be rendered.
</DESCRIPTION>
<METHOD value="figure(cost">
<DESCRIPTION>
 Since rendering in abcmacs is done in bogotwips (100*twips),
 we need to make sure that we know how many pixels to an inch.
 The figures work out best if we transform to screen coordinates
 when rendering the figure rather than rendering in twips and
 fixing it later.
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Create a new figure based on this figure
</DESCRIPTION>
</METHOD>
<METHOD value="rescale">
<DESCRIPTION>
 Reset the scale.  Since we render on a scale-specific canvas,
 that means re-rendering the polygon.  Note that, since many figures
 are shared between many clients, re-scaling a figure could have
 strange results if everything else isn't rescaled, also.
</DESCRIPTION>
</METHOD>
<METHOD value="add/remove">
<DESCRIPTION>
 Handle reference counting
</DESCRIPTION>
</METHOD>
<METHOD value="get...point">
<DESCRIPTION>
 Get the extreme points (leftmost, etc) points
 in a figure.
</DESCRIPTION>
</METHOD>
<METHOD value="get_size_in_pixels">
<DESCRIPTION>
 Returns size in pixels and ul in terms of offset from starting point
</DESCRIPTION>
</METHOD>
<METHOD value="get_bounding_box">
<DESCRIPTION>
 Return the bounding box of the rectangle if it were drawn at the
 given point.
</DESCRIPTION>
</METHOD>
<METHOD value="get_middle">
<DESCRIPTION>
 return the middle point of the bounding box that surrounds the figure.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 You can get this from the size one, but its useful by itself
</DESCRIPTION>
<METHOD value="dispatch_draw_self">
<DESCRIPTION>
 Draw the figure in the window thread at the point the_origin on the
 window w.
</DESCRIPTION>
</METHOD>
<METHOD value="get_extreme_point">
<DESCRIPTION>
 Returns the topmost, leftmost, etc. actual point.  Good for
 connecting figures together.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Remove references to contained figures.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 method called by dispatcher template class.  This method
 will always be called in the windows thread.
</DESCRIPTION>
</METHOD>
<METHOD value="create_poly">
<DESCRIPTION>
 Derivation draws the thing here.
</DESCRIPTION>
</METHOD>
<METHOD value="render_poly">
<DESCRIPTION>
 Render the polygon, either so it can be drawn or for sizing.
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_ppi">
<DESCRIPTION>
 The pixels per inch that we use to reference our points.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_scale">
<DESCRIPTION>
 The scaling constant we use when deciding how big things are.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_poly">
<DESCRIPTION>
 The polygon that defines the figure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_polygon_rendered">
<DESCRIPTION>
 True if we have rendered, so we only have to do it once.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_count">
<DESCRIPTION>
 reference count, delete this when 0.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="set_pen_width">
<DESCRIPTION>
 set the pen width for drawing this figure before rendering.
</DESCRIPTION>
</METHOD>
<METHOD value="calculate_scaled_pen_width">
<DESCRIPTION>
 Sometimes, especially for outlined objects, its good to get 
 the pend width based on the scale and ppi of this object.  Do
 that here.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_pen_width">
</ATTRIBUTE>
<ATTRIBUTE value="my_is_scaled">
<DESCRIPTION>
 Indicates the pen width is scaled.  I added this when I realized
 that cloned_figure broke my scaled_figure inheritance, but left
 the scaled_figure class out of laziness.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="scaled_figure">
<DESCRIPTION>
 A figure that uses a pen width based on the
 current scale.
</DESCRIPTION>
</CLASS>
<CLASS value="cloned_figure">
<DESCRIPTION>
 A cloned figure uses the polygons from a figure class
 but maps the points to a different rectangle.  We have
 to re-render the polygon in order to handle the different
 scaling without aliasing.
</DESCRIPTION>
<METHOD value="create_poly">
<DESCRIPTION>
 ctor
</DESCRIPTION>
</METHOD>
<METHOD value="set_xform">
<DESCRIPTION>
 Set the scale of the drawing surface.  Many of the drawing routines
 we have use twips in a postscript-like coordinate system, but some
 are in absolute pixels.  The default behavior is the postscript like
 scaling.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="figure_factory.cpp" dir="CVS">
</FILE>
<FILE value="figure_factory.h" dir="CVS">
<CLASS value="figure_factory">
<DESCRIPTION>
 Create and manage figures that are fixed.  that is,
 they have the same set of points regardless of where the
 center of the figure is.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="gm.cpp" dir="CVS">
</FILE>
<FILE value="gm.h" dir="CVS">
<DESCRIPTION>
 Geometry Management. Stand-alone functions that compute coordinates of 
 things in relation to a staff, but didn't belong any place else.
 Basically these functions will compute the correct spot to place a note
 given some basic information about the note and the staff.
</DESCRIPTION>
<DESCRIPTION>
 Compute the coordinate to place the figure, if you want it to represent
 the_note place on the_staff.
</DESCRIPTION>
<DESCRIPTION>
 Find the height of the note, if the staff height is the_staff_heigh and the
 center of the staff is center_line.  Value is offset from the center of 
 the staff.
</DESCRIPTION>
<DESCRIPTION>
 Get the vertical placement of the given pitch, if the given staff is
 the_staff_height.
</DESCRIPTION>
</FILE>
<FILE value="iabc.h" dir="CVS">
</FILE>
<FILE value="iabc_media.cpp" dir="CVS">
</FILE>
<FILE value="iabc_media.h" dir="CVS">
<CLASS value="iabc_media">
<DESCRIPTION>
 This class reads in an abc file, and converts it to the
 universal internal format.  Then it sends this internal music
 to the media for the music to be realized.
</DESCRIPTION>
<METHOD value="iabc_media(ctor)">
<DESCRIPTION>
 Store the file that we will open later and try to parse.
</DESCRIPTION>
</METHOD>
<METHOD value="parse(media &amp; ">
<DESCRIPTION>
 parse the input file and tell the media what we've found so the
 music can be realized somehow.
</DESCRIPTION>
</METHOD>
<METHOD value="set_modified">
<DESCRIPTION>
 The buffer has been modified.  Set up the last modified time as the current time.
</DESCRIPTION>
</METHOD>
<METHOD value="get_start_line_of_tune">
<DESCRIPTION>
 Return the line that the tune we just partsed started on.
</DESCRIPTION>
</METHOD>
<METHOD value="present_all">
<DESCRIPTION>
 We have parsed a file.  Now display all the music.
</DESCRIPTION>
</METHOD>
<METHOD value="get_points">
<DESCRIPTION>
 We have changed parts so we weren't reading the music in in order.
 Get the points we saved the last time, and save the current point
 of measure and chord for when we change back to this part/voice.
</DESCRIPTION>
</METHOD>
<METHOD value="get_current_tune">
<DESCRIPTION>
 Get the current tune selection from the GUI, and also save that in the
 registry for next time we open the file.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_has_parsed">
<DESCRIPTION>
 Indicates whether or not we have parsed a file already so we can
 display different parts of a file without reloading the file, which
 can take a long time if the file is big.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 The number of tunes in the parser, used to see if we need to
 re-parse the file.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="iabc_media_manager.cpp" dir="CVS">
</FILE>
<FILE value="iabc_media_manager.h" dir="CVS">
<DESCRIPTION>
 This is it.  There is where the parser is created and the window
 that the parser draws on is created.  It must know about all things
 including wxWindows stuff because it creates things explicitly
</DESCRIPTION>
<CLASS value="wx_tune_list_control">
<DESCRIPTION>
 Display a list of tunes that the media read in.  We need to use
 the tune box to do this.
</DESCRIPTION>
</CLASS>
<CLASS value="iabc_media_manager">
<DESCRIPTION>
 Allow a user to open and parse and iabc file, then display it on a window
 somewhere.  Also handles printing and midi.
</DESCRIPTION>
<METHOD value="click">
<DESCRIPTION>
 someone has clicked on the area of the window that
 contains this document.
</DESCRIPTION>
</METHOD>
<METHOD value="ctor">
<DESCRIPTION>
 Do many things.
</DESCRIPTION>
</METHOD>
<METHOD value="entry_point">
<DESCRIPTION>
 Handle the entry point of the thread.  The parsing and construction of the music is
 done in this thread.
</DESCRIPTION>
</METHOD>
<METHOD value="rescale">
<DESCRIPTION>
 Handle where the user has chosen a different rendering scale.
</DESCRIPTION>
</METHOD>
<METHOD value="print">
<DESCRIPTION>
 send it to the printer in wxWindows
</DESCRIPTION>
</METHOD>
<METHOD value="attach_canvas">
<DESCRIPTION>
 Someone has created a document and is now attaching it to a window.  Let the window know
 that we exist and keep track of it so that we can draw on something.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 The document is closing or has closed.  Its no good anymore so remove all references to it.
</DESCRIPTION>
<METHOD value="restart">
<DESCRIPTION>
 Start the thread and parse the same file again.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Indicates that the parse is still on-going so we can't respond to the drawing commands yet.
</DESCRIPTION>
<DESCRIPTION>
 Document method that returns what part of the window a page in a document occupies. Used
 in printing.
</DESCRIPTION>
<METHOD value="open">
<DESCRIPTION>
 Open the following abc file and parse it.
</DESCRIPTION>
</METHOD>
<METHOD value="play">
<DESCRIPTION>
 Create a midi file based on the current tune.
</DESCRIPTION>
</METHOD>
<METHOD value="close">
<DESCRIPTION>
 Close the file we were just looking at and free all resources.
</DESCRIPTION>
</METHOD>
<METHOD value="has_page">
<DESCRIPTION>
 Usually for printing, return this information
</DESCRIPTION>
</METHOD>
<METHOD value="choose_tune">
<DESCRIPTION>
 Choose a tune from the file we have already opened.
</DESCRIPTION>
</METHOD>
<METHOD value="refresh_current_tune">
<DESCRIPTION>
 The user wants to refresh a tune that he is editing.
 PARAMS:
 the_last_cursor - the last cursor position.  We'd like to restore
 this after the system has finished rendering the image so the user
 doesn't have to scroll back on every redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_tick">
<DESCRIPTION>
 We check and update some things every so often on a tick from the
 GUI.
</DESCRIPTION>
</METHOD>
<METHOD value="get_screen_pos_from_text_line">
<DESCRIPTION>
 Get the screen position in pixels from the location of the cursor in the text buffer
</DESCRIPTION>
</METHOD>
<METHOD value="transpose-selection">
<DESCRIPTION>
 transpose the selected text the given number of 1/2 steps (or letters if it is diatonic)
 PARAMETERS:
 the_steps - the number of steps (1/2 or diatonic) to transpose
 the_diatonic - true if we transpose letter values only.
 the_start - the start place of the selection in the buffer
 the_stop  - the stop place of the selection in the buffer
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_names">
<DESCRIPTION>
 Return the list of voice names for the GUI.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_status">
<DESCRIPTION>
 Get the on/off voice status of the voices in the tune.
</DESCRIPTION>
</METHOD>
<METHOD value="set_voice_on_map">
<DESCRIPTION>
 Set the voice map when the user has edited it from the menu.
</DESCRIPTION>
</METHOD>
<METHOD value="print_page">
<DESCRIPTION>
 This is something we owe document.  We assume that
 the printing is already set up, and we just need
 to tell the page to print itself.
</DESCRIPTION>
</METHOD>
<METHOD value="setup_pages">
<DESCRIPTION>
 Set up the page settings and stuff.
</DESCRIPTION>
</METHOD>
<METHOD value="rerender">
<DESCRIPTION>
 We are printing.  Don't read in the music again but render
 the music again.  Make sure the scale is 1/1
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_view_canvas">
<DESCRIPTION>
 This is the wxWindow instance where the music drawing occurs.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="map &lt; int,bool &gt; ">
<DESCRIPTION>
 keep track of the 'voice on map' when we are refreshing
 the tune.  This will tell the tune which voices to turn
 on in the new tune.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_abc_window">
<DESCRIPTION>
 This is the iabc-defined window, which contains a view-canvas window
 and interacts with classes like figure and text_figure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_list_box">
<DESCRIPTION>
 This is the actual wx object that the tune list gets drawn into.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_tune_list">
<DESCRIPTION>
 This is the gadget that we pass to the iabc_media that accepts all
 the tunes that it creates.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_is_parsing">
<DESCRIPTION>
 Set this to indicate that we are still parsing this file, os
 we should not try and open a new file.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_is_changing_tunes">
<DESCRIPTION>
 True if we are opening a new tune in a collection, so we need to
 set the buffer position to the start point of the new tune.
 Otherwise we preserve the existing buffer position.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_media">
<DESCRIPTION>
 This is where the music information gets displayed.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_print_media">
<DESCRIPTION>
 This is where the print information gets displayed.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_source">
<DESCRIPTION>
 The thing that parses the abc file and makes the music data structures.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_can_restart">
<DESCRIPTION>
 We set this to true when we have finished displaying the music and the
 parsing thread exits, so that we cna restart.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_filename">
<DESCRIPTION>
 This lets us tall the iabc source which file to open.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_text_position">
<DESCRIPTION>
 the last positition within the text buffer that we were.  Used to
 reposition the cursor after refreshes.  Unless we're changing tunes,
 then we don't want to replace the cursor since the program will change
 the cursor position.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_text_y">
<DESCRIPTION>
 This is used to center the screen on a redraw around the part of the
 tune that we were last editing.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_redraw_time">
<DESCRIPTION>
 We set this every time we redraw something so we don't have to
 redraw when nothing's changed.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="midi_media*">
<DESCRIPTION>
 The midi output place.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wx_text_buffer &amp; ">
<DESCRIPTION>
 The buffer where the ABC text lives.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_text_pointer">
<DESCRIPTION>
 This is the last place we drew the handy text pointer.  Note that
 this is a pointer to the GUI music that indiates where the text is,
 not a pointer to the text window itself.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="iabc_parse.cpp" dir="CVS">
</FILE>
<FILE value="iabc_parse.h" dir="CVS">
<DESCRIPTION>
 Drive the parser rules that define the abc language, at least as iabc
 understands them.
</DESCRIPTION>
<CLASS value="abc_parseable_unit">
<DESCRIPTION>
 Keep track of a line or so of an abc file and the musical
 information that came out of it from the parser.  This can keep us
 from having to re-parse an unchanged line of abc.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Parse this line of text, update the parser state and store all of the
 musical information.
</DESCRIPTION>
</METHOD>
<METHOD value="check_match">
<DESCRIPTION>
 return true if this string matches the string that I was
 created with,  or if the timestamp is earlier than the
 last time I was created.
 If this returns true, the_info and the_start_voice will contain
 the voice and parser_info that were present at the end
 of this line when it was first parsed.
</DESCRIPTION>
</METHOD>
<METHOD value="clear_match_text">
<DESCRIPTION>
 Indicate that check_match() has returned false.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="void">
<DESCRIPTION>
 This is called by the constructor and actually performs the work
 of parsing the line of code we were fed when we were created.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="parse_words">
<DESCRIPTION>
 Parse the w: header.
</DESCRIPTION>
</METHOD>
<METHOD value="put_chords_into_array()">
<DESCRIPTION>
 Put the chords into an array (they are stored in list format)
 so that we may put the words to them.
</DESCRIPTION>
</METHOD>
<METHOD value="advance_array">
<DESCRIPTION>
 Also used when putting words with the chord infos.
 RETURNS:
 true if the array still has stuff left in it.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="string">
<DESCRIPTION>
 The line that I was created with
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 Keep track of the first measure of the last line, which is where we start putting the
 words.
</DESCRIPTION>
<ATTRIBUTE value="array &lt; measure_or_header::match_type &gt; ">
<DESCRIPTION>
 The array of all the matches.  The match type will indicate
 whether the current match type is a header, measure, or whatever
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="list &lt; header_rule_info &gt; ">
<DESCRIPTION>
 The header rules that we created from parsing our string
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="list &lt; measure_rule_info &gt; ">
<DESCRIPTION>
 the match rules that we created from parsing our string.  The
 parser state info could change during any
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="parser_state_info">
<DESCRIPTION>
 Each rule is matched in the context of a parser state.  Keep track of the
 parser state at the start of this line, if the line is same and the parser
 state is the same then the line is unchanged so all the misical information is
 also unchanged.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="bool">
<DESCRIPTION>
 Indicates that we have a match.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 This is the line number of the text file that was matched.  We keep
 track of this so that we can track the music with the text in the GUI.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="time_t">
<DESCRIPTION>
 Don't even bother looking at the line if the buffer hasn't changed since
 my_modified_time.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="iabc_parse">
<DESCRIPTION>
 This class invokes the pre-processor to get a line of text
 and then adds the music to the supplied media_source object.
</DESCRIPTION>
</CLASS>
<CLASS value="tune_index_info">
<DESCRIPTION>
 Keep the index in to the file for quickly finding a tune.
</DESCRIPTION>
<METHOD value="iabc_media(ctor)">
<DESCRIPTION>
 Store the file name that we will open later and try to parse.
</DESCRIPTION>
</METHOD>
<METHOD value="get_start_line_of_tune">
<DESCRIPTION>
 retunr the starting line of the tune that we just parsed.
</DESCRIPTION>
</METHOD>
<METHOD value="parse(media &amp; ">
<DESCRIPTION>
 parse the input file and tell the media what we've found so the
 music can be realized somehow.  Get the tune from the file, based
 in the tune at the given index.
</DESCRIPTION>
</METHOD>
<METHOD value="quick_parse">
<DESCRIPTION>
 Do a parse of just the T: and the X: headers
</DESCRIPTION>
</METHOD>
<METHOD value="parse_measure(medai &amp; ,int &amp; ,preprocess &amp; )">
<DESCRIPTION>
 get the next measure and deal with it from the abc file.  Some
 measures are split across several lines so send the file in too,
 and keep track of the measure number.
 ARGS:
 int the_measure - the last measure we read in
 bool read_in_music - true if we've read in some music and we need
           a line break
 preprocess &amp;  the_file - the file we're reading in.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="string">
<DESCRIPTION>
 Get the next line of text.  This can actually be more than
 one line of text, if there are words that are associated with this
 line of abc stuff.  Also get the line number of the file so that we
 can associate it with this spot in the music.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="is_there_text_left">
<DESCRIPTION>
 return true if there is text left to read in the current tune.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="bool">
<DESCRIPTION>
 Because of the way we associate words with chord_info structures, we have to
 parse the word header (w:) outside if the state machine rules as well as
 in the word rule itself.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="void">
<DESCRIPTION>
 Read through all the lines of the file, and feed each line to a new
 parseable unit for parsing.  But, if we already have a parseable unit in the list that
 has parsed this line then don't bother reparsing.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="update_measure_line_pair">
<DESCRIPTION>
 We want to make the lowest measure in a line be the key for that line
 for playing and indicating the place in the music.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_measure_match(measure_rule &amp; ,media &amp; ,int &amp; ,fraction &amp; )">
<DESCRIPTION>
 We've found a measure's worth of music.  Handle it and update the
 current measure and beat.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_header_change(media &amp; ,header_rule &amp; ,const">
<DESCRIPTION>
 We have received a header at the given score point.  Record it and make any
 required changes.  Also reset the_measure_index to 1 if we are on a new
 tune.
</DESCRIPTION>
</METHOD>
<METHOD value="get_measure_from_voice">
<DESCRIPTION>
 Return the last measure we read from the_voice.  If this is the
 first one, we return 0.
</DESCRIPTION>
</METHOD>
<METHOD value="update_measure_from_voice">
<DESCRIPTION>
 We have just changed voices, so update the new measure since it may
 be different than the last voice was.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="string">
<DESCRIPTION>
 Keep track of the last line that we read in from the scanner, if there are
 words in this line then we combine it with earlier lines into one parseable
 unit.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_line_number">
<DESCRIPTION>
 Keep track of the last line number that we read in from the user.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_start_line_of_tune">
<DESCRIPTION>
 Keep track of the line in the text buffer that a song starts on
 so that we can scroll to there if we like.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_voice_measure">
<DESCRIPTION>
 When we switch voices in the parse, we need to keep track of what
 measure index we were on last time.  Keep that information here.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_songwords">
<DESCRIPTION>
 map of words that go below the staff, to the point in the music where they go.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_tunes">
<DESCRIPTION>
 Tunes that we get in a quick parse of an abc file.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 Keep track of the first measure of the last line, which is where we start putting the
 words.
</DESCRIPTION>
<ATTRIBUTE value="my_text_buffer">
<DESCRIPTION>
 text buffer for input
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="reset">
<DESCRIPTION>
 Reset all the internal state things that I keep track of for a fresh parse of
 a file.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Keep track of which line corresponds to which line of
 text for GUI magic later on.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="iabc_preferences.cpp" dir="CVS">
</FILE>
<FILE value="iabc_preferences.h" dir="CVS">
</FILE>
<FILE value="key_sig.cpp" dir="CVS">
</FILE>
<FILE value="key_sig.h" dir="CVS">
<CLASS value="key_sig">
<DESCRIPTION>
 Handle all the logic and resources associated with drawing a key
 signature on a staff.
</DESCRIPTION>
<METHOD value="key_sig">
<DESCRIPTION>
 Just populate variables.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 draw yourself on the page, on the staff supplied.  Draw the ending bar if this is
 an inline key change.
</DESCRIPTION>
</METHOD>
<METHOD value="get_number_figures">
<DESCRIPTION>
 gets the number of sharps or flats
</DESCRIPTION>
</METHOD>
<METHOD value="get_number_naturals">
<DESCRIPTION>
 If this is an inline key change, indicate how many naturals to put down
 if we are going to a more-natural key.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="line_of_music.cpp" dir="CVS">
</FILE>
<FILE value="line_of_music.h" dir="CVS">
<CLASS value="line_of_music">
<DESCRIPTION>
 A line_of_music is a container for all the stuff that gets drawn on one line
 of music.  It also takes care of drawing fixtures of the staff (like
 the key signature) and the staff itself.
 Aside from that, the line_of_music does the horizontal justification that
 keeps the notes evenly spaced.
</DESCRIPTION>
<METHOD value="line_of_music">
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Free all the graphical resources we use to draw ourselves.
</DESCRIPTION>
</METHOD>
<METHOD value="add_measure">
<DESCRIPTION>
 Add another measure to this staff.  Future notes will be added to that measure.
</DESCRIPTION>
</METHOD>
<METHOD value="add_nth_ending">
<DESCRIPTION>
 Add an 1st, 2nd etc. ending bracket over the music between the given measures.
</DESCRIPTION>
</METHOD>
<METHOD value="add_slur_from">
<DESCRIPTION>
 add a slur from the previous point in the music.  The point in the music
 where we're slurring to will be added later.
</DESCRIPTION>
</METHOD>
<METHOD value="add_slur_to">
<DESCRIPTION>
 Finish the slur that was last added with add_slur_from
</DESCRIPTION>
</METHOD>
<METHOD value="get_start_measure">
<DESCRIPTION>
 get the measure that we start with
</DESCRIPTION>
</METHOD>
<METHOD value="get_end_measure">
<DESCRIPTION>
 get the measure that we end with
</DESCRIPTION>
</METHOD>
<METHOD value="get_number_measures">
<DESCRIPTION>
 just subtract the from and the to.
</DESCRIPTION>
</METHOD>
<METHOD value="render">
<DESCRIPTION>
 This draws everything.
</DESCRIPTION>
</METHOD>
<METHOD value="does_rect_overlap">
<DESCRIPTION>
 Return true if the rectangle overlaps any of the regions of the
 staff.  Used by the page manager (window_media) to draw page
 fixtures without ruiing the music.
</DESCRIPTION>
</METHOD>
<METHOD value="add_note_figure">
</METHOD>
<METHOD value="add_crescendo">
<DESCRIPTION>
 Add a creschendo/dimenuendo to the staff from/to the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_dynamic">
<DESCRIPTION>
 This adds a dynamic change (pp, p, etc) to the list for later rendering
</DESCRIPTION>
</METHOD>
<METHOD value="get_high_point">
<DESCRIPTION>
 Get the highest y coordinate, which is the lowest point on the screen tha this
 staff takes up.
</DESCRIPTION>
</METHOD>
<METHOD value="add_y_offset">
<DESCRIPTION>
 We decided this staff needs an offset different that the y
 coordinate.  Change the y coordinate of the origin.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_info">
</METHOD>
<METHOD value="get_lowest_score_point">
<DESCRIPTION>
 return the lowest musical point on this staff, good for making hashtables.
</DESCRIPTION>
</METHOD>
<METHOD value="render_ornaments">
<DESCRIPTION>
 We need to add the ornaments after we draw all the notes cause then
 we know which way the beams go.  This should be called after the notes
 are rendered or nothing will happen.
</DESCRIPTION>
</METHOD>
<METHOD value="operator">
<DESCRIPTION>
 A lot of fixtures need some basic information about a staff before
 rendering themselves.  This is information about this staff for figures
 to use when drawing themselves.  It also reflects my current position
 horizontally as I'm drawing from left to right.
</DESCRIPTION>
</METHOD>
<METHOD value="get_width_of_words">
<DESCRIPTION>
 get the width of the words below the notes.  If they are wider
 than the note head, use this for the width.
</DESCRIPTION>
</METHOD>
<METHOD value="render_figures">
<DESCRIPTION>
 render the notes into figures.
</DESCRIPTION>
</METHOD>
<METHOD value="render_words">
<DESCRIPTION>
 render the words for the first time.
</DESCRIPTION>
</METHOD>
<METHOD value="render_part">
<DESCRIPTION>
 render the 'part' string, which is the letter marking
 used at different places in the music.
</DESCRIPTION>
</METHOD>
<METHOD value="render_dynamics">
<DESCRIPTION>
 render the dynamics.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_time_signature">
<DESCRIPTION>
 draw the time signature on the point at the given location.  Update
 the point based on my width.
</DESCRIPTION>
</METHOD>
<METHOD value="get_time_signature">
<DESCRIPTION>
 return the time signature for the given measure.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_beginning_repeat">
<DESCRIPTION>
 If there is a repeat sign at the beginning of the measure, draw that.
</DESCRIPTION>
</METHOD>
<METHOD value="render_bar_at">
<DESCRIPTION>
 Draws the end-of-measure figures
</DESCRIPTION>
</METHOD>
<METHOD value="get_note_pixels">
<DESCRIPTION>
 We try to spread out the notes on a staff as much as possible.  If we
 do this in a uniform way, this guarantees that we will always line up
 parts from the same points of a score, if we can.
 RETURNS:
 The number of points that this note figure should take up.  This will
 always be at least the width of the figure.
 ASSUMPTIONS:
 We assume that the get_leftover_pixels() has already been run, as this
 will use my_rhs_overlap and my_spare_pixels
</DESCRIPTION>
</METHOD>
<METHOD value="get_leftover_pixels">
<DESCRIPTION>
 Go through all the figures in this staff, and figure out how many
 pixels they would take up.  Fill in some class information about
 how many pixels in all so we can justify the notes.
</DESCRIPTION>
</METHOD>
<METHOD value="get_pixels_from_duration">
<DESCRIPTION>
 Get the number of pixels a note of this duration shoudl take
 up, given the number of pixles and number of beats in this
 staff.
</DESCRIPTION>
</METHOD>
<METHOD value="count_measure_pixels">
<DESCRIPTION>
 Count the numer of pixels taken by measure end things.  We use
 this to justify the music
</DESCRIPTION>
</METHOD>
<METHOD value="draw_ledger_lines">
<DESCRIPTION>
 Determine if we need ledger lines and draw them.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_little_numbers">
<DESCRIPTION>
 Draws the little measure numbers on the left hand side
</DESCRIPTION>
</METHOD>
<METHOD value="get_barline_width">
<DESCRIPTION>
 Get the width of the barline figure for the end of measure x.
</DESCRIPTION>
</METHOD>
<METHOD value="get_bar_width">
<DESCRIPTION>
 Get the width of bar in pixels, once its been drawn.  Assumes that the
 bar points have been populated already.
</DESCRIPTION>
</METHOD>
<METHOD value="get_bar_width">
<DESCRIPTION>
 Get the width of bar in pixels, once its been drawn.
</DESCRIPTION>
</METHOD>
<METHOD value="create_chord_symbol">
<DESCRIPTION>
 Create the text figure that goes above/(and somdeday below) the note and
 compute its x coordinate.  The y location is computed when we have rendered
 the chord and we know where its supposed to go.
</DESCRIPTION>
</METHOD>
<METHOD value="render_chords">
<DESCRIPTION>
 We figure out the chord symbols, but we can't actually render the chords
 until we have drawn the figures and beamed them all.  Go through the 
 my_chord_symbols and print them all out.
</DESCRIPTION>
</METHOD>
<METHOD value="render_voice_info">
<DESCRIPTION>
 Add the description of the voice information to the staff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_top/bottom">
<DESCRIPTION>
 Get the top and bottom note on the staff to deterine if the
 ledger lines are needed
</DESCRIPTION>
</METHOD>
<METHOD value="get_measure_end_figure">
<DESCRIPTION>
 Get the appropriate figure for the give figure ending.
</DESCRIPTION>
</METHOD>
<METHOD value="get_height_of_first_note">
<DESCRIPTION>
 We need to put something near the first beat of a measure, make sure it
 doesn't run into a note.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_figure_list">
<DESCRIPTION>
 Render the figures into a list first so we can move them down
 to a different page if we want to.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="cleanup">
<DESCRIPTION>
 We create lots of intermediate things when creating the figures.  We don't 
 need any of it now so release all the resources.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_is_complete">
<DESCRIPTION>
 Indicate that all of the fixtures have been added to the staff, no more
 should be added.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_offset">
<DESCRIPTION>
 the offset where this staff is to be drawn.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_start_measure">
<DESCRIPTION>
 the measure number I start on.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_end_measure">
<DESCRIPTION>
 my last measure
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_should_center">
<DESCRIPTION>
 keep track of whether or not we should try and justify
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="page">
<DESCRIPTION>
 where it all happens...
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_show_name">
<DESCRIPTION>
 true if we need to show the name on top of the staff, i.e. we're in
 score mode
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="map &lt; staff_point,note_figure* &gt; ">
<DESCRIPTION>
 Map each point in the score with a figure to draw on the staff.
 We keep 2 around, so we can re-render things fast if we already
 know where stuff goes.  We also store the x location of the words since
 we compute that at the same time as the note locations
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="map &lt; int,points &gt; ">
<DESCRIPTION>
 Keep track of the places where the barlines go so we don't have to
 keep recomputing those.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="fraction">
<DESCRIPTION>
 Keep track of the time signature.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="key_sig*">
<DESCRIPTION>
 A key signature can draw itself on my.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="point">
<DESCRIPTION>
 We keep track of the UL part of ourselves, and then we increment the x part
 as we render the staf from left to right.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="point">
<DESCRIPTION>
 This is the original origin.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="array">
<DESCRIPTION>
 We compute the x location of the chord symbols and the y location at 
 different times, to avoid chords and beams colliding.  Save the figures
 in an array and then render them all after the notes have been rendered.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="pitch">
<DESCRIPTION>
 Keep track of which is the center pitch for this cleff.  That is used to determmine
 things like beam directions, etc.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="int">
<DESCRIPTION>
 Keep track of how many pixels are left for notes, after drawing the key sig
 and stuff.  This helps us justify correctly.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_rhs_overlap">
<DESCRIPTION>
 Keep track of how many pixels over the right edge we'll be going,
 so we can 'borrow' from wider notes on a later pass.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_leftover_pixels">
<DESCRIPTION>
 Keep track of how many 'spare' pixels we have for each note so we
 can 'borrow' if there is overlap.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="beamer*">
<DESCRIPTION>
 Keep track of the last beamer so that we can add notes to the current
 beam group as they come in from the parser.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="beamer*">
<DESCRIPTION>
 We beam grace notes seperately, so keep track of those too.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="slurer*">
<DESCRIPTION>
 There is one slur object per staff that contains all slurs on that staff.
 This should allow us to do complex things with slurs like slur around
 notes.  For now we just try to draw it as best we can.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="double">
<DESCRIPTION>
 a constant scaling the drawing routines so we can fit more/less stuff on
 the screen.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_rect_map">
<DESCRIPTION>
 When we add figures to the staff, we want to keep them from bumping
 into the important things like notes.  So make an array of all the rectangles
 of the figures that we have drawn.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="double">
<DESCRIPTION>
 Page width in inches
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="A">
</ATTRIBUTE>
<ATTRIBUTE value="my_begin_barlines">
<DESCRIPTION>
 If a measure begins with a repeat, and its the first in a line,
 this is what we draw.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="nth_ending_info">
<DESCRIPTION>
 This is all the stuff that is required to draw an nth ending.
 We populate the number ending and begin/end type when we 
 add the measure to the staff, and the other stuff gets
 populated after we have rendered all the measures.
</DESCRIPTION>
<METHOD value="render_nth_endings">
<DESCRIPTION>
 Make the figures that constitue nth endings.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="dynamic_marking">
<DESCRIPTION>
 Keep track of dynamics that we need to spell out,
 and crescendos.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_has_rendered">
<DESCRIPTION>
 Return true, this will let a client know that no more music should
 go on this page.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_draw_part_first">
<DESCRIPTION>
 If the first measure is the first measure in a new part,
 we need to be told that so that we can draw it.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_voice_info_map">
<DESCRIPTION>
 General stuff about the current key, staff, etc.  Mapped per
 measure.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_hi/lo">
<DESCRIPTION>
 Keep track of the high and low point so we can adjust our size
 for vertical justification.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_accidentals">
<DESCRIPTION>
 keep track of a running total of the accidentals
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_accidentals">
<DESCRIPTION>
 Keep track of which accidentals are being used in which measure
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="list.cpp" dir="CVS">
</FILE>
<FILE value="list.h" dir="CVS">
<DESCRIPTION>
 This is a bidirectional list with the default node
 serving as the head of the list.  The 'data' part of the
 default node is not valid and is never refereneced. The
 default node always exists (even in an empty list) and is used
 in comparisons to end-of-list
</DESCRIPTION>
<CLASS value="list_node">
<DESCRIPTION>
 List node is the data plus the pointers
 of a linked list.
</DESCRIPTION>
</CLASS>
<CLASS value="list_data">
<DESCRIPTION>
 list_data does all the work of the container interface for lists.
</DESCRIPTION>
</CLASS>
<CLASS value="list_iterator">
<DESCRIPTION>
 This iterates through a list, and also is used to add or remove
 elements (which in STL is a list function).  This is always referenced
 as a nested iterator within list (e.g. list &lt; T &gt; ::iterator = my_list.first)
</DESCRIPTION>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a reference.
</DESCRIPTION>
</METHOD>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a copy.
</DESCRIPTION>
</METHOD>
<METHOD value="T*">
<DESCRIPTION>
 Allow the list to be checked for validity in the pointer way, 
 e.g.:
 if (my_iterator) {       // check for end of list.
 tmp_data = *my_iterator; // now this is safe
</DESCRIPTION>
</METHOD>
<METHOD value="operator=">
<DESCRIPTION>
 shallow, reference counted copy.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="list">
<DESCRIPTION>
 list is an extra layer of indirection so that we can
 pass const lists and still access the methods needed to 
 perform const-type operations (like copying a list)
 It also allows us to assign the lists by value and lets
 the reference counting for list_data work transparently.
</DESCRIPTION>
<DESCRIPTION>
 these are a bunch of predicates to find special elements of a 
 list using find_predicate function.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="list_box_control.cpp" dir="CVS">
</FILE>
<FILE value="list_box_control.h" dir="CVS">
</FILE>
<FILE value="map.cpp" dir="CVS">
<METHOD value="T*">
<DESCRIPTION>
 Allow the list to be checked for validity in the pointer way, 
 e.g.:
 if (my_iterator) {       // check for end of list.
 tmp_data = *my_iterator; // now this is safe
</DESCRIPTION>
</METHOD>
<METHOD value="least">
<DESCRIPTION>
 get the item that maps to lowest ordinal in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="most">
<DESCRIPTION>
 Get the item that maps to the greatest ordinal in the map.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="map.h" dir="CVS">
<CLASS value="kv_pair">
<DESCRIPTION>
 A key-value pair template class.  The key is some type of 
 ordinal type, and the value is something associated with the key.
 It's used as an element of a map.
</DESCRIPTION>
</CLASS>
<CLASS value="list_data">
<DESCRIPTION>
 list_data does all the work of the container interface for lists.
</DESCRIPTION>
</CLASS>
<CLASS value="map_match_type">
</CLASS>
<CLASS value="map_equality_pred">
<DESCRIPTION>
 Create a predicate for map searches.
</DESCRIPTION>
</CLASS>
<CLASS value="map_iterator">
<DESCRIPTION>
 Allow a user to iterate through a map from some start point
 to some end point, using the get_item method of map.
</DESCRIPTION>
<METHOD value="get_item">
<DESCRIPTION>
 get the item that maps to the_key, or return a NULL iterator.
</DESCRIPTION>
</METHOD>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a reference.
</DESCRIPTION>
</METHOD>
<METHOD value="operator*">
<DESCRIPTION>
 Acts like a pointer dereference.  Throws excepction if the list is
 empty.  Returns a copy.
</DESCRIPTION>
</METHOD>
<METHOD value="T*">
<DESCRIPTION>
 Allow the list to be checked for validity in the pointer way, 
 e.g.:
 if (my_iterator) {       // check for end of list.
 tmp_data = *my_iterator; // now this is safe
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="map">
<DESCRIPTION>
 If there's a place you need to go, it'll get you there I know.
 Map a set of keys to a set of values.
 
 There's a couple of things that make this class special.  First off,
 the map follows a 'worst possible' matching algorithm, which means
 for example, that the lt (less-than) match type will always return the greatest
 ordinal for which the lt constraint holds.
 Second, the map contains an iterator, which always points to the last
 thing selected.  This means that copying one map to another will be an
 O(n) operation.  Frequently the map iterator will be used instead of creating
 a seperate iterator class.
</DESCRIPTION>
<METHOD value="get_iterator">
<DESCRIPTION>
 Allow the client to iterate through the list.  I'm not sure that I like
 this since it allows the user to delete an item and not my_last_cursor.
 But it allows the user to easily dereference all the pointers from a map.
 The assumption is that this is only used before the list is destroyed.
 list &lt; kv_pair  &lt; ordinal,T &gt;   &gt; ::iterator
     get_iterator(){return (my_list.first());}
</DESCRIPTION>
</METHOD>
<METHOD value="add_pair">
<DESCRIPTION>
 Add a new pair to the map, with the_key mapping to the_item
</DESCRIPTION>
</METHOD>
<METHOD value="get_item">
<DESCRIPTION>
 get the item that maps to the_key, or return a NULL iterator.
</DESCRIPTION>
</METHOD>
<METHOD value="least">
<DESCRIPTION>
 get the item that maps to lowest ordinal in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="most">
<DESCRIPTION>
 Get the item that maps to the greatest ordinal in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="remove">
<DESCRIPTION>
 Safely remove an item.
</DESCRIPTION>
</METHOD>
<METHOD value="clear">
<DESCRIPTION>
 Clear out all the element in the map.
</DESCRIPTION>
</METHOD>
<METHOD value="get_size()">
<DESCRIPTION>
 Get the size of the list of keys/values
</DESCRIPTION>
</METHOD>
<METHOD value="init_my_current">
<DESCRIPTION>
 It is possible for this class to be populated entirely by a copy of this
 map class, in which case my iterator's my_current pointer will be null.
 This is never a valid case since even an empty list has the seed element.
 So perform this initializtion one time if required.
</DESCRIPTION>
</METHOD>
<METHOD value="get_inverse_map">
<DESCRIPTION>
 Return map &lt; key,value &gt;  give map &lt; value,key &gt; .  Note that
 not all maps will have an inverse.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="media.cpp" dir="CVS">
</FILE>
<FILE value="media.h" dir="CVS">
<DESCRIPTION>
 Classes that define how iabc handles media.  A media is a thing
 that the music is presented on.  Probably the most common media
 is a window on the screen, but it will include other types.  The
 media is populated with information about the music from a media
 source, which could be something like an abc parser.
</DESCRIPTION>
<CLASS value="score_point">
<DESCRIPTION>
 A score point is an ordinal type that represents a particular
 beat in a particular measure in a particular voice.
</DESCRIPTION>
</CLASS>
<CLASS value="score_time">
<DESCRIPTION>
 Sometimes we need to sort by voice last instead of
 first, like when we're playing all the voices back at once.
 To do this we use the score_time class as an ordinal.
</DESCRIPTION>
</CLASS>
<CLASS value="tune">
<DESCRIPTION>
 Contains all the information that can make a tune,
 including all the music, voices, key changes, etc.  A single
 abc file could contain many small tunes, or one big one.
</DESCRIPTION>
<METHOD value="extract_music_from_tune_point">
<DESCRIPTION>
 Sometimes its nice to have all the streams of music
 information into one map for easy iteration.  This 
 function combines the maps in a tune into on supermap.
 This function sorts by score_point.
</DESCRIPTION>
</METHOD>
<METHOD value="extract_music_from_tune_voice">
<DESCRIPTION>
 Extract the music from the tune for the given voice only.
</DESCRIPTION>
</METHOD>
<METHOD value="extract_music_from_tune_time">
<DESCRIPTION>
 same as the other extract, except sorts by score_time
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="voice_map_source">
<DESCRIPTION>
 The media needs to get a list of voices that we want to display.
 There may be more voices in the source.  Create an abstract
 class for this.
</DESCRIPTION>
</CLASS>
<CLASS value="media">
<DESCRIPTION>
 Media represents a place where the music is presented to the user.  The
 media source populates the media with information about the music.  The
 media presents it to the user.
</DESCRIPTION>
<METHOD value="media">
</METHOD>
<METHOD value="~media">
</METHOD>
<METHOD value="setup">
<DESCRIPTION>
 Get any resources and parameters neccessary to display the music
 on the media
</DESCRIPTION>
</METHOD>
<METHOD value="complete">
<DESCRIPTION>
 Notify the media that that's all the music there is.
</DESCRIPTION>
</METHOD>
<METHOD value="present">
</METHOD>
<METHOD value="present">
</METHOD>
<METHOD value="present">
</METHOD>
<METHOD value="present">
<DESCRIPTION>
 This only applies to visual renderings of the music.  Typically abc programs
 use this parameter to display information about dynamics and stuff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_info">
<DESCRIPTION>
 A part info is a bunch of static information that applies to the music, but
 could change at anytime.  One example is the key signature.  Get the current
 set of information for this point in the music.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="map &lt; int,bool &gt;  &amp; ">
<DESCRIPTION>
 Keep track of the voices in the tune, and allow people to
 change whether or not they are on/off
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="is_voice_turned_on">
<DESCRIPTION>
 Return true if this voice has not been turned off.
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the music to the user
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the end of the measure
 to the user
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="repeat_info">
<DESCRIPTION>
 information about a particular repeat, including which measure its
 located in, and nth endings around the repeat.
</DESCRIPTION>
<ATTRIBUTE value="my_repeat_info">
<DESCRIPTION>
 A map of measures to repeat infos.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="populate_repeat_info">
<DESCRIPTION>
 Go through the tune and figure out which repeats go where in the
 song.
</DESCRIPTION>
</METHOD>
<METHOD value="count_voices">
<DESCRIPTION>
 Count the number of voices in the tune.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="tune_chooser">
<DESCRIPTION>
 Encapsulate a list of tunes, and provide an interface
 for allowing a user to choose one from a user interface of
 some kind...
</DESCRIPTION>
<METHOD value="add_tune">
<DESCRIPTION>
 Add a tune to the list of tunes.
</DESCRIPTION>
</METHOD>
<METHOD value="clear_tunes">
<DESCRIPTION>
 Clear the music out of the tunes, but leave the
 title and index of each tune.
</DESCRIPTION>
</METHOD>
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that gets the current tune choice from the user.
</DESCRIPTION>
</METHOD>
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that clears the list for new parsing.
</DESCRIPTION>
</METHOD>
<METHOD value="operator[]">
<DESCRIPTION>
 Allow the client to treat the list like an array to get or
 modify elements.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="is_dirty">
<DESCRIPTION>
 This indicates whether or not we need to repopulate the
 box, if data has changed.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="media_source">
<DESCRIPTION>
 A media source is a thing that defines the music that a media object presents to the
 user.  The most common example would be an abc parser.
</DESCRIPTION>
<METHOD value="add_music_feature">
<DESCRIPTION>
 Add a music feature (e.g. a note) to the current tune on the given beat.
</DESCRIPTION>
</METHOD>
<METHOD value="add_music_feature">
<DESCRIPTION>
 Add a measure feature (e.g. a bar line) to the current tune on the given beat.
</DESCRIPTION>
</METHOD>
<METHOD value="set_line_break">
<DESCRIPTION>
 Look up the measure feature for the last beat before this measure and make
 it a line break.
</DESCRIPTION>
</METHOD>
<METHOD value="add_words">
<DESCRIPTION>
 add a word to the chord at the given time, in the current tune and voice.
</DESCRIPTION>
</METHOD>
<METHOD value="add_songwords">
<DESCRIPTION>
 These are the words that show up after the music.
</DESCRIPTION>
</METHOD>
<METHOD value="change_voice_info">
<DESCRIPTION>
 The state of the music that is being played/displayed has changed in some way,
 for example the key signature.
</DESCRIPTION>
</METHOD>
<METHOD value="get_voice_info">
<DESCRIPTION>
 Get the voice info for as close to the given point in the
 score as we can.
</DESCRIPTION>
</METHOD>
<METHOD value="get_tune">
<DESCRIPTION>
 We have read in some tunes.  Get the tune at index the_index,
 and return an empty string when there are no more.
</DESCRIPTION>
</METHOD>
<METHOD value="clear_tunes">
<DESCRIPTION>
 Clear the music out of each tune.  This is done to prepare for a 
 new parsing.  Leave the title and index number in each tune
 so we don't have to redo the quick parse.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_all_tunes">
<DESCRIPTION>
 Remove all tunes from the tune list.  This is
 done to prepare a modified file for new parsing.
</DESCRIPTION>
</METHOD>
<METHOD value="get_next_non_rest">
<DESCRIPTION>
 Start looking at the_measure, the_beat in the current tune,
 and iterate through the music until a non-rest is recovered.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="message_box.cpp" dir="CVS">
</FILE>
<FILE value="message_box.h" dir="CVS">
</FILE>
<FILE value="midi_media.cpp" dir="CVS">
</FILE>
<FILE value="midi_media.h" dir="CVS">
<CLASS value="midi_media">
<DESCRIPTION>
 Output to a midi file, and hopefully someday play
 midi file as well.
</DESCRIPTION>
<METHOD value="setup">
<DESCRIPTION>
 Get any resources and parameters neccessary to display the music
 on the media
</DESCRIPTION>
</METHOD>
<METHOD value="complete">
<DESCRIPTION>
 Notify the media that that's all the music there is.
</DESCRIPTION>
</METHOD>
<METHOD value="store_data_for_voice">
<DESCRIPTION>
 Store all the track data for the given voice in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="update_chords_for_ties">
<DESCRIPTION>
 Fix the chords so that tied notes actually sound like one note.
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the music to the user
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the end of the measure
 to the user
</DESCRIPTION>
</METHOD>
<METHOD value="count_outstanding_grace">
<DESCRIPTION>
 The music for grace notes is stored somewhat deceptively: we give grace
 notes some time, even though they're sort of 'out of time' to make
 them display properly.  But we need to compensate for grace notes, put
 them before the next beat and subtract the delta time.
</DESCRIPTION>
</METHOD>
<METHOD value="check_voice_info_change">
<DESCRIPTION>
 If the voice info has changed (tempo, meter, etc.)
 send an midi meta-event to handle that.
</DESCRIPTION>
</METHOD>
<METHOD value="count_beats">
<DESCRIPTION>
 Count the beats from the_start to the_end.
</DESCRIPTION>
</METHOD>
<METHOD value="write_header">
<DESCRIPTION>
 Make sure we write the midi header if we haven't already.
</DESCRIPTION>
</METHOD>
<METHOD value="store_time_signature">
<DESCRIPTION>
 Store the time signature in the music array as a midi
 meta-event.
</DESCRIPTION>
</METHOD>
<METHOD value="store_time_signature">
<DESCRIPTION>
 Store the tempo in the music array as a midi
 meta-event.
</DESCRIPTION>
</METHOD>
<METHOD value="store_track_end">
<DESCRIPTION>
 Store the track end magic cookie in the array.
</DESCRIPTION>
</METHOD>
<METHOD value="store_program_change">
<DESCRIPTION>
 Store the program change for the given voice in the given
 stream.
</DESCRIPTION>
</METHOD>
<METHOD value="write_absolute">
<DESCRIPTION>
 Write the given value in midi variable-sized format
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_next_note_off">
<DESCRIPTION>
 Keep track of where the next note off point goes,
 if the point we're currently talking about is beyond that.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="handle_note_off">
<DESCRIPTION>
 Go through the array of note off events pending and see if we owe the
 world any note off events.  Spit them out to the file, and return
 the point where we ended up before any deltas.
</DESCRIPTION>
</METHOD>
<METHOD value="pitch_to_midi">
<DESCRIPTION>
 Convert the internal pitch format to the midi format
</DESCRIPTION>
</METHOD>
<METHOD value="duration_to_midi">
<DESCRIPTION>
 convert the internal duration format to a the number of midi
 ticks.  Use the current tempo as a guide.
</DESCRIPTION>
</METHOD>
<METHOD value="get_tempo_from_time_signature.">
<DESCRIPTION>
 Some files don't declare a tempo; here we guess what the tempo is based
 on the time signature that is used through most of the piece.  E.g.
 cut time tunes go twice as fast.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_midi_data">
<DESCRIPTION>
 Store the midi data in an array so that we can size if and incorporate
 that stuff into the MTrk part
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_music_map">
<DESCRIPTION>
 Keep track of all the music in one map so we don't have to
 keep switching maps.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_original_music">
<DESCRIPTION>
 The music part of the tune.  We need to change this for
 midi reasons, but we should restore the original after we
 have constructed the midi part.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="music_info.cpp" dir="CVS">
</FILE>
<FILE value="music_info.h" dir="CVS">
<DESCRIPTION>
 This contains information about the music that's not particular
 to any single medium and isn't about the notes (note stuff is in
 note info)
</DESCRIPTION>
<CLASS value="measure_feature">
<DESCRIPTION>
 information to describe a particular measure, including the number
 and the endpoint
</DESCRIPTION>
<ATTRIBUTE value="nth_repeat">
<DESCRIPTION>
 1st, 2nd ending etc.  usually 0.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="part_point">
<DESCRIPTION>
 A part point represents a particular beat in a particular measure.
 Each chord in each voice belongs to a particular part_point
</DESCRIPTION>
</CLASS>
<CLASS value="voice_info">
<DESCRIPTION>
 Information about a particular part, which in ABC would be
 called a voice.
</DESCRIPTION>
<ATTRIBUTE value="my_index">
<DESCRIPTION>
 This is the voice number or part number.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="music_info">
<DESCRIPTION>
 This is a union of all things that can be in a tune that are
 related to the music at any given point.  The idea is that you
 can construct a big supermap of this to make it easy to iterate
 through the music for midi and display output.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="mutex.cpp" dir="CVS">
</FILE>
<FILE value="mutex.h" dir="CVS">
<CLASS value="mutex_interface">
<DESCRIPTION>
 The abstract interface to the platform-specific object.  The generic
 mutex proxies to this object, that allows us to create mutex objects
 automatically.
 IMPORTANT NOTE:
 See IMPORTANT NOTE below...
</DESCRIPTION>
</CLASS>
<CLASS value="mutex">
<DESCRIPTION>
 A proxy to the real mutex object.  The is called the proxy pattern.
 IMPORTANT NOTE:
 This mutex may behave differently than some other mutex objects you may
 have heard tell of.  So here is how it works:
 If you seize the mutex and you don't own it, you block.
 If you release the mutex and you own it, then you don't own it anymore.
 If you seize a mutex and own it, NOTHING happens, no count is increased.
 If you release a mutex and you don't own it, nothing happens.
 If this behavior is surprising to you, then you probably want semaphore or
 lock (see below)
</DESCRIPTION>
</CLASS>
<CLASS value="lock">
<DESCRIPTION>
 Allow stackable locking and unlocking of a mutex.  This allows you
 to implement re-entrant methods.  Usage:
 void my_safe_function(){
 lock tmp_lock(my_mutex);
 ... access shared stuff
 }
</DESCRIPTION>
</CLASS>
<CLASS value="atomic_counter">
<DESCRIPTION>
 Implement a threadsafe decrement-and-read operation.  This avoids
 nasty race conditions when implementing reference counters across multiple
 threads.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="note_figure.cpp" dir="CVS">
</FILE>
<FILE value="note_figure.h" dir="CVS">
<CLASS value="note_figure">
<DESCRIPTION>
 Draws the actual note part.  Also updates beam group.
</DESCRIPTION>
<METHOD value="get_width;">
<DESCRIPTION>
 Return the width of the rendered figure so that the staff can do
 justification.
</DESCRIPTION>
</METHOD>
<METHOD value="get_head_offset">
<DESCRIPTION>
 Return the offset of the head, which isn't always in
 the left hand side.
</DESCRIPTION>
</METHOD>
<METHOD value="ctor">
<DESCRIPTION>
 none.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Dereference all my stuff.
</DESCRIPTION>
</METHOD>
<METHOD value="render">
<DESCRIPTION>
 Actually draw self in correct thread.  Honor the_should_block,
 which should be set the first time so drawing occurs properly.
 Also activate beams and slurs and stuff.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Allow the beamer to get set, so I can beam self when drawing self.
</DESCRIPTION>
<DESCRIPTION>
 Accessor functions.
</DESCRIPTION>
<METHOD value="more">
<DESCRIPTION>
 We need to keep track of the  absolute bounding box once we've
 rendered these so that we can draw other figures right next to
 them.
</DESCRIPTION>
</METHOD>
<METHOD value="rescale">
<DESCRIPTION>
 We are now on a different scale so all of our beamers and figures
 are no good.  So get new ones.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_ornaments">
<DESCRIPTION>
 Handle any ornamentation on the note, like tenuto
 or slurs.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Figure out what type of note head to draw and get that from the factory.
</DESCRIPTION>
<DESCRIPTION>
 Keep track of the high and low point of this note and beam group.
</DESCRIPTION>
<DESCRIPTION>
 Figure out what type of accidental to draw, and get that from the factory.
</DESCRIPTION>
<METHOD value="set_rest">
<DESCRIPTION>
 Figure out which rest figure we need and get it from the factory.
</DESCRIPTION>
</METHOD>
<METHOD value="get_num_dots">
<DESCRIPTION>
 Reverse-engineer the number of dots on the note from its duration.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Update the slurer for this channel with the location of the note.
</DESCRIPTION>
<ATTRIBUTE value="my_head,">
<DESCRIPTION>
 A whole bunch of figures for rendering beams, etc.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_scale">
<DESCRIPTION>
 We use this to determine what the scaling factor of all those figures is.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 The page on which we draw ourselves.
</DESCRIPTION>
<ATTRIBUTE value="my_key">
<DESCRIPTION>
 This tells us whether or not we need to draw accidentals.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_note">
<DESCRIPTION>
 This is the chord that we are representing.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_origin">
<DESCRIPTION>
 Where we park.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_accidental_width">
<DESCRIPTION>
 We keep track of this so we can tell how big the whole
 figure is.  This is used when justifying.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="need_to_beam">
<DESCRIPTION>
 Keep track of whether or not we have drawn the beam and stuff.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 The array of accidentaly, maybe one for each note
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="note_info.cpp" dir="CVS">
</FILE>
<FILE value="note_info.h" dir="CVS">
<DESCRIPTION>
 This file contains classes that represent the notes and chords
 in the music.
</DESCRIPTION>
<CLASS value="note_info">
<DESCRIPTION>
 A note info consists of a pitch and a duration.  We also keep an extra
 flag to indicate whether or not this note is a rest.
</DESCRIPTION>
<METHOD value="starts_slur">
<DESCRIPTION>
 You can slur to and from a chord to another chord.  Allow
 getting and setting of this attribute
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="chord_info">
<DESCRIPTION>
 In ABC you can use a chord almost anywhere you can use a note, so
 a chord is the main abstraction that represents music.  A chord
 info is an array of note_infos, plus some additional information
 about how the music is to be played and notated.
</DESCRIPTION>
<METHOD value="clone">
<DESCRIPTION>
 Return a copy of this note, including a deep-copy of the array.
 A shallow copy of the array happens during copy ctor or = operator.
</DESCRIPTION>
</METHOD>
<METHOD value="is_beamable">
<DESCRIPTION>
 Return true if this note is short enough to beam
</DESCRIPTION>
</METHOD>
<METHOD value="get_duration">
<DESCRIPTION>
 In order to figure out what beat we're on, we need to give each
 chord a concept of a duration.  We say that the shortest duration
 note in a chord is the true duration, since that should determine
 where the next beat in a measure will fall.
</DESCRIPTION>
</METHOD>
<METHOD value="change_length">
<DESCRIPTION>
 Change the length of each note in the chord by multiplying by
 product and adding sum.
</DESCRIPTION>
</METHOD>
<METHOD value="get_high_note">
<DESCRIPTION>
 Get the highest note in the chord
</DESCRIPTION>
</METHOD>
<METHOD value="get_next_in_beam">
<DESCRIPTION>
 When we connect 2 chords in a beam we create a 2-directional list,
 so we can get the next and last in the beam group.
 (so if foo.get_next_in_beam() == foo there's no subsequent notes.)
</DESCRIPTION>
</METHOD>
<METHOD value="get_size">
<DESCRIPTION>
 the number of notes in the chord.
</DESCRIPTION>
</METHOD>
<METHOD value="as_string">
<DESCRIPTION>
 Return a string representation of the chord, for debugging
</DESCRIPTION>
</METHOD>
<METHOD value="operator[]">
<DESCRIPTION>
 Treat a chord info like an array of chords.
</DESCRIPTION>
</METHOD>
<METHOD value="operator=,">
<DESCRIPTION>
 We want a chord to be treated like a simple type
 with regard to assignment and concatenation
</DESCRIPTION>
</METHOD>
<METHOD value="set_embellishment">
<DESCRIPTION>
 A chord can have an embellishment like an accent.  Allow setting
 and getting of that.
</DESCRIPTION>
</METHOD>
<METHOD value="get/set_description">
<DESCRIPTION>
 A chord can have a description, for example [CEG] can be
 C.  Allow the chord to save its description.
</DESCRIPTION>
</METHOD>
<METHOD value="starts_slur">
<DESCRIPTION>
 You can slur to and from a chord to another chord.  Allow
 getting and setting of this attribute by looking at the
 contained notes of the chord
</DESCRIPTION>
</METHOD>
<METHOD value="get/set">
<DESCRIPTION>
 Return true if this is a grace note
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_embellishment">
<DESCRIPTION>
 stacatto, etc.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_description">
<DESCRIPTION>
 A textual description of the chord, e.g. 'Am7'.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_words">
<DESCRIPTION>
 words that go along with this particular beat.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_notes">
<DESCRIPTION>
 The notes that make me a chord
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_first_in_beam">
<DESCRIPTION>
 true if this chord is the first in a beam group
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 true if this is the last note in a beam group.
</DESCRIPTION>
<ATTRIBUTE value="my_xlet_value">
<DESCRIPTION>
 Indicates that it's supposed to be grouped with a number,
 like a triplet is.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_is_grace">
<DESCRIPTION>
 pretty self-explanatory
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="null_media.h" dir="CVS">
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the end of the measure
 to the user
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 The base class overrides this method to actually present the music to the user
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="parse.cpp" dir="CVS">
</FILE>
<FILE value="parse.h" dir="CVS">
<METHOD value="pre_match">
<DESCRIPTION>
 This is useful for debugging, since the match method of most
 of the classes will be overridden, this will allow you to
 debug other classes by overriding this method.
</DESCRIPTION>
</METHOD>
<CLASS value="null_rule">
<DESCRIPTION>
 A null rule always matches.  It is handy when optimizing 
 the sequence of rules in an 'or' and making optional params.
</DESCRIPTION>
</CLASS>
<CLASS value="loser_rule">
<DESCRIPTION>
 A loser rule is like a null rule, except that it always fails.
</DESCRIPTION>
</CLASS>
<CLASS value="terminal">
<DESCRIPTION>
 A terminal is a regular expression, like a variable name
</DESCRIPTION>
</CLASS>
<CLASS value="non_terminal">
<DESCRIPTION>
 A non-terminal rule is made up of other terminal or non-terminal rules.
 We want to overload the  &amp;  and | operators to use them in the usual way so
 we don't make non_terminal be of type 'rule'.  Instead we make non_terminal
 its own class that can be constructed with a rule or another non_terminal.
</DESCRIPTION>
</CLASS>
<CLASS value="compound_rule">
<DESCRIPTION>
 Some rules are made up of other rules.  When constructing these
 rules its more efficient if you just set up your parse tree
 one time during the lifetime of the rule, and then just keep
 resetting it everytime you use it.
</DESCRIPTION>
<METHOD value="match">
<DESCRIPTION>
 Construct the compound rule if we have to, and then run it.
 Call convert() if there's a match and return true.
</DESCRIPTION>
</METHOD>
<METHOD value="is_matched">
<DESCRIPTION>
 return true if I matched last time I tried
</DESCRIPTION>
</METHOD>
<METHOD value="convert">
<DESCRIPTION>
 We have found a match for the rule, which means we have matched a
 expression in the language.  Do whatever that expression tells us to.
</DESCRIPTION>
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We create the compound rule using or and 'and' only once during the 
 lifetime of the object to speed up the parse - its wasteful to keep
 creating and deleting instances.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="the">
</ATTRIBUTE>
</CLASS>
<CLASS value="iterative_rule">
<DESCRIPTION>
 A '1 or more' compound rule.  Calls repeat_match until the match
 fails, and return true if there was at least 1 match and
 no syntax_error was raised.
</DESCRIPTION>
<METHOD value="match">
<DESCRIPTION>
 Try repeat_match 1 more more times, then call convert
 if there is a match.  Keep going until the match fails.
</DESCRIPTION>
</METHOD>
<METHOD value="reset">
</METHOD>
<METHOD value="create_complete_rule">
<DESCRIPTION>
 We are iterating through the_iteration and we need to make sure that the
 arrays have been created up to this level, if we have never been at this level
 before.  We also need to make sure we've reset the rules at this level before
 we try the match.
</DESCRIPTION>
</METHOD>
<METHOD value="repeat_match">
<DESCRIPTION>
 We have matched on the_iteration.  Extract any information we need from the 
 rules before going on to the next step.
</DESCRIPTION>
</METHOD>
<METHOD value="repeat_match">
<DESCRIPTION>
 This is where we call the actual match.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_terminals">
<DESCRIPTION>
 These are the non-terminal rules that make up this rule.  They are an array
 such that the n'th iteration refers to the n-1th rule.  The array is populated
 by calls to create_complete_rule.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="quoted_string_rule">
<DESCRIPTION>
 This matches a string delemited by matching characters.  Probably
 the most famous of these is a quoted string.
</DESCRIPTION>
</CLASS>
<CLASS value="word_rule">
<DESCRIPTION>
 A word, in other words not spaces
</DESCRIPTION>
</CLASS>
<CLASS value="key_rule">
<DESCRIPTION>
 key = something, chop off the '=' part
</DESCRIPTION>
</CLASS>
<CLASS value="nv_rhs">
<DESCRIPTION>
 name-value right hand side, either a word or a 
 quoted string.
</DESCRIPTION>
</CLASS>
<CLASS value="nv_pair">
<DESCRIPTION>
 name-value pair, for example:
 NAME = VALUE
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="percentage_meter.cpp" dir="CVS">
</FILE>
<FILE value="percentage_meter.h" dir="CVS">
</FILE>
<FILE value="pitch.cpp" dir="CVS">
<METHOD value="get_accidental_from_array">
</METHOD>
</FILE>
<FILE value="pitch.h" dir="CVS">
<CLASS value="pitch">
<DESCRIPTION>
 Representation of a pitch.  Consists of a letter note, accidental,
 and octave.
</DESCRIPTION>
<METHOD value="as_string">
<DESCRIPTION>
 Returns a string representation of the pitch, but not an ABC string
 use abc_string for that.
</DESCRIPTION>
</METHOD>
<METHOD value="string_value">
<DESCRIPTION>
 Returns the pre-parsed value of the string.  Used for transposing ..toABC things 
</DESCRIPTION>
</METHOD>
<METHOD value="add_accidental">
<DESCRIPTION>
 These can be used by clients keeping track of accidentals
 to decide what needs to be displayed/played based on what
 has been played thus far in the measure and the common rules
 of music notation
</DESCRIPTION>
</METHOD>
<METHOD value="change_accidental">
<DESCRIPTION>
 Change the accidental to compensate for the key or the forced
 accidental.  The assumption is that the changed accidental is 
 already added to the map.
</DESCRIPTION>
</METHOD>
<METHOD value="get_accidental_from_array">
</METHOD>
<METHOD value="has_accidental_changed">
<DESCRIPTION>
 return true if the accidental for my_letter in the map is 
 different than my_accidental, or if the accidental doesn't
 appear in the map at all.
</DESCRIPTION>
</METHOD>
<METHOD value="is_accidental_in_array">
<DESCRIPTION>
 Return true if there is an accidental for my_letter in the 
 map.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="polygon.cpp" dir="CVS">
</FILE>
<FILE value="polygon.h" dir="CVS">
<DESCRIPTION>
 Represents an arbitrary shape that can later be
 rendered on some type of device.  Most of the operations
 that can be performed on this objects are derived from the
 postscript language (loosely).
</DESCRIPTION>
<CLASS value="linear_xform">
<DESCRIPTION>
 A polygon can be transformed the same way a window can.
 When we transform a polygon we only apply the transform to
 future drawing operations.  If you want to change the transform
 of the whole polygon you need to apply the transform and then
 redraw all the points
</DESCRIPTION>
<METHOD value="linear">
<DESCRIPTION>
 Allow the user to set up the zoom and offset in x and y directions
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="fill_point">
<DESCRIPTION>
 This class is used to represent a point in the drawing of the
 polygon where the drawing actually occurs.  This lets us represent
 more complex shapes in one polygon.
</DESCRIPTION>
<METHOD value="get_...">
<DESCRIPTION>
 returns the extreme points of the polygon. 
</DESCRIPTION>
</METHOD>
<METHOD value="operator[]">
<DESCRIPTION>
 Allow the polygon to be treated like an array of points.
</DESCRIPTION>
</METHOD>
<METHOD value="get_next_fill_point">
<DESCRIPTION>
 Many figures are actually multiple sub-figures.  The sub-figures are either
 filled or outlined at a certain index into the array.
</DESCRIPTION>
</METHOD>
<METHOD value="fill_poly">
<DESCRIPTION>
 This sets the next fill point at the current index (the index that was added last).
</DESCRIPTION>
</METHOD>
<METHOD value="outline_poly">
<DESCRIPTION>
 This sets the next outline point at the current index (the index that was added last).
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Follow the same set of commands that was used to build 'o', when
 creating a new polygon.  This can be used to render polys on a
 different scale (like on a printer).
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="poly_command">
<DESCRIPTION>
 this is used by clone()
</DESCRIPTION>
<METHOD value="expand_points">
<DESCRIPTION>
 handle expandable array.  We figure that this object will be rendered seldom
 but referenced many times, so an expandable array will be best.
</DESCRIPTION>
</METHOD>
<METHOD value="must_add_current">
<DESCRIPTION>
 return true if we must add the current point in a lineto or 
 curveto operation.  We need to do this is the last thing was
 a moveto or moveto relative.
</DESCRIPTION>
</METHOD>
<METHOD value="make_midpoints">
<DESCRIPTION>
 Implement Bezier curve by replacing a n point array with
 n + 1 midpoints.  Return false if we can't bisect the
 midpoints because they're too close together.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_ul_offset,">
<DESCRIPTION>
 Keep track of the size and some special points of the
 polygon
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_need_to...">
<DESCRIPTION>
 Keep track of whether or not we need to recalculate things.  This speeds
 things up when referencing the size of a polygon many times.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="posixmutex.cpp" dir="CVS">
</FILE>
<FILE value="posixmutex.h" dir="CVS">
</FILE>
<FILE value="posixsemaphore.cpp" dir="CVS">
</FILE>
<FILE value="posixsemaphore.h" dir="CVS">
</FILE>
<FILE value="posixthreads.cpp" dir="CVS">
</FILE>
<FILE value="posixthreads.h" dir="CVS">
</FILE>
<FILE value="preprocess.cpp" dir="CVS">
</FILE>
<FILE value="preprocess.h" dir="CVS">
<CLASS value="text_buf">
<DESCRIPTION>
 Abstract the behavior of a file so that it could work on any text
 buffer, such as a text editing window.
</DESCRIPTION>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
<METHOD value="sync_contents_to_buffer">
<DESCRIPTION>
 Make sure the contents of the text_file object match the contents of the
 underlying buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="buffer_setpos">
<DESCRIPTION>
 set cursor position to l
</DESCRIPTION>
</METHOD>
<METHOD value="open">
<DESCRIPTION>
 Open the text buffer for reading.
</DESCRIPTION>
</METHOD>
<METHOD value="getpos">
<DESCRIPTION>
 Return the current position of the pointer into the text buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
<METHOD value="refresh()">
<DESCRIPTION>
 Refresh the text buffer with the persistent representation.
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_modify_time">
<DESCRIPTION>
 returns the last time the buffer was changed, so you'll know
 if you need to reparse it.
</DESCRIPTION>
</METHOD>
<METHOD value="get_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="set_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="file_buf">
<DESCRIPTION>
 A stdio file implementation of text_buf.  Used for unit testing and
 development.
</DESCRIPTION>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
<METHOD value="getpos">
<DESCRIPTION>
 Return the current position of the pointer into the text buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="preprocess">
<DESCRIPTION>
 Preprocess an abc file.  Scan through the comments and return
 completed lines, including lines seperated with '\'.
</DESCRIPTION>
<METHOD value="set_line">
<DESCRIPTION>
 Move to the position of the given line number.
</DESCRIPTION>
</METHOD>
<METHOD value="get_pos_from_line">
<DESCRIPTION>
 Get the offset (for getpos, etc.) that we corresponds to
 the beginning of the given line.
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_modify_time">
<DESCRIPTION>
 return true if the file has changed since this was opened.
</DESCRIPTION>
</METHOD>
<METHOD value="index_file">
<DESCRIPTION>
 Count the lines, and create the line to position map for the buffer.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_lines_to_fpos">
<DESCRIPTION>
 Keep track of which index is which line, so we can
 get there fast.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="registry.cpp" dir="CVS">
</FILE>
<FILE value="registry.h" dir="CVS">
<DESCRIPTION>
 Classes that implement a simple platform-independent
 persistent registry for 
 a program, that manage a list of name-value pairs
 from a .ini file.  This can be used to store preferences,
 program state, etc.
 The form of the registry is:
 [category]
 key1=value1
 key2=value2
 key3.subkey = value3
</DESCRIPTION>
<CLASS value="registry_key">
<DESCRIPTION>
 A registry key is a set of strings that can be associated
 with a value.  The strings are arranged in a heirarchy so that
 we can sort them and peruse them.
</DESCRIPTION>
<METHOD value="ctor,">
</METHOD>
<METHOD value="ctor,">
</METHOD>
<METHOD value="op=,">
</METHOD>
<METHOD value="copy">
</METHOD>
<METHOD value="default">
</METHOD>
<METHOD value="get_subkey_from_string">
<DESCRIPTION>
 Parse the string to split on the '.', which allows entries like: LASTFILE.1=foo.abc
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="registry_entry">
<DESCRIPTION>
 registry_entry is a registry_key + a string value.
 An entry can be put into the registry and looked up later,
 based on the key.
</DESCRIPTION>
<METHOD value="registry_entry">
<DESCRIPTION>
 construct a registry entry based on the strings.
</DESCRIPTION>
</METHOD>
<METHOD value="registry_entry">
<DESCRIPTION>
 construct a registry entry based on the key an a value.
</DESCRIPTION>
</METHOD>
<METHOD value="registry_entry">
<DESCRIPTION>
 construct an empty registry entry.
</DESCRIPTION>
</METHOD>
<METHOD value="copy">
</METHOD>
<METHOD value="op=">
</METHOD>
<METHOD value="op=,">
<DESCRIPTION>
 change the value of the existing key.
</DESCRIPTION>
</METHOD>
<METHOD value="is_persistent">
<DESCRIPTION>
 Indicate whether or not this registry entry should be written to disk 
 when a flush() is performed on the registry.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="registry">
<DESCRIPTION>
 Allow the user toe store key/value pairs persistently between releases.
 It is similary to a windows .ini file, hence the name, but it works cross-
 platforms.
</DESCRIPTION>
<METHOD value="registry">
<DESCRIPTION>
 Create a new registry instance, and initialize it with values from
 the_filename.  Future flushes of this buffer will also be written to
 this filename.
</DESCRIPTION>
</METHOD>
<METHOD value="get_entry">
<DESCRIPTION>
 look up the registry and return the value associated with the given key,
 or an empty string if no such value is found.
</DESCRIPTION>
</METHOD>
<METHOD value="get_entry">
<DESCRIPTION>
 look up the registry and add or replace the given entry.
</DESCRIPTION>
</METHOD>
<METHOD value="flush">
<DESCRIPTION>
 write all values marked as persistent to the file
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="registry_defaults.cpp" dir="CVS">
</FILE>
<FILE value="registry_defaults.h" dir="CVS">
</FILE>
<FILE value="resource.h" dir="CVS">
</FILE>
<FILE value="scan.cpp" dir="CVS">
</FILE>
<FILE value="scan.h" dir="CVS">
<DESCRIPTION>
 All the class needed to implement a semi-functional, extremely slow
 regular expression scanner
</DESCRIPTION>
<DESCRIPTION>
 In order to get all of the state machine creators created we need
 to explicitly reference them somewhere.  Do it here, for the linker's
 benefit.
</DESCRIPTION>
<CLASS value="scan_state">
<DESCRIPTION>
 We will construct a state machine to implement our regular expression scanner.
 Each state in the machine will implement the following interface.
</DESCRIPTION>
<METHOD value="scan_state">
<DESCRIPTION>
 We construct a scan state with 2 variables:  the previous state,
 which could be used for things like wildcard matches, and the group
 number, which can be used to remember previous matches
</DESCRIPTION>
</METHOD>
<METHOD value="match">
<DESCRIPTION>
 This is the main public module for a scan state.
 Match the_string starting at the_index.  If this state matches the
 string at the_index, increment the_index by the size of the string we
 matched and return true.  Otherwise the match failed, return false
 and leave the_index unchanged.
</DESCRIPTION>
</METHOD>
<METHOD value="get_length()">
</METHOD>
<METHOD value="get_group_number">
<DESCRIPTION>
 Parts of a regular expression can be grouped.  The groups are assigend indices
 and can be referenced if they are all matched.  States are assigned group numbers
 when they are created.  Return the group number we were assigned.
</DESCRIPTION>
</METHOD>
<METHOD value="get_min_length">
<DESCRIPTION>
 return the minimum that this state can match and be satisifed.  If the remainin
 string is less than that, we know we're done.
</DESCRIPTION>
</METHOD>
<METHOD value="get_match">
<DESCRIPTION>
 Return the matched string, or an emptry string if no match was found.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 This actually implements the match in the derived class
</DESCRIPTION>
<METHOD value="reset">
<DESCRIPTION>
 Some states have internal state that must be reset before another
 expression can be matched.  This does that.
</DESCRIPTION>
</METHOD>
<METHOD value="private_get_length">
<DESCRIPTION>
 return the length of the string that this state has matched.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="scan_state_creator">
<DESCRIPTION>
 The state machine is constructed based on an input string.  So we have
 to scan the input string before we have a state machine.  This class will
 construct a scan state based on the input string.  For example, the '\d'
 input string will construct a digit-matching scan state.
</DESCRIPTION>
<METHOD value="create_state">
<DESCRIPTION>
 Static method.
 Regexp can call this to create the next state in the input string.
</DESCRIPTION>
</METHOD>
<METHOD value="match_input">
<DESCRIPTION>
 This will return a state if the next input token on the input string matches the
 string the scan_state that I know how to create.
 Note when implementing this method in a derived class, make sure that you increment
 the_index if you create a state, or you will loop forever.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 match A-z or 0-9 or an _
</DESCRIPTION>
<METHOD value="match_input">
<DESCRIPTION>
 Make \w match a word character.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="semaphore.cpp" dir="CVS">
</FILE>
<FILE value="semaphore.h" dir="CVS">
</FILE>
<FILE value="simple.cpp" dir="CVS">
</FILE>
<FILE value="simple.h" dir="CVS">
<DESCRIPTION>
 Define some simple types that are useful, like point
 and line and stuff.
</DESCRIPTION>
<CLASS value="point">
<DESCRIPTION>
 A 2 dimensional point, and some usefule
 operations
</DESCRIPTION>
</CLASS>
<CLASS value="point_ordinal">
<DESCRIPTION>
 In order to create an ordinal type out of 'point',
 assign the y value arbitrary importance.
</DESCRIPTION>
</CLASS>
<CLASS value="size">
<DESCRIPTION>
 same as point
</DESCRIPTION>
<DESCRIPTION>
 Define a fraction as 2 int's, and some useful
 operations
</DESCRIPTION>
</CLASS>
<CLASS value="scale">
<DESCRIPTION>
 a floating point version of size
</DESCRIPTION>
</CLASS>
<CLASS value="line">
<DESCRIPTION>
 A line is just 2 points.
</DESCRIPTION>
</CLASS>
<CLASS value="rect">
<DESCRIPTION>
 A rectangle is 2 points also, but it's treated differently
</DESCRIPTION>
<DESCRIPTION>
 These functions are used to map a point from one rectangle to one
 of a different size.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="slurer.cpp" dir="CVS">
</FILE>
<FILE value="slurer.h" dir="CVS">
<CLASS value="slurer">
<DESCRIPTION>
 Handles all the slur points for a single staff.  This will allow it
 (in theory) to keep the slurs from running into each other.
 We discover slurs by matching open/closed parens in a LIFO way.
 Each time we get a new to point, we match it with the last 'from'
 point and add it to the map.  Then we draw the map from left to
 right.
</DESCRIPTION>
<METHOD value="normalize">
<DESCRIPTION>
 We try to normalize around 0,0.  That way we can draw the
 slurer on the page where it starts instead of having
 it always offset from absolute 0,0.  Makes the page logic
 simpler since 0,0 is always on page 1.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="staff.cpp" dir="CVS">
</FILE>
<FILE value="staff.h" dir="CVS">
</FILE>
<FILE value="staff_info.h" dir="CVS">
</FILE>
<FILE value="string.cpp" dir="CVS">
</FILE>
<FILE value="string.h" dir="CVS">
<METHOD value="chop">
<DESCRIPTION>
 remove the last character
</DESCRIPTION>
</METHOD>
<METHOD value="clear">
<DESCRIPTION>
 Clear out the string
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="text_figure.cpp" dir="CVS">
</FILE>
<FILE value="text_figure.h" dir="CVS">
<DESCRIPTION>
 Allow a string to be drawn on the given window in the correct
 thread.  Handle the dispatching to the GUI thread and the
 correct placement
</DESCRIPTION>
<METHOD value="get_current_rect">
<DESCRIPTION>
 This gets the current rectangle from the current string.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_words">
<DESCRIPTION>
 Do the same things with words.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="calculate_text_info">
<DESCRIPTION>
 Calculate all the size info about this string in this font.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_should_calculate">
<DESCRIPTION>
 This is true if we need to call calculate text info
</DESCRIPTION>
</ATTRIBUTE>
</FILE>
<FILE value="threads.cpp" dir="CVS">
</FILE>
<FILE value="threads.h" dir="CVS">
</FILE>
<FILE value="time_sig.cpp" dir="CVS">
</FILE>
<FILE value="time_sig.h" dir="CVS">
<METHOD value="ctor">
</METHOD>
</FILE>
<FILE value="wd_data.cpp" dir="CVS">
</FILE>
<FILE value="wd_data.h" dir="CVS">
<DESCRIPTION>
 Template files for handling notification of concurrent
 things.  This is various interpretations of the observer
 pattern.  
</DESCRIPTION>
<CLASS value="wd_data">
<DESCRIPTION>
 Encapsulate a multi-type container.  This class acts as a 
 proxy to another derived wd_data, which contains an instance
 of some type, possible a built in type, which is passed as
 a parameter to a dispatcher function.
</DESCRIPTION>
</CLASS>
<CLASS value="wd_data_dx">
<DESCRIPTION>
 A derived wd_data, with the parameterized type which detemrines
 what the real type is.  It can be used in the place of a
  &lt; type1 &gt;  parameter to a dispatcher call.
</DESCRIPTION>
</CLASS>
<CLASS value="selection_handler">
<DESCRIPTION>
 Abstract class that allows a client to get reports of GUI things to him
 using the observer pattern.
</DESCRIPTION>
</CLASS>
<CLASS value="selection_handler_dx_data">
<DESCRIPTION>
 This is a template class that allows the client to be
 a selection handler (e.g. receive selection events) 
 without having to inherit from selection_handler himself.
 But he needs to implement the handle_selection method.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 create the class with the object that is getting notified
 as the parent.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
</METHOD>
<METHOD value="select">
<DESCRIPTION>
 This is the method the widget calls to get the events to the user.
 This is what calls the handle_selection method.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_paremt">
<DESCRIPTION>
 The client class that we notify.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="selection_handler">
<DESCRIPTION>
 This is the type that the client creates.  Usage:
 my_tree_ctrl- &gt; add_selection_handler(selection_handler_dx &lt; my_type &gt; (*this));
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the data that is reference counted and initiaze
 it with this parent.  If the parameter is another
 instance, add ref to my data object.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 Remove the reference count and delete the object if 
 need be.
</DESCRIPTION>
</METHOD>
<METHOD value="select">
<DESCRIPTION>
 Call the select method of the data object.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="wd_temp.cpp" dir="CVS">
</FILE>
<FILE value="win32mutex.cpp" dir="CVS">
</FILE>
<FILE value="win32mutex.h" dir="CVS">
</FILE>
<FILE value="win32semaphore.cpp" dir="CVS">
</FILE>
<FILE value="win32semaphore.h" dir="CVS">
</FILE>
<FILE value="win32threads.cpp" dir="CVS">
</FILE>
<FILE value="win32threads.h" dir="CVS">
</FILE>
<FILE value="window_feature.h" dir="CVS">
</FILE>
<FILE value="window_figure.h" dir="CVS">
</FILE>
<FILE value="window_media.cpp" dir="CVS">
</FILE>
<FILE value="window_media.h" dir="CVS">
<CLASS value="music_window_iterator">
<DESCRIPTION>
 Iterate through the music and populate the graphical interface.  We use
 a template because the iteration actually uses different clients depending
 on whether we're in score mode or not, but everything else is the same.
</DESCRIPTION>
<DESCRIPTION>
 There will be other media types, such as: midi device output,
 printer output, midi file output,
 but for now the only one is window output.  As other media types are
 added they will be moved into their own files.  This accepts musical
 features from a media source and renders them on some type of window
 device.
</DESCRIPTION>
<METHOD value="setup">
<DESCRIPTION>
 This is supposed to be where the media gets set up to receive
 the music, but it doesn't really apply to a window getting
 music.
 This didn't really work....
</DESCRIPTION>
</METHOD>
<METHOD value="complete">
<DESCRIPTION>
 This is called when all the music has been added to the media.
 It's a sign for the media to start drawing itself.  Here we just
 render the music one page at a time.
</DESCRIPTION>
</METHOD>
<METHOD value="consolidate_long_rests">
<DESCRIPTION>
 If we are in part mode, consolitdate all the rests into blocks where possible.
</DESCRIPTION>
</METHOD>
<METHOD value="sort_staffs_in_y_order">
<DESCRIPTION>
 Sort the staffs in order from lowest to highest on the
 screen
</DESCRIPTION>
</METHOD>
<METHOD value="adjust_staff_height">
<DESCRIPTION>
 Move all the staffs so that they don't overlap one another.
</DESCRIPTION>
</METHOD>
<METHOD value="add_margins_stuff">
<DESCRIPTION>
 Add the header and footer to the given page.
</DESCRIPTION>
</METHOD>
<METHOD value="render_music_feature">
<DESCRIPTION>
 Make the musical feature come alive on the window.  Usually this creates a note
 figure and puts it on the correct line_of_music.
</DESCRIPTION>
</METHOD>
<METHOD value="render_measure_feature">
<DESCRIPTION>
 render a feature that revolves around a measure, such as a bar line or repeat sign.
</DESCRIPTION>
</METHOD>
<METHOD value="transpose_chord">
<DESCRIPTION>
 Transpose the note up or down the given number of half-steps
</DESCRIPTION>
</METHOD>
<METHOD value="transpose_key">
<DESCRIPTION>
 Transpose the note up or down the given number of half-steps
</DESCRIPTION>
</METHOD>
<METHOD value="render_music">
<DESCRIPTION>
 We've read in the music, and stored it, so now its time to render the music.
 RETURNS:
 the number of the next page; 0 if this is the last page.
</DESCRIPTION>
</METHOD>
<METHOD value="render_words">
<DESCRIPTION>
 Handle the big 'W'.  Just draw the words centered in the window at the
 end of the song part.
</DESCRIPTION>
</METHOD>
<METHOD value="render_all_staffs">
<DESCRIPTION>
 We've put together a bunch of staffs and added the music to them, now
 go and do the drawing of them all at once.
</DESCRIPTION>
</METHOD>
<METHOD value="set_dynamics">
<DESCRIPTION>
 Set the dynamics in the staff, if they've changed.
</DESCRIPTION>
</METHOD>
<METHOD value="add_figures_to_page">
<DESCRIPTION>
 Add the staffs to the pages, compensating for the offset and
 adding new pages when necessary.
</DESCRIPTION>
</METHOD>
<METHOD value="get_staves_per_system">
<DESCRIPTION>
 If we are in score mode, return the number of voices.
 Otherwise, return 1.
</DESCRIPTION>
</METHOD>
<METHOD value="add_music_feature_to_staff">
<DESCRIPTION>
 Create a note figure from a note info and add it to the staff.
</DESCRIPTION>
</METHOD>
<METHOD value="add_measure">
<DESCRIPTION>
 We have rendered all the notes in the measure, now complete the
 measure by adding the figure that goes at the end, and the figure
 that starts the next measure (e.g. a begin repeat) to the appropriate
 staff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_or_create_line_of_music">
<DESCRIPTION>
 We keep a map of places in the music to the staff objects that go with it.  Look up
 the staff in the map that is less than or = to this point in the score.  If this is
 the first such request there are no staffs for this voice,
 create the initial staff and return it.
</DESCRIPTION>
</METHOD>
<METHOD value="get_previous_staff">
<DESCRIPTION>
 To keep the staffs from running into one another, compare the points
 to the previous staff.
</DESCRIPTION>
</METHOD>
<METHOD value="add_nth_endings">
<DESCRIPTION>
 Figure out which nth endings go on the staff.
</DESCRIPTION>
</METHOD>
<METHOD value="get_points">
<DESCRIPTION>
 We have changed parts so we weren't reading the music in in order.
 Get the points we saved the last time, and save the current point
 of measure and chord for when we change back to this part/voice.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 x and y scale and page size
</DESCRIPTION>
<ATTRIBUTE value="my_staff_names[]">
<DESCRIPTION>
 an array names that contain the voice header name information
 (e.g. trumpet2).  There may be one of these for each page.
</DESCRIPTION>
</ATTRIBUTE>
<METHOD value="get_vertical_offset">
<DESCRIPTION>
 We have a line_of_music.  We want to see what the offset is info this window so that we
 can put it in the right place.
</DESCRIPTION>
</METHOD>
<METHOD value="create_new_staff">
<DESCRIPTION>
 Handle the work of creating a new staff instance given a
 point of music.  We assume that the client wants to actually create the
 line_of_music if they call this function; no check is made to see if it
 already exists.
</DESCRIPTION>
</METHOD>
<METHOD value="in_score_mode">
<DESCRIPTION>
 Return true if we are in score mode.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="window*">
<DESCRIPTION>
 This is where we do our thing...
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="rect">
<DESCRIPTION>
 Used to determine whether or not a thing is in the window range
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 A map of staffs to parts/measures
</DESCRIPTION>
<DESCRIPTION>
 Keep track of the staffs as we draw them so we can
 space them properly
</DESCRIPTION>
<ATTRIBUTE value="my_staffs_to_render">
<DESCRIPTION>
 Keep track of the staffs and then render them all at once.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_staffs_to_render">
<DESCRIPTION>
 Keep track of the staffs that we have started so far.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_pages">
<DESCRIPTION>
 These keep track of the pages.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_rendered_score_point">
<DESCRIPTION>
 The last point I rendered, used to update the system a little at a time.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_music_map">
<DESCRIPTION>
 Keep track of all the music in one map so we don't have to
 keep switching maps.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_score_map">
<DESCRIPTION>
 This is the map we use if we are displaying in score mode.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_lines_to_score_point">
<DESCRIPTION>
 Keep track of which screen lines the staff is on so we
 can do GUI magic later.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="winres.cpp" dir="CVS">
</FILE>
<FILE value="winres.h" dir="CVS">
<DESCRIPTION>
 Generic window classes.  We want this to be as portable as possible
 so we make the base classes do as much of the work as possible
</DESCRIPTION>
<CLASS value="window_res">
<DESCRIPTION>
 A generic resource associated with a windowing system.  This could
 be a font, a pen or a window itself.
</DESCRIPTION>
<METHOD value="res_add_ref">
<DESCRIPTION>
 Keep a reference count so it gets deleted at the
 correct time.
</DESCRIPTION>
</METHOD>
<METHOD value="res_remove_ref">
<DESCRIPTION>
 Decrement the reference count and delete if its
 zero
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="caster">
<DESCRIPTION>
 A template class that will cast a window resource to
 its derived type, or return null
</DESCRIPTION>
</CLASS>
<CLASS value="canvas">
<DESCRIPTION>
 A canvas is really a window, but we use it to get around the
 circular dependency between a window and the resources that
 can draw stuff in it.  We make the assumption that it doesn't
 really make any sense to have a pen, color, whatever unless
 there's a window to go with it.
</DESCRIPTION>
</CLASS>
<CLASS value="pen">
<DESCRIPTION>
 A pen that can draw on a window.
</DESCRIPTION>
<METHOD value="clear_all_pens_for_canvas">
<DESCRIPTION>
 We create pens and fonts based on a particular
 window.  Avoid memory leaks by derefing all pens still owned
 by this canvas.  Hopefully by now any clients that keep
 pens around have been removed.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="font">
<DESCRIPTION>
 A font class that can write text to a window
</DESCRIPTION>
</CLASS>
<CLASS value="font_data">
<DESCRIPTION>
 font_data allows you to specify a font in a generic way, and
 then get the font for a specific system.
</DESCRIPTION>
<METHOD value="get_font_from_list">
<DESCRIPTION>
 get the font from the list of fonts that this window knows about, or return
 NULL if this font has not been created yet.  This can be called from outside
 the windows thread and will not switch threads.
</DESCRIPTION>
</METHOD>
<METHOD value="get_rect">
<DESCRIPTION>
 Return the bounding rectangle that you get if you draw the_string
 using this font.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="document">
<DESCRIPTION>
 This is like the windows view/document architecture.  A document
 gives the window something to nofity when its state changes, so that
 the document can render itself in the window properly
</DESCRIPTION>
<METHOD value="redraw">
<DESCRIPTION>
 redraw the rectangle the_rect in the window, as this part has changed
</DESCRIPTION>
</METHOD>
<METHOD value="click">
<DESCRIPTION>
 someone has clicked on the area of the window that
 contains this document.
</DESCRIPTION>
</METHOD>
<METHOD value="attach_canvas">
<DESCRIPTION>
 attach a canvas, which is really a window, to a document
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Detach a document from a window, so that we can destroy the window
 or the document.
</DESCRIPTION>
<METHOD value="print_page">
<DESCRIPTION>
 Print the given page
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="window">
<DESCRIPTION>
 Finally we have enough information to define a window.  Mostly a window object
 represents a real system window, and the methods transform from the logical
 space of the application to the 'real' space.  The interface also allows almost
 all drawing to occur in a generic window without any real system specific stuff.
</DESCRIPTION>
</CLASS>
<CLASS value="window::linear_xform">
<DESCRIPTION>
 A linear transform on a thing that consists of multiplying by a
 scalar and adding a scalar offset
</DESCRIPTION>
</CLASS>
<CLASS value="window::display_context">
<DESCRIPTION>
 A display context is the current linear transform that operates on
 stuff that gets drawn in the window, and the current point (the
 turtle) that we're drawing on.
</DESCRIPTION>
<METHOD value="get_window">
<DESCRIPTION>
 Each window has a name, you can get a particular window by knowning its name
 and calling this static function.
</DESCRIPTION>
</METHOD>
<METHOD value="get_font">
<DESCRIPTION>
 create or get the font that has this typeface as a family name (e.g. Times).
</DESCRIPTION>
</METHOD>
<METHOD value="get_pen">
<DESCRIPTION>
 Get the pen that draws in this color and has this width and drawn
 on this window.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 pixels_per_inch return the pixels per inch that can be drawn
 on the current window.  This is used by things that render shapes
 on the screen.
</DESCRIPTION>
<METHOD value="refresh">
<DESCRIPTION>
 This can be used to refresh a region; also it is called by the OS when
 the screen is refreshed.  Otherwise known as redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="refresh">
<DESCRIPTION>
 Refreshes the whole screen.
</DESCRIPTION>
</METHOD>
<METHOD value="add_document">
<DESCRIPTION>
 Sets my document to the_document.  Also notify the document that its got a windoow, things
 are gonna be different from now on...
</DESCRIPTION>
</METHOD>
<METHOD value="shutdown">
<DESCRIPTION>
 Used when the document is being destroyed.  Remove my reference to it, and set my_document
 to 0 so we ignore any pending events.
</DESCRIPTION>
</METHOD>
<METHOD value="scale_point_size">
<DESCRIPTION>
 Scale the point size such that it is proportional to the size of the window.  We need to do
 this since the mapping mode we used is pixel-based.
</DESCRIPTION>
</METHOD>
<METHOD value="set_center_of_y_scroll">
<DESCRIPTION>
 make the given point the central point visible on the screen.  Make it
 virtual but not pure virtual so printing doesn't have to fake it out.
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="win_page.cpp" dir="CVS">
<METHOD value="remove_text_figures">
<DESCRIPTION>
 Remove all text figures at the given point
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="win_page.h" dir="CVS">
<DESCRIPTION>
 Classes to help manage the dimensions of the pages, without any windows-specific
 stuff in it.
</DESCRIPTION>
<CLASS value="figure_container">
<DESCRIPTION>
 This is the interface that describes how the pages hold the figures.
</DESCRIPTION>
<METHOD value="add_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.  Note that the point may not be
 the same as the UL location where the figure is located on the window, since
 some figures have the absolute coordinates and some have relative.  The point
 where the figure is to be drawn is in the point part of the point-figure pair.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure with the given string, and sort on the given point.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="figure_container">
<DESCRIPTION>
 Allow other classes to act like a page class. This allows us to
 implement the same interface as a page without having to inherit from
 anything.
</DESCRIPTION>
</CLASS>
<CLASS value="page_settings">
<DESCRIPTION>
 A structure to keep track of the settings of one page.  By settings I mean
 page size, things like that.
</DESCRIPTION>
</CLASS>
<CLASS value="page_contents">
<DESCRIPTION>
 This is all the figures in a page, along with information about
 the page itself.
</DESCRIPTION>
<METHOD value="add_title">
<DESCRIPTION>
 Add the title to this page.
</DESCRIPTION>
</METHOD>
<METHOD value="add_copyright">
<DESCRIPTION>
 Add the copyright information to the page.
</DESCRIPTION>
</METHOD>
<METHOD value="add_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.  Note that the point may not be
 the same as the UL location where the figure is located on the window, since
 some figures have the absolute coordinates and some have relative.  The point
 where the figure is to be drawn is in the point part of the point-figure pair.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure with the given string, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="redraw">
<DESCRIPTION>
 Redraw all figures who's bounding rectangle intersects the_rect.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_figures">
<DESCRIPTION>
 Remove all figures at the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_text_figures">
<DESCRIPTION>
 Remove all text figures at the given point
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Re-render all the figures on the given window, by stretching/
 compacting the figures based on the source and target rectangles.
</DESCRIPTION>
</METHOD>
<METHOD value="allow_erase">
<DESCRIPTION>
 Disallow erasing the image before draw, as on a print.
</DESCRIPTION>
</METHOD>
<METHOD value="add_offset">
<DESCRIPTION>
 Add the offset to the figures before they're drawn, as on a redraw.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_should_erase">
<DESCRIPTION>
 True if we should erase before redrawing.  False on
 printing since there's nothing to erase on a blank
 page.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="page">
<DESCRIPTION>
 This is the interface to page_contents, which includes copy
 operators and reference counting.
</DESCRIPTION>
<METHOD value="add_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.  Note that the point may not be
 the same as the UL location where the figure is located on the window, since
 some figures have the absolute coordinates and some have relative.  The point
 where the figure is to be drawn is in the point part of the point-figure pair.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="add_text_figure">
<DESCRIPTION>
 Add the figure, and sort on the given point.
</DESCRIPTION>
</METHOD>
<METHOD value="redraw">
<DESCRIPTION>
 Redraw all figures who's bounding rectangle intersects the_rect.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 Based on an absolute pixel offset, figure out which page we're on, or vise versa.
 Return the important parts of a page like the title rectangle
</DESCRIPTION>
<METHOD value="add_page">
<DESCRIPTION>
 Add the page to the array, if it doesn't exist.
</DESCRIPTION>
</METHOD>
<METHOD value="get_stuff">
<DESCRIPTION>
 Given a page number, 
</DESCRIPTION>
</METHOD>
<METHOD value="clone">
<DESCRIPTION>
 Create all new page objects using the target window and
 scale to get the dimensions to draw on.
</DESCRIPTION>
</METHOD>
<METHOD value="get_more">
<DESCRIPTION>
 We can also take a point and figure out which page we're on.
</DESCRIPTION>
</METHOD>
<METHOD value="refresh">
<DESCRIPTION>
 Iterate through all the pages, and refresh any pages that intersect
 with the_rect
</DESCRIPTION>
</METHOD>
<METHOD value="print_page">
<DESCRIPTION>
 Render the page, but fix the UL to be 0,0
</DESCRIPTION>
</METHOD>
</CLASS>
</FILE>
<FILE value="wx_dispatch.cpp" dir="CVS">
</FILE>
<FILE value="wx_dispatch.h" dir="CVS">
</FILE>
<FILE value="wx_frame.cpp" dir="CVS">
</FILE>
<FILE value="wx_frame.h" dir="CVS">
<CLASS value="wx_view_frame">
<DESCRIPTION>
 This is the main application window.  All the events that
 can happen in iabc come through this class.
</DESCRIPTION>
<METHOD value="wx_view_frame">
<DESCRIPTION>
 The main window is divided up into 3 panes, for the music, the tune
 list and the abc text.  This mostly created those and also creates
 the main sub objects and timers that define the application.
</DESCRIPTION>
</METHOD>
<METHOD value="init">
<DESCRIPTION>
 Make debuggin a little easier by putting the init stuff into a different function.
</DESCRIPTION>
</METHOD>
<METHOD value="OnAbout">
<DESCRIPTION>
 Prints the version.
</DESCRIPTION>
</METHOD>
<METHOD value="OnDumpLog">
<DESCRIPTION>
 We provide a menu option to allow the user to dump the event log to
 a file.  This helps me debug problems that occur.
</DESCRIPTION>
</METHOD>
<METHOD value="OnHelp">
<DESCRIPTION>
 This will attempt to start a web browser that points to the
 included documentation.  But the online docs are probably better.
</DESCRIPTION>
</METHOD>
<METHOD value="OnNew">
<DESCRIPTION>
 The user wants a clean document.  Handle save issues and create a 
 generic tune.
</DESCRIPTION>
</METHOD>
<METHOD value="OnOpen">
<DESCRIPTION>
 Open a new file.  gets the file name from the user and sends the
 parameter to the iabc_media_manager to handle.
</DESCRIPTION>
</METHOD>
<METHOD value="OnScoreMode">
<DESCRIPTION>
 The user has requested to display the music in 'score' mode.
</DESCRIPTION>
</METHOD>
<METHOD value="OnViewPreferences">
<DESCRIPTION>
 Display the 'view preferences' dialog that allows the user to
 set a variety of display parameters.
</DESCRIPTION>
</METHOD>
<METHOD value="OnABCPreferences">
<DESCRIPTION>
 Allow the user to set up some parameters regarding the ABC language and
 how the parser works.
</DESCRIPTION>
</METHOD>
<METHOD value="OnViewPreferences">
<DESCRIPTION>
 Display a dialog for changing the editor font.
</DESCRIPTION>
</METHOD>
<METHOD value="OnSave">
<DESCRIPTION>
 Save the current document.
</DESCRIPTION>
</METHOD>
<METHOD value="ProcessEvent">
<DESCRIPTION>
 iabc dispatch model uses the wxWindows event pump.  This is the
 system entry points for events that are dispatched to the windows
 thread or other threads.
</DESCRIPTION>
</METHOD>
<METHOD value="OnRefresh">
<DESCRIPTION>
 The user has pressed the ctrl-L combination.  This will call the function
 in iabc_media_manager that re-parses the file and refreshes the tune.
 Also save the current cursor position so that the user is in the same
 place after the refresh.
</DESCRIPTION>
</METHOD>
<METHOD value="OnPlay">
<DESCRIPTION>
 Play zha midi, ja.
</DESCRIPTION>
</METHOD>
<METHOD value="OnSetPlayer">
<DESCRIPTION>
 Handle the logic to set the midi player, for the OnPlay command.
</DESCRIPTION>
</METHOD>
<METHOD value="OnExport">
<DESCRIPTION>
 Allow the user to export the document to midi.
</DESCRIPTION>
</METHOD>
<METHOD value="OnPrint">
<DESCRIPTION>
 Print the current tune using OS-specific methods.
</DESCRIPTION>
</METHOD>
<METHOD value="OnCut">
<DESCRIPTION>
 Handle the Ctrl-x character sequence.  This gets sent to the
 text buffer window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnCopy">
<DESCRIPTION>
 Handle the Ctrl-c character sequence.  This gets sent to the
 text buffer window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnPaste">
<DESCRIPTION>
 handle the Ctrl-v character sequence.  This gets sent to the 
 text buffer window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnUndo">
<DESCRIPTION>
 Handle the 'undo' command - poorly.  This needs some work.
</DESCRIPTION>
</METHOD>
<METHOD value="OnCloseWindow">
<DESCRIPTION>
 The big 'X' has been clicked, or exit from the menu.
</DESCRIPTION>
</METHOD>
<METHOD value="OnWindowCreate">
<DESCRIPTION>
 This is called one time during creation, we just use the
 generic windows code.
</DESCRIPTION>
</METHOD>
<METHOD value="OnSize">
<DESCRIPTION>
 Recalculate the sizes of the window parts.  Someday I'd
 like to allow the user to undock different parts of the 
 window.
</DESCRIPTION>
</METHOD>
<METHOD value="OnTick">
<DESCRIPTION>
 We try to keep the music and the text in sync as the user
 is typing.  Every tick we check for changed text to move the
 cursor and do some other periodic things.
</DESCRIPTION>
</METHOD>
<METHOD value="OnTranspose">
<DESCRIPTION>
 The user has selected some text and chosen to transpose it.  Call
 the code that handles this.
</DESCRIPTION>
</METHOD>
<METHOD value="OnVoice">
<DESCRIPTION>
 Setup voice options.  The dialog box doesn't do anything yet but this
 will let the user show/hide voices.
</DESCRIPTION>
</METHOD>
<METHOD value="OnShowTuneList">
<DESCRIPTION>
 Show or hide the window pane with the tune list in it.
</DESCRIPTION>
</METHOD>
<METHOD value="really_exit">
<DESCRIPTION>
 Confirm save before exit.
</DESCRIPTION>
</METHOD>
<METHOD value="handle_key_event">
<DESCRIPTION>
 Some key events that get received in the key area don't get handled
 by the text buffer object, but have a global effect and must be
 handled here.
</DESCRIPTION>
</METHOD>
<METHOD value="get_current_line_position">
<DESCRIPTION>
 Returns the point in the text buffer where the cursor is.
</DESCRIPTION>
</METHOD>
<METHOD value="do_open">
<DESCRIPTION>
 Documents can be opened a couple of different ways, this performs
 the actual open.
</DESCRIPTION>
</METHOD>
<METHOD value="do_close">
<DESCRIPTION>
 remove the object and close the window.
</DESCRIPTION>
</METHOD>
<METHOD value="get_midi_command_string">
<DESCRIPTION>
 This constructs the command line string that we use to 
 launch the midi player.
</DESCRIPTION>
</METHOD>
<METHOD value="get_random_filename">
<DESCRIPTION>
 Utility function to generate a random file name.
</DESCRIPTION>
</METHOD>
<METHOD value="create_menu">
<DESCRIPTION>
 create the main window's menu bar.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_handle_size">
<DESCRIPTION>
 true if we are initialized enough to handle window events.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_media">
<DESCRIPTION>
 This is where all the music-rendering and parsing action 
 goes on.
</DESCRIPTION>
</ATTRIBUTE>
<DESCRIPTION>
 handle the 500ms tick.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="wx_list_box.cpp" dir="CVS">
</FILE>
<FILE value="wx_list_box.h" dir="CVS">
<DESCRIPTION>
 These files all have to do with GUI artifacts used to get information
 from the user to an application.  
</DESCRIPTION>
<METHOD value="add/remove">
<DESCRIPTION>
 Don't do this because we will delete these explicitly since its a widows
 resource.
</DESCRIPTION>
</METHOD>
<CLASS value="wx_list_box_control">
<DESCRIPTION>
 A nested list of things, a widget that really everyone
 else calls a tree (and maybe someday I will too)
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="wx_percentage_meter.cpp" dir="CVS">
</FILE>
<FILE value="wx_percentage_meter.h" dir="CVS">
</FILE>
<FILE value="wx_pp.cpp" dir="CVS">
<DESCRIPTION>
 helper functions to convert values from dialog boxes into
 globals of various types
</DESCRIPTION>
</FILE>
<FILE value="wx_pp.h" dir="CVS">
<DESCRIPTION>
 Stuff to handle property pages.  A property page
 is just a way to get preferences from the user.
</DESCRIPTION>
</FILE>
<FILE value="wx_pp_temp.cpp" dir="CVS">
</FILE>
<FILE value="wx_pp_temp.h" dir="CVS">
</FILE>
<FILE value="wx_splitter.cpp" dir="CVS">
</FILE>
<FILE value="wx_splitter.h" dir="CVS">
</FILE>
<FILE value="wx_text_buffer.cpp" dir="CVS">
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
<METHOD value="sync_contents_to_buffer">
<DESCRIPTION>
 Update the text contents with the contents of the underlying
 wxTextCtrl buffer
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="wx_text_buffer.h" dir="CVS">
<CLASS value="key_handler">
<DESCRIPTION>
 We need a way to pass some key events to the menu frame so we can
 bind 'hotkeys' to menu items.  This abstract class allows us to do
 that.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_text_control">
<DESCRIPTION>
 This is our derivation of the text control class.  Right now we just
 update the cursor position when the user presses a character control.
 Someday maybe we will do some brief-style formatting.
</DESCRIPTION>
<DESCRIPTION>
 Update the cursor position in the status bar.
</DESCRIPTION>
<DESCRIPTION>
 Some key events we handle and don't pass to the default handler.  Return
 true if that's the case.
</DESCRIPTION>
<DESCRIPTION>
 Call the default handler and return
 true if this is an event that has changed the buffer.
</DESCRIPTION>
<DESCRIPTION>
 Keep track of the last time the buffer was modified so
 we know when to require a redraw.
</DESCRIPTION>
<ATTRIBUTE value="my_frame">
<DESCRIPTION>
 Lets us update the status text based on cursor position change.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wx_key_handler*">
<DESCRIPTION>
 give the main window first dibs on keyboard events.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wx_text_buffer">
<DESCRIPTION>
 A buffer class that implements text_buf, which has
 pretty much the same interface as FILE* stdio.  This is
 so our preprocess class can treat this like a file text
 buffer.
</DESCRIPTION>
<METHOD value="getpos">
<DESCRIPTION>
 Return the current position of the pointer into the text buffer.
</DESCRIPTION>
</METHOD>
<METHOD value="setpos">
<DESCRIPTION>
 set the position of the next read to the_pos;
</DESCRIPTION>
</METHOD>
<METHOD value="getc">
<DESCRIPTION>
 get the next character in the buffer.  Return text_buf::eof when the
 last position is reached.
</DESCRIPTION>
</METHOD>
<METHOD value="close">
<DESCRIPTION>
 free up the resource so that it can be used by others.
</DESCRIPTION>
</METHOD>
<METHOD value="load">
<DESCRIPTION>
 Load the contents of the file and refresh the internal string.
</DESCRIPTION>
</METHOD>
<METHOD value="get_filename">
<DESCRIPTION>
 return the file name that I was opened with.
</DESCRIPTION>
</METHOD>
<METHOD value="get_last_modify_time">
<DESCRIPTION>
 Get the last time this control was modified by the user.  We
 return the lesser of the modify/redraw time, since what the
 user really wants to know is: have the contents changes since
 last I redrew everything?
</DESCRIPTION>
</METHOD>
<METHOD value="refresh">
<DESCRIPTION>
 Update the status bar with the new position.
</DESCRIPTION>
</METHOD>
<METHOD value="remove_ref">
<DESCRIPTION>
 There to satisfy dispatcher
</DESCRIPTION>
</METHOD>
<METHOD value="get_insertion_point">
<DESCRIPTION>
 Return the point of the 'carat' in the text field.
</DESCRIPTION>
</METHOD>
<METHOD value="set_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="get_selection">
<DESCRIPTION>
 For the real GUI application, we need to get and set the selection of the
 text buffer so that the selection stays the same after redraw.
</DESCRIPTION>
</METHOD>
<METHOD value="reset_modify_time">
<DESCRIPTION>
 Set the modify time of the underlying file to match the underlying
 file's modify time (so we don't keep reloading the file)
</DESCRIPTION>
</METHOD>
<METHOD value="has_underlying_file_changed">
<DESCRIPTION>
 Returns true if the file underlying the control
 has been changed since my_last_modify_time.
</DESCRIPTION>
</METHOD>
<METHOD value="has_changed">
<DESCRIPTION>
 Return true if the contents have changed.
</DESCRIPTION>
</METHOD>
<METHOD value="load_if_newer">
<DESCRIPTION>
 Load the file if it has modified since we last read it in, or if
 we never read it in yet.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 GUI thread method to interact with windows.
</DESCRIPTION>
</METHOD>
<METHOD value="draw_self">
<DESCRIPTION>
 GUI thread method to insert the carat in the file.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_control">
<DESCRIPTION>
 The underlying windows object.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_has_underlying_file_changed">
<DESCRIPTION>
 The scanning thread sets this to true if the underlying file
 has changed beneath the buffer.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_should_exit">
<DESCRIPTION>
 used to control the exit of the scanning thread.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_position">
<DESCRIPTION>
 This stuff is kept track of so we can access it outside the
 windows thread.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_file_modify_time">
<DESCRIPTION>
 The modify time of the underlying file.  Use this to keep
 track of when we need to load the file into the buffer.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_last_redraw_time">
<DESCRIPTION>
 The last time we've redrawn the graphical music.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="display_to_buffer_map">
<DESCRIPTION>
 Under MS windows, the control has an extra character for each
 return character, so handle that here.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="wx_winres.cpp" dir="CVS">
</FILE>
<FILE value="wx_winres.h" dir="CVS">
<CLASS value="wx_canvas">
<DESCRIPTION>
 A place holder to break the dependency between resources like wxFonts and the
 windows who love them.
</DESCRIPTION>
</CLASS>
<CLASS value="font_creator">
<DESCRIPTION>
 Create a font in the correct windows thread.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_font">
<DESCRIPTION>
 wxWindows implementation of the font concept.
</DESCRIPTION>
<METHOD value="get_rect">
<DESCRIPTION>
 Return the rectangle that would contain the given string.  This
 method can be called from any thread, since the geometry data associated
 with a font is not stored when the font is created.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="wx_pen">
<DESCRIPTION>
 A pen to draw on a window.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_view_canvas">
<DESCRIPTION>
 We need to derive from the wxWindow object to handle the events like
 scrolling and screen updates, event though we have our own window object
 that does all the real window stuff.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_dc">
<DESCRIPTION>
 Proxy for the wxWindows device context, which needs to
 be established whenever we draw something on the screen
 or print something.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_window">
<DESCRIPTION>
 This is the actual window that we draw on.  It also acts
 as the event source for events and dispatches.
</DESCRIPTION>
<METHOD value="wx_window">
<DESCRIPTION>
 Constructor.  Give wx_window its drawing area.
</DESCRIPTION>
</METHOD>
<METHOD value="show()">
<DESCRIPTION>
 show/hide the window.
</DESCRIPTION>
</METHOD>
<METHOD value="pixels_per_inch_x/y">
<DESCRIPTION>
 Gets the window dimensions.
</DESCRIPTION>
</METHOD>
<METHOD value="get_dc">
<DESCRIPTION>
 Get the DC that we need to draw on.  This allows us to handle the DC where we
 are printing and the one where we're not.  This needs to be public as fonts and
 pens need to use the DC as well.
</DESCRIPTION>
</METHOD>
<METHOD value="dtor">
<DESCRIPTION>
 The reference count has expired us and we are gone.
</DESCRIPTION>
</METHOD>
<METHOD value="set_pens">
<DESCRIPTION>
 Sets up the DC to draw with the selected pens.
</DESCRIPTION>
</METHOD>
<METHOD value="set_raw_size">
<DESCRIPTION>
 The contents of the document have changed such that the size of the virtual
 window needs to be updated.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_draw_rect">
<DESCRIPTION>
 Draw a rectangle on the screen with the given pen.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_draw_line">
<DESCRIPTION>
 Draw a line.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_draw_text">
<DESCRIPTION>
 Draw a string in the current location.
</DESCRIPTION>
</METHOD>
<DESCRIPTION>
 METHOD:
 Draw the polygon in the current location.
</DESCRIPTION>
<METHOD value="raw_refresh">
<DESCRIPTION>
 Redraw the window in the given rectangle.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_get_visible">
<DESCRIPTION>
 return the absolute visible rectangle.
</DESCRIPTION>
</METHOD>
<METHOD value="initialize">
<DESCRIPTION>
 not used.
</DESCRIPTION>
</METHOD>
<METHOD value="get_drawable_rect">
<DESCRIPTION>
 Determine whether or not we are printing and get either the
 visible or printable area.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="my_ppi">
<DESCRIPTION>
 Store the ppi so we don't have to re-render it all the time
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wx_drawing_window">
<DESCRIPTION>
 This is a class that is used for drawing on the screen, in that it
 can handle scrolling.  It needs a specailly derived instance of
 wxWindow for scrolling and handling scroll events.
</DESCRIPTION>
<METHOD value="set_scroll_point">
<DESCRIPTION>
 Move the scroll thing so tha the given position is where the
 top of the scroll point is.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_update_thumb_scroll_size">
<DESCRIPTION>
 The document calls this when the contents of the document have changed such that
 the scroll bars need to be re-sized.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_refresh">
<DESCRIPTION>
 Redraw the window in the given rectangle.
 virtual void raw_refresh(const rect  &amp; tmp_rect);
</DESCRIPTION>
</METHOD>
<METHOD value="initialize">
<DESCRIPTION>
 not used.
</DESCRIPTION>
</METHOD>
<METHOD value="get_dc">
<DESCRIPTION>
 Get the DC that we need to draw on.  This allows us to handle the DC where we
 are printing and the one where we're not.  This needs to be public as fonts and
 pens need to use the DC as well.
</DESCRIPTION>
</METHOD>
</CLASS>
<CLASS value="wx_printing_window">
<DESCRIPTION>
 Like the scrolling window, but does not accept
 callbacks since it doesn't get redrawn.
</DESCRIPTION>
<METHOD value="get_dc">
<DESCRIPTION>
 Get the DC that we need to draw on.  This allows us to handle the DC where we
 are printing and the one where we're not.  This needs to be public as fonts and
 pens need to use the DC as well.
</DESCRIPTION>
</METHOD>
<METHOD value="prepare_to_print">
<DESCRIPTION>
 This is set when we are prepared to print.
</DESCRIPTION>
</METHOD>
<METHOD value="start_printing">
<DESCRIPTION>
 set the print object to be the_printout and defer rendering for
 awhile until the pages have all been prepared.
</DESCRIPTION>
</METHOD>
<METHOD value="end_printing">
<DESCRIPTION>
 Set the printout object to NULL and do all future rendering on the
 screen DC.
</DESCRIPTION>
</METHOD>
<METHOD value="print_page">
<DESCRIPTION>
 Get the rectangle that describes the supplied page, and redraw that page.
</DESCRIPTION>
</METHOD>
<METHOD value="raw_get_visible">
<DESCRIPTION>
 return the absolute visible rectangle.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="wxPrintout*">
<DESCRIPTION>
 The printout object that we will be printing on if we will
 be printing on something.
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="my_printing_rect">
<DESCRIPTION>
 If my_printing rect has some area to it, accept drawing
 commands over that area.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wx_printout">
<DESCRIPTION>
 Derive from the wxPrintout and do the stuff we need
 to.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="doc.cpp" dir="CVS">
</FILE>
<FILE value="doc.h" dir="CVS">
</FILE>
<FILE value="docview.cpp" dir="CVS">
</FILE>
<FILE value="docview.h" dir="CVS">
</FILE>
<FILE value="main.cpp" dir="CVS">
<DESCRIPTION>
 Defines the entry point for the application.
</DESCRIPTION>
<CLASS value="MyApp">
<DESCRIPTION>
 Every application needs to create a derivation
 of hte wxApp class as an entry point.
 Define a new application
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the main appplication window frame, and initialize
 all of the pre-ordained dialog box objects.
</DESCRIPTION>
</METHOD>
<METHOD value="OnInit">
<DESCRIPTION>
 This is called when the main window is created.  We
 make the window visible here.
</DESCRIPTION>
</METHOD>
<METHOD value="OnExit">
<DESCRIPTION>
 Do some garbage collection and other cleanup, if you are debugging for
 memory leaks this may be useful.
</DESCRIPTION>
</METHOD>
<METHOD value="MainLoop">
<DESCRIPTION>
 Boilerplate stuff for the windows message pump.
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="frame">
<DESCRIPTION>
 the frame is the main application window.
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
</FILE>
<FILE value="resource.h" dir="CVS">
</FILE>
<FILE value="resources.cpp" dir="CVS">
</FILE>
<FILE value="resources.h" dir="CVS">
</FILE>
<FILE value="StdAfx.cpp" dir="CVS">
</FILE>
<FILE value="StdAfx.h" dir="CVS">
</FILE>
<FILE value="system_dirs.cpp" dir="CVS">
</FILE>
<FILE value="system_dirs.h" dir="CVS">
</FILE>
<FILE value="view.cpp" dir="CVS">
</FILE>
<FILE value="view.h" dir="CVS">
</FILE>
<FILE value="wx24_resources.cpp" dir="CVS">
</FILE>
<FILE value="wx24_resources.h" dir="CVS">
<DESCRIPTION>
 Define most of the dialog boxes and similar gadgets that are defined in this
 program.
</DESCRIPTION>
<CLASS value="wxTextQuerySizer">
<DESCRIPTION>
 A text widget in a dialog box.  Acts just like a wxTextCtrl combined with a sizer.
</DESCRIPTION>
<METHOD value="ctor">
<DESCRIPTION>
 Create the widget and bind it to the parent window
</DESCRIPTION>
</METHOD>
<METHOD value="~ctor">
<DESCRIPTION>
 release the resources
</DESCRIPTION>
</METHOD>
<METHOD value="wxSizer*()">
<DESCRIPTION>
 Act just like a sizer to the client
</DESCRIPTION>
</METHOD>
<METHOD value="SetValue">
<DESCRIPTION>
 Set the value of the widget
</DESCRIPTION>
</METHOD>
<ATTRIBUTE value="wxStaticText*">
<DESCRIPTION>
 The label for the control
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wxTextCtrl*">
<DESCRIPTION>
 the control itself
</DESCRIPTION>
</ATTRIBUTE>
<ATTRIBUTE value="wxBoxSizer*">
<DESCRIPTION>
 the parent sizer
</DESCRIPTION>
</ATTRIBUTE>
</CLASS>
<CLASS value="wxBooleanQuerySizer">
<DESCRIPTION>
 Act just like a sizer, allow the user to make boolean choices.  Implemented
 as a checkbox probably
</DESCRIPTION>
</CLASS>
<CLASS value="wxIntSpinSizer">
<DESCRIPTION>
 Allows the user to choose a number with arrows up/down that increment
 /decrement the values.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_percentage_dialog">
<DESCRIPTION>
 Just displays progress for a long operation
</DESCRIPTION>
</CLASS>
<CLASS value="wx_window_media_pp:public">
<DESCRIPTION>
 The dialog box that contains all of the display
 choices like page size, etc.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_window_media_pp:public">
<DESCRIPTION>
 The dialog box that contains all of the display
 choices like page size, etc.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_abc_options_dialog">
<DESCRIPTION>
 A dialog box that allows the user t ochoose some
 options that affect the parser.
</DESCRIPTION>
</CLASS>
<CLASS value="wx_midi_options_dialog">
<DESCRIPTION>
 Allows the user to choose midi player, etc.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="StdAfx.cpp" dir="CVS">
</FILE>
<FILE value="StdAfx.h" dir="CVS">
</FILE>
<FILE value="ut_concur.cpp" dir="CVS">
</FILE>
<FILE value="containut.cpp" dir="ut_contain">
</FILE>
<FILE value="StdAfx.cpp" dir="CVS">
</FILE>
<FILE value="StdAfx.h" dir="CVS">
</FILE>
<FILE value="doc.cpp" dir="CVS">
<CLASS value="wx_view_frame">
<DESCRIPTION>
 Each major window in wxWindows consists of a frame and a canvas.
 Define the frame.  The canvas is described in wx_winres.cpp.
</DESCRIPTION>
</CLASS>
</FILE>
<FILE value="doc.h" dir="CVS">
</FILE>
<FILE value="StdAfx.cpp" dir="Release">
</FILE>
<FILE value="StdAfx.h" dir="Release">
</FILE>
<FILE value="ut_parse.cpp" dir="Release">
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that gets the current tune choice from the user.
</DESCRIPTION>
</METHOD>
<METHOD value="get_choice">
<DESCRIPTION>
 Abstract method that clears the list for new parsing.
</DESCRIPTION>
</METHOD>
</FILE>
<FILE value="StdAfx.cpp" dir="Release">
</FILE>
<FILE value="StdAfx.h" dir="Release">
</FILE>
<FILE value="ut_string.cpp" dir="Release">
</FILE>
</PROJECT>
>>>>>>> 1.3
