home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fujiology Archive
/
fujiology_archive_v1_0.iso
/
!FALCON
/
NOCREW
/
MP2_0997.ZIP
/
mp2_0997
/
mp2audio.sho
< prev
next >
Wrap
Text File
|
1999-09-06
|
9KB
|
329 lines
;;
;; Set up some frequently used functions.
;;
(define not (x) (equal x #f))
(define nil? (x) (equal x ()))
(define undef? (x) (equal x #undef))
(define err? (x) (equal x #ERR.))
(define list (#rest x) x)
(define > (a b) (not (or (< a b) (equal a b))))
(define <= (a b) (or (< a b) (equal a b)))
(define >= (a b) (not (< a b)))
(define or (a b) (if a #t (if b #t #f)))
(define and (a b) (if a (if b #t #f) #f))
(define nor (a b) (not (or a b)))
(define nand (a b) (not (and a b)))
(define xor (a b) (or (and a (not b)) (and (not a) b)))
(define symbol? (x) (nor (list? x) (number? x)))
(define caar (x) (car (car x)))
(define cadr (x) (car (cdr x)))
(define cdar (x) (cdr (car x)))
(define cddr (x) (cdr (cdr x)))
(define cadar (x) (car (cdr (car x))))
;;
;; List parsing functions.
;;
(define last (x)
(if (nil? (cdr x))
(car x)
(last (cdr x))))
(define size (x)
(if (nil? x) 0 (+ 1 (size (cdr x)))))
;(define append (#rest x)
; ((lambda (append-loop append-one)
; (append-loop x ()))
; ;; append-one
; (lambda (x y) (if (nil? x) y (append-one (car x) (append-loop (cdr x) y))))
; ;; append-loop
; (lambda (x y) (if (nil? x) y (cons (car x) (append-one (cdr x) y))))))
(define reverse (x)
((lambda (reverse-loop x)
(reverse-loop x ()))
(lambda (x y)
(if (nil? x) y (reverse-loop (cdr x) (cons (car x) y)))) x))
(define member (entry x)
(if (nil? x) #f
(if (equal entry (car x)) x
(member entry (cdr x)))))
(define assoc (entry x)
(if (nil? x) #undef
(if (equal entry (caar x)) (car x)
(assoc entry (cdr x)))))
(define index (entry x)
(cadr (assoc entry x)))
(define indices (x)
(if (nil? x) ()
(cons (caar x) (indices (cdr x)))))
(define values (x)
(if (nil? x) ()
(cons (cadar x) (values (cdr x)))))
(define search (entry x)
(let ((search-iter (lambda (entry x position)
(cond ((nil? x) #undef)
((equal entry (car x)) position)
(#t (search-iter entry (cdr x) (+ 1 position)))))))
(search-iter entry x 0)))
;;
;; Improved flow control.
;;
(define begin (#rest x) (last x))
(define defmacro (macro (m v b)
(list (quote define) m (list (quote macro) v b))))
(defmacro let (variables #rest body)
(cons (list (quote lambda) (indices variables)
(append (quote (begin)) body))
(values variables)))
(defmacro backquote (value)
((lambda (backquote-rec backquote-iter)
(backquote-rec value))
;; backquote-rec
(lambda (value)
(if (nil? value)
()
(if (list? value)
(if (equal (quote comma) (car value))
(cadr value)
(cons (quote list) (backquote-iter value)))
(list (quote quote) value))))
;; backquote-iter
(lambda (l)
(if (nil? l)
()
(cons (backquote-rec (car l)) (backquote-iter (cdr l)))))))
(defmacro alias (fu-alias fu) (list (quote define) fu-alias (eval fu)))
(alias = equal)
(defmacro cond (#rest x)
(if (nil? x) #f
(if (nil? (cdr x))
(list (quote if) (caar x) (cadar x) #f)
(list (quote if) (caar x) (cadar x)
(cons (quote cond) (cdr x))))))
;((macro (real-lambda)
; (list (quote defmacro) (quote lambda) (quote (v #rest b))
; (list (quote list) (eval real-lambda)
; (quote v) (quote (cons (quote begin) b))))) lambda)
(defmacro map (fu x)
((lambda (x)
(if (nil? x) ()
(list (quote cons) (list fu (car x))
(list (quote map) fu (list (quote quote) (cdr x))))))
(eval x)))
(defmacro apply (fu args)
(eval (cons fu (eval args))))
;;
;; Enhanced numerical functions.
;;
(define +1 (x) (+ x 1))
(define -1 (x) (- x 1))
;;
;; Various example functions.
;;
(define play (file)
(begin (mp2-load file)
(mp2-play)))
(define factorial (n)
(if (< n 1) 1 (* n (factorial (- n 1)))))
(define s-to-hms (sec)
(list (/ sec 3600) (% (/ sec 60) 60) (% sec 60)))
(define song-time ()
(s-to-hms (cadr (assoc "timelength" (mp2-type)))))
;;
;; Grand old interface.
;;
(define mp2-find-next (e l)
(if (nil? (cdr l)) #f
(if (equal e (car l))
(cadr l)
(mp2-find-next e (cdr l)))))
(define mp2-find-previous (e l)
(if (nil? (cdr l)) #f
(if (equal e (cadr l))
(car l)
(mp2-find-previous e (cdr l)))))
(define mp2filelist ()
(let ((uppercase (ls "*.MP?"))
(lowercase (ls "*.mp?")))
(if (equal (car uppercase) (car lowercase))
(sort uppercase)
(sort (append uppercase lowercase)))))
(define mp2-next ()
(mp2-find-next (index "filename" (mp2-type)) (mp2filelist)))
(define mp2-previous ()
(mp2-find-previous (index "filename" (mp2-type)) (mp2filelist)))
(define mp2-load-and-play (filename)
(if (mp2-load filename)
(mp2-play)
#f))
;; Define icons.
(define mp2-icon-stop () (mp2-stop))
(define mp2-icon-pause () (mp2-pause))
(define mp2-icon-loop () (mp2-loop))
(define mp2-icon-info () (mp2-window-info))
(define mp2-icon-console () (mp2-window-console))
(define mp2-icon-fast-forward () (mp2-fast-forward))
(define mp2-icon-play ()
(if (or (not (mp2-loaded?)) (mp2-play?))
(mp2-load-and-play (mp2-select))
(mp2-play)))
(define mp2-icon-load () (mp2-load (mp2-select)))
(define mp2-icon-next ()
(if (mp2-play?)
(mp2-load-and-play (mp2-next))
(mp2-load (mp2-next))))
(define mp2-icon-previous ()
(if (< 3 (mp2-play-time))
(begin (mp2-stop) (mp2-play))
(if (not (if (mp2-play?)
(mp2-load-and-play (mp2-previous))
(mp2-load (mp2-previous))))
(if (mp2-play?) (begin (mp2-stop) (mp2-play))))))
;; Define hooks.
(define mp2-hook-finitum ()
(if (mp2-loop?)
(begin (mp2-stop) (mp2-play))
(if (equal (mp2-load-and-play (mp2-next)) #f)
(mp2-stop))))
(define mp2-hook-dragumdroppum (filename)
(begin (mp2-load filename) (mp2-play)))
(define mp2-hook-loaditum ()
(mp2-subtitle (index "filename" (mp2-type))))
(mp2-countdown #t)
(mp2-display-time #t)
;;
;; Define some titles.
;;
(mp2-title "MP2")
(mp2-subtitle " No song loaded ")
;;
;; Define control keys.
;;
(define mp2-control-c () (mp2-icon-console))
(define mp2-control-i () (mp2-icon-info))
(define mp2-control-p () (mp2-icon-play))
(define mp2-control-P () (mp2-icon-pause))
(define mp2-control-s () (mp2-icon-stop))
(define mp2-control-f () (mp2-icon-next))
(define mp2-control-b () (mp2-icon-previous))
(define mp2-control-o () (mp2-icon-load))
(define mp2-control-L () (mp2-icon-loop))
(define mp2-control-F () (mp2-icon-fast-forward))
(define mp2-control-t () (mp2-countdown))
(define mp2-control-u () (mp2-close-window))
(define mp2-control-w () (mp2-switch-window))
(define mp2-control-l () (mp2-clear-console))
(define mp2-control-q () (exit))
;;
;; Jukebox mode.
;;
(define play-list ())
(define empty-play-list? ()
(nil? play-list))
(define push-play-list (#rest filenames)
(if filenames
(define play-list (append play-list filenames))))
(define pop-play-list ()
(if (empty-play-list?)
#f
(let ((filename (car play-list)))
(begin (define play-list (cdr play-list))
filename))))
(define juke-play ()
(if (empty-play-list?)
#f
(begin (mp2-subtitle " *Jukebox mode* ")
(mp2-load (pop-play-list))
(mp2-subtitle (index "filename" (mp2-type)))
(mp2-play)
#t)))
;; Define juke-mode hooks and icons.
(define juke-mode ()
(begin
(mp2-subtitle " *Jukebox mode* ")
(define mp2-hook-finitum ()
(if (not (juke-play)) (mp2-stop)))
(define mp2-hook-dragumdroppum (filename)
(push-play-list filename))
(define mp2-icon-play ()
(begin
(if (and (mp2-loaded?) (not (mp2-play?)))
(mp2-play)
(if (or (empty-play-list?) (mp2-play?))
(mp2-icon-load)))
(if (not (mp2-play?))
(juke-play))))
(define mp2-icon-load ()
(let ((filename (mp2-select)))
(if (not (equal filename #f))
(push-play-list filename))))
(define mp2-icon-next () (juke-play))
(if (mp2-loaded?)
(mp2-subtitle (index "filename" (mp2-type))))
(juke-play)))
(define mp2-control-j () (juke-mode))
;; Default position of windows.
(mp2-place-window-control 400 380)
(mp2-place-window-info 500 100)
(mp2-place-window-console 200 350)