Mercurial > hg > amuse
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 "))