Mercurial > hg > amuse
diff implementations/tabcode/tabcode-import.lisp @ 43:2fd7ebed5b87
basic tabcode amuse implementation
darcs-hash:20070614145209-dc3a5-98b89c451db974b34878aae216e024e2ae38b734.gz
author | c.rhodes <c.rhodes@gold.ac.uk> |
---|---|
date | Thu, 14 Jun 2007 15:52:09 +0100 |
parents | |
children | ba65f66a713e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/implementations/tabcode/tabcode-import.lisp Thu Jun 14 15:52:09 2007 +0100 @@ -0,0 +1,89 @@ +(in-package :amuse-tabcode) + +(defun word-duration (word default) + (if (typep word 'tabcode::rhythmic-word) + (let ((flag (tabcode::flag word)) + (dots (tabcode::dots word))) + (if flag + (* (car (rassoc flag tabcode::*rhythms*)) + (if dots 3/2 1)) + default)) + 0)) + +(defun word-causes-stop-p (word course) + (or (typep word 'tabcode::rest) + (typep word 'tabcode::barline) + (and (typep word 'tabcode::chord) + (member course (tabcode::playing word) :key #'tabcode::course)))) + +(defun duration-for-course (course buffer start initial-duration) + (let ((duration initial-duration) + (default-duration initial-duration)) + (do ((i start (+ i 1))) + ((>= i (drei-buffer:size buffer)) duration) + (let* ((object (drei-buffer:buffer-object buffer i)) + (word (tabcode-syntax::tabword-word object))) + (when (word-causes-stop-p word course) + (return-from duration-for-course duration)) + (let ((word-duration (word-duration word default-duration))) + (incf duration word-duration) + (when (> word-duration 0) + (setf default-duration word-duration))))))) + +;;; FIXME: like GET-COURSE-TUNING/GET-TUNING only more hardcoded +(defun fret-to-number (char) + (let ((fret-num (- (char-code char) 97))) + (cond + ((> fret-num 20) (- fret-num 2)) + ((> fret-num 8) (- fret-num 1)) + (t fret-num)))) +(defun midi-pitch-for-playing (course fret) + (let ((tuning #(67 62 57 53 48 43))) + (+ (aref tuning (1- course)) + (fret-to-number fret)))) + +(defun make-tabcode-composition (tabword-buffer) + (let ((time 0) + (notes) + (result) + (current-duration 1)) + (dotimes (i (drei-buffer:size tabword-buffer) (setq notes (nreverse result))) + (let* ((object (drei-buffer:buffer-object tabword-buffer i)) + (tabword (tabcode-syntax::tabword-word object)) + (duration (word-duration tabword current-duration))) + (when (typep tabword 'tabcode::rhythmic-word) + (setf current-duration duration)) + (when (typep tabword 'tabcode::chord) + (dolist (playing (tabcode::playing tabword)) + (let* ((course (tabcode::course playing)) + (fret (tabcode::fret playing)) + (note-duration (duration-for-course course tabword-buffer (1+ i) current-duration))) + (push (make-instance 'tabcode-pitched-event + :course course + :fret fret + :word tabword ; object? + :number (midi-pitch-for-playing course fret) + :time time + :interval note-duration) + result)))) + (incf time duration))) + (let ((composition (make-instance 'tabcode-composition + :time 0 + :interval time))) + (sequence:adjust-sequence composition (length notes) + :initial-contents notes)))) + +#| +(in-package :clim-user) + +(defvar *composition*) + +(define-command (com-set-amuse-composition + :name t :command-table tabcode-syntax::tabcode-table) + () + (let* ((window (esa:current-window)) + (buffer (drei-buffer:buffer window)) + (syntax (climacs::syntax buffer)) + (tabwords (slot-value syntax 'tabcode-syntax::tabwords))) + (setq *composition* (amuse-tabcode::make-tabcode-composition tabwords)))) +|# \ No newline at end of file