added simple arpeggio support; improved staccato/frame tracking.
[mumble.git] / music-utilities.lisp
blobd61b3a63883609e82225aa82833697c24f3f8941
2 (in-package :mumble)
4 ;; 60 seconds in a minute, 4 beats per whole note.
5 (defconstant +seconds-per-minute+ 60)
6 (defconstant +beats-per-whole-note+ 4)
8 (defun duration-to-frames (duration tempo &optional (frequency 50))
9 "Returns a /fractional/ duration -- the conversion routine is
10 responsible for dealing with these fractions as it sees fit."
11 (let ((count (/ (/ (* frequency +seconds-per-minute+)
12 (/ tempo +beats-per-whole-note+))
13 (duration-denominator duration))))
14 ;; dots
15 (do ((dots (duration-dots duration) (1- dots))
16 (extra (/ count 2) (/ extra 2)))
17 ((not (plusp dots)))
18 (incf count extra))
19 ;; XXX staccato, ties
20 count))