anchor.diff:     (octave-ratio :initarg :octave-ratio :accessor tuning-octave-ratio :documentation "The octave ratio of the tuning (i.e. what to multiply a pitch by to increase its octave by 1)."))
     (:documentation "Tuning definition."))
   
  -(defmethod print-object ((this tuning) stream)
  -  (format stream "(~s ~s)" 'tuning (tuning-name this)))
  +(defmethod print-object ((tuning tuning) stream)
  +  (format stream "(~s ~s)" 'tuning (tuning-name tuning)))
   
   (defvar *tunings* (make-hash-table)
     "Hash table mapping names and aliases to tuning definition objects.")
  
positive.code: (defgeneric chord (object)
    (:documentation "Get a chord by name."))
  
  (defmethod chord ((object list))
    ;; FIX: allow for stuff like '(:c :major) etc
    )
  
  (defmethod chord ((object symbol))
    (let ((chord (gethash object *chords*)))
      (when chord
        (if (symbolp chord)
            (chord chord)
            chord))))
  
  (defmethod chord ((object string))
    (chord (friendly-symbol object)))
  
  (defmethod chord ((object chord))
    object)
  
  (defmethod chord-name ((this symbol))
    (when this
      (chord-name (chord this))))
  
  (defmethod chord-scale ((this symbol))
    (when this
      (chord-scale (chord this))))
  
  (defmethod chord-indexes ((this symbol))
    (when this
      (chord-indexes (chord this))))
  
  (defmethod describe-object ((chord chord) stream)
    (with-slots (name scale) chord
  
negative.code: (defun note-name-and-octave (note)
    "Given a note name, return a list consisting of its note number and its octave (defaulting to 5 if it's not specified).
  
  See also: `note-midinote', `note-name'"
    (let* ((str (string note))
           (note (remove-if-not (lambda (i)
                                  (or (alpha-char-p i)
  