- [Function]
(rts[to] {keyword value}*)
Starts the real time scheduler according to optional and keyword arguments. Returns no values. You must load the RTS system before calling the function.
rts supports the following optional arguments:
- to {stream | false}
- The default destination output stream, defaults
to
*out*. If the value is a stream then it must already be open and initialized. If the value is false then no output stream is assumed and the caller is expected to manage stream IO directly using the:toargument to output.
rts supports the following keywor arguments:
:time-format{:sec|:msec|:usec}- The format of time values returned by now . If the value is
:secthen floating point seconds are returned,:msecreturns integer milliseconds (1000 msec equals 1 sec) and:usecreturns microseconds (1000000 usec equals 1 sec). The default value is:sec. Use:msecor:usecto avoid float consing in some Lisps. Note that event durations and wait values must agree with the time format. :resolution{usecs}- The duty cycle of the scheduling loop in microseconds (usec), where 1000000 usec equals 1 second. The default value is 100, or 1/10 of a millisecond.
:priority{number}- The pthread priorty that the scheduler runs under. The value should be an integer between 1 and 100. The default value is 20.
:policy{number}- The pthread policy that the scheduler runs under. The value 2 is
SCHED_RRand 4 isSCHED_FIFO. This value is currently ignored.
Examples:
Example 1. Starting rts and sprouting from the REPL.
(define *pm* (portmidi-open :output 3 :latency 0)) (define (zzz len lb ub wai amp) (process repeat len output (new midi :time (now) :duration .1 :amplitude amp :keynum (between lb ub)) wait wai)) (rts *pm*) ;;; eval to add stuff (let ((k (between 20 100)) (n (pick 3 5 7 11))) (sprout (zzz (* n (pick 2 3 4)) k (+ k 7) (/ 1 n) .75))) ;;; stop when you are done. (rts-stop)
Example 2. Endless Fluff. Stops only when rts-stop is called. (Todd Ingalls)
(define fluff '(60 62 64 67 72 65 69 48 50)) (define (endless-fluff num dur knums) (process repeat num for i from 0 output (new midi :time (now) :duration (* 2 dur) :amplitude .5 :keynum (pickl fluff)) wait (pick dur (/ dur 2) (/ dur 4)) when (= i (1- num)) sprout (process repeat 4 output (new midi :time (now) :duration 5 :amplitude .5 :keynum (pickl knums))) and sprout (endless-fluff 20 1 knums))) (rts *pm*) (sprout (endless-fluff 20 1 fluff)) ;;; stop when you are done. (rts-stop)
Example 3. Sprouting into the scheduler from a receive hook.
(define *pm* (portmidi-open :input 1 :output 3 :latency 0)) (define (major-thirds len knum) (process with d = .1 for i below len for k = (+ knum (* (mod i 5) 4)) output (make-note-on 0 k 90) at (now) sprout (make-note-off 0 k 125) at (+ (now) .5) wait d)) (rts *pm*) (set-receiver! (lambda (mm ms) ms (if (note-on-p mm) (sprout (major-thirds 20 (note-on-key mm))))) *pm*) ;;; stop receiving and scheduling. (remove-receiver! *pm*) (rts?) ⇒ :running (rts-stop) (rts?) ⇒ #f
See also:
rts?[Function]rts-pause[Function]rts-continue[Function]rts-stop[Function]set-receiver![Function]sprout[Function]