change-map/cm-get-data [ Methods ]

[ Top ] [ change-map ] [ Methods ]

FUNCTION

 cm-get-data:

ARGUMENTS

RETURN VALUE

EXAMPLE

DATE

SYNOPSIS

(defmethod cm-get-data ((cm change-map) section 
                        &optional (sequence 1) (bar 1))

change-map/find-nearest [ Methods ]

[ Top ] [ change-map ] [ Methods ]

FUNCTION

 find-nearest:

ARGUMENTS

RETURN VALUE

EXAMPLE

DATE

SYNOPSIS

(defmethod find-nearest (section (cm change-map))

sc-map/change-map [ Classes ]

[ Top ] [ sc-map ] [ Classes ]

NAME

 change-map

 File:             change-map.lsp

 Class Hierarchy:  named-object -> linked-named-object -> sclist -> 
                   circular-sclist -> assoc-list -> recursive-assoc-list ->
                   sc-map -> change-map

 Version:          1.0.0-beta1

 Project:          slippery chicken (algorithmic composition)

 Purpose:          Implementation of the change-map class where, unlike
                   normal sc-maps (data is given for each sequence) gives
                   data sporadically when the parameter changes, for
                   instance tempo.

                   It is assumed that maps will be typed in in the order in
                   which sections occur so that previous-data slots can be
                   kept up-to-date; also, unless all data will be given,
                   that the sections (but not instrument ids)
                   will be in integer sequential order so that nearest
                   sections can be returned when given a non-existent
                   section reference.
                    
                   For example, the following change-map indicates tempo 
                   (though tempo-maps have their own class now).
                   It has sections within sections so that the tempo for
                   section '(1 2 3) can be defined, that is, section 1 has
                   subsections 1, 2, and 3 and subsection 2 has further
                   subsections 1, 2, and 3.  This can be nested to any
                   depth.  The tempo information itself is given in sublists
                   where (3 27) means that in the third sequence of the
                   section, the tempo is 27.  (3 2 27) means the 2nd bar of
                   the third sequence has tempo 27: when only two numbers
                   are in the list, bar 1 is assumed.  The trick is, that
                   this tempo then remains, as would be expected, until the
                   next tempo change is indicated, which means that
                   requesting the tempo of section (2 2 3) with any sequence
                   and bar in the map below would return 25, because that is
                   the last tempo given in section 1 and no tempo is defined
                   for section 2.

                   (setf x 
                     (make-change-map
                      'test nil
                      '((0 ((3 27) (9 3 45)))
                        (1 
                         ((1 ((1 21) (5 28) (8 35) (3 2 40) (3 1 54)))
                          (2 
                           ((1 ((1 23) (6 28) (18 35)))
                            (2 ((2 2 24) (7 28) (18 22)))
                            (3 ((3 34) (7 28) (18 42)))))
                          (3 ((1 22) (5 34) (10 5 25)))))
                        (4
                         ((1 ((1 21) (5 28) (8 36) (3 2 40) (3 1 55)))
                          (2 ((1 22) (5 34) (10 5 103)))))
                        (5 ((2 28) (6 3 45)))
                        (10
                         ((1 ((1 21) (5 28) (8 37) (3 2 40) (3 1 56)))
                          (2 ((1 22) (5 34) (10 5 27))))))))

                   You have to be careful with change-maps however as the
                   nesting is flexible and therefore ambigous.  For
                   instance, in the following the bcl, tape1 etc. ids are
                   not subsections of section 1, rather these are the hint
                   pitches assigned to the instruments in section 1 (which
                   has no subsections).  This is where the last-ref-required
                   class slot comes in:  If this slot is t (this is the
                   second argument to make-change-map) then the last
                   reference in a call to cm-get-data is always respected,
                   i.e. not the last data given will be returned when the
                   section doesn't exist, rather the last data for this
                   reference.  E.g. In the following map, if
                   last-ref-required  were nil, then the call to
                   (cm-get-data x '(2 tape2) 1) would fail (because we can't
                   find nearest data when references aren't numbers), but
                   because it's t, we get the last data given for tape2 and
                   return cs5. 

                   (setf x                                         
                     (make-change-map                              
                         'hint-pitches t                           
                         '((1 ((bcl ((1 a4) (2 b4) (3 c5) (4 d6))) 
                               (tape1 ((1 a3) (2 ds2) (3 e4)))     
                               (tape2 ((1 a3) (2 ds2) (3 cs5)))    
                               (tape3 ((1 a3) (2 ds2) (3 eqf4))))) 
                           (2 ((bcl ((1 a4) (2 b4) (3 c5) (4 d6))) 
                               (tape1 ((1 a3) (2 ds2) (5 fs4)))))  
                           (3 ((bcl ((1 a4) (2 b4) (3 c5) (4 d6))) 
                               (tape1 ((1 a3) (2 ds2) (5 f4))))))))

 Author:           Michael Edwards: m@michael-edwards.org

 Creation date:    2nd April 2001

 $$ Last modified: 21:14:11 Thu Dec  8 2011 ICT

 SVN ID: $Id: change-map.lsp 1764 2012-05-17 11:49:59Z medward2 $