bar-holder/section [ Classes ]

[ Top ] [ bar-holder ] [ Classes ]

NAME

 section

 File:             section.lsp

 Class Hierarchy:  named-object -> linked-named-object -> bar-holder 
                   -> section

 Version:          1.1.0

 Project:          slippery chicken (algorithmic composition)

 Purpose:          Implementation of section class which is simply a bar
                   holder and recursive-assoc-list that contains (possibly
                   subsections which contain) player-sections. 

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

 Creation date:    23rd March 2002

 $$ Last modified:  15:20:01 Fri Jan 10 2020 CET

 SVN ID: $Id$

section/get-all-players [ Methods ]

[ Top ] [ section ] [ Methods ]

DESCRIPTION

 Return a list of the IDs from all players in a section object. NB: When
 retrieving from a section within a slippery-chicken object, all players in
 the ensemble will be returned, as the slippery-chicken object will generate
 rest bars for players even when they're not active in a given section.

ARGUMENTS

 - A section object.

RETURN VALUE

 - A list of player IDs (symbols).

EXAMPLE

(let ((mini
       (make-slippery-chicken
        '+mini+
        :ensemble '(((cl (b-flat-clarinet :midi-channel 1))
                     (hn (french-horn :midi-channel 2))
                     (vc (cello :midi-channel 3))))
        :set-palette '((1 ((f3 g3 a3 b3 c4 d4 e4 f4 g4 a4 b4 c5))))
        :set-map '((1 (1 1 1 1 1))
                   (2 (1 1 1 1 1))
                   (3 (1 1 1 1 1)))
        :rthm-seq-palette '((1 ((((4 4) h q e s s))
                                :pitch-seq-palette ((1 2 3 4 5)))))
        :rthm-seq-map '((1 ((cl (1 1 1 1 1))
                            (hn (1 1 1 1 1))
                            (vc (1 1 1 1 1))))
                        (2 ((cl (1 1 1 1 1))
                            (vc (1 1 1 1 1))))
                        (3 ((hn (1 1 1 1 1))
                            (vc (1 1 1 1 1))))))))
  (print (get-all-players (get-section mini 1)))
  (print (get-all-players (get-section mini 2)))
  (print (get-all-players (get-section mini 3))))

=>
(CL HN VC) 
(CL HN VC) 
(CL HN VC) 

SYNOPSIS

