#! /usr/bin/env fth \ agn.fth -- Bill Schottstaedt's agn.cl \ (see clm-2/clm-example.clm and clm-2/bess5.cl) \ Translator/Author: Michael Scholz <mi-scholz@users.sourceforge.net> \ Created: Wed Dec 15 23:30:43 CET 2004 \ Changed: Sat Jul 28 00:00:24 CEST 2012 \ Type do-agn \ or start the script in a shell. #t value *clm-c-version* dl-load sndlib Init_sndlib *clm-c-version* [if] dl-load sndins Init_sndins [else] require clm-ins [then] require clm require env *argc* 2 > [if] *argv* 2 array-ref [else] "agn.fsm" [then] value agn-test-file 60.0 value agn-time #t to *clm-play* #t to *clm-statistics* #t to *clm-verbose* 44100 to *clm-srate* 2 to *clm-channels* <'> jc-reverb to *clm-reverb* '( :volume 0.8 ) to *clm-reverb-data* 2 to *clm-reverb-channels* #t to *clm-delete-reverb* : rbell ( x -- r ) 100 f* '( 0 0 10 0.25 90 1 100 1 ) 1.0 envelope-interp ; : tune ( x -- r ) { x } #( 1 256/243 9/8 32/27 81/64 4/3 1024/729 3/2 128/81 27/16 16/9 243/128 2 ) x 12.0 fmod f>s array-ref 2.0 x 12.0 f/ floor f** f* ; #( 0 0 2 4 11 11 5 6 7 9 2 0 0 ) constant agn-mode 256 constant agn-lim #f value agn-octs #f value agn-pits #f value agn-rhys #f value agn-amps #f value agn-begs : agn-init ( -- ) agn-lim make-array map! 1.0 random rbell f2* 4.0 f+ floor end-map to agn-octs agn-lim make-array map! agn-mode 1.0 random 12.0 f* floor f>s array-ref end-map to agn-pits agn-lim make-array map! 1.0 random 6.0 f* 4.0 f+ end-map to agn-rhys agn-lim make-array map! 1.0 random rbell 8.0 f* 1.0 f+ end-map to agn-amps agn-lim make-array map! 1.0 random 0.9 f< if 1.0 random f2* 4.0 f+ else 4.0 random 6.0 f* then end-map to agn-begs ; : agn ( fname -- ) ( fname ) io-open-write { io } io "\\ from agn.cl (see clm-2/clm-example.clm and clm-2/bess5.cl)\n" io-write io "\\\n" io-write io "%s\n" '( make-default-comment ) io-write-format #( '( 0 0 40 0.1 60 0.2 75 0.4 82 1 90 1 100 0 ) '( 0 0 60 0.1 80 0.2 90 0.4 95 1 100 0 ) '( 0 0 10 1 16 0 32 0.1 50 1 56 0 60 0 90 0.3 100 0 ) '( 0 0 30 1 56 0 60 0 90 0.3 100 0 ) '( 0 0 50 1 80 0.3 100 0 ) '( 0 0 40 0.1 60 0.2 75 0.4 82 1 90 1 100 0 ) '( 0 0 40 0.1 60 0.2 75 0.4 82 1 90 1 100 0 ) '( 0 0 10 1 32 0.1 50 1 90 0.3 100 0 ) '( 0 0 60 0.1 80 0.3 95 1 100 0 ) '( 0 0 80 0.1 90 1 100 0 ) ) { wins } agn-init 4 1 do 0 4 0 { cellbeg cellsiz cellctr } 1 i s>f i 1- s>f 0.2 { whichway base mi mytempo } 0.0 0.0 { nextbeg beg } begin beg agn-time f< cellctr agn-lim < and while beg nextbeg f+ to beg 0.25 mytempo 1.0 random 0.2 f* 0.9 f+ f* agn-rhys cellctr array-ref f* fmax to nextbeg 16.352 2.0 mi f** f/ agn-pits cellctr array-ref tune f* 2.0 agn-octs cellctr array-ref f** f* { freq } freq 100.0 f< if nextbeg f2* else nextbeg then { dur } 0.003 agn-amps cellctr array-ref 60.0 base f* 1/f f* fmax { amp } 1.0 random 2.0 f* base f* { ind } base 0.1 f* { revamt } 10.0 beg beg floor f- f* floor f>s { winnum } 0.00001 freq 2.0 flogn 4.0 f- 4.0 f** f* { ranamt } io " %f %f %f %f :fm-index %f :amp-env %S :reverb-amount %f :noise-amount %f fm-violin" '( beg dur freq amp ind wins winnum array-ref revamt ranamt ) io-write-format cellctr 1+ to cellctr cellctr cellsiz cellbeg + > if cellbeg 1+ to cellbeg 1.0 random 0.5 f> if cellsiz whichway + to cellsiz then cellsiz 16 > 1.0 random 0.99 f> and if -2 to whichway else cellsiz 12 > 1.0 random 0.999 f> and if -1 to whichway else cellsiz 4 < if 1 to whichway then then then cellbeg 3 + to cellbeg cellbeg to cellctr then repeat loop io "\n\n\\ %s ends here\n" '( agn-test-file ) io-write-format io io-close ; : do-agn ( -- ) agn-test-file undef file-basename ".snd" $+ { sndfile } "\\ writing \"%s\"\n" '( agn-test-file ) fth-print agn-test-file agn :output sndfile agn-test-file clm-load ; 'snd provided? [unless] do-agn [then] \ agn.fth ends here