when working with ugens with lots of arguments, i think it could be  
helpful to have infrastructure or conventions for named arguments,  
e.g. something like this:

module Sound.SC3.UGen.Pitch (
     Args(..),
     pitch',
     defaults
) where

import Sound.SC3 hiding (median)

data Args = Args {
     initFreq :: UGen,
     minFreq :: UGen,
     maxFreq :: UGen,
     execFreq :: UGen,
     maxBinsPerOctave :: UGen,
     median :: UGen,
     ampThreshold :: UGen,
     peakThreshold :: UGen,
     downSample :: UGen
}

defaults :: Args
defaults = Args {
     initFreq = 440,
     minFreq = 60,
     maxFreq = 4000,
     execFreq = 100,
     maxBinsPerOctave = 16,
     median = 1,
     ampThreshold = 0.01,
     peakThreshold = 0.5,
     downSample = 1.0
}

pitch' :: UGen -> Args -> UGen
pitch' input args = pitch
                         input
                         (initFreq args)
                         (minFreq args)
                         (maxFreq args)
                         (execFreq args)
                         (maxBinsPerOctave args)
                         (median args)
                         (ampThreshold args)
                         (peakThreshold args)
                         (downSample args)

so you can write things like this:

Pitch.pitch'
        (mix (soundIn (mce audioInputChannels)))
         Pitch.defaults { Pitch.initFreq = 100 }

which is slightly less ugly than providing all the defaults each  
time. comments?

maybe it's possible to help writing the boilerplate with template  
haskell? alternatively (somewhat more overhead): if we had some kind  
of ugen database describing rates, inputs, outputs, documentation and  
code examples in different languages, things like these could be  
autogenerated (in fact most of the haskell ugen library).

<sk>

_______________________________________________
haskell-art mailing list
haskell-art@lists.lurk.org
http://lists.lurk.org/mailman/listinfo/haskell-art

Reply via email to