view implementations/midi/classes.lisp @ 204:10d47e78a53d

Added support for most significant midi messages (some remain missing, but these do not occur in a 1000-file test sample)
author David Lewis <d.lewis@gold.ac.uk>
date Fri, 17 Sep 2010 10:28:27 +0100
parents 4e0a5c7026ca
children
line wrap: on
line source
(cl:in-package #:amuse-midi) 

(defclass midi-object (amuse-object) ()
  (:documentation "MIDI base class"))

;; rhythms not as notated
(defclass unquantized-composition () ())
;; onsets as notated, but durations free
(defclass partially-quantized-composition (unquantized-composition) ())

(defclass midi-composition (standard-composition midi-object)
  ((time-signatures :initarg :time-signatures
		    :initform 'nil
		    :accessor %midi-time-signatures)
   (tempi :initarg :tempi
	  :initform 'nil
	  :accessor %midi-tempi)
   (key-signatures  :initarg :key-signatures
		    :initform 'nil
		    :accessor %midi-key-signatures)
   (pitch-bends :initarg :pitch-bends
		    :initform 'nil
		    :accessor %midi-pitch-bends)
   (lyrics  :initarg :lyrics
		    :initform 'nil
		    :accessor %midi-lyrics)
   (texts  :initarg :texts
		    :initform 'nil
		    :accessor %midi-texts)
   (misc-controllers :initarg :controllers
		      :initform 'nil
		      :accessor %midi-misc-controllers))
  (:documentation "Class for midi compositions, with time
  signatures, tempi, key signatures and other controllers as
  lists in slots"))

(defclass midi-monody (amuse:standard-monody midi-composition)
  ())

(defclass midi-message (midi-object) 
  ((track :accessor %midi-message-track :initarg :track :type integer)))

(defclass channel-message (midi-message)
  ((channel :accessor %midi-message-channel :initarg :channel :type (integer 0 15))))
   

(defclass midi-pitched-event (standard-chromatic-pitched-event channel-message)
  ((velocity :initarg :velocity
	     :accessor %midi-pitched-event-velocity
         :type (integer 0 127))
   (patch :initarg :patch
	  :accessor %midi-pitched-event-patch))
  (:documentation "Adds MIDI information to chromatic-pitched-event"))

(defclass midi-percussive-event (standard-percussive-event channel-message)
  ((velocity :initarg :velocity
	     :accessor %midi-percussive-event-velocity
         :type (integer 0 127))
   (patch :initarg :patch
	  :accessor %midi-percussive-event-patch)
   (sound :initarg :sound
	  :accessor %midi-percussive-event-sound))
  (:documentation "Adds MIDI information to percussive-event"))

(defclass pitch-bend-message (channel-message)
  ((value :initarg :value :accessor %midi-pitch-bend-value
          :type (integer 0 16383))))
(defclass pitch-bend-period (pitch-bend-message standard-anchored-period) ())

;; FIXME: these moments should be anchored-periods
(defclass channel-aftertouch-message (channel-message)
  ((pressure :initarg :pressure :accessor %channel-pressure
             :type (integer 0 127))))
(defclass channel-aftertouch-moment (channel-aftertouch-message standard-moment) ())
#+nil #+nil
;; not used -- we put program information into the events
(defclass program-change-message (channel-message)
  ((program :initarg :program :accessor %program-change-program
            :type (integer 0 127))))
(defclass program-change-moment (program-change-message standard-moment) ())
(defclass aftertouch-message (channel-message) ;;`polyphonic key pressure'
  ((pressure :initarg :pressure :accessor %aftertouch-pressure
             :type (integer 0 127))
   (key :initarg :key :accessor key
        :type (integer 0 127))))
(defclass aftertouch-moment (aftertouch-message standard-moment) ())


(defclass text-message (midi-message)
  ((text :initarg :text :accessor %midi-text
         :type string)))
(defclass text-moment (text-message standard-moment) ())
(defclass lyric-moment (text-moment) ())
(defclass copyright-moment (text-moment) ())
(defclass sequence-or-track-moment (text-moment) 
  ((channel :accessor %midi-message-channel :initarg :channel :type (integer 0 15))))
(defclass instrument-name-moment (text-moment) ())
(defclass marker-moment (text-moment) ())
(defclass cue-moment (text-moment) ())
(defclass program-name-moment (text-moment) ())
(defclass device-name-moment (text-moment) ())

(defclass parameter-message-set (channel-message)
  ((lsb :initarg :lsb :accessor %value-lsb :initform nil
        :type (integer 0 127))
   (msb :initarg :msb :accessor %value-msb :initform nil
        :type (integer 0 127))))
(defclass registered-parameter-message-set (parameter-message-set) ())
(defclass non-registered-parameter-message-set (parameter-message-set)
  ((parameter-lsb :initarg :nrpn-lsb :accessor %nrpn-lsb
                  :type (integer 0 127))
   (parameter-msb :initarg :nrpn-msb :accessor %nrpn-msb
                  :type (integer 0 127))))
(defclass pitch-bend-sensitivity (registered-parameter-message-set) ())
;; This may be moment or period, for now, moment
(defclass pitch-bend-sensitivity-moment (pitch-bend-sensitivity standard-moment) ())
(defclass channel-fine-tuning-moment (registered-parameter-message-set standard-moment) ())
(defclass channel-course-tuning-moment (registered-parameter-message-set standard-moment) ())
(defclass tuning-program-moment (registered-parameter-message-set standard-moment) ())
(defclass tuning-bank-moment (registered-parameter-message-set standard-moment) ())
(defclass modulation-depth-moment (registered-parameter-message-set standard-moment) ())
(defclass unknown-registered-parameter-moment (registered-parameter-message-set standard-moment)
  ((register-lsb :initarg :reg-lsb :accessor %rpn-reg-lsb
                 :type (integer 0 127))
   (register-msb :initarg :reg-msb :accessor %rpn-reg-msb
                 :type (integer 0 127))))
(defclass non-registered-parameter-moment (non-registered-parameter-message-set standard-moment) ())

(defclass system-exclusive-message (midi-message)
  ((status :initarg :status :initform 240 :accessor %system-exclusive-status
           :type (member 240 247))
   (value :initarg :value :accessor %system-exclusive-value
          :type (array (integer 0 255) *))))
(defclass system-exclusive-moment (system-exclusive-message standard-moment) ())

(defclass control-change-message (channel-message)
  ;; c.f. HA's midi_param table
  ((control-number :initarg :control :accessor %midi-control-number
                   :type (integer 0 127))
   (value :initarg :value :accessor %midi-control-value
          :type (integer 0 127))))
(defclass control-change-moment (control-change-message standard-moment) ())

;;;;;;;;;;;;;;;;
;; Necessary? don't really know, but still

(defparameter *controllers* 
  #(;;0-7
  "Bank Select (MSB)" "Modulation Wheel (MSB)"
  "Breath Controller (MSB)" :undefined 
  "Foot Controller (MSB)" "Portamento Time (MSB)" 
  "Data Entry (MSB)" "Channel Volume (MSB)" 
  ;; 8-15
  "Balance (MSB) " :undefined
  "Pan (MSB)" "Expression (MSB)"
  "Effect Control 1 (MSB)" "Effect Control 2 (MSB)"
  :undefined :undefined
  ;; 16-23
  "General Purpose Controller 1 (MSB)"
  "General Purpose Controller 2 (MSB)"
  "General Purpose Controller 3 (MSB)"
  "General Purpose Controller 4 (MSB) "
  :undefined :undefined :undefined :undefined
  ;; 24-31
  :undefined :undefined :undefined :undefined
  :undefined :undefined :undefined :undefined
  ;; 32-39
  "Bank Select (LSB)" "Modulation Wheel (LSB)"
  "Breath Controller (LSB)" :undefined
  "Foot Controller (LSB)" "Portamento Time (LSB)"
  "Data Entry (LSB) Channel" "Channel Volume (LSB)"
  ;; 40-47
  "Balance (LSB)" :undefined
  "Pan (LSB)" "Expression (LSB)"
  "Effect Control 1 (LSB)" "Effect Control 2 (LSB) "
  :undefined undefined
  ;; 48-55
  "General Purpose Controller 1 (LSB)"
  "General Purpose Controller 2 (LSB)"
  "General Purpose Controller 3 (LSB)"
  "General Purpose Controller 4 (LSB)"
  :undefined :undefined :undefined :undefined
  ;; 56-63
  :undefined :undefined :undefined :undefined
  :undefined :undefined :undefined :undefined
  ;; 64-71
  "Sustain Pedal" "Portamento On/Off"
  "Sostenuto" "Soft Pedal"
  "Legato Footswitch" "Hold 2"
  "Sound Controller 1" "Sound Controller 2"
  ;; 72-79
  "Sound Controller 3"  "Sound Controller 4"
  "Sound Controller 5" "Sound Controller 6"
  "Sound Controller 7" "Sound Controller 8"
  "Sound Controller 9" "Sound Controller 10 (GM2 default: Undefined)"
  ;; 80-87
  "General Purpose Controller 5"
  "General Purpose Controller 6"
  "General Purpose Controller 7"
  "General Purpose Controller 8"
  "Portamento Control "
  :undefined :undefined :undefined
  ;; 88-95
  :undefined :undefined :undefined
  "Effects 1 Depth (default: Reverb Send)"
  "Effects 2 Depth (default: Tremolo Depth)"
  "Effects 3 Depth (default: Chorus Send)"
  "Effects 4 Depth (default: Celeste [Detune] Depth)"
  "Effects 5 Depth (default: Phaser Depth)"
  ;; 96-103
  "Data Increment"
  "Data Decrement"
  "Non-Registered Parameter Number (LSB)"
  "Non-Registered Parameter Number (MSB)"
  "Registered Parameter Number (LSB)"
  "Registered Parameter Number (MSB)"
  :undefined :undefined
  ;; 104-111
  :undefined :undefined :undefined :undefined
  :undefined :undefined :undefined :undefined
  ;; 112-119
  :undefined :undefined :undefined :undefined
  :undefined :undefined :undefined :undefined
  ;; 120-127
  "All Sound Off"
  "Reset All Controllers"
  "Local Control On/Off"
  "All Notes Off"
  "Omni Mode Off"
  "Omni Mode On"
  "Poly Mode Off"
  "Poly Mode On "))