./../../src/pitch-seq-palette.lsp

## palette/pitch-seq-palette [ Classes ]

[ Top ] [ palette ] [ Classes ]

NAME

     pitch-seq-palette

     File:             pitch-seq-palette.lsp

     Class Hierarchy:  named-object -> linked-named-object -> sclist ->
                       circular-sclist -> assoc-list -> recursive-assoc-list ->
                       palette -> pitch-seq-palette

     Version:          1.0.0

     Project:          slippery chicken (algorithmic composition)

     Purpose:          Implementation of the pitch-seq-palette class.

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

     Creation date:    19th February 2001

     $$ Last modified: 17:22:31 Sat Jul 14 2012 BST

     SVN ID: $Id: pitch-seq-palette.lsp 3155 2012-12-06 16:19:43Z medward2 $

## pitch-seq-palette/add-inversions [ Methods ]

[ Top ] [ pitch-seq-palette ] [ Methods ]

DESCRIPTION

     Add inversions of the existing pitch-seq objects in a given
     pitch-seq-palette object to the end of that pitch-seq-palette object. (See
     pitch-seq::invert for more details on slippery-chicken inversions.)

ARGUMENTS

     - A pitch-seq-palette object.

RETURN VALUE

     Always returns T.

EXAMPLE

    ;; Create a pitch-seq-palette object and print the DATA of the pitch-seq
    ;; objects it contains; then apply the add-inversions method and print the same
    ;; DATA to see the changes
    (let ((mpsp (make-psp 'mpsp 5 '((2 5 3 1 4)
                                    (1 4 2 5 3)
                                    (5 1 3 2 4)
                                    (2 3 4 5 1)
                                    (3 2 4 1 5)))))
      (print (loop for ps in (data mpsp)
                collect (data ps)))
      (add-inversions mpsp)
      (print (loop for ps in (data mpsp)
                collect (data ps))))

    =>
    ((2 5 3 1 4) (1 4 2 5 3) (5 1 3 2 4) (2 3 4 5 1) (3 2 4 1 5))

    ((2 5 3 1 4) (1 4 2 5 3) (5 1 3 2 4) (2 3 4 5 1) (3 2 4 1 5) (4 1 3 5 2)
     (5 2 4 1 3) (1 5 3 4 2) (4 3 2 1 5) (3 4 2 5 1))

