( (oscil* ( "freq" 0 200 5000 :log #t))) ( (pulse-train* ( "freq" 0 200 5000 :log #t))) ( (sawtooth-wave* ( "freq" 0 200 5000 :log #t))) ( (sine-summation* ( "freq" 0 200 5000 :log #t))) ( (square-wave* ( "freq" 0 200 5000 :log #t))) ( (sum-of-cosines* ( "freq" 0 200 5000 :log #t))) ( (sum-of-sines* ( "freq" 0 200 5000 :log #t))) ( (triangle-wave* ( "freq" 0 200 5000 :log #t))) ( (table-lookup* ( "freq" 0 200 5000 :log #t))) ( (wave-train* ( "freq" 0 200 5000 :log #t))) ( (* ( "Amp" 0 0.5 1) ( "On/Off" #t) (oscil*))) ( (* ( "Amp" 0 0.5 1) ( "On/Off" #t) (oscil* ( "Freq" 20 200 4000 :log #t)))) ( (* ( "vol" 0 0.2 1) ( "vol2" 0 0.2 1 :glide #f) ( "on/off" #t :glide #t) ( "on/off" #t :glide #f) (oscil* ( "freq" 50 200 1000 :log #t)))) ( (let ((outval (* ( "on/off" #t) (oscil* ( "freq" 50 200 8000 :log #t))))) (vct (* ( "left" 0 0.2 1) outval) (* ( "right" 0 0.2 1) outval)))) [1] (let () (define-multi-instrument-rt-dialog) ( (* ( "osci" 0 0.5 1) ( "Main volume" 0 1 2) (oscil*))) ( (* ( "square" 0 0.5 2) ( "Main volume" 0 1 2) (square-wave*)))) [1] Faust has an operator "<:", which can be used to split the input signal by sending it to a list of functions to further make a multichannel signal out of it. A quite similar operator can easely be implemented in snd-rt: (define-rt-macro (<: input . outputs) (define val (rt-gensym)) `(let ((,val ,input)) (vct ,@(map (lambda (output) `(,output ,val)) outputs)))) (define-rt-macro (curry function . rest) (define x (rt-gensym)) `(lambda (,x) (,function ,x ,@rest))) By using the "<:" macro for splitting the signal, and the "curry" macro to conveniently create the type of functions we need here, the original dialog can now be written in a shorter form like this: ( (<: (* ( "on/off" #t) (oscil* ( "freq" 50 200 8000 :log #t))) (curry * ( "left" 0 0.2 1)) (curry * ( "right" 0 0.2 1)))) And here is a version which is easier to read: ( (begin (define on/off ( "on/off" #t)) (define freq ( "freq" 50 200 8000 :log #t)) (define left ( "left" 0 0.2 1)) (define right ( "right" 0 0.2 1)) (<: (* on/off (oscil* freq)) (curry * left) (curry * right))))