#!r6rs (library (rsc3 graphdef ugen) (export ugen make-ugen ugen? ugen-inputs ugen-name ugen-rate ugen-outputs ugen-special ugen-id ugen-output ugen-validate ugen-transform dupn ugen->u8t) (import (rnrs) (rsc3 collection list) (rsc3 u8 encode) (rsc3 graphdef id) (rsc3 graphdef input) (rsc3 graphdef control) (rsc3 graphdef mce) (rsc3 graphdef output) (rsc3 graphdef proxy) (rsc3 graphdef rate)) ;; A represents a UGen in a UGen graph. The name ;; names the C level UGen. Each value at the inputs is either ;; a , a , a , a or a . Each ;; value at the outputs is a an . The id is an . (define-record-type ugen (fields name rate inputs outputs special id)) (define (ugen-output u n) (list-ref (ugen-outputs u) n)) (define (ugen-transform u f) (let ((n (ugen-name u)) (r (ugen-rate u)) (i (ugen-inputs u)) (o (ugen-outputs u)) (s (ugen-special u)) (d (ugen-id u))) (f n r i o s d))) (define (input*? i) (or (number? i) (control*? i) (ugen? i) (proxy? i) (mce? i))) (define (ugen-validate u) (ugen-transform u (lambda (n r i o s d) (and (string? n) (rate? r) (and (list? i) (every input*? i)) (and (list? o) (every output? o)) (integer? s) (uid? d))))) (define (ugen->u8t u) (ugen-transform u (lambda (n r i o s d) (list (encode-pstr n) (encode-u8 (rate-value r)) (encode-i16 (length i)) (encode-i16 (length o)) (encode-i16 s) (map input->u8t i) (map output->u8t o))))) (define (uniquify u) (ugen-transform u (lambda (n r i o s d) (make-ugen n r i o s (unique-uid))))) (define (dupn n u) (make-mce (map (lambda (_) (uniquify u)) (iota n)))) (define (dup u) (dupn 2 u)) )