SYNOPSIS

    (defmethod add-inversions ((psp pitch-seq-palette))

## pitch-seq-palette/combine [ Methods ]

[ Top ] [ pitch-seq-palette ] [ Methods ]

DESCRIPTION

     Create a new pitch-seq-palette object by combining the pitch-seq lists from
     one pitch-seq-palette object with those of another.

     The method combines the contents of the two given rthm-seq-palette objects
     consecutively; i.e., the first pitch-seq object of the first
     pitch-seq-palette is combined with the first pitch-seq object of the other,
     then the second with the second, the third with the third etc.

     If one pitch-seq-palette object contains more pitch-seq objects than the
     other, the method cycles through the shorter one until all of the members
     of the longer one have been handled. The new pitch-seq-palette object will
     therefore contain the same number of pitch-seq objects as is in the longest
     of the two starting pitch-seq-palette objects.

     It is not necessary for the lengths of the pitch-seq objects in the two
     starting pitch-seq-palette objects to be the same.

ARGUMENTS

     - A first pitch-seq-palette object.
     - A second pitch-seq-palette object.

RETURN VALUE

     A pitch-seq-palette object.

EXAMPLE

    ;;; Combine two pitch-seq-palette objects of the same length, each of whose
    ;;; pitch-seqs are the same length
    (let ((mpsp1 (make-psp 'mpsp1 5 '((2 5 3 1 4) (1 4 2 5 3) (5 1 3 2 4))))
          (mpsp2 (make-psp 'mpsp2 5 '((2 3 4 5 1) (3 2 4 1 5) (3 2 1 5 4)))))
      (combine mpsp1 mpsp2))

    =>
    PITCH-SEQ-PALETTE: num-notes: 10, instruments: NIL
    PALETTE:
    RECURSIVE-ASSOC-LIST: recurse-simple-data: T
                          num-data: 3
                          linked: NIL
                          full-ref: NIL
    ASSOC-LIST: warn-not-found T
    CIRCULAR-SCLIST: current 0
    SCLIST: sclist-length: 3, bounds-alert: T, copy: T
    LINKED-NAMED-OBJECT: previous: NIL, this: NIL, next: NIL
    NAMED-OBJECT: id: "MPSP1-MPSP2", tag: NIL,
    data: (
    PITCH-SEQ: notes: NIL
    [...]
    data: (2 5 3 1 4 2 3 4 5 1)
    PITCH-SEQ: notes: NIL
    [...]
    data: (1 4 2 5 3 3 2 4 1 5)
    [...]
    PITCH-SEQ: notes: NIL
    [...]
    data: (5 1 3 2 4 3 2 1 5 4)
    )

    ;; When combining pitch-seq-palette objects of different lengths, the method
    ;; cyles through the shorter of the two
    (let ((mpsp1 (make-psp 'mpsp1 5 '((2 5 3 1 4) (1 4 2 5 3) (5 1 3 2 4))))
          (mpsp2 (make-psp 'mpsp2 5 '((2 3 4 5 1) (3 2 4 1 5)))))
      (loop for ps in (data (combine mpsp1 mpsp2))
           collect (data ps)))

    => ((2 5 3 1 4 2 3 4 5 1) (1 4 2 5 3 3 2 4 1 5) (5 1 3 2 4 2 3 4 5 1))

    ;; The two starting pitch-seq-palette objects are not required to have
    ;; pitch-seq objects of the same length
    (let ((mpsp1 (make-psp 'mpsp1 5 '((2 5 3 1 4) (1 4 2 5 3) (5 1 3 2 4))))
          (mpsp2 (make-psp 'mpsp2 3 '((2 3 4) (3 2 4)))))
      (loop for ps in (data (combine mpsp1 mpsp2))
           collect (data ps)))

    => ((2 5 3 1 4 2 3 4) (1 4 2 5 3 3 2 4) (5 1 3 2 4 2 3 4))

SYNOPSIS

    (defmethod combine ((psp1 pitch-seq-palette) (psp2 pitch-seq-palette))

## pitch-seq-palette/make-psp [ Functions ]

[ Top ] [ pitch-seq-palette ] [ Functions ]

DESCRIPTION

     Create a pitch-seq-palette object from an ID, a specified number of notes,
     and a list of lists of numbers representing the pitch curve of the intended
     pitch-seq objects.

ARGUMENTS

     - A symbol that is to be the ID of the pitch-seq-palette to be created.
     - An integer that is the number of notes there are to be in each pitch-seq
       object created.
     - A list of lists, each of which contained list is a list of numbers
       representing the pitch curve of the intended pitch-seq object.

RETURN VALUE

     A pitch-seq-palette object.

EXAMPLE

    ;; Returns a pitch-seq-palette object
    (make-psp 'mpsp 5 '((2 5 3 1 4)
                        (1 4 2 5 3)
                        (5 1 3 2 4)
                        (2 3 4 5 1)
                        (3 2 4 1 5)))

    =>
    PITCH-SEQ-PALETTE: num-notes: 5, instruments: NIL
    PALETTE:
    RECURSIVE-ASSOC-LIST: recurse-simple-data: T
                          num-data: 5
                          linked: NIL
                          full-ref: NIL
    ASSOC-LIST: warn-not-found T
    CIRCULAR-SCLIST: current 0
    SCLIST: sclist-length: 5, bounds-alert: T, copy: T
    LINKED-NAMED-OBJECT: previous: NIL, this: NIL, next: NIL
    NAMED-OBJECT: id: MPSP, tag: NIL,
    data: (
    PITCH-SEQ: notes: NIL
    [...]
    data: (2 5 3 1 4)
    PITCH-SEQ: notes: NIL
    [...]
    data: (1 4 2 5 3)
    PITCH-SEQ: notes: NIL
    [...]
    data: (5 1 3 2 4)
    PITCH-SEQ: notes: NIL
    [...]
    data: (2 3 4 5 1)
    PITCH-SEQ: notes: NIL
    [...]
    data: (3 2 4 1 5)
    )

    ;; Interrupts with an error if any of the <pitch-seqs> lists is not of the
    ;; length specified by <num-notes>
    (make-psp 'mpsp 5 '((1 2 1 1 3)
                        (1 3 2 1 5)
                        (1 3 5 6 7 8)))

    =>
    pitch-seq-palette::verify-and-store:
    In pitch-seq MPSP-ps-3 from palette MPSP:
    Each pitch sequence must have 5 notes (you have 6):
    [...]
     (1 3 5 6 7 8))
       [Condition of type SIMPLE-ERROR]

SYNOPSIS

    (defun make-psp (id num-notes pitch-seqs)

## rthm-seq-palette/create-psps-default [ Functions ]

[ Top ] [ rthm-seq-palette ] [ Functions ]

ARGUMENTS

     - An integer that is the number of notes for which a pitch-seq-palette
       object is needed.
     - the pitch-seq data (see documentation for create psps method).  Ideally
       this would only be passed the first time the function is called.

RETURN VALUE

     A list of numbers suitable for use in creating a pitch-seq object.

SYNOPSIS

      (defun create-psps-default (num-notes data-lists)