\ snd-forth-docs.fs -- examples from sndclm.html \ Usage: snd-forth-nogui -noinit snd-forth-docs.fs require clm require examp \ OSCIL lambda: ( -- ) 440.0 make-oscil { gen } 44100 0 do i gen 0 0 oscil f2/ *output* outa drop loop ; :play #t with-sound drop \ ENV lambda: ( -- ) 440.0 make-oscil { gen } '( 0 0 0.01 1 0.25 0.1 0.5 0.01 1 0 ) :scaler 0.5 :length 44100 make-env { ampf } 44100 0 do i gen 0 0 oscil ampf env f* *output* outa drop loop ; :play #t with-sound drop \ TABLE-LOOKUP lambda: ( -- ) 440.0 :wave '( 1 0.5 2 0.5 ) #f #f partials->wave make-table-lookup { gen } 44100 0 do i gen 0 table-lookup f2/ *output* outa drop loop ; :play #t with-sound drop \ POLYWAVE lambda: ( -- ) 440.0 :partials '( 1 0.5 2 0.5 ) make-polywave { gen } 44100 0 do i gen 0 polywave f2/ *output* outa drop loop ; :play #t with-sound drop \ TRIANBLE-WAVE lambda: ( -- ) 440.0 make-triangle-wave { gen } 44100 0 do i gen 0 triangle-wave f2/ *output* outa drop loop ; :play #t with-sound drop \ NCOS lambda: ( -- ) 440.0 10 make-ncos { gen } 44100 0 do i gen 0 ncos f2/ *output* outa drop loop ; :play #t with-sound drop \ NRXYCOS lambda: ( -- ) 440.0 :n 10 make-nrxycos { gen } 44100 0 ?do i gen 0 nrxycos f2/ *output* outa drop loop ; :play #t with-sound drop \ SSB-AM lambda: ( -- ) 440.0 20 make-ssb-am { shifter } 440.0 make-oscil { osc } 44100 0 ?do i shifter osc 0 0 oscil 0 ssb-am f2/ *output* outa drop loop ; :play #t :statistics #t :srate 44100 with-sound drop \ WAVE-TRAIN lambda: ( -- ) 400 10 make-ncos { g } g -0.5 pi f* set-mus-phase drop 64 make-vct map! g 0 ncos end-map { v } 440.0 :wave v make-wave-train { gen } 44100 0 do i gen 0 wave-train f2/ *output* outa drop loop ; :play #t with-sound drop \ RAND lambda: ( -- ) 5.0 220.0 hz->radians make-rand { ran1 } 5.0 330.0 hz->radians make-rand-interp { ran2 } 440.0 make-oscil { osc1 } 1320.0 make-oscil { osc2 } 88200 0 do i osc1 ran1 0 rand 0 oscil f2/ *output* outa drop i osc2 ran2 0 rand-interp 0 oscil f2/ *output* outb drop loop ; :channels 2 :play #t with-sound drop \ TWO-POLE lambda: ( -- ) 1000.0 0.999 make-two-pole { flt } 10000.0 0.002 make-rand { ran1 } 44100 0 do i flt ran1 0 rand two-pole f2/ *output* outa drop loop ; :play #t with-sound drop \ FIRMANT lambda: ( -- ) 1000.0 0.999 make-firmant { flt } 10000.0 5.0 make-rand { ran1 } 44100 0 do i flt ran1 0 rand #f firmant f2/ *output* outa drop loop ; :play #t with-sound drop \ IIR-FILTER lambda: ( -- ) 3 vct( 0.0 -1.978 0.998 ) make-iir-filter { flt } 10000.0 0.002 make-rand { ran1 } 44100 0 do i flt ran1 0 rand iir-filter f2/ *output* outa drop loop ; :play #t with-sound drop \ DELAY lambda: ( -- ) 0.5 seconds->samples make-delay { dly } 440.0 make-oscil { osc1 } 660.0 make-oscil { osc2 } 44100 0 do i osc1 0 0 oscil dly osc2 0 0 oscil 0 delay f+ f2/ *output* outa drop loop ; :play #t with-sound drop \ COMB lambda: ( -- ) 0.4 0.4 seconds->samples make-comb { cmb } 440.0 make-oscil { osc } '( 0 0 1 1 2 1 3 0 ) :length 4410 make-env { ampf } 88200 0 do i cmb ( gen ) ampf env osc 0 0 oscil f* ( val ) 0 ( pm ) comb f2/ *output* outa drop loop ; :play #t with-sound drop \ ALL-PASS lambda: ( -- ) -0.4 0.4 0.4 seconds->samples make-all-pass { alp } 440.0 make-oscil { osc } '( 0 0 1 1 2 1 3 0 ) :length 4410 make-env { ampf } 88200 0 do i alp ( gen ) ampf env osc 0 0 oscil f* ( val ) 0 ( pm ) all-pass f2/ *output* outa drop loop ; :play #t with-sound drop \ MOVING-AVERAGE lambda: ( -- ) 4410 make-moving-average { avg } 440.0 make-oscil { osc } 44100 4410 - { stop } 0.0 { val } stop 0 do osc 0 0 oscil to val i avg val fabs moving-average val f* *output* outa drop loop 44100 stop do i avg 0.0 moving-average osc 0 0 oscil f* *output* outa drop loop ; :play #t with-sound drop \ SRC1 lambda: ( -- ) "oboe.snd" make-readin { rd } rd 0.5 make-src { sr } "oboe.snd" mus-sound-framples 2* ( len ) 0 do i sr 0 #f src *output* outa drop loop ; :play #t :srate 22050 with-sound drop \ SRC2 : make-src-proc { osc -- prc; dir self -- val } 1 proc-create osc , ( prc ) does> { dir self -- val } self @ ( osc ) 0 0 oscil ; lambda: ( -- ) 440.0 make-oscil { osc } osc make-src-proc { prc } :srate 2.0 make-src { sr } 44100 0 do i sr 0 prc src *output* outa drop loop ; :play #t with-sound drop \ CONVOLVE1 lambda: ( -- ) "pistol.snd" make-readin ( rd ) "oboe.snd" file->vct ( v ) make-convolve { cnv } 88200 0 do i cnv #f convolve 0.25 f* *output* outa drop loop ; :play #t :statistics #t with-sound drop \ CONVOLVE2 lambda: ( -- ) "oboe.snd" "pistol.snd" 0.5 "convolved.snd" convolve-files { tempfile } tempfile make-readin { reader } tempfile mus-sound-framples ( len ) 0 do i reader readin *output* outa drop loop tempfile file-delete ; :play #t with-sound drop \ GRANULATE1 lambda: ( -- ) "oboe.snd" make-readin 2.0 make-granulate { grn } 44100 0 do i grn #f #f granulate *output* outa drop loop ; :play #t with-sound drop \ GRANULATE2 : make-granulate-proc { osc sweep -- prc; dir self -- val } 1 proc-create osc , sweep , ( prc ) does> { dir self -- val } self @ ( osc ) self cell+ @ ( sweep ) env 0 oscil 0.2 f* ; lambda: ( -- ) 440.0 make-oscil { osc } '( 0 0 1 1 ) :scaler 440.0 hz->radians :length 44100 make-env { sweep } osc sweep make-granulate-proc :expansion 2.0 :length 0.5 make-granulate { grn } 88200 0 do i grn #f #f granulate *output* outa drop loop ; :play #t with-sound drop \ PHASE-VOCODER1 lambda: ( -- ) "oboe.snd" make-readin :pitch 2.0 make-phase-vocoder { pv } 44100 0 do i pv #f #f #f #f phase-vocoder *output* outa drop loop ; :play #t with-sound drop \ PHASE-VOCODER2 lambda: ( -- ) "oboe.snd" make-readin :interp 256 make-phase-vocoder { pv } "oboe.snd" mus-sound-framples 2* ( samps ) 0 do i pv #f #f #f #f phase-vocoder *output* outa drop loop ; :play #t :srate 22050 with-sound drop \ ASYMMETRIC-FM lambda: ( -- ) 440.0 0.0 0.9 0.5 make-asymmetric-fm { fm } 44100 0 do i fm 1.0 0 asymmetric-fm f2/ *output* outa drop loop ; :play #t with-sound drop \ FILE->FRAME->FILE lambda: ( -- ) "stereo.snd" make-file->frame { input } 2 make-frame { frm } "stereo.snd" mus-sound-framples ( len ) 0 do input i frm file->frame ( frm ) 1 frame-ref ( val1 ) frm 0 frame-ref ( val0 ) frm 1 rot frame-set! drop ( val1 ) frm 0 rot frame-set! drop *output* i frm frame->file drop loop ; :channels 2 :play #t with-sound drop \ READIN lambda: ( -- ) "oboe.snd" make-readin { reader } 44100 0 do i reader readin f2/ *output* outa drop loop ; :play #t with-sound drop \ IN-OUT-ANY lambda: ( -- ) "oboe.snd" make-file->sample { infile } 44100 0 do i i 0 infile in-any 0 *output* out-any drop loop ; :play #t with-sound drop \ LOCSIG lambda: ( -- ) 60.0 make-locsig { loc } 440.0 make-oscil { osc } 44100 0 do loc i osc 0 0 oscil f2/ locsig drop loop ; :play #t :channels 2 with-sound drop \ AMPLITUDE-MODULATE lambda: ( -- ) 440.0 make-oscil { osc1 } 220.0 make-oscil { osc2 } 44100 0 do i 0.3 ( car ) osc1 0 0 oscil ( in1 ) osc2 0 0 oscil ( in2 ) amplitude-modulate f2/ *output* outa drop loop ; :play #t with-sound drop bye \ snd-forth-docs.fs ends here