(defmethod get-all-players ((s section))

section/get-bar [ Methods ]

[ Top ] [ section ] [ Methods ]

DESCRIPTION

 Return the rthm-seq-bar object at the specified bar number within the given
 section.  

 NB: The bar number is counted from the beginning of the entire piece, not
     the beginning of the section.

ARGUMENTS

 - A section object.
 - An integer that is the bar number for which to return the rthm-seq-bar
   object. This number is 1-based and counts from the beginning of the
   piece, not the beginning of the section.

OPTIONAL ARGUMENTS

 NB: The <player> argument is actually required, but is listed as optional
     for reasons of class inheritance.

 - The ID of the player for whose part the rthm-seq-bar object is to be
   returned. 

RETURN VALUE

 A rthm-seq-bar object.

EXAMPLE

(let ((mini
       (make-slippery-chicken
        '+mini+
        :ensemble '(((cl (b-flat-clarinet :midi-channel 1))
                     (hn (french-horn :midi-channel 2))
                     (vc (cello :midi-channel 3))))
        :set-palette '((1 ((f3 g3 a3 b3 c4 d4 e4 f4 g4 a4 b4 c5)))
                       (2 ((f3 g3 a3 b3 c4 d4 e4 f4 g4 a4 b4 c5)))
                       (3 ((f3 g3 a3 b3 c4 d4 e4 f4 g4 a4 b4 c5))))
        :set-map '((1 (1 1 1 1 1))
                   (2 (2 2 2 2 2))
                   (3 (3 3 3 3 3)))
        :rthm-seq-palette '((1 ((((4 4) h q e s s))
                                :pitch-seq-palette ((1 2 3 4 5))))
                            (2 ((((4 4) q e s s h))
                                :pitch-seq-palette ((1 2 3 4 5))))
                            (3 ((((4 4) e s s h q))
                                :pitch-seq-palette ((1 2 3 4 5)))))
        :rthm-seq-map '((1 ((cl (1 1 1 1 1))
                            (hn (1 1 1 1 1))
                            (vc (1 1 1 1 1))))
                        (2 ((cl (2 2 2 2 2))
                            (hn (2 2 2 2 2))
                            (vc (2 2 2 2 2))))
                        (3 ((cl (3 3 3 3 3))
                            (hn (3 3 3 3 3))
                            (vc (3 3 3 3 3))))))))
  (get-bar (get-section mini 3) 11 'hn))

=>
RTHM-SEQ-BAR: time-sig: 2 (4 4), time-sig-given: T, bar-num: 11, 
              old-bar-nums: NIL, write-bar-num: NIL, start-time: 40.000, 
              start-time-qtrs: 40.0, is-rest-bar: NIL, multi-bar-rest: NIL, 
              show-rest: T, notes-needed: 5, 
              tuplets: NIL, nudge-factor: 0.35, beams: NIL, 
              current-time-sig: 2, write-time-sig: NIL, num-rests: 0, 
              num-rhythms: 5, num-score-notes: 5, parent-start-end: NIL, 
              missing-duration: NIL, bar-line-type: 0, 
              player-section-ref: (3 HN), nth-seq: 0, nth-bar: 0, 
              rehearsal-letter: NIL, all-time-sigs: (too long to print) 
              sounding-duration: 4.000, 
              rhythms: (
[...]
)
SCLIST: sclist-length: 6, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: NIL, this: NIL, next: NIL
NAMED-OBJECT: id: "3-bar1", tag: NIL, 
data: ((4 4) E S S H Q)

SYNOPSIS

(defmethod get-bar ((s section) bar-num &optional player)

section/get-sequenz [ Methods ]

[ Top ] [ section ] [ Methods ]

DESCRIPTION

 Get the specified sequenz object from a given section object.

ARGUMENTS

 - A section object.
 - The ID of the player from whose part the sequenz object is to be
   returned. 
 - An integer that is the number of the sequence object to be returned from
   within the given section object. This number is 1-based.

RETURN VALUE

 A sequenz object.

EXAMPLE

(let ((mini
       (make-slippery-chicken
        '+mini+
        :ensemble '(((cl (b-flat-clarinet :midi-channel 1))
                     (vc (cello :midi-channel 2))))
        :set-palette '((1 ((f3 g3 a3 b3 c4))))
        :set-map '((1 (1 1 1 1 1))
                   (2 (1 1 1 1 1))
                   (3 (1 1 1 1 1)))
        :rthm-seq-palette '((1 ((((4 4) h q e s s))
                                :pitch-seq-palette ((1 2 3 4 5))))
                            (2 ((((4 4) q e s s h))
                                :pitch-seq-palette ((1 2 3 4 5))))
                            (3 ((((4 4) e s s h q))
                                :pitch-seq-palette ((1 2 3 4 5)))))
        :rthm-seq-map '((1 ((cl (1 1 1 1 1))
                            (vc (1 1 1 1 1))))
                        (2 ((cl (2 2 2 2 2))
                            (vc (2 2 2 2 2))))
                        (3 ((cl (3 3 3 3 3))
                            (vc (3 3 3 3 3))))))))
  (get-sequenz (get-section mini 2) 'vc 2))

=>
SEQUENZ: pitch-curve: (1 2 3 4 5)
RTHM-SEQ: num-bars: 1
          num-rhythms: 5
          num-notes: 5
          num-score-notes: 5
          num-rests: 0
          duration: 4.0
          psp-inversions: NIL
          marks: NIL
          time-sigs-tag: NIL
          handled-first-note-tie: NIL
         (for brevity's sake, slots pitch-seq-palette and bars are not printed)
SCLIST: sclist-length: 3, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: (1), this: (2), next: (3)
BAR-HOLDER: 
            start-bar: 7
            end-bar: 7
            num-bars: 1
            start-time: 24.0
            end-time: 28.0
            start-time-qtrs: 24.0
            end-time-qtrs: 28.0
            num-notes (attacked notes, not tied): 5
            num-score-notes (tied notes counted separately): 5 
            num-rests: 0
            duration-qtrs: 4.0 
            duration: 4.0 (4.000)

SYNOPSIS

(defmethod get-sequenz ((s section) player seq-num) ; 1-based

section/has-subsections [ Methods ]

[ Top ] [ section ] [ Methods ]

DESCRIPTION

 Boolean test to determine whether a specified section of a slippery-chicken
 object has subsections.  

ARGUMENTS

 - A section object.

RETURN VALUE

 T if the specified section has subsections, otherwise NIL.

EXAMPLE

(let ((mini
       (make-slippery-chicken
        '+mini+
        :ensemble '(((vn (violin :midi-channel 1))))
        :set-palette '((1 ((c4 d4 e4 f4 g4 a4 b4 c5))))
        :set-map '((1
                    ((a (1 1 1))
                     (b (1 1 1))))
                   (2 (1 1 1 1))
                   (3
                    ((a (1 1 1))
                     (b
                      ((x (1 1 1))
                       (y (1 1 1))))))
                   (4
                    ((a (1 1 1))
                     (b (1 1 1))
                     (c (1 1 1 1)))))
        :rthm-seq-palette '((1 ((((2 4) (q) e (s) s))
                                :pitch-seq-palette ((1 2)))))
        :rthm-seq-map '((1
                         ((a ((vn (1 1 1))))
                          (b ((vn (1 1 1))))))
                        (2 ((vn (1 1 1 1))))
                        (3
                         ((a ((vn (1 1 1))))
                          (b
                           ((x ((vn (1 1 1))))
                            (y ((vn (1 1 1))))))))
                        (4
                         ((a ((vn (1 1 1))))
                          (b ((vn (1 1 1))))
                          (c ((vn (1 1 1 1))))))))))
  (print (has-subsections (get-section mini 1)))
  (print (has-subsections (get-section mini 2))))

=>
T 
NIL

SYNOPSIS

(defmethod has-subsections ((s section))

section/num-sequenzes [ Methods ]

[ Top ] [ section ] [ Methods ]

DESCRIPTION

 Get the number of sequenz objects in a given section object.

ARGUMENTS

 - A section object.

RETURN VALUE

 An integer that is the number of sequenz objects in the specified section
 object. 

EXAMPLE

(let ((mini
       (make-slippery-chicken
        '+mini+
        :ensemble '(((vc (cello :midi-channel 1))))
        :set-palette '((1 ((f3 g3 a3 b3 c4))))
        :set-map '((1 (1 1 1 1 1))
                   (2 (1 1 1 1 1))
                   (3 (1 1 1 1 1)))
        :rthm-seq-palette '((1 ((((4 4) h q e s s))
                                :pitch-seq-palette ((1 2 3 4 5)))))
        :rthm-seq-map '((1 ((vc (1 1 1 1 1))))
                        (2 ((vc (1 1 1 1 1))))
                        (3 ((vc (1 1 1 1 1))))))))
  (num-sequenzes (get-section mini 2)))

=> 5

SYNOPSIS

(defmethod num-sequenzes ((s section))

section/re-bar [ Methods ]

[ Top ] [ section ] [ Methods ]

DESCRIPTION

 Regroup the consecutive note and rest events of a given section object into
 new bars of the specified time signature. 

 This method will only combine short bars into longer ones; it will not
 split up longer bars and recombine them. 

 The method will also use the specified (or default) time signature as a
 target, and may be forced to create a number of bars that are not of the
 specified time signature if the number of beats in the given section object
 do not correspond.

 NB: The user must call the update-slots method after using this method as a
     post-generation editing method.

ARGUMENTS

 - A section object.

OPTIONAL ARGUMENTS

 keyword arguments:
 - :start-bar. An integer that is the first bar within the specified section
   that is to be re-barred. Default = First bar of the given section.
 - :end-bar. An integer that is the last bar within the specified section
   that is to be re-barred. Default = Last bar of the given section.
 - :min-time-sig. The target time signature for all new bars. NB: Depending
   on the number of beats in the given section, the method may have to
   deviate from this target time signature. Default = '(2 4).
 - :verbose. T or NIL to indicate whether to print feedback on the
   re-barring process to the Lisp listener. Default = NIL.
 - :auto-beam.  T, NIL, or an integer. If T, the method will automatically
   attach beam indications to the corresponding events according to the beat
   unit of the time signature. If an integer, the method will beam in
   accordance with a beat unit that is equal to that integer. If NIL, the
   method will not automatically place beams. Default = T.

RETURN VALUE

 T.

EXAMPLE

SYNOPSIS

(defmethod re-bar ((s section)
                   &key start-bar 
                   end-bar
                   (min-time-sig '(2 4))
                   verbose
                   ;; could also be a beat rhythmic unit
                   (auto-beam t))