hsc3 0.2 → 0.3
raw patch · 146 files changed
+3195/−1707 lines, 146 filesdep ~hoscPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hosc
API changes (from Hackage documentation)
- Sound.SC3.UGen.Filter: twindex :: UGen -> UGen -> UGen -> UGen
- Sound.SC3.UGen.Graph.Naive: Graph :: [UGen] -> [UGen] -> [UGen] -> Graph
- Sound.SC3.UGen.Graph.Naive: Input :: Int -> Int -> Input
- Sound.SC3.UGen.Graph.Naive: constants :: Graph -> [UGen]
- Sound.SC3.UGen.Graph.Naive: controls :: Graph -> [UGen]
- Sound.SC3.UGen.Graph.Naive: data Graph
- Sound.SC3.UGen.Graph.Naive: data Input
- Sound.SC3.UGen.Graph.Naive: graph :: UGen -> Graph
- Sound.SC3.UGen.Graph.Naive: instance Eq Graph
- Sound.SC3.UGen.Graph.Naive: instance Eq Input
- Sound.SC3.UGen.Graph.Naive: instance Show Graph
- Sound.SC3.UGen.Graph.Naive: instance Show Input
- Sound.SC3.UGen.Graph.Naive: makeInput :: Graph -> UGen -> Input
- Sound.SC3.UGen.Graph.Naive: nodeIndex :: Graph -> UGen -> Int
- Sound.SC3.UGen.Graph.Naive: primitives :: Graph -> [UGen]
- Sound.SC3.UGen.UGen: controlRate_ :: UGen -> Rate
- Sound.SC3.UGen.UGen: type Name = String
- Sound.SC3.UGen.UGen.Construct: liftU :: (UId m) => (UGenId -> a -> UGen) -> (a -> m UGen)
- Sound.SC3.UGen.UGen.Construct: liftU2 :: (UId m) => (UGenId -> a -> b -> UGen) -> (a -> b -> m UGen)
- Sound.SC3.UGen.UGen.Construct: liftU3 :: (UId m) => (UGenId -> a -> b -> c -> UGen) -> (a -> b -> c -> m UGen)
- Sound.SC3.UGen.UGen.Construct: liftU4 :: (UId m) => (UGenId -> a -> b -> c -> d -> UGen) -> (a -> b -> c -> d -> m UGen)
- Sound.SC3.UGen.UGen.Construct: mkBinaryOperator :: Binary -> (Double -> Double -> Double) -> UGen -> UGen -> UGen
- Sound.SC3.UGen.UGen.Construct: mkFilter :: Name -> [UGen] -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkFilterId :: UGenId -> Name -> [UGen] -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkFilterKeyed :: Name -> Int -> [UGen] -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkFilterMCE :: Name -> [UGen] -> UGen -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkOsc :: Rate -> Name -> [UGen] -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkOscId :: UGenId -> Rate -> Name -> [UGen] -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkOscMCE :: Rate -> Name -> [UGen] -> UGen -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkOscMCEId :: UGenId -> Rate -> Name -> [UGen] -> UGen -> Int -> UGen
- Sound.SC3.UGen.UGen.Construct: mkUnaryOperator :: Unary -> (Double -> Double) -> UGen -> UGen
- Sound.SC3.UGen.UGen.MCE: mceChannel :: Int -> UGen -> UGen
- Sound.SC3.UGen.UGen.MCE: mceChannels :: UGen -> [UGen]
- Sound.SC3.UGen.UGen.MCE: mceDegree :: UGen -> Int
- Sound.SC3.UGen.UGen.MCE: mceEdit :: ([UGen] -> [UGen]) -> UGen -> UGen
- Sound.SC3.UGen.UGen.MCE: mceExpand :: UGen -> UGen
- Sound.SC3.UGen.UGen.MCE: mceExtend :: Int -> UGen -> [UGen]
- Sound.SC3.UGen.UGen.MCE: mceReverse :: UGen -> UGen
- Sound.SC3.UGen.UGen.MCE: mceTransform :: UGen -> UGen
- Sound.SC3.UGen.UGen.MCE: mceTranspose :: UGen -> UGen
- Sound.SC3.UGen.UGen.Math: instance Enum UGen
- Sound.SC3.UGen.UGen.Math: instance Floating UGen
- Sound.SC3.UGen.UGen.Math: instance Fractional UGen
- Sound.SC3.UGen.UGen.Math: instance Integral UGen
- Sound.SC3.UGen.UGen.Math: instance Num UGen
- Sound.SC3.UGen.UGen.Math: instance Ord UGen
- Sound.SC3.UGen.UGen.Math: instance Random UGen
- Sound.SC3.UGen.UGen.Math: instance Real UGen
- Sound.SC3.UGen.UGen.Predicate: isConstant :: UGen -> Bool
- Sound.SC3.UGen.UGen.Predicate: isControl :: UGen -> Bool
- Sound.SC3.UGen.UGen.Predicate: isMCE :: UGen -> Bool
- Sound.SC3.UGen.UGen.Predicate: isMRG :: UGen -> Bool
- Sound.SC3.UGen.UGen.Predicate: isProxy :: UGen -> Bool
- Sound.SC3.UGen.UGen.Predicate: isUGen :: UGen -> Bool
+ Sound.SC3.Server.Command: c_set1 :: Int -> Double -> OSC
+ Sound.SC3.Server.Command: n_set1 :: Int -> String -> Double -> OSC
+ Sound.SC3.Server.Status: serverSampleRateActual :: (Transport t) => t -> IO Double
+ Sound.SC3.Server.Status: serverSampleRateNominal :: (Transport t) => t -> IO Double
+ Sound.SC3.UGen.Composite: dcons :: (UId m) => UGen -> UGen -> m UGen
+ Sound.SC3.UGen.Composite: soundIn :: UGen -> UGen
+ Sound.SC3.UGen.Composite: tChoose :: (UId m) => UGen -> UGen -> m UGen
+ Sound.SC3.UGen.Composite: twChoose :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen
+ Sound.SC3.UGen.Demand.Base: dswitch :: UGenId -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Monadic: dswitch :: (UId m) => UGen -> UGen -> m UGen
+ Sound.SC3.UGen.Demand.Unsafe: dbrown :: UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dbufrd :: UGen -> UGen -> Loop -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dbufwr :: UGen -> UGen -> UGen -> Loop -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dgeom :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dibrown :: UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: diwhite :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: drand :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dseq :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dser :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dseries :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dswitch :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dswitch1 :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dwhite :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Demand.Unsafe: dxrand :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: atsNoiSynth :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: atsSynth :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: ay :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: ayFreqToTone :: (Fractional a) => a -> a
+ Sound.SC3.UGen.External: lpcSynth :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: lpcVals :: Rate -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: membraneCircle :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: membraneHexagon :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: pv_Invert :: UGen -> UGen
+ Sound.SC3.UGen.External: stkBowed :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: stkFlute :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: stkMandolin :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: stkModalBar :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: stkShakers :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External: vosim :: UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.External.ATS: ATS :: ATSHeader -> [ATSFrame] -> ATS
+ Sound.SC3.UGen.External.ATS: ATSHeader :: Double -> Int -> Int -> Int -> Int -> Double -> Double -> Double -> Int -> ATSHeader
+ Sound.SC3.UGen.External.ATS: atsAnalysisDuration :: ATSHeader -> Double
+ Sound.SC3.UGen.External.ATS: atsFileType :: ATSHeader -> Int
+ Sound.SC3.UGen.External.ATS: atsFrameSize :: ATSHeader -> Int
+ Sound.SC3.UGen.External.ATS: atsFrames :: ATS -> [ATSFrame]
+ Sound.SC3.UGen.External.ATS: atsHeader :: ATS -> ATSHeader
+ Sound.SC3.UGen.External.ATS: atsMaxAmplitude :: ATSHeader -> Double
+ Sound.SC3.UGen.External.ATS: atsMaxFrequency :: ATSHeader -> Double
+ Sound.SC3.UGen.External.ATS: atsNFrames :: ATSHeader -> Int
+ Sound.SC3.UGen.External.ATS: atsNPartials :: ATSHeader -> Int
+ Sound.SC3.UGen.External.ATS: atsRead :: FilePath -> IO ATS
+ Sound.SC3.UGen.External.ATS: atsSC3 :: ATS -> [Double]
+ Sound.SC3.UGen.External.ATS: atsSampleRate :: ATSHeader -> Double
+ Sound.SC3.UGen.External.ATS: atsWindowSize :: ATSHeader -> Int
+ Sound.SC3.UGen.External.ATS: data ATS
+ Sound.SC3.UGen.External.ATS: data ATSHeader
+ Sound.SC3.UGen.External.ATS: instance Eq ATS
+ Sound.SC3.UGen.External.ATS: instance Eq ATSHeader
+ Sound.SC3.UGen.External.ATS: instance Show ATS
+ Sound.SC3.UGen.External.ATS: instance Show ATSHeader
+ Sound.SC3.UGen.External.ATS: type ATSFrame = [Double]
+ Sound.SC3.UGen.External.LPC: LPC :: LPCHeader -> [LPCFrame] -> LPC
+ Sound.SC3.UGen.External.LPC: LPCHeader :: Int -> Int -> Int -> Int -> Double -> Double -> Double -> Int -> LPCHeader
+ Sound.SC3.UGen.External.LPC: data LPC
+ Sound.SC3.UGen.External.LPC: data LPCHeader
+ Sound.SC3.UGen.External.LPC: instance Eq LPC
+ Sound.SC3.UGen.External.LPC: instance Eq LPCHeader
+ Sound.SC3.UGen.External.LPC: instance Show LPC
+ Sound.SC3.UGen.External.LPC: instance Show LPCHeader
+ Sound.SC3.UGen.External.LPC: lpcAnalysisDuration :: LPCHeader -> Double
+ Sound.SC3.UGen.External.LPC: lpcFrameRate :: LPCHeader -> Double
+ Sound.SC3.UGen.External.LPC: lpcFrameSize :: LPCHeader -> Int
+ Sound.SC3.UGen.External.LPC: lpcFrames :: LPC -> [LPCFrame]
+ Sound.SC3.UGen.External.LPC: lpcHeader :: LPC -> LPCHeader
+ Sound.SC3.UGen.External.LPC: lpcHeaderSize :: LPCHeader -> Int
+ Sound.SC3.UGen.External.LPC: lpcMagic :: LPCHeader -> Int
+ Sound.SC3.UGen.External.LPC: lpcNFrames :: LPCHeader -> Int
+ Sound.SC3.UGen.External.LPC: lpcNPoles :: LPCHeader -> Int
+ Sound.SC3.UGen.External.LPC: lpcRead :: FilePath -> IO LPC
+ Sound.SC3.UGen.External.LPC: lpcSC3 :: LPC -> [Double]
+ Sound.SC3.UGen.External.LPC: lpcSampleRate :: LPCHeader -> Double
+ Sound.SC3.UGen.External.LPC: type LPCFrame = [Double]
+ Sound.SC3.UGen.FFT.Unsafe: pv_BinScramble :: UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.FFT.Unsafe: pv_RandComb :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.FFT.Unsafe: pv_RandWipe :: UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Filter: freeVerb :: UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Filter: freeVerb2 :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.MachineListening: beatTrack2 :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.MachineListening: mfcc :: Int -> UGen -> UGen
+ Sound.SC3.UGen.MachineListening: specCentroid :: UGen -> UGen
+ Sound.SC3.UGen.MachineListening: specFlatness :: UGen -> UGen
+ Sound.SC3.UGen.MachineListening: specPcile :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Base: twindex :: UGenId -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Monadic: twindex :: (UId m) => UGen -> UGen -> UGen -> m UGen
+ Sound.SC3.UGen.Noise.Unsafe: brownNoise :: Rate -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: clipNoise :: Rate -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: coinGate :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: dust :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: dust2 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: expRand :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: grayNoise :: Rate -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: iRand :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfClipNoise :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfNoise0 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfNoise1 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfNoise2 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfdClipNoise :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfdNoise0 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfdNoise1 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfdNoise2 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: lfdNoise3 :: Rate -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: linRand :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: nRand :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: pinkNoise :: Rate -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: rand :: UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: tExpRand :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: tRand :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: tiRand :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: twindex :: UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.Noise.Unsafe: whiteNoise :: Rate -> UGen
+ Sound.SC3.UGen.Rate: ar :: Rate
+ Sound.SC3.UGen.Rate: dr :: Rate
+ Sound.SC3.UGen.Rate: ir :: Rate
+ Sound.SC3.UGen.Rate: kr :: Rate
+ Sound.SC3.UGen.UGen: check_input :: UGen -> UGen
+ Sound.SC3.UGen.UGen: controlOperatingRate :: UGen -> Rate
+ Sound.SC3.UGen.UGen: instance Enum UGen
+ Sound.SC3.UGen.UGen: instance Floating UGen
+ Sound.SC3.UGen.UGen: instance Fractional UGen
+ Sound.SC3.UGen.UGen: instance Integral UGen
+ Sound.SC3.UGen.UGen: instance Num UGen
+ Sound.SC3.UGen.UGen: instance Ord UGen
+ Sound.SC3.UGen.UGen: instance Random UGen
+ Sound.SC3.UGen.UGen: instance Real UGen
+ Sound.SC3.UGen.UGen: isConstant :: UGen -> Bool
+ Sound.SC3.UGen.UGen: isControl :: UGen -> Bool
+ Sound.SC3.UGen.UGen: isMCE :: UGen -> Bool
+ Sound.SC3.UGen.UGen: isMRG :: UGen -> Bool
+ Sound.SC3.UGen.UGen: isProxy :: UGen -> Bool
+ Sound.SC3.UGen.UGen: isUGen :: UGen -> Bool
+ Sound.SC3.UGen.UGen: is_sink :: UGen -> Bool
+ Sound.SC3.UGen.UGen: mceChannel :: Int -> UGen -> UGen
+ Sound.SC3.UGen.UGen: mceChannels :: UGen -> [UGen]
+ Sound.SC3.UGen.UGen: mceDegree :: UGen -> Int
+ Sound.SC3.UGen.UGen: mceEdit :: ([UGen] -> [UGen]) -> UGen -> UGen
+ Sound.SC3.UGen.UGen: mceExpand :: UGen -> UGen
+ Sound.SC3.UGen.UGen: mceExtend :: Int -> UGen -> [UGen]
+ Sound.SC3.UGen.UGen: mceReverse :: UGen -> UGen
+ Sound.SC3.UGen.UGen: mceTransform :: UGen -> UGen
+ Sound.SC3.UGen.UGen: mceTranspose :: UGen -> UGen
+ Sound.SC3.UGen.UGen: mkBinaryOperator :: Binary -> (Double -> Double -> Double) -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.UGen: mkFilter :: String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkFilterId :: UGenId -> String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkFilterKeyed :: String -> Int -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkFilterMCE :: String -> [UGen] -> UGen -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkFilterMCEId :: UGenId -> String -> [UGen] -> UGen -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkInfo :: String -> UGen
+ Sound.SC3.UGen.UGen: mkOperator :: String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkOsc :: Rate -> String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkOscId :: UGenId -> Rate -> String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkOscMCE :: Rate -> String -> [UGen] -> UGen -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkOscMCEId :: UGenId -> Rate -> String -> [UGen] -> UGen -> Int -> UGen
+ Sound.SC3.UGen.UGen: mkUGen :: Rate -> String -> [UGen] -> [Output] -> Special -> Maybe UGenId -> UGen
+ Sound.SC3.UGen.UGen: mkUnaryOperator :: Unary -> (Double -> Double) -> UGen -> UGen
+ Sound.SC3.UGen.UGen: mk_filter :: Maybe UGenId -> String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mk_filter_mce :: Maybe UGenId -> String -> [UGen] -> UGen -> Int -> UGen
+ Sound.SC3.UGen.UGen: mk_osc :: Maybe UGenId -> Rate -> String -> [UGen] -> Int -> UGen
+ Sound.SC3.UGen.UGen: mk_osc_mce :: Maybe UGenId -> Rate -> String -> [UGen] -> UGen -> Int -> UGen
+ Sound.SC3.UGen.UGen: proxify :: UGen -> UGen
+ Sound.SC3.UGen.UGen: rateOf :: UGen -> Rate
- Sound.SC3.Server.Synthdef: NodeK :: NodeId -> Rate -> Name -> Double -> Node
+ Sound.SC3.Server.Synthdef: NodeK :: NodeId -> Rate -> String -> Double -> Node
- Sound.SC3.Server.Synthdef: NodeU :: NodeId -> Rate -> Name -> [FromPort] -> [Output] -> Special -> Maybe UGenId -> Node
+ Sound.SC3.Server.Synthdef: NodeU :: NodeId -> Rate -> String -> [FromPort] -> [Output] -> Special -> Maybe UGenId -> Node
- Sound.SC3.Server.Synthdef: node_k_name :: Node -> Name
+ Sound.SC3.Server.Synthdef: node_k_name :: Node -> String
- Sound.SC3.Server.Synthdef: node_u_name :: Node -> Name
+ Sound.SC3.Server.Synthdef: node_u_name :: Node -> String
- Sound.SC3.UGen.Demand: tDuty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen
+ Sound.SC3.UGen.Demand: tDuty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen -> UGen
- Sound.SC3.UGen.MachineListening: onsets :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+ Sound.SC3.UGen.MachineListening: onsets :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
- Sound.SC3.UGen.UGen: Control :: Rate -> Name -> Double -> UGen
+ Sound.SC3.UGen.UGen: Control :: Rate -> String -> Double -> UGen
- Sound.SC3.UGen.UGen: Primitive :: Rate -> Name -> [UGen] -> [Output] -> Special -> Maybe UGenId -> UGen
+ Sound.SC3.UGen.UGen: Primitive :: Rate -> String -> [UGen] -> [Output] -> Special -> Maybe UGenId -> UGen
- Sound.SC3.UGen.UGen: control :: Rate -> Name -> Double -> UGen
+ Sound.SC3.UGen.UGen: control :: Rate -> String -> Double -> UGen
- Sound.SC3.UGen.UGen: controlName :: UGen -> Name
+ Sound.SC3.UGen.UGen: controlName :: UGen -> String
- Sound.SC3.UGen.UGen: ugenName :: UGen -> Name
+ Sound.SC3.UGen.UGen: ugenName :: UGen -> String
Files
- Help/Graphs/adso.lhs +31/−0
- Help/Graphs/aleatoric-quartet.lhs +0/−25
- Help/Graphs/analog-bubbles.lhs +0/−5
- Help/Graphs/babbling-brook.lhs +0/−9
- Help/Graphs/bottle.lhs +19/−0
- Help/Graphs/bowed-string.lhs +0/−14
- Help/Graphs/ccomb.lhs +0/−13
- Help/Graphs/cricket.lhs +0/−14
- Help/Graphs/cut-outs.lhs +0/−13
- Help/Graphs/cymbalism.lhs +4/−3
- Help/Graphs/demanding-studies.lhs +3/−3
- Help/Graphs/dial-history.lhs +3/−4
- Help/Graphs/diffraction.lhs +20/−0
- Help/Graphs/discretion.lhs +0/−13
- Help/Graphs/drummer.lhs +0/−10
- Help/Graphs/e-lamell.lhs +50/−0
- Help/Graphs/eggcrate.lhs +1/−3
- Help/Graphs/f-lets.lhs +23/−0
- Help/Graphs/feedr.lhs +20/−0
- Help/Graphs/fm-iter.lhs +14/−0
- Help/Graphs/fm-kltr.lhs +46/−0
- Help/Graphs/forest-sounds.lhs +0/−9
- Help/Graphs/fwalk.lhs +1/−1
- Help/Graphs/h-chatter.lhs +0/−22
- Help/Graphs/harmonic-swimming.lhs +0/−12
- Help/Graphs/hh-808.lhs +1/−2
- Help/Graphs/implosion.lhs +0/−19
- Help/Graphs/k-ppr.lhs +0/−18
- Help/Graphs/klink.lhs +0/−12
- Help/Graphs/lf-pulses.lhs +0/−7
- Help/Graphs/lfo-modulation.lhs +0/−5
- Help/Graphs/lg-timed.lhs +36/−0
- Help/Graphs/lin-sosc.lhs +53/−0
- Help/Graphs/modal-space.lhs +5/−5
- Help/Graphs/moto-rev.lhs +0/−4
- Help/Graphs/mouse-clatter.lhs +2/−4
- Help/Graphs/nharm.lhs +20/−0
- Help/Graphs/one-line.lhs +0/−5
- Help/Graphs/oscillator-cluster.lhs +0/−24
- Help/Graphs/pattern-buffer.lhs +1/−1
- Help/Graphs/police-state.lhs +0/−16
- Help/Graphs/record-scratcher.lhs +3/−5
- Help/Graphs/rm-octaver.lhs +7/−0
- Help/Graphs/rzblp.lhs +22/−0
- Help/Graphs/s-chirp.lhs +2/−25
- Help/Graphs/sample-and-hold-liquidities.lhs +0/−9
- Help/Graphs/scratchy.lhs +0/−4
- Help/Graphs/shifting-pulses.lhs +0/−11
- Help/Graphs/sosc-lp.lhs +30/−0
- Help/Graphs/sprinkler.lhs +0/−4
- Help/Graphs/sweepy-noise.lhs +4/−4
- Help/Graphs/tgb.lhs +30/−0
- Help/Graphs/tgr-rpr.lhs +37/−0
- Help/Graphs/theremin.lhs +2/−11
- Help/Graphs/three-cpsw.lhs +0/−10
- Help/Graphs/tipnso.lhs +12/−0
- Help/Graphs/tr-out.lhs +20/−0
- Help/Graphs/trkl.lhs +24/−0
- Help/Graphs/trmlo.lhs +41/−0
- Help/Graphs/tsort.lhs +0/−7
- Help/Graphs/vlc-distrtn.lhs +130/−0
- Help/Graphs/voscil.lhs +28/−0
- Help/Graphs/what-was-i-thinking.lhs +0/−15
- Help/Graphs/wial.lhs +19/−0
- Help/Graphs/wind-metals.lhs +0/−13
- Help/Graphs/xy-interference.lhs +0/−9
- Help/Tutorial/Tutorial.lhs +13/−5
- Help/UGen/Buffer/bufDur.help.lhs +1/−1
- Help/UGen/Control/mrg2.help.lhs +26/−0
- Help/UGen/Demand/dswitch.help.lhs +32/−0
- Help/UGen/Demand/tDuty.help.lhs +10/−7
- Help/UGen/External/atsNoiSynth.help.lhs +38/−0
- Help/UGen/External/atsSynth.help.lhs +29/−0
- Help/UGen/External/ay.help.lhs +68/−0
- Help/UGen/External/lpcSynth.help.lhs +44/−0
- Help/UGen/External/lpcVals.help.lhs +1/−0
- Help/UGen/External/membraneCircle.help.lhs +25/−0
- Help/UGen/External/membraneHexagon.help.lhs +1/−0
- Help/UGen/External/pv_Invert.help.lhs +9/−0
- Help/UGen/External/stkBowed.help.lhs +4/−0
- Help/UGen/External/stkFlute.help.lhs +5/−0
- Help/UGen/External/stkMandolin.help.lhs +25/−0
- Help/UGen/External/stkModalBar.help.lhs +25/−0
- Help/UGen/External/stkShakers.help.lhs +24/−0
- Help/UGen/External/vosim.help.lhs +32/−0
- Help/UGen/Filter/freeVerb.help.lhs +24/−0
- Help/UGen/IO/lagIn.help.lhs +8/−0
- Help/UGen/IO/lagIn.lhs +0/−8
- Help/UGen/IO/soundIn.help.lhs +12/−0
- Help/UGen/Information/sampleRate.help.lhs +7/−0
- Help/UGen/MachineListening/beatTrack.help.lhs +57/−0
- Help/UGen/MachineListening/onsets.help.lhs +100/−0
- Help/UGen/Oscillator/tChoose.help.lhs +16/−0
- Help/UGen/Oscillator/twChoose.help.lhs +5/−5
- Help/UGen/Oscillator/twindex.help.lhs +5/−5
- Help/UGen/Trigger/sendTrig.help.lhs +24/−0
- Help/UGen/Trigger/sendTrig.lhs +0/−24
- Help/hsc3.help.lhs +35/−1
- README +4/−3
- Sound/SC3/Server/Command.hs +63/−55
- Sound/SC3/Server/NRT.hs +2/−2
- Sound/SC3/Server/Play.hs +2/−2
- Sound/SC3/Server/Status.hs +33/−17
- Sound/SC3/Server/Synthdef.hs +25/−26
- Sound/SC3/Server/Utilities.hs +4/−4
- Sound/SC3/UGen.hs +6/−8
- Sound/SC3/UGen/Analysis.hs +2/−3
- Sound/SC3/UGen/Buffer.hs +18/−19
- Sound/SC3/UGen/Chaos.hs +2/−3
- Sound/SC3/UGen/Composite.hs +37/−17
- Sound/SC3/UGen/Demand.hs +12/−10
- Sound/SC3/UGen/Demand/Base.hs +8/−5
- Sound/SC3/UGen/Demand/Monadic.hs +6/−2
- Sound/SC3/UGen/Demand/Unsafe.hs +62/−0
- Sound/SC3/UGen/Enum.hs +1/−1
- Sound/SC3/UGen/Envelope.hs +9/−11
- Sound/SC3/UGen/Envelope/Construct.hs +4/−5
- Sound/SC3/UGen/External.hs +68/−0
- Sound/SC3/UGen/External/ATS.hs +97/−0
- Sound/SC3/UGen/External/LPC.hs +61/−0
- Sound/SC3/UGen/FFT.hs +1/−4
- Sound/SC3/UGen/FFT/Base.hs +6/−3
- Sound/SC3/UGen/FFT/Monadic.hs +2/−2
- Sound/SC3/UGen/FFT/Unsafe.hs +17/−0
- Sound/SC3/UGen/Filter.hs +68/−65
- Sound/SC3/UGen/Granular.hs +2/−3
- Sound/SC3/UGen/Graph/Naive.hs +0/−73
- Sound/SC3/UGen/IO.hs +8/−8
- Sound/SC3/UGen/Information.hs +12/−13
- Sound/SC3/UGen/MachineListening.hs +22/−7
- Sound/SC3/UGen/Math.hs +1/−3
- Sound/SC3/UGen/Noise/Base.hs +16/−13
- Sound/SC3/UGen/Noise/Monadic.hs +8/−4
- Sound/SC3/UGen/Noise/Unsafe.hs +110/−0
- Sound/SC3/UGen/Oscillator.hs +4/−5
- Sound/SC3/UGen/Panner.hs +3/−4
- Sound/SC3/UGen/Rate.hs +20/−9
- Sound/SC3/UGen/UGen.hs +327/−28
- Sound/SC3/UGen/UGen/Construct.hs +0/−136
- Sound/SC3/UGen/UGen/Lift.hs +41/−0
- Sound/SC3/UGen/UGen/MCE.hs +0/−60
- Sound/SC3/UGen/UGen/Math.hs +0/−83
- Sound/SC3/UGen/UGen/Predicate.hs +0/−34
- Sound/SC3/UGen/Unsafe.hs +7/−0
- Sound/SC3/UGen/Utilities.hs +28/−34
- hsc3.cabal +497/−445
+ Help/Graphs/adso.lhs view
@@ -0,0 +1,31 @@+adso (rd)++> let { rrand l r = getStdRandom (randomR (l, r))+> ; rrand_l j l r = replicateM j (rrand l r)+> ; threadPause :: Double -> IO ()+> ; threadPause t = when (t>0) (threadDelay (floor (t * 1e6)))+> ; n = 24+> ; adso = let { get b j = let k = mce [0 .. constant j - 1]+> in bufRdN 1 kr b k NoLoop+> ; m = sinOsc kr (get 3 n) 0+> ; f = midiCPS (get 0 n) * (m * get 4 n + 1)+> ; l = get 2 n+> ; g = get 1 n }+> in out 0 (mix (pan2 (sinOsc ar f 0) l g))+> ; pattern fd t = do { z <- do { l <- rrand 22 48+> ; r <- rrand 54 122+> ; replicateM n (rrand l r) }+> ; send fd (b_setn1 0 0 z)+> ; let rn i l r = do { d <- rrand_l n l r+> ; send fd (b_setn1 i 0 d) }+> in do { rn 1 0 0.1+> ; rn 2 (-1) 1+> ; rn 3 2 12+> ; rn 4 0.001 0.0075+> ; rn 5 1 24+> ; rn 6 0.05 2.4 }+> ; threadPause t } }+> in withSC3 (\fd -> do { mapM_ (\i -> async fd (b_alloc i n 1)) [0..6]+> ; play fd adso+> ; mapM_ (pattern fd) =<< rrand_l 32 0.025 0.75 +> ; reset fd })
Help/Graphs/aleatoric-quartet.lhs view
@@ -44,28 +44,3 @@ ; var g = Mix.fill(4, mk_s) ; 5.do({ g = rapf.value(g) }) ; Out.ar(0, LeakDC.ar(g, 0.995)) }.play--(let* ((amp 0.4)- (density (MouseX kr 0.01 1 0 0.1))- (dmul (Mul (Recip density) (Mul 0.5 amp)))- (dadd (Add (Neg dmul) amp))- (rapf (lambda (i)- (let ((r (Mce (rand 0 0.05) (rand 0 0.05))))- (AllpassN i 0.05 r 1))))- (mk_f (lambda ()- (let* ((i0 (IRand 0 2))- (r0 (Select i0 (Mce 1 0.5 0.25)))- (r1 (Rand -30 30))- (n0 (LFNoise0 kr r0))- (m (Lag (Round (MulAdd n0 7 (Add 66 r1)) 1) 0.2)))- (MIDICPS m))))- (mk_s (lambda (_)- (let* ((f (Recip (mk_f)))- (r (Rand -1 1))- (n0 (PinkNoise ar))- (n1 (LFNoise1 kr 8))- (x (Mul n0 (Max 0 (MulAdd n1 dmul dadd)))))- (Pan2 (CombL x 0.02 f 3) r 1))))- (g (mix/fill 4 mk_s)))- (for-each (lambda (_) (set! g (rapf g))) (list 0 1 2 3))- (audition (Out 0 (LeakDC g 0.995))))
Help/Graphs/analog-bubbles.lhs view
@@ -9,8 +9,3 @@ ; var f = LFSaw.kr(0.4, 0, 24, o) ; var s = SinOsc.ar(f.midicps, 0, 0.04) ; Out.ar(0, CombN.ar(s, 0.2, 0.2, 4)) }.play--(let* ((o (MulAdd (LFSaw kr (Mce 8 7.23) 0) 3 80))- (f (MulAdd (LFSaw kr 0.4 0) 24 o))- (s (Mul (SinOsc ar (MIDICPS f) 0) 0.04)))- (audition (Out 0 (CombN s 0.2 0.2 4))))
Help/Graphs/babbling-brook.lhs view
@@ -16,13 +16,4 @@ ; var y = b.value(20, 800, 1000, 0.010) ! 2 ; Out.ar(0, x + y) }.play -(let* ((b (lambda (f m a g)- (let* ((n1 (BrownNoise ar))- (n2 (BrownNoise ar))- (n3 (MulAdd (LPF n2 f) m a)))- (Mul (RHPF (OnePole n1 0.99) n3 0.03) g))))- (x (clone 2 (b 14 400 500 0.006)))- (y (clone 2 (b 20 800 1000 0.010))))- (audition (Out 0 (Add x y))))- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+ Help/Graphs/bottle.lhs view
@@ -0,0 +1,19 @@+bottle (sc)++> do { freq <- rand 220 880+> ; wn <- whiteNoise ar+> ; pn <- pinkNoise ar+> ; let { chain n f = foldl (>=>) return (replicate n f)+> ; perc = envPerc 0.1 0.6+> ; ex = envGen kr 1 1 0 1 DoNothing perc * wn * 0.02+> ; flute = ringz ex freq 0.3+> ; r = resonz pn (5 + (freq / 2)) 0.1+> ; breath = envGen kr 1 1 0 1 DoNothing perc * r+> ; rapf i = do { x <- linRand 0.001 0.1 (-1)+> ; return (i + allpassN i 0.1 x 1.0 * 0.5) }+> ; cls i = let { en = replicate 3 (EnvNum (-4))+> ; l = envLinen 0.01 3.0 1.0 1 en+> ; z = (breath + i) * envGen kr 1 1 0 1 RemoveSynth l }+> in mce2 z z }+> in do { f <- (chain 2 rapf) flute+> ; audition (out 0 (cls f)) } }
Help/Graphs/bowed-string.lhs view
@@ -31,17 +31,3 @@ ; var d = `[Array.series(12, f, f), Array.geom(12, 1, r1), r2] ; var k = Klank.ar(d, x) ; Out.ar(0, (k * 0.1).softclip) }.play--(let* ((root 5)- (scale (map (lambda (n) (+ n root)) (list 0 2 4 5 7 9 11)))- (oct (list 24 36 48 60 72 84))- (f (midicps (+ (choose scale) (choose oct))))- (n0 (clone 2 (BrownNoise ar)))- (r0 (ExpRand 0.125 0.5))- (n1 (LFNoise1 kr r0))- (r1 (rand 0.7 0.9))- (r2 (list-tabulate 12 (lambda (_) (Rand 1.0 3.0))))- (x (Mul* n0 0.007 (Max 0 (MulAdd n1 0.6 0.4))))- (d (klank-data (iota 12 f f) (geom 12 1 r1) r2))- (k (Klank x 1 0 1 d)))- (audition (Out 0 (SoftClip (Mul k 0.1)))))
Help/Graphs/ccomb.lhs view
@@ -23,16 +23,3 @@ ; CombC.ar(x, flwr.reciprocal, f.reciprocal, m.range(1, 8)) } } ; var t = Dust.kr([0.75, 0.35]) ; Out.ar(0, Mix.fill(12, spart.value(t)) * 0.1) }.play--(let* ((rng (lambda (u l r) (LinLin u -1 1 l r)))- (lwr 48)- (flwr (midicps 48))- (spart (lambda (t)- (let* ((n (rng (LFNoise2 kr 0.1) lwr 72))- (e (Decay2 t 0.01 (TRand 0.05 0.75 t)))- (x (Mul (WhiteNoise ar) e))- (m (LFNoise2 kr 0.1))- (f (Lag (MIDICPS n) 0.25)))- (CombC x (Recip flwr) (Recip f) (rng m 1.0 8.0)))))- (t (Dust ar (Mce 0.9 0.8))))- (audition (Out 0 (mix/fill 7 (lambda (_) (Mul (spart t) 0.1))))))
Help/Graphs/cricket.lhs view
@@ -17,17 +17,3 @@ ; var f = SinOsc.kr(r2, 0) * e * r3 ; var r4 = Array.fill(2, { TRand.kr(2220, 2227, t) }) ; Out.ar(0, SinOsc.ar(r4, 0) * f * 0.25) }.play--(let* ((mRand (lambda (l r)- (Mce (Rand l r) (Rand l r))))- (mTRand (lambda (l r t)- (Mce (TRand l r t) (TRand l r t))))- (r1 (mRand 10 13))- (r2 (mRand 10 13))- (r3 (mRand 4 7))- (t (Impulse kr 0.7 0))- (e (Decay2 (Impulse kr r1 0) 0.001 0.005))- (f (Mul* (SinOsc kr r2 0) e r3))- (r4 (mTRand 2220 2227 t)))- (audition (Out 0 (Mul* (SinOsc ar r4 0) f 0.25))))-
Help/Graphs/cut-outs.lhs view
@@ -22,16 +22,3 @@ ; var b = TRand.kr(0, 1, Dust.kr(8)) ; Out.kr(0, b) ; Out.ar(0, s.clip2(In.kr(0, 1)) * 0.25) }.play--(let* ((t (Mul (Impulse ar 22 0) (Add (SinOsc kr 0.5 0) 1)))- (x (MouseX kr 0.005 0.12 1 0.1))- (y (MouseY kr 0.01 0.52 1 0.1))- (n (lambda (_)- (let* ((n1 (LFNoise0 kr 2))- (n2 (CoinGate (Add* 0.05 (Mul n1 0.4) y) (Mul t 0.5)))- (n3 (TExpRand (Mce 500 900) 1600 t)))- (Ringz n2 n3 x))))- (s (mix/fill 3 n))- (b (TRand 0 1 (Dust kr 8))))- (audition (Mrg (Out 0 b)- (Out 0 (Mul (Clip2 s (In 1 kr 0)) 0.25)))))
Help/Graphs/cymbalism.lhs view
@@ -21,6 +21,7 @@ ; var rt = Array.fill(p, { 1 + Rand.new(0, 4) }) ; `[f, nil, rt] } ; var z = Array.fill(2, y)-; var t = Impulse.ar(Rand.new(0, 3) + 0.5)-; var n = WhiteNoise.ar(0.03)-; Out.ar(0, Klank.ar(z, Decay.ar(t, 0.004, n))) }.play+; var t = Impulse.ar(Rand.new(0, 3) + 0.5, 0)+; var n = WhiteNoise.ar() * 0.03+; var s = Decay.ar(t, 0.004) * n+; Out.ar(0, Klank.ar(z, s)) }.play
Help/Graphs/demanding-studies.lhs view
@@ -2,17 +2,17 @@ > do { s1 <- drand dinf (mce [72, 75, 79, 82]) > ; s2 <- drand 1 (mce [82, 84, 86])-> ; s2 <- dseq dinf (mce [72, 75, 79, s2])+> ; s3 <- dseq dinf (mce [72, 75, 79, s2]) > ; let { x = mouseX KR 5 13 Linear 0.2 > ; tr = impulse KR x 0-> ; f = demand tr 0 (mce [midiCPS (s1 - 12), midiCPS s2])+> ; f = demand tr 0 (mce [midiCPS (s1 - 12), midiCPS s3]) > ; o1 = sinOsc AR (f + mce2 0 0.7) 0 > ; o2 = saw AR (f + mce2 0 0.7) * 0.3 > ; o3 = cubed (distort (log (distort (o1 + o2)))) } > in audition (out 0 (o3 * 0.1)) } { var s1 = Drand.new([72, 75, 79, 82], inf)-; var s2 = Drand.new([82, 84, 86])+; var s2 = Drand.new([82, 84, 86], 1) ; var s3 = Dseq.new([72, 75, 79, s2], inf) ; var x = MouseX.kr(5, 13, 'linear', 0.2) ; var tr = Impulse.kr(x, 0)
Help/Graphs/dial-history.lhs view
@@ -13,7 +13,7 @@ > ; g1 <- grayNoise AR > ; g2 <- grayNoise AR > ; d <- lfdNoise3 KR 0.5-> ; let { tr = trig (tDuty KR rate 0 DoNothing q) 0.09+> ; let { tr = trig (tDuty KR rate 0 DoNothing q 1) 0.09 > ; pat = latch tr tr > ; x = mouseX KR 0 1 Linear 0.2 > ; h = hasher (pat * x)@@ -22,9 +22,8 @@ > ; dial = select both (mce_r (transpose mfv)) > ; sig = sinOsc AR dial 0 * 0.05 * tr > ; dsig = delayN sig 0.2 (range d 0 0.01)-> ; hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000-> ; z = silent 1 }-> in audition (mce_mrg (out 0 (mce2 z (dsig + hiss)))) }+> ; hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000 }+> in audition (out 0 (dsig + hiss)) } { var mfv = [[697, 770, 852, 941], [1209, 1336, 1477, 1633]] ; var numbers = [[3, 1]] ++ {: [a, b], a <- (0..2), b <- (0..2) }.all
+ Help/Graphs/diffraction.lhs view
@@ -0,0 +1,20 @@+diffraction (rd)++> let { p = let { x = mouseX kr 0.001 0.02 Exponential 0.1+> ; y = mouseY kr 120 400 Exponential 0.1 }+> in do { f <- fmap (* mce2 32 64) (lfNoise0 kr 4)+> ; w <- fmap (* x) (lfNoise0 kr 32)+> ; z <- fmap (* 0.1) (lfNoise0 kr 2)+> ; m <- lfNoise0 kr 6+> ; let s = pulse ar f w+> in return (resonz s (y + z) (m * 0.4 + 0.8) * 0.5) }+> ; q = do { n <- lfNoise0 kr 128+> ; s <- p+> ; return (combN s 0.2 (n * 0.1 + 0.1) 3) }+> ; r = let { x = mouseX kr 0.75 1.25 Exponential 0.1+> ; y = mouseY kr 0.25 1 Exponential 0.1+> ; f _ = do { fr <- fmap (* x) (rand 50 59)+> ; am <- fmap (* y) (rand 0.04 0.16)+> ; return (sinOsc ar fr 0 * am) } }+> in liftM2 mce2 (mixFillM 16 f) (mixFillM 12 f) }+> in audition . (out 0) . sum =<< sequence [p, q, r]
Help/Graphs/discretion.lhs view
@@ -10,16 +10,3 @@ > ; a_ = mkls [(0, 0), (0.33, a), (1, 0)] t } > in return (saw AR f_ * a_) } } > in audition . out 0 . mix =<< clone 8 part--(let* ((mkls (lambda (bp t)- (EnvGen kr 1 1 0 1 removeSynth (env/bp bp t 1))))- (part (lambda (_)- (let* ((f1 (clone 2 (Rand 50 55)))- (f2 (clone 2 (Rand 50 65)))- (f3 (clone 2 (Rand 50 55)))- (a (clone 2 (Rand 0.01 0.035)))- (t 21)- (f_ (mkls (list 0.0 f1 0.33 f2 1.0 f3) t))- (a_ (mkls (list 0 0 0.33 a 1 0) t)))- (Mul (Saw ar f_) a_)))))- (audition (Out 0 (mix/fill 8 part))))
Help/Graphs/drummer.lhs view
@@ -20,13 +20,3 @@ ; var bass = SinOsc.ar(60, 0) * Decay2.ar(tr_4, 0.005, 0.5) ; var hihat = HPF.ar(n, 10000) * Decay2.ar(tr, 0.005, 0.5) ; Out.ar(0, Pan2.ar(snare + bass + hihat, 0, 0.4)) }.play--(let* ((tempo 4)- (n (WhiteNoise ar))- (tr (Impulse ar tempo 0))- (tr_2 (PulseDivider tr 4 2))- (tr_4 (PulseDivider tr 4 0))- (snare (Mul n (Decay2 tr_2 0.005 0.5)))- (bass (Mul (SinOsc ar 60 0) (Decay2 tr_4 0.005 0.5)))- (hihat (Mul (HPF n 10000) (Decay2 tr 0.005 0.5))))- (audition (Out 0 (Pan2 (Add* snare bass hihat) 0 0.4))))
+ Help/Graphs/e-lamell.lhs view
@@ -0,0 +1,50 @@+e-lamell (rd)++> let { rrand l r = getStdRandom (randomR (l, r))+> ; i_rrand l r = return . floorE =<< rrand l r+> ; exp_rrand a b = do { n <- rrand 0 1+> ; let r = b / a +> in return ((r ** n) * a) }+> ; choose l = return . (l !!) =<< rrand 0 (length l - 1)+> ; threadPause :: Double -> IO ()+> ; threadPause t = when (t>0) (threadDelay (floor (t * 1e6)))+> ; sendSynth fd n u = async fd (d_recv (synthdef n u))+> ; e_lamell = let { ctl s v = Control KR s v+> ; f = ctl "f" 440+> ; n = ctl "n" 12+> ; d = ctl "d" 0.1+> ; l = ctl "l" 0+> ; a = ctl "a" 1 }+> in do { t <- tChoose 1 (mce2 1 32)+> ; let { h = line ar n t d DoNothing+> ; s = blip ar f h+> ; e_d = envPerc 0.005 d+> ; e = envGen ar 1 a 0 1 RemoveSynth e_d }+> in return (out 0 (pan2 s l e)) }+> ; r_note o p = do { oe <- choose o+> ; pe <- choose p+> ; return (oe * 12 + pe) }+> ; l_sel = r_note [2, 3] [0]+> ; h_sel = r_note [2, 3, 4] [0]+> ; mk_s_new f n d a l = s_new "blip" (-1) AddToTail 1+> [("f", f)+> ,("n", n)+> ,("d", d)+> ,("a", a)+> ,("l", l)]+> ; pattern fd = do { p <- do { f <- liftM midiCPS l_sel+> ; n <- rrand 2 36+> ; d <- exp_rrand 0.01 0.4+> ; a <- rrand 0 0.75+> ; l <- rrand (-1) 1+> ; return (mk_s_new f n d a l) }+> ; q <- do { f <- liftM midiCPS h_sel+> ; n <- rrand 2 36+> ; d <- exp_rrand 0.01 0.4+> ; a <- choose [0, 0.25, 0.5, 1]+> ; l <- rrand (-1) 1+> ; return (mk_s_new f n d a l) }+> ; send fd (Bundle (-1) [p, q]) +> ; threadPause 0.1 } }+> in withSC3 (\fd -> do { sendSynth fd "blip" =<< e_lamell+> ; replicateM_ 64 (pattern fd) })
Help/Graphs/eggcrate.lhs view
@@ -3,9 +3,7 @@ > let { cosu = cos . (* pi) > ; sinu = sin . (* pi) > ; eggcrate u v = cosu u * sinu v-> ; tChoose t a = do { n <- tiRand 0 (fromIntegral (length a)) t-> ; return (select n (mce a)) }-> ; p = [64, 72, 96, 128, 256, 6400, 7200, 8400, 9600] }+> ; p = mce [64, 72, 96, 128, 256, 6400, 7200, 8400, 9600] } > in do { [x, y] <- replicateM 2 (brownNoise KR) > ; t <- dust KR 2.4 > ; [f0, f1] <- replicateM 2 (tChoose t p)
+ Help/Graphs/f-lets.lhs view
@@ -0,0 +1,23 @@+f-lets (rd)++> let { f_let t g j n f = +> let pd = pulseDivider t j 0+> in do { r0 <- tiRand (mce2 2 1) n pd+> ; r1 <- tRand 0.01 0.04 pd+> ; r2 <- tRand 0.05 0.10 pd+> ; return (formlet pd (f * r0) r1 r2 * g) }+> ; mk_n t = do { r0 <- tRand 0 1 t+> ; r1 <- tRand 0 1 t+> ; r2 <- tRand 0 1 t+> ; r3 <- tRand 0 1 t+> ; r4 <- coinGate 0.2 t+> ; sequence+> [ f_let t 0.15 2 9 (mce2 200 400)+> , f_let t 0.25 2 9 (mce2 (200 + r0) (400 + r1))+> , f_let t 0.05 4 5 (mce2 25 50)+> , f_let t 0.15 4 5 (mce2 (25 + r2) (50 + r3))+> , let lr = fmap (* (latch r4 t))+> in lr (f_let t 0.5 1 16 (mce2 300 600)) ] }+> ; tr = impulse ar 24 0 }+> in do { n <- lfNoise0 kr 2+> ; audition . out 0 . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr }
+ Help/Graphs/feedr.lhs view
@@ -0,0 +1,20 @@+feedr (rd)+warning: input/output feedback loop++> let { delayWr b i = recordBuf b 0 1 0 1 Loop 0 i+> ; tap nc b dt = playBuf nc b 1 0 (dt * (- sampleRate)) Loop+> ; dl = 6+> ; feedr n = do { t <- replicateM n (rand 0.0 (constant dl))+> ; g <- replicateM n (rand 0.4 1.0)+> ; f <- replicateM n (rand 0.9 0.95)+> ; let { d = zipWith (\p q -> tap 2 10 p * q) t g+> ; x = mouseX kr 0.02 1.0 Exponential 0.1+> ; s = clip2 (leakDC (hpf (sum d) 20) 0.995) 1+> ; i = soundIn (mce2 0 1)+> ; r = i + sum (map (* x) (zipWith (*) d f)) }+> in return (mrg [out 0 s, delayWr 10 r]) } }+> in withSC3 (\fd -> do { nf <- fmap (* dl) (serverSampleRateActual fd)+> ; send fd (b_alloc 10 (floor nf) 2)+> ; audition =<< feedr 18 })++> withSC3 (\fd -> send fd (b_zero 10))
+ Help/Graphs/fm-iter.lhs view
@@ -0,0 +1,14 @@+fm-iter (rd)++> let { t0 = impulse AR (recip 0.30) 0+> ; t1 = tDelay t0 0.15+> ; t = mce2 t0 t1 }+> in do { k <- tRand 56 57 t+> ; i <- tRand 40 480 t+> ; j <- tRand (-1) 1 t+> ; let { c = midiCPS k+> ; m = midiCPS (k + 1 + j)+> ; s = envPerc 0.01 0.9+> ; e = envGen AR t 0.1 0 1 RemoveSynth s+> ; f = sinOsc AR c 0 * i + m }+> in audition (out 0 (sinOsc AR f 0 * e)) }
+ Help/Graphs/fm-kltr.lhs view
@@ -0,0 +1,46 @@+fm-kltr (rd)++> let { rrand l r = getStdRandom (randomR (l, r))+> ; threadPause :: Double -> IO ()+> ; threadPause t = when (t>0) (threadDelay (floor (t * 1e6)))+> ; gr =+> do { r1 <- rand 0.975 1.025+> ; r2 <- rand 0.5 1.5+> ; r3 <- rand 0.975 1.025+> ; r4 <- rand 0.75 1.25+> ; let { o = Control KR "out" 0+> ; t = Control KR "trig" 0+> ; a = Control KR "amp" 0.1+> ; d = Control KR "dur" 0.1+> ; f = Control KR "freq" 400.0+> ; i = Control KR "index" 40.0+> ; p = Control KR "pan" 0.0+> ; f2 = Control KR "freq2" 600+> ; ep = envPerc 0.01 d+> ; e = envGen AR 1 a 0 1 RemoveSynth ep+> ; so = sinOsc AR (xLine KR f (f * r1) d DoNothing) 0+> ; xl = xLine KR f2 (f2 * r3) d DoNothing+> ; m = so * line KR i (f * r2) d DoNothing + xl+> ; l = line KR p (p * r4) d DoNothing }+> in return (out o (pan2 (sinOsc AR m 0) l e)) }+> ; fm fd f ff a d i =+> do { r1 <- rrand (-1) 1+> ; r2 <- rrand (-1) 1+> ; send fd (s_new "fm" (-1) AddToTail 1+> [("freq", midiCPS f)+> ,("freq2", midiCPS ff + r1)+> ,("amp", a)+> ,("dur", d)+> ,("index", i)+> ,("pan", r2)]) }+> ; nd fd =+> do { ff <- rrand 48 96+> ; a <- rrand 0.1 0.4+> ; d <- rrand 1.2 7.2+> ; i <- rrand 240 1480+> ; t <- rrand 0.15 1.25+> ; fm fd 53 ff a d i+> ; threadPause t } }+> in withSC3 (\fd -> do { u <- gr+> ; async fd (d_recv (synthdef "fm" u))+> ; replicateM 32 (nd fd) })
Help/Graphs/forest-sounds.lhs view
@@ -12,13 +12,4 @@ ; BPF.ar(n1, o, 0.001) * 10 } ; Out.ar(0, Array.fill(2, insects)) }.play -(let ((insects- (lambda (_)- (let* ((n1 (BrownNoise ar))- (n2 (LFNoise2 kr 50))- (f (MulAdd n2 50 50))- (o (MulAdd (SinOsc kr f 0) 100 2000)))- (Mul (BPF n1 o 0.001) 10)))))- (audition (Out 0 (mce/fill 2 insects))))- sc-users, 2007-04-06
Help/Graphs/fwalk.lhs view
@@ -13,7 +13,7 @@ > ; fwalk r = do { t <- dust KR 3 > ; r1 <- tiRand 0 6 t > ; r2 <- tRand (-0.0001) 0.0001 t-> ; let { f = bufRdL 1 KR (MCE [0, 1]) r1 NoLoop+> ; let { f = bufRdL 1 KR (mce2 0 1) r1 NoLoop > ; f' = f + r2 > ; o1 = blip AR (midiCPS (r + f)) 12 > ; o2 = blip AR (midiCPS (r + f')) 12 }
Help/Graphs/h-chatter.lhs view
@@ -39,25 +39,3 @@ ; var o = Blip.ar(HenonN.ar(f, a, b, 0, 0).range(p, p * 2), h) ; Pan2.ar(o, l, g) * 0.35 } ; Out.ar(0, h0.value + h1.value) }.play--(let* ((wrp (lambda (i l r)- (let ((m (FDiv (Sub r l) 2)))- (MulAdd i m (Add l m)))))- (h0 (let* ((n (MulAdd (LFNoise0 kr 1) 5 5))- (a (MulAdd (LFNoise2 kr n) 0.20 1.20))- (b (MulAdd (LFNoise2 kr n) 0.15 0.15))- (f 40)- (h (HenonN ar (Mce f (Mul f 0.5)) a b 0 0)))- (Mul (Saw ar (MulAdd h 3200 1600)) 0.35)))- (h1 (let* ((n0 (LFNoise0 ar 32))- (n1 (LFNoise0 ar 2))- (a (MouseX kr 1.2 1.4 0 0.1))- (b (MouseY kr 0.2 0.3 0 0.1))- (h (wrp n0 1 32))- (p (wrp n1 2400 3200))- (l (wrp n1 -0.75 0.75))- (g (wrp n1 0.55 0.85))- (f 40)- (o (Blip ar (wrp (HenonN ar f a b 0 0) p (Mul p 2)) h)))- (Mul (Pan2 o l g) 0.35))))- (audition (Out 0 (Add h0 h1))))
Help/Graphs/harmonic-swimming.lhs view
@@ -20,15 +20,3 @@ ; var e = max(0, n * a + l) ; FSinOsc.ar(f * (h + 1), 0) * e } ; Out.ar(0, (0..p).collect(o).sum) }.play--(let* ((a 0.02)- (f 50)- (p 20)- (z 0)- (l (Line kr 0 (- a) 60 0))- (o (lambda (h)- (let* ((r (clone 2 (Rand 2 8)))- (n (LFNoise1 kr r))- (e (Max 0 (MulAdd n a l))))- (Mul (FSinOsc ar (* f (+ h 1)) 0) e)))))- (audition (Out 0 (mix (make-mce (map o (iota p)))))))
Help/Graphs/hh-808.lhs view
@@ -1,7 +1,6 @@ hh-808 (ryan at wabdo.com) -> let { freeVerb i mx room damp = mkFilter "FreeVerb" [i, mx, room, damp] 1-> ; time = 250+> let { time = 250 > ; freqs = [205.35, 304.41, 369.64, 522.71, 540.54, 812.21] > ; pulseEnv = let e = env [1.0, 0.6] [time] [EnvNum (-0.5)] 0 0 > in envGen AR 1 1 0 (1/1000) DoNothing e
Help/Graphs/implosion.lhs view
@@ -17,22 +17,3 @@ > ; l <- pmr_n KR n0 n1 0 0 d > ; a <- pmr_n KR 0.1 0.6 0 0 d > ; audition (out 0 (pan2 (saw AR f) l a)) }--(let* ((mkls (lambda (bp t)- (EnvGen kr 1 1 0 1 removeSynth (env/bp bp t 1))))- (mkrmp (lambda (l r t)- (mkls (list 0 l 1 r) t)))- (wrp (lambda (i l r)- (let ((m (FDiv (Sub r l) 2)))- (MulAdd i m (Add l m)))))- (pmr/n (lambda (rt l0 l1 r0 r1 d)- (let ((le (mkrmp l0 r0 d))- (re (mkrmp l1 r1 d)))- (wrp (WhiteNoise rt) le re))))- (d (Rand 7.5 13.5))- (f0 (Rand 10990 16220))- (f1 (Rand 9440 19550))- (f (pmr/n ar 440 f0 f1 f1 d))- (l (pmr/n kr (rand -1 0) (rand 0 1) 0 0 d))- (a (pmr/n kr 0.1 0.6 0 0 d)))- (audition (Out 0 (Pan2 (Saw ar f) l a))))
Help/Graphs/k-ppr.lhs view
@@ -30,21 +30,3 @@ ; var s1 = stream.value(3140, 6240, 0.050, 0.005, 0.15) ; var s2 = stream.value(0400, 9000, 0.005, 0.005, 0.15) ; Out.ar(0, Array.fill(2, s1) + Array.fill(2, s2)) }.play--(let* ((wrp (lambda (i l r)- (LinLin i -1 1 l r)))- (x (MouseX kr 0.05 0.35 0 0.1))- (y (MouseY kr 0.15 0.75 0 0.1))- (ti (LFTri kr x 0))- (tf (wrp ti 100 200))- (t (Impulse ar tf 0))- (stream (lambda (lf rf ld rd g)- (lambda (_)- (let* ((r1 (Rand 9 18))- (t* (PulseDivider t r1 0))- (r2 (TRand lf (wrp ti lf rf) t*))- (r3 (TRand ld rd t*)))- (Mul (Ringz (Decay2 t* 0.01 0.5) r2 (Mul r3 y)) g)))))- (s1 (stream 3140 6240 0.050 0.005 0.15))- (s2 (stream 0400 9000 0.005 0.005 0.15)))- (audition (Out 0 (Add (mce/fill 2 s1) (mce/fill 2 s2)))))
Help/Graphs/klink.lhs view
@@ -23,15 +23,3 @@ ; var n2 = TRand.ar(x, 3940, t) ; var n3 = TRand.ar(0.005, 0.275, t) ; Out.ar(0, Ringz.ar(i, n2, n3 * y)) }.play--(let* ((n1 (LFNoise0 kr (Mce 0.5 1.5)))- (o (SinOsc kr n1 0))- (f (Mce 2 3))- (a (Mul (Abs (Slope o)) f))- (t (Impulse ar a 0))- (i (Decay2 t 0.01 0.1))- (x (MouseX kr 960 3620 1 0.1))- (y (MouseY kr 0.5 2.0 0 0.2))- (n2 (TRand x 3940 t))- (n3 (TRand 0.005 0.275 t)))- (audition (Out 0 (Ringz i n2 (Mul n3 y)))))
Help/Graphs/lf-pulses.lhs view
@@ -13,10 +13,3 @@ ; var f = Formlet.ar(Blip.ar(10, 12), n0 * 43 + 700, 0.005, x) ; var o = SinOsc.ar(40, 0) * n1 ; Out.ar(0, LeakDC.ar(f + o, 0.995).clip2(0.75)) }.play--(let* ((n0 (LFNoise0 ar (Mce 20 40)))- (n1 (LFNoise0 ar (Mce 5 10)))- (x (MouseX kr 0.012 0.19 1 0.1))- (f (Formlet (Blip ar 10 12) (MulAdd n0 43 700) 0.005 x))- (o (Mul (SinOsc ar 40 0) n1)))- (audition (Out 0 (Clip2 (Add f o) 1))))
Help/Graphs/lfo-modulation.lhs view
@@ -9,8 +9,3 @@ ; var p = FSinOsc.kr([0.6, 0.7], 0, 3600, 4000) ; var s = RLPF.ar(LFPulse.ar(o, 0, 0.4, 0.05), p, 0.2) ; Out.ar(0, CombL.ar(s, 0.3, [0.2, 0.25], 2)) }.play--(let* ((o (MulAdd (FSinOsc kr 0.05 0) 80 160))- (p (MulAdd (FSinOsc kr (Mce 0.6 0.7) 0) 3600 4000))- (s (RLPF (Mul (LFPulse ar o 0 0.4) 0.05) p 0.2)))- (audition (Out 0 (CombL s 0.3 (Mce 0.2 0.25) 2))))
+ Help/Graphs/lg-timed.lhs view
@@ -0,0 +1,36 @@+lg-timed (rd)++> let { timed r y p =+> do { d0 <- dser r p+> ; d1 <- dcons 0 d0+> ; d2 <- dser r y+> ; let t = tDuty AR d1 0 RemoveSynth d2 1+> in return (latch t t) }+> ; lg u = return (lag u 0.03)+> ; n = mce [52, 76, 66, 67, 68, 69]+> ; a = mce [0.35, 0.15, 0.04, 0.05, 0.16, 0.07]+> ; d = mce [0.1, 0.5, 0.09, 0.08, 0.07, 0.3]+> ; x = mouseX KR 0.5 1.25 Linear 0.2 }+> in do { tn <- lg =<< timed dinf n (d * x)+> ; ta <- lg =<< timed dinf a (d * x)+> ; audition (out 0 (sinOsc AR (midiCPS tn) 0 * ta)) }++{ var dcons = { arg x, xs+ ; var i = Dseq.new([0, 1], 1)+ ; var a = Dseq.new([x, xs], 1)+ ; Dswitch.new(a, i) }+; var timed = { arg r, y, p+ ; var d0 = Dser.new(p, r)+ ; var d1 = dcons.value(0, d0)+ ; var d2 = Dser.new(y, r)+ ; var t = TDuty.ar(d1, 0, d2, 2, 1)+ ; Latch.ar(t, t) }+; var lg = { arg u+ ; Lag.ar(u, 0.03) }+; var n = [52, 76, 66, 67, 68, 69]+; var a = [0.35, 0.15, 0.04, 0.05, 0.16, 0.07]+; var d = [0.1, 0.5, 0.09, 0.08, 0.07, 0.3]+; var x = MouseX.kr(0.5, 1.25, 'linear', 0.2)+; var tn = lg.value(timed.value(inf, n, d * x))+; var ta = lg.value(timed.value(inf, a, d * x))+; Out.ar(0, SinOsc.ar(tn.midicps, 0) * ta) }.play
+ Help/Graphs/lin-sosc.lhs view
@@ -0,0 +1,53 @@+lin-sosc (rd)++> let { n = 1024+> ; x = mouseX KR 0.001 1.0 Linear 0.1+> ; tblM b = playBuf 1 b (x * bufRateScale KR b) 0 0 Loop+> ; tblC b c = playBuf 1 b (in' 1 KR c * bufRateScale KR b) 0 0 Loop+> ; o = sinOsc AR (tblM 0) 0 * tblM 1 +> ; co = clip2 (pan2 o (tblC 1 0) 0.025) 0.25+> ; rrand (a, b) = getStdRandom (randomR (a,b))+> ; choose l = liftM (l !!) (rrand (0, length l - 1))+> ; pauseThread n = when (n > 1e-3) (threadDelay (floor (n * 1e6)))+> ; iota 0 _ _ = []+> ; iota n l s = l : iota (n - 1) (l + s) s+> ; geom 0 _ _ = []+> ; geom n i f = i : geom (n - 1) (i * f) f+> ; lineTo n l r = iota n l ((r - l) / n)+> ; xlineTo n l r = geom n l ((r / l) ** (1.0 / n))+> ; twoPi = pi * 2.0+> ; rng l r e = l + (e * (l - r))+> ; srng l r e = let m = (l - r ) / 2+> in m + l + (e * m) +> ; freq = [ lineTo n 440.0 444.0+> , lineTo n 40.0 16000.0+> , xlineTo n 40.0 16000.0+> , map (srng 20 21000 . sin) (lineTo n 0.0 twoPi)+> , map (srng 20 12000 . cos) (lineTo n 0.0 twoPi)+> , map (srng 20 22000 . tan) (lineTo n 0.0 twoPi)+> , map (srng 20 90 . tan) (lineTo n 0.0 twoPi) ]+> ; ampl = [ lineTo n 0.1 1.0+> , lineTo n 1.0 0.1+> , lineTo n 0.5 0.01+> , lineTo n 0.01 0.5+> , xlineTo n 1.0 0.1+> , xlineTo n 0.1 1.0+> , map sin (lineTo n 0.0 twoPi)+> , map cos (lineTo n 0.0 twoPi)+> , map (* 0.001) (map tan (lineTo n 0 twoPi)) ]+> ; sloc = [ 0.005, 0.0075, 0.01, 0.025, 0.05, 0.075+> , 0.1, 0.25, 0.5, 0.75+> , 0.8, 0.85, 1.0, 1.005 ]+> ; paus = [0.01, 0.05, 0.1, 0.15, 0.25, 0.5, 0.75]+> ; update fd = do { f <- choose freq+> ; a <- choose ampl+> ; s <- choose sloc+> ; p <- choose paus+> ; send fd (b_setn 0 [(0, f)])+> ; send fd (b_setn 1 [(0, a)])+> ; send fd (c_set [(0, s)])+> ; pauseThread p } }+> in do { withSC3 (\fd -> do { async fd (b_alloc 0 (floor n) 1)+> ; async fd (b_alloc 1 (floor n) 1)+> ; play fd (out 0 co) })+> ; forkIO (withSC3 (\fd -> replicateM_ 128 (update fd))) }
Help/Graphs/modal-space.lhs view
@@ -38,15 +38,15 @@ (x (MouseX kr 0 15 0 0.1)) (k (DegreeToKey 0 x 12)) (c (lambda (n r)- (let* ((o (Mul (SinOsc ar (MIDICPS (Add* r k n)) 0) 0.1))- (t (LFPulse ar (MIDICPS (Mce 48 55)) 0.15 0.5))+ (let* ((o (Mul (SinOsc ar (MIDICPS (Add3 r k n)) 0) 0.1))+ (t (LFPulse ar (MIDICPS (mce2 48 55)) 0.15 0.5)) (f (MIDICPS (MulAdd (SinOsc kr 0.1 0) 10 r))) (d (Mul (RLPF t f 0.1) 0.1)) (m (Add o d))) (Add (CombN m 0.31 0.31 2) m))))) (with-sc3 (lambda (fd)- (->< fd (/b_alloc 0 7 1))- (-> fd (/b_setn* 0 0 p))- (let ((n (Mul (LFNoise1 kr (Mce 3 3.05)) 0.04)))+ (async fd (/b_alloc 0 7 1))+ (send fd (/b_setn1 0 0 p))+ (let ((n (Mul (LFNoise1 kr (mce2 3 3.05)) 0.04))) (play fd (Out 0 (Mul (Add (c n 48) (c n 72)) 0.25)))))))
Help/Graphs/moto-rev.lhs view
@@ -7,7 +7,3 @@ { var f = SinOsc.kr(0.2, 0) * 10 + 21 ; var s = LFPulse.ar(f, [0, 0.1], 0.1) ; Out.ar(0, RLPF.ar(s, 100, 0.1).clip2(0.4)) }.play--(let* ((f (MulAdd (SinOsc kr 0.2 0) 10 21))- (s (LFPulse ar f (Mce 0 0.1) 0.1)))- (audition (Out 0 (Clip2 (RLPF s 100 0.1) 0.4))))
Help/Graphs/mouse-clatter.lhs view
@@ -18,7 +18,7 @@ (let* ((x (MouseX kr 100 12000 0 0.1)) (y (MouseY kr 0.01 0.15 0 0.1))- (n1 (LFNoise0 kr (Mce 3 3.25)))+ (n1 (LFNoise0 kr (mce2 3 3.25))) (t (Impulse kr (MulAdd n1 16 18) 0)) (n2 (TRand 0.005 y t)) (n3 (WhiteNoise ar))@@ -31,7 +31,5 @@ (s (Add (Mul o 0.05) (IFFT* n7)))) (with-sc3 (lambda (fd)- (->< fd (/b_alloc 10 2048 1))+ (async fd (/b_alloc 10 2048 1)) (play fd (Out 0 s)))))--
+ Help/Graphs/nharm.lhs view
@@ -0,0 +1,20 @@+nharm (rd)++> let { nharm n f = map ((* f) . fromIntegral) [1..n]+> ; rrand l r = getStdRandom (randomR (l, r))+> ; threadPause n = when (n>0) (threadDelay (floor (n * 1e6)))+> ; klg m u = do { n <- rrand 4 u+> ; d <- rrand 9 12+> ; f <- rrand m (m + 2)+> ; l <- replicateM n (rrand 0.01 0.02)+> ; p <- rrand (-1.0) 1.0+> ; let { a = 0.5+> ; e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)+> ; nh = nharm n (midiCPS f)+> ; s = klangSpec nh l (replicate n 0.0) }+> in return (pan2 (klang AR 1 0 s) p e) }+> ; ply :: Int -> (Double, Double) -> UGen -> Int -> IO ()+> ; ply n (l,r) m u = replicateM_ n (do { threadPause =<< rrand l r+> ; audition . out 0 =<< klg m u }) }+> in do { forkIO (ply 32 (0.25, 0.75) 92 24)+> ; forkIO (ply 8 (1.25, 1.75) 12 54) }
Help/Graphs/one-line.lhs view
@@ -9,8 +9,3 @@ ; var lfs_t = lfs.trunc([400, 600]) * [1, -1] ; var f = OnePole.ar(Mix.new(lfs_t), 0.98) ; Out.ar(0, Pan2.ar(SinOsc.ar(f, 0), 0, 0.1)) }.play--(let* ((lfs (MulAdd (LFSaw ar (Mce 1 0.99) (Mce 0 0.6)) 2000 2000))- (lfs_t (Mul (Trunc lfs (Mce 400 600)) (Mce 1 -1)))- (f (OnePole (mix lfs_t) 0.98)))- (audition (Out 0 (Pan2 (SinOsc ar f 0) 0 0.1))))
Help/Graphs/oscillator-cluster.lhs view
@@ -44,27 +44,3 @@ ; var d = Rand.new(4, 7) ; var a = Rand.new(0.01, 0.05) ; Out.ar(0, fp.collect(prt.value(d, a)).sum) }.play--(let* ((ln (lambda (a b d)- (Line kr a b d removeSynth)))- (xln (lambda (a b d)- (XLine kr a b d removeSynth)))- (rln (lambda (r a b d)- (Line kr (Add a (Rand 0 r)) b d removeSynth)))- (rxln (lambda (r a b d)- (XLine kr (Add a (Rand 0 r)) b d removeSynth)))- (prt (lambda (d a)- (lambda (cf)- (let* ((r1 (Rand cf (Add cf 2)))- (r2 (rln 1 5 0.01 d))- (r3 (rln 10 20 0 d))- (r4 (Rand 0.1 0.2))- (f (Add (Mce cf r1) (Mul (SinOsc kr r2 0) r3)))- (o (FSinOsc ar f 0))- (e (Mul (Decay2 (Impulse ar 0 0) r4 d) a)))- (Mul o e)))))- (np 12)- (fp (list-tabulate np (lambda (_) (Rand 220 660))))- (d (Rand 4 7))- (a (Rand 0.01 0.05)))- (audition (Out 0 (foldl Add 0 (map (prt d a) fp)))))
Help/Graphs/pattern-buffer.lhs view
@@ -3,7 +3,7 @@ > let { nf = 2 * 48000 > ; c = 24 > ; tseq l = let n = fromIntegral (length l) / 2.0-> in select (lfSaw KR 0.5 0 * n + n) (MCE l)+> in select (lfSaw KR 0.5 0 * n + n) (mce l) > ; rrand l r = getStdRandom (randomR (l, r)) > ; p = phasor AR 0 (bufRateScale KR 10) 0 (bufFrames KR 10) 0 > ; t = bufRdC 1 AR 10 p Loop
Help/Graphs/police-state.lhs view
@@ -30,19 +30,3 @@ ; var n2 = LFNoise2.kr([0.3,0.3]) ; var e = n1 * (n2 * 0.15 + 0.18) ; Out.ar(0, CombL.ar(Mix.fill(4, node) + e, 0.3, 0.3, 3)) }.play--(let* ((node (lambda (_)- (let* ((r0 (Rand 0.02 0.1))- (r1 (Rand 0 two-pi))- (r2 (Rand 0 600))- (r3 (Rand 700 1300))- (r4 (Rand -1 1))- (r5 (Rand 80 120))- (n0 (LFNoise2 ar r5))- (f (MulAdd (SinOsc kr r0 r1) r2 r3)))- (Pan2 (Mul (SinOsc ar f 0) n0) r4 0.1))))- (n0 (LFNoise2 kr (Mce 0.4 0.4)))- (n1 (LFNoise2 ar (MulAdd n0 90 620)))- (n2 (LFNoise2 kr (Mce 0.3 0.3)))- (e (Mul n1 (MulAdd n2 0.15 0.18))))- (audition (Out 0 (CombL (Add (mix/fill 4 node) e) 0.3 0.3 3))))
Help/Graphs/record-scratcher.lhs view
@@ -2,15 +2,13 @@ > let { dup a = mce2 a a > ; fn = "/home/rohan/audio/metal.wav"-> ; b = 0-> ; gate = 1 > ; d = env [0, 1, 0] [0.1, 0.1] [EnvSin] 1 0-> ; e = envGen KR gate 1 0 1 RemoveSynth d+> ; e = envGen KR 1 1 0 1 RemoveSynth d > ; x = mouseX KR (-10) 10 Linear 0.2 > ; dx = x - delayN x 0.1 0.1 > ; bdx = mouseButton KR 1 0 0.3 + dx-> ; bdxr = bdx * bufRateScale KR (constant b)-> ; scr = playBuf 1 (constant b) bdxr 0 0 Loop }+> ; bdxr = bdx * bufRateScale KR 0+> ; scr = playBuf 1 0 bdxr 0 0 Loop } > in withSC3 (\fd -> do { async fd (b_allocRead 0 fn 0 0) > ; play fd (out 0 (dup (scr * e))) })
+ Help/Graphs/rm-octaver.lhs view
@@ -0,0 +1,7 @@+rm-octaver (andrea valle, miller puckette)++> let { defaultPitch x = pitch x 440 60 4000 100 16 1 0.01 0.5 1+> ; i = soundIn 0+> ; p = defaultPitch i+> ; f = mceChannel 0 p }+> in audition (out 0 (sinOsc ar (f * 0.5) 0 * i + i))
+ Help/Graphs/rzblp.lhs view
@@ -0,0 +1,22 @@+rzblp (rd)++> import System.IO.Unsafe++> let { u = unsafePerformIO+> ; wrp i l r = let m = (r - l) / 2+> in i * m + l + m+> ; lfn f l r = wrp (u (lfNoise0 kr f)) l r+> ; hpb q = mixFill 2 (\_ -> let { f = lfn q 1330 1395+> ; a = lfn q 0.001 0.007 }+> in blip ar f 24 * a)+> ; mk_f d = let { q = lfn 5.2 5.2 5.21+> ; a = u (d dinf (mce [1, 3, 2, 7, 8]))+> ; tr = impulse kr q 0+> ; freq = demand tr 0 a * 30 + 340 }+> in sum [ blip ar freq 3 * lfn q 0.001 0.01+> , resonz (impulse ar q (mce2 0 0))+> (lfn 5 30 640)+> (lfn q 0.1 0.5) * lfn q 0.01 1.8+> , hpb q * lfn q 1.2 1.8+> , blip ar (lfn q 16 36) 3 * mce2 0.03 0.09 ] }+> in audition (out 0 (mk_f drand + mk_f dxrand))
Help/Graphs/s-chirp.lhs view
@@ -1,12 +1,10 @@ s-chirp (rd) -> let { tChoose t a = do { n <- tiRand 0 (fromIntegral (length a)) t-> ; return (select n (mce a)) }-> ; x = mouseX KR 15 0 Linear 0.1+> let { x = mouseX KR 15 0 Linear 0.1 > ; y = mouseY KR 15 27 Linear 0.1 > ; scl = [0, 2, 3.2, 5, 7, 9, 10] } > in do { t <- dust KR 9-> ; b <- tChoose t [36, 48, 60, 72]+> ; b <- tChoose t (mce [36, 48, 60, 72]) > ; n <- liftM (* 0.04) (lfNoise1 KR (mce2 3 3.05)) > ; d <- tiRand x y t > ; e <- liftM (decay2 t 0.005) (tRand 0.02 0.15 t)@@ -20,24 +18,3 @@ > ; withSC3 (\fd -> do { async fd (b_alloc 0 7 1) > ; send fd (b_setn1 0 0 scl) > ; play fd (out 0 o) }) }--(let* ((x (MouseX kr 15 0 0 0.1))- (y (MouseY kr 15 27 0 0.1))- (scl (list 0 2 3.2 5 7 9 10))- (t (Dust kr 9))- (b (TChoose t (Mce 36 48 60 72)))- (n (Mul (LFNoise1 kr (Mce 3 3.05)) 0.04))- (d (TIRand x y t))- (e (Decay2 t 0.005 (TRand 0.02 0.15 t)))- (k (DegreeToKey 0 d 12))- (f (MIDICPS (Add* b k n)))- (m (Mul* e (SinOsc ar f 0) 0.2))- (u (PulseDivider t 9 0))- (r0 (TRand 0.0075 0.125 u))- (r1 (TRand 0.05 0.15 u))- (o (MulAdd m 0.5 (AllpassC m 0.15 r0 r1))))- (with-sc3- (lambda (fd)- (->< fd (/b_alloc 0 7 1))- (-> fd (/b_setn* 0 0 scl))- (audition (Out 0 o)))))
Help/Graphs/sample-and-hold-liquidities.lhs view
@@ -18,12 +18,3 @@ ; var p = Latch.kr(WhiteNoise.kr, c) ; var i = Pan2.ar(SinOsc.ar(f, 0, Decay2.kr(c, 0.1 * t, 0.9 * t)), p, 1) ; Out.ar(0, CombN.ar(i, 0.3, 0.3, 2)) }.play--(let* ((r (MouseX kr 1 200 1 0.1))- (t (Recip r))- (c (Impulse kr r 0.4))- (cf (MouseY kr 100 8000 1 0.1))- (f (Latch (MulAdd (WhiteNoise kr) (Mul cf 0.5) cf) c))- (p (Latch (WhiteNoise kr) c))- (i (Pan2 (Mul (SinOsc ar f 0) (Decay2 c (Mul 0.1 t) (Mul 0.9 t))) p 1)))- (audition (Out 0 (CombN i 0.3 0.3 2))))
Help/Graphs/scratchy.lhs view
@@ -8,10 +8,6 @@ ; var f = (n - 0.49).max(0) * 20 ; Out.ar(0, RHPF.ar(f, 5000, 1)) }.play -(let* ((n (Mul (clone 2 (BrownNoise ar)) 0.5))- (f (Mul (Max (Sub n 0.49) 0) 20)))- (audition (Out 0 (RHPF f 5000 1))))- with non-monadic noise > let { bn = Sound.SC3.UGen.Base.brownNoise
Help/Graphs/shifting-pulses.lhs view
@@ -18,14 +18,3 @@ ; var f = n1.range(300, 1800) ; var rq = n2.range(0.01, 2) ; Out.ar(0, l * RLPF.ar(p, f, rq)) }.play--(let* ((wrp (lambda (i l r) (LinLin i -1 1 l r)))- (n1 (clone 2 (BrownNoise kr)))- (n2 (clone 2 (BrownNoise kr)))- (n3 (clone 2 (BrownNoise kr)))- (t (Dust kr 0.75))- (l (Latch t t))- (p (Mul (Pulse ar (wrp n1 2 (Mce 11 15)) 0.01) 0.1))- (f (wrp n2 300 1800))- (rq (wrp n3 0.01 2)))- (audition (Out 0 (Mul l (RLPF p f rq)))))
+ Help/Graphs/sosc-lp.lhs view
@@ -0,0 +1,30 @@+sosc-lp (rd)++> let { dustR r lo hi = do { n1 <- dwhite 1 lo hi+> ; n2 <- whiteNoise r+> ; d <- dseq dinf n1+> ; return (tDuty r d 0 DoNothing (abs n2) 1) }+> ; a = [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]+> ; b = [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]+> ; setup fd = do { async fd (b_alloc 10 9 1)+> ; async fd (b_alloc 11 9 1)+> ; send fd (b_setn1 10 0 a)+> ; send fd (b_setn1 11 0 b) }+> ; d_env t = decay2 t 0.002 2.5+> ; idx t = stepper t 0 0 15 1 0+> ; f1 t = let { l = (bufRdL 1 kr 10 (idx t) Loop - 24)+> ; r = (bufRdL 1 kr 11 (idx t) Loop - 24) }+> in midiCPS (mce2 l r)+> ; f2 t n = f1 t + n * 1.2+> ; o1 t = sinOsc ar (f1 t) 0 * d_env t+> ; o2 t n = sinOsc ar (f2 t n) 0 * d_env t+> ; sosc_lp t n = out 0 ((o1 t + o2 t n) * 0.2) }+> in do { clk <- dustR kr 0.2 0.9+> ; n <- lfNoise0 kr (mce2 1 3)+> ; audition (sosc_lp clk n) }++> let { a = [71, 60, 65, 89, 36, 57, 95, 97, 92, 97]+> ; b = [89, 71, 60, 65, 57, 36, 92, 95, 93, 97]+> ; resetup fd = do { send fd (b_setn1 10 0 a)+> ; send fd (b_setn1 11 0 b) } }+> in withSC3 resetup
Help/Graphs/sprinkler.lhs view
@@ -9,10 +9,6 @@ ; var t = LFPulse.kr(f, 0, 0.25, 0.1) ; Out.ar(0, BPZ2.ar(WhiteNoise.ar * t)) }.play -(let* ((f (MulAdd (LFPulse kr 0.09 0 0.16) 10 7))- (t (Mul (LFPulse kr f 0 0.25) 0.1)))- (audition (Out 0 (BPZ2 (Mul (WhiteNoise ar) t)))))- with non-monadic noise > let { n = Sound.SC3.UGen.Base.whiteNoise (uid 0) AR
Help/Graphs/sweepy-noise.lhs view
@@ -7,8 +7,8 @@ > ; filtered = rlpf (n * 0.03) freq 0.1 } > in audition (out 0 (combN filtered 0.3 0.3 2 + filtered)) } -{ var lfoDepth = MouseY.kr(200, 8000, 'exponential')-; var lfoRate = MouseX.kr(4, 60, 'exponential')-; var freq = LFSaw.kr(lfoRate, 0, lfoDepth, lfoDepth * 1.2)+{ var lfoDepth = MouseY.kr(200, 8000, 'exponential', 0.1)+; var lfoRate = MouseX.kr(4, 60, 'exponential', 0.1)+; var freq = LFSaw.kr(lfoRate, 0) * lfoDepth + (lfoDepth * 1.2) ; var filtered = RLPF.ar(WhiteNoise.ar([0.03,0.03]), freq, 0.1)-; Out.ar(0, CombN.ar(filtered, 0.3, 0.3, 2, 1, filtered)) }.play+; Out.ar(0, CombN.ar(filtered, 0.3, 0.3, 2) + filtered) }.play
+ Help/Graphs/tgb.lhs view
@@ -0,0 +1,30 @@+tgb (rd)++> let { mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)+> ; pm_t l r d t = let { le = mkls l d+> ; re = mkls r d }+> in tRand le re t+> ; wrp i l r = linLin i (-1) 1 l r+> ; pm_n rt l d = let { le = mkls l d+> ; re = mkls l d }+> in do { n <- whiteNoise rt+> ; return (wrp n le re) }+> ; rrand l r = getStdRandom (randomR (l, r))+> ; gb b d = do { gps <- pm_n AR [(0, 400), (1, 900)] d+> ; let { t = impulse AR gps 0+> ; pm_f (l, r) = pm_t l r d t }+> in do { du <- pm_f ([(0, 0.005), (0.5, 0.015), (1, 0.005)]+> ,[(0, 0.009), (0.5, 0.020), (1, 0.009)])+> ; pn <- pm_f ([(0, -1.0), (0.5, -0.5), (1, 0.5)]+> ,[(0, -0.5), (0.5, 0.5), (1, 1.0)])+> ; rt <- pm_f ([(0, 6), (0.5, 12), (1, 6)]+> ,[(0, 12), (0.5, 12), (1, 12)])+> ; cs <- pm_f ([(0, 0), (1, 0.95)]+> ,[(0, 0), (1, 1)])+> ; am <- pm_f ([(0, 0.25), (0.5, 0.55), (1, 0.15)]+> ,[(0, 0.5), (0.5, 0.75), (1, 0.25)])+> ; let cs' = cs * (bufDur KR b)+> in return (tGrains 2 t b rt cs' du pn am 2) } }+> ; fn = "/home/rohan/audio/text.snd" }+> in withSC3 (\fd -> do { async fd (b_allocRead 10 fn 0 0)+> ; play fd . (out 0) =<< gb 10 12 })
+ Help/Graphs/tgr-rpr.lhs view
@@ -0,0 +1,37 @@+tgr-rpr (rd)++> let { sf = "/home/rohan/audio/text.snd"+> ; preset = [ 0.01, 0.02+> , 0.95, 1.05+> , 0.02, 0.06+> , 0.2, 0.3+> , 0.7, 0.9+> , -1.0, 1.0 ]+> ; dustR r lo hi = do { n1 <- dwhite 1 lo hi+> ; n2 <- whiteNoise r+> ; d <- dseq dinf n1+> ; return (tDuty r d 0 DoNothing (abs n2) 1) }+> ; rpr n t = tRand (in' 1 KR n) (in' 1 KR (n + 1)) t+> ; rrand l r = getStdRandom (randomR (l, r))+> ; rSet = [ (0.005, 0.025), (0.05, 0.25)+> , (0.75, 0.95) , (1.05, 1.25)+> , (0.001, 0.01) , (0.02, 0.04)+> , (0.1, 0.2) , (0.2, 0.4)+> , (0.0, 0.45) , (0.55, 1.0)+> , (-1.0, 0.0) , (0.0, 1.0) ]+> ; edit fd = do { s <- mapM (\(l,r) -> rrand l r) rSet+> ; send fd (c_setn [(0, s)])+> ; threadDelay 350000 } }+> in do { clk <- dustR AR (in' 1 KR 0) (in' 1 KR 1)+> ; rat <- rpr 2 clk+> ; dur <- rpr 4 clk+> ; pos <- liftM (* (bufDur KR 10)) (rpr 8 clk)+> ; pan <- rpr 10 clk+> ; amp <- rpr 6 clk+> ; withSC3 (\fd -> do { async fd (b_allocRead 10 sf 0 0)+> ; send fd (c_setn [(0, preset)])+> ; let o = tGrains 2 clk 10 rat pos dur pan amp 2+> in play fd (out 0 o)+> ; threadDelay 3000000+> ; replicateM_ 16 (edit fd)+> ; reset fd }) }
Help/Graphs/theremin.lhs view
@@ -1,11 +1,11 @@ theremin (jmcc) -> let { mod = 7+> let { m = 7 > ; detune = 0 > ; x = mouseX KR 0 0.9 Linear 0.2 > ; y = mouseY KR 4000 200 Exponential 0.8 > ; f = y + detune-> ; f' = f + f * sinOsc AR mod 0 * 0.02+> ; f' = f + f * sinOsc AR m 0 * 0.02 > ; a = sinOsc AR f' 0 * x } > in audition (out 0 (pan2 a 0 1)) @@ -17,12 +17,3 @@ ; var f_ = f + (f * SinOsc.ar(mod, 0) * 0.02) ; var a = SinOsc.ar(f_, 0) * x ; Out.ar(0, (Pan2.ar(a, 0, 1))) }.play--(let* ((mod 7)- (detune 0)- (x (MouseX kr 0 0.9 0 0.2))- (y (MouseY kr 4000 200 1 0.8))- (f (Add y detune))- (f* (Add f (Mul* f (SinOsc ar mod 0) 0.02)))- (a (Mul (SinOsc ar f* 0) x)))- (audition (Out 0 (Pan2 a 0 1))))
Help/Graphs/three-cpsw.lhs view
@@ -19,13 +19,3 @@ ; var f = f1 * [9000, 12000] + 9500 ; var o = Saw.ar(f) + Saw.ar(f * dh) + Saw.ar(f * dt) ; Out.ar(0, (o * a).clip2(0.75)) }.play--(let* ((t (Dust kr (Mce 12 18)))- (f0 (TRand 1 64 t))- (f1 (LFNoise0 kr f0))- (a (TRand 0.0 0.5 t))- (dt (TRand 0.975 1.025 t))- (dh (TRand 0.750 0.7505 t))- (f (MulAdd f1 (Mce 9000 12000) 9500))- (o (Add* (Saw ar f) (Saw ar (Mul f dh)) (Saw ar (Mul f dt)))))- (audition (Out 0 (Clip2 (Mul o a) 0.75))))
+ Help/Graphs/tipnso.lhs view
@@ -0,0 +1,12 @@+tipnso (rd)++> let { x = mouseX KR 1 32 Linear 0.1+> ; t = impulse AR x 0 }+> in do { n1 <- tiRand 16 72 t+> ; n2 <- tiRand 0 1 t+> ; n3 <- pinkNoise AR+> ; let { e = decay2 t 0.01 (mce2 0.1 0.15)+> ; f = midiCPS (n1 + 36 + (12 * n2))+> ; s = sinOsc AR f 0 * e+> ; b = bpf (n3 * e) (36 + midiCPS n1) (175 / (midiCPS n1)) }+> in audition (out 0 ((s + b) * mce2 0.15 0.1)) }
+ Help/Graphs/tr-out.lhs view
@@ -0,0 +1,20 @@+tr-out (rd)++> let node n = do { t <- dust KR 1.6+> ; r1 <- tRand 0 6 t+> ; r2 <- tRand 0 6 t+> ; r3 <- tRand 0 6 t+> ; let { f = midiCPS (bufRdN 1 KR 0 r1 NoLoop)+> ; p = bufRdN 1 KR 1 r2 NoLoop+> ; a = bufRdN 1 KR 2 r3 NoLoop }+> in return ( pan2 (sinOsc AR f 0) p a+> , sendTrig t n (f / 660) ) }+> in withSC3 (\fd -> do { async fd (b_alloc 0 6 1)+> ; send fd (b_setn1 0 0 [60, 62, 64, 65, 67, 69])+> ; async fd (b_alloc 1 6 1)+> ; send fd (b_setn1 1 0 [-1, -0.5, 0, 0.25, 0.75, 1.0])+> ; async fd (b_alloc 2 6 1)+> ; send fd (b_setn1 2 0 [0.01, 0.05, 0.1, 0.15, 0.25, 0.35])+> ; ns <- mapM node [1..4]+> ; let o = sum (map fst ns)+> in play fd (out 0 (mrg (o : map snd ns))) })
+ Help/Graphs/trkl.lhs view
@@ -0,0 +1,24 @@+trkl (rd)++> let trkl d ul fu dy la fy =+> let { tf = xLine kr 1 ul d RemoveSynth+> ; st = impulse ar (tf * 8) 0+> ; t = impulse ar tf 0 }+> in do { r0 <- rand (-1) 1+> ; r1 <- rand (-1) 1+> ; r2 <- tRand 0.05 1.0 t+> ; r3 <- tExpRand 0.0 0.25 st +> ; fh <- tRand 1.75 2.25 t +> ; let { a = dbAmp (line kr 12 la d RemoveSynth)+> ; f = xLine kr fu 900 d RemoveSynth+> ; p = line kr r0 r1 d RemoveSynth+> ; o1 = mix (ringz (decay2 t 0.01 dy) (mce2 f (f * fh)) fy)+> ; o2 = mix (saw ar (mce2 f (f * fh))) }+> in return (pan2 (o1 + o2 * decay2 t 0.1 r2 * r3) p a) }+> in do { d <- rand 0.5 16+> ; ul <- rand 16 64+> ; fu <- rand 1200 9000+> ; dy <- rand 0.005 0.175+> ; la <- rand (-60) (-25)+> ; fy <- rand 0.015 0.125+> ; audition . (out 0) =<< trkl d ul fu dy la fy }
+ Help/Graphs/trmlo.lhs view
@@ -0,0 +1,41 @@+trmlo (rd)++> import System.IO.Unsafe++> let { u_iRand p q = unsafePerformIO (iRand p q)+> ; u_rand p q = unsafePerformIO (rand p q)+> ; mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)+> ; mWrp1 i m = mWrp i m (m + 1)+> ; mWrpN i m n = mWrp i m (m + n)+> ; o1 = let { f = 5+> ; d = 3+> ; s = envSine d 0.1+> ; e = envGen kr 1 1 0 1 DoNothing s+> ; n = 65+> ; m = sinOsc kr f 0 }+> in pan2 (sinOsc ar (mWrp1 m n) 0) m e+> ; o2 = let { f = u_iRand 5 9+> ; d = u_iRand 5 9+> ; s = envSine d (u_rand 0.1 0.2)+> ; e = envGen kr 1 1 0 1 DoNothing s+> ; n = u_iRand 69 72+> ; m = sinOsc kr f 0 }+> in pan2 (sinOsc ar (mWrp1 m n) 0) m e+> ; o3 = let { f = u_iRand 5 9+> ; d = u_iRand 9 12+> ; s = envSine d (u_rand 0.1 0.2)+> ; e = envGen kr 1 1 0 1 DoNothing s+> ; n = u_iRand 69 72+> ; m = sinOsc kr f 0+> ; l = line kr 0 (u_iRand 1 5) d DoNothing }+> in pan2 (blip ar (mWrp1 m (n + l)) (linLin m (-1) 1 1 2)) m e+> ; o4 = let { f = u_iRand 5 18+> ; d = u_iRand 12 15+> ; s = envSine d (u_rand 0.1 0.2)+> ; e = envGen kr 1 5e-2 0 1 DoNothing s+> ; n = u_iRand 69 72+> ; m = sinOsc kr f 0+> ; l = line kr 0 (u_iRand 1 5) d RemoveSynth+> ; fr = mWrpN m (n + l) (u_iRand 1 5) }+> in pan2 (blip ar fr (linLin m (-1) 1 1 (u_iRand 2 24))) m e }+> in audition (out 0 (o1 + o2 + o3 + o4))
Help/Graphs/tsort.lhs view
@@ -16,11 +16,4 @@ > ; s = mixFill n f } > in audition (out 0 (s * e)) -(let* ((n 122)- (c (env/bp '(0 0 0.15 1 6 0) 1 1))- (e (EnvGen kr 1 1 0 1 removeSynth c))- (f (lambda (o) (Mul (SinOsc ar (Add 440 o) 0) 0.001)))- (s (mix/fill n f)))- (audition (Out 0 (Mul s e))))- http://create.ucsb.edu/pipermail/sc-users/2003-March/002807.html
+ Help/Graphs/vlc-distrtn.lhs view
@@ -0,0 +1,130 @@+vlc-distrtn (rd)+caution - audio feedback graph++> let { rrand l r = getStdRandom (randomR (l, r))+> ; choose l = return . (l !!) =<< rrand 0 (length l - 1)+> ; threadPause :: Double -> IO ()+> ; threadPause t = when (t>0) (threadDelay (floor (t * 1e6)))+> ; prep (ampl, phase) = [dbAmp ampl, phase]+> ; vlc = [ (0.00000, 1.85550)+> , (-9.92383, -0.65147)+> , (-8.74205, -0.74728)+> , (-3.70464, -1.39796)+> , (-9.43435, -1.14812)+> , (-25.84790, -1.03375)+> , (-16.99500, -2.41724)+> , (-29.17040, 2.67419)+> , (-26.82750, -1.61810)+> , (-18.59870, 1.34568)+> , (-19.72160, -2.85972)+> , (-29.43650, 0.54603)+> , (-23.63120, -1.47813)+> , (-28.20100, -1.98501)+> , (-41.20700, -1.11808)+> , (-33.14310, -2.19369)+> , (-31.54010, 1.43134)+> , (-47.62740, 1.28571)+> , (-28.79740, -1.03754)+> , (-34.97950, 0.37740)+> , (-39.05770, -0.57557)+> , (-38.84060, 2.34836)+> , (-40.18090, -0.96978)+> , (-47.32150, 2.14768)+> , (-45.49290, 2.52100)+> , (-40.57100, -1.39905)+> , (-47.19530, -2.23994)+> , (-50.80920, 2.97853)+> , (-48.13640, 0.46815)+> , (-58.56890, -1.01821)+> , (-57.81200, -3.08971)+> , (-47.96870, -0.48657)+> , (-43.96100, -0.10311)+> , (-50.49810, -2.80977)+> , (-50.61640, -0.17212)+> , (-60.64640, -1.02433)+> , (-58.03410, 1.06921)+> , (-55.46390, -2.04501)+> , (-54.31000, -1.53512)+> , (-52.78670, -1.49875)+> , (-57.99380, 0.17697)+> , (-56.76990, 2.28241)+> , (-54.17450, -1.85553)+> , (-62.58220, -2.40971)+> , (-59.86460, 1.04782)+> , (-61.58570, 1.56183)+> , (-52.62080, 1.68360)+> , (-49.82940, -1.11019)+> , (-56.18160, -0.78538)+> , (-57.73320, -2.23918)+> , (-49.87560, 3.09604)+> , (-51.00100, -0.53762)+> , (-59.71530, 0.99017)+> , (-65.73280, 2.43855)+> , (-73.01270, -0.90664)+> , (-61.81450, -0.53346)+> , (-65.58980, 1.51174)+> , (-75.94320, -3.06072)+> , (-65.22210, -1.49937)+> , (-70.79970, -2.96199)+> , (-64.72450, 1.78172)+> , (-73.24130, 0.26939)+> , (-66.17110, -0.23305)+> , (-61.32910, -3.12592)+> , (-66.98180, 0.64700)+> , (-65.23060, -2.94395)+> , (-70.13430, 1.29805)+> , (-68.43470, -1.35906)+> , (-71.33000, -2.71582)+> , (-86.90080, 2.11646)+> , (-74.97450, 2.76118)+> , (-68.02520, 0.94979)+> , (-67.32960, 3.05994)+> , (-67.32140, -2.79905)+> , (-68.22010, -2.33831) ]+> ; partial i freq detune fall n =+> do { n0 <- lfNoise1 kr 1+> ; n1 <- rand 0.75 1.25+> ; let { m = n * 2+> ; ampl = bufRdN 1 kr 0 m NoLoop+> ; f = freq * (n + 1) * (n0 * detune + 1) }+> in return (ringz i f (fall * n1) * ampl) }+> ; plyr n =+> let { ctl j k = Control KR j k+> ; buf = ctl "buf" 0+> ; iamp = ctl "iamp" 0.1+> ; ampl = ctl "ampl" 0.1+> ; freq = ctl "freq" 129.897+> ; fall = ctl "fall" 0.5+> ; loc = ctl "loc" 0.0+> ; detune = ctl "detune" 0.001+> ; i = soundIn 0 * iamp }+> in do { s <- mapM (partial i freq detune fall) [0 .. n-1]+> ; return (out 0 (clip2 (pan2 (sum s) loc ampl) 0.1)) }+> ; degree_to_key degree scale steps =+> let scale_n = length scale+> in (steps * (degree `div` scale_n)) + (scale !! (degree `mod` scale_n))+> ; getCps b =+> do { b_ <- choose b+> ; d <- choose [0 .. 8]+> ; let k = degree_to_key d [0, 2, 3, 5, 7, 8, 10] 12+> in return (midiCPS (b_ + realToFrac k)) }+> ; pattern fd =+> do { f <- getCps [24, 36, 48, 55, 60]+> ; ia <- rrand 0.05 0.75+> ; l <- rrand (-1) 1+> ; a <- rrand 0.05 0.1+> ; d <- rrand 0.001 0.005+> ; fl <- rrand 1 7+> ; send fd (n_set 1002 [("freq", f)+> ,("iamp", ia)+> ,("buf", 0)+> ,("loc", l)+> ,("ampl", a)+> ,("detune", d)+> ,("fall", fl)])+> ; threadPause =<< choose [0.25, 0.5, 0.75, 1.5] } }+> in withSC3 (\fd -> do { async fd (b_alloc 0 (length vlc * 2) 1)+> ; send fd (b_setn1 0 0 (concatMap prep vlc))+> ; async fd . d_recv . synthdef "plyr48" =<< plyr 48+> ; send fd (s_new "plyr48" 1002 AddToTail 1 [])+> ; replicateM 32 (pattern fd) })
+ Help/Graphs/voscil.lhs view
@@ -0,0 +1,28 @@+voscil (rd)++> import System.IO.Unsafe++> let { rrand l r = getStdRandom (randomR (l, r))+> ; lfn r = unsafePerformIO (lfNoise0 kr r)+> ; b = 32+> ; hb = (constant b - 1) / 2+> ; bn = 8192 * 4+> ; rt = 6+> ; f = 600+> ; s = let { v = vOsc ar (lfn rt * hb + hb) (f * 2) 0+> ; o = let { bf = lfn rt * 40 + 600+> ; nh = lfn rt * 16 + 24 }+> in blip ar bf nh * (lfn rt * 0.1 + 0.1)+> ; p = pan2 (v + o) (lfn rt) (lfn rt * 0.5 + 0.5)+> ; w = vOsc ar (lfSaw kr (1 / rt) 0 * hb + hb) f 0+> ; q = pan2 w (lfn rt) (lfn rt * 0.5 + 0.5) }+> in p + q+> ; run fd = let r_set i = +> do { m <- rrand 2 512+> ; j <- replicateM m (rrand 0 bn)+> ; k <- replicateM m (rrand (-1) 1)+> ; async fd (b_alloc i bn 1)+> ; send fd (b_set i (zip j k)) }+> in do { mapM_ r_set [0 .. (b - 1)]+> ; play fd (out 0 s) } }+> in withSC3 run
Help/Graphs/what-was-i-thinking.lhs view
@@ -29,18 +29,3 @@ ; var y = z * 0.6 ; Out.ar(0, z + [ c.value(y) + c.value(y) , c.value(y) + c.value(y) ]) }.play--(let* ((n0 (MulAdd (LFNoise1 kr 0.2) 2000 2400))- (n1 (MulAdd (LFNoise1 kr 0.157) 0.4 0.5))- (i (Mul* (LFPulse ar 0.1 0 0.05) (Impulse ar 8 0) 500))- (d (Decay i 2))- (f (Max (Add (SinOsc kr 4 0) 80) d))- (p (Mul (Pulse ar f n1) 0.04))- (z (RLPF p n0 0.2))- (c (lambda (x) - (let* ((r (Rand 0 0.3))- (n (MulAdd (LFNoise1 kr r) 0.025 0.035)))- (CombL x 0.06 n 1))))- (y (Mul z 0.6)))- (audition (Out 0 (Add z (Mce (Add (c y) (c y))- (Add (c y) (c y)))))))
+ Help/Graphs/wial.lhs view
@@ -0,0 +1,19 @@+wial (rd)++> let { pls c d f = let { t = pulseDivider c d 0+> ; e = decay2 t 0.05 0.75+> ; o = sinOsc AR (toggleFF t * f + f * 2) 0 }+> in do { n0 <- tiRand 0 1 t+> ; return (o * e * n0 * 0.5) }+> ; smpl f = [ (4, 6, f , 0.75)+> , (2, 6, f * 2, 0.75)+> , (1, 2, f * 16, 0.025)+> , (1, 5, f * 64, 0.005)+> , (1, 4, f * 128, 0.035)+> , (1, 3, f * 256, 0.15)+> , (2, 3, f * 512, 0.35) ]+> ; plss c (d0, d1, f, a) = liftM (* a) (pls c (mce2 d0 d1) f)+> ; clk = impulse AR 16 0 }+> in do { n0 <- dust KR 2+> ; f <- twChoose n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0+> ; audition . out 0 . sum =<< mapM (plss clk) (smpl f) }
Help/Graphs/wind-metals.lhs view
@@ -24,16 +24,3 @@ ; var dt = Array.fill(n, { Rand.new(0.1, 2.0) }) ; var s = Klank.ar(`[f, nil, dt], exc) ; Out.ar(0, (s * 0.1).softclip) }.play--(let* ((n 6)- (base (ExpRand 60 4000))- (range (Rand 500 8000))- (n0 (clone 2 (BrownNoise ar)))- (r0 (ExpRand 0.125 0.5))- (n1 (LFNoise1 kr r0))- (f (list-tabulate n (lambda (_) (Rand base (Add base range)))))- (dt (list-tabulate n (lambda (_) (Rand 0.1 2))))- (exc (Mul* n0 0.007 (Max 0 (MulAdd n1 0.75 0.25))))- (k (klank-data f (make-list n 1) dt))- (s (Klank exc 1 0 1 k)))- (audition (Out 0 (SoftClip (Mul s 0.1)))))
Help/Graphs/xy-interference.lhs view
@@ -15,12 +15,3 @@ ; var b = SinOsc.ar(y, 0) ; a * b } ; Out.ar(0, Mix.fill(3, nd)) }.play--(let* ((x (MouseX kr 20 22000 1 (Mce 0.005 0.025)))- (y (MouseY kr 20 22000 1 (Mce 0.005 0.075)))- (nd (lambda (_)- (let* ((n (LFNoise0 kr (Mce 5 9)))- (a (SinOsc ar (Add x n) 0))- (b (SinOsc ar y 0)))- (Mul a b)))))- (audition (Out 0 (mix/fill 3 nd))))
Help/Tutorial/Tutorial.lhs view
@@ -16,7 +16,7 @@ $ darcs get http://slavepianos.org/rd/sw/hsc3 To build use the standard Cabal process in each repository in-sequence.+sequence. To install to the user package database type: $ runhaskell Setup.lhs configure --prefix ~ $ runhaskell Setup.lhs build@@ -28,7 +28,7 @@ (push "~/sw/hsc3/emacs" load-path) (setq hsc3-interpreter "ghci")- (setq hsc3-help-directory "~/sw/hsc3/Help/")+ (setq hsc3-help-directory "~/sw/hsc3/ Help/") (require 'hsc3) The hsc3 emacs mode associates itself with files having the extension@@ -184,10 +184,10 @@ * Identifier lookup & hasktags The emacs command M-. (find-tag) looks up an identifier in-a 'tags' table. The hasktags utility can generate tags files +a 'tags' table. The hasktags utility can generate tags files from haskell source files that are usable with emacs. -To generate the a tags file for hsc3, visit the hsc3 directory +To generate a tags file for hsc3, visit the hsc3 directory and type: $ find Sound -name '*.*hs' | xargs hasktags -e@@ -197,9 +197,17 @@ (setq tags-table-list '("~/sw/hsc3")) +* External Unit Generators++hsc3 includes bindings and help files for some unit generators+not in the standard supercollider distribution. In order to+use these unit generators they must be installed, see:++ http://sf.net/projects/sc3-plugins/+ * Example Unit Generator Graphs -The Help/Graphs directory contains example unit generator graphs. The+The Help/ directory contains example unit generator graphs. The graphs are self contained, selecting the graph and typing C-cC-e will audition it. In many cases both supercollider language and haskell versions are given, switch the emacs buffer to sclang-mode to run the
Help/UGen/Buffer/bufDur.help.lhs view
@@ -1,6 +1,6 @@ bufDur rate bufnum -Current duration of buffer.+Current duration of buffer (in seconds). > withSC3 (\fd -> async fd (b_allocRead 0 "/home/rohan/audio/metal.wav" 0 0))
+ Help/UGen/Control/mrg2.help.lhs view
@@ -0,0 +1,26 @@+mrg2 left right++mrg2 defines a node indicating a multiple root graph.++> let { l = out 0 (sinOsc AR 300 0 * 0.1)+> ; r = out 1 (sinOsc AR 900 0 * 0.1) }+> in audition (mrg2 l r)++there is a leftmost rule, so that mrg nodes need not+be terminal.++> let { l = sinOsc AR 300 0 * 0.1+> ; r = out 1 (sinOsc AR 900 0 * 0.1) }+> in audition (out 0 (mrg2 l r))++the leftmost node may be an mce node++> let { l = sinOsc AR (mce2 300 400) 0 * 0.1+> ; r = out 1 (sinOsc AR 900 0 * 0.1) }+> in audition (out 0 (mrg2 l r))++the implementation is not thorough++> let { l = sinOsc AR (mce2 300 400) 0 * 0.1+> ; r = out 1 (sinOsc AR 900 0 * 0.1) }+> in audition (out 0 (mrg2 l r + mrg2 l r))
+ Help/UGen/Demand/dswitch.help.lhs view
@@ -0,0 +1,32 @@+dswitch index array++Demand rate generator for embedding different inputs++array - array of values or other ugens+index - which of the inputs to return++In difference to dswitch1, dswitch embeds all items of +an input demand ugen first before looking up the next index.++> do { a0 <- dwhite 2 3 4+> ; a1 <- dwhite 2 0 1+> ; a2 <- dseq 2 (mce [1, 1, 1, 0])+> ; i <- dseq 2 (mce [0, 1, 2, 1, 0])+> ; d <- dswitch i (mce [a0, a1, a2])+> ; let { t = impulse KR 4 0+> ; f = demand t 0 d * 300 + 400+> ; o = sinOsc AR f 0 * 0.1 }+> in audition (out 0 o) }++compare with dswitch1++> do { a0 <- dwhite 2 3 4+> ; a1 <- dwhite 2 0 1+> ; a2 <- dseq 2 (mce [1, 1, 1, 0])+> ; i <- dseq 2 (mce [0, 1, 2, 1, 0])+> ; d <- dswitch1 i (mce [a0, a1, a2])+> ; let { t = impulse KR 4 0+> ; f = demand t 0 d * 300 + 400+> ; o = sinOsc AR f 0 * 0.1 }+> in audition (out 0 o) }+
Help/UGen/Demand/tDuty.help.lhs view
@@ -1,4 +1,4 @@-tDuty rate duration reset doneAction level+tDuty rate duration reset doneAction level gap Demand results as trigger from demand rate ugens. @@ -23,26 +23,29 @@ level - demand ugen providing the output values. +gap - if true the dirst duration precedes the first level,+ else it follows it.+ Play a little rhythm > do { d <- dseq dinf (mce [0.1, 0.2, 0.4, 0.3])-> ; audition (out 0 (tDuty AR d 0 DoNothing 1)) }+> ; audition (out 0 (tDuty AR d 0 DoNothing 1 1)) } Amplitude changes > do { d0 <- dseq dinf (mce [0.1, 0.2, 0.4, 0.3]) > ; d1 <- dseq dinf (mce [0.1, 0.4, 0.01, 0.5, 1.0])-> ; audition (out 0 (ringz (tDuty AR d0 0 DoNothing d1) 1000 0.1)) }+> ; audition (out 0 (ringz (tDuty AR d0 0 DoNothing d1 1) 1000 0.1)) } Mouse control. > do { d <- dseq dinf (mce [0.1, 0.4, 0.01, 0.5, 1.0])-> ; let x = mouseX KR 0.001 1 Linear 0.1-> in audition (out 0 (ringz (tDuty AR x 0 DoNothing d) 1000 0.1)) }+> ; let x = mouseX KR 0.003 1 Exponential 0.1+> in audition (out 0 (ringz (tDuty AR x 0 DoNothing d 1) 1000 0.1)) } -Note that the 440 is the long pitch.+Note that the 440 is the shorter pitch, since gap is set to false > do { d0 <- dser 12 (mce [0.1, 0.3]) > ; d1 <- dser 12 (mce [440, 880])-> ; let t = tDuty AR d0 0 RemoveSynth d1+> ; let t = tDuty AR d0 0 RemoveSynth d1 0 > in audition (out 0 (sinOsc AR (latch t t) 0 * 0.1)) }
+ Help/UGen/External/atsNoiSynth.help.lhs view
@@ -0,0 +1,38 @@+atsNoiSynth b nPartials partialStart partialSkip ptr sinP noiseP + freqMul freqAdd nBands bandStart bandSkip++Resynthesize sine data from an ATS analysis file++ b - buffer containing ATS data+ nPartials - number of partials to synthesize+partialStart - partial in the analysis to start the + synthesis on (zero indexed)+ partialSkip - increment indicating partials to synthesize+ ptr - index into data set (0, 1)+ sineP - scaler on sinusoidal portion of the resynthesis+ noiseP - scaler on noise portion of the resynthesis+ freqMul - multiplier on the sinusoidal frequency information.+ freqAdd - value to add to frequency information.+ nBands - number of critical bands (noise) to synthesize. + There are 25 critical bands.+ bandStart - critical band to start resynthesis on. + 0 is the first band.+ bandSkip - increment indicating bands to synthesize.++> let { load_data fd b i d = +> if length d < 512 +> then send fd (b_setn1 b i d) +> else do { send fd (b_setn1 b i (take 512 d))+> ; load_data fd b (i + 512) (drop 512 d) } }+> in do { ats <- atsRead "/home/rohan/tn/tn-56/ats/metal.ats"+> ; let { d = atsSC3 ats+> ; h = atsHeader ats+> ; x = mouseX KR 0.05 1.5 Linear 0.2+> ; y = mouseY KR 0 1 Linear 0.2+> ; np = constant (atsNPartials h)+> ; f = x / constant (atsAnalysisDuration h)+> ; ptr = clip (lfSaw AR f 1 * 0.5 + 0.5) 0 1+> ; rs = atsNoiSynth 10 np 0 1 ptr (1 - y) y 1 0 25 0 1 }+> in withSC3 (\fd -> do { async fd (b_alloc 10 (length d) 1)+> ; load_data fd 10 0 d+> ; play fd (out 0 rs) }) }
+ Help/UGen/External/atsSynth.help.lhs view
@@ -0,0 +1,29 @@+atsSynth b nPartials partialStart partialSkip ptr freqMul freqAdd++Resynthesize sine data from an ATS analysis file.++ b - buffer containing ATS data+ nPartials - number of partials to synthesize+ partialStart - partial to start the synthesis at (zero indexed)+ partialSkip - increment indicating partials to synthesize+ ptr - data index (0, 1)+ freqMul - multiplier for sinusoidal frequency data+ freqAdd - value to add to frequency data++> let { load_data fd b i d = +> if length d < 512 +> then send fd (b_setn1 b i d) +> else do { send fd (b_setn1 b i (take 512 d))+> ; load_data fd b (i + 512) (drop 512 d) } }+> in do { ats <- atsRead "/home/rohan/tn/tn-56/ats/metal.ats"+> ; let { d = atsSC3 ats+> ; h = atsHeader ats+> ; x = mouseX KR 0.05 1.5 Linear 0.2+> ; y = mouseY KR 0.25 2.0 Linear 0.2+> ; np = constant (atsNPartials h)+> ; f = x / constant (atsAnalysisDuration h)+> ; ptr = lfSaw AR f 1 * 0.5 + 0.5+> ; rs = atsSynth 10 np 0 1 (clip ptr 0 1) y 0 }+> in withSC3 (\fd -> do { async fd (b_alloc 10 (length d) 1)+> ; load_data fd 10 0 d+> ; play fd (out 0 rs) }) }
+ Help/UGen/External/ay.help.lhs view
@@ -0,0 +1,68 @@+ay tonea toneb tonec noise ctl vola volb volc envfreq envstyle chiptype++Emulates the General Instrument AY-3-8910 (a.k.a. the Yamaha+YM2149) 3-voice sound chip, as found in the ZX Spectrum+128, the Atari ST, and various other home computers during+the 1980s.++The inputs are as follows:++ * tonea, toneb, tonec - integer "tone" value for each of+ the 3 voices, from 0 to 4095 (i.e. 12-bit range). Higher+ value = lower pitch. For convenience, the AY.freqtotone+ method converts a frequency value to something+ appropriate for these inputs.++ * noise - the period of the pseudo-random noise generator, + 0 to 31++ * control - controls how the noise is mixed into the+ tone(s), 0 to 32 (0 is mute). This is a binary mask value+ which masks the noise/tone mixture in each channel, so+ it's not linear.++ * vola, volb, volc - volume of the three channels, 0 to 15+ (or 0 to 31 if using YM chiptype)++ * envfreq - envelope frequency, 0 to 4095++ * envstyle - type of envelope used, 0 to 15++ * chiptype - 0 for AY (default), 1 for YM. The models+ behave slightly differently. This input cannot be+ modulated - its value is only handled at the moment the+ UGen starts.++The chip's inputs are integer values, so non-integer values+will be rounded off.++The emulation is provided by the libayemu library:+http://sourceforge.net/projects/libayemu.++> audition (out 0 (ay 1777 1666 1555 1 7 15 15 15 4 1 0))++> let { tonea = mouseY KR 10 3900 Exponential 0.2+> ; toneb = mouseX KR 10 3900 Exponential 0.2+> ; ctl = 3+> ; vola = 14+> ; volb = 14+> ; volc = 0 +> ; s = ay tonea toneb 1555 1 ctl vola volb volc 4 1 0 }+> in audition (out 0 (pan2 s 0 0.25))++> let { rate = mouseX KR 0.1 10 Linear 0.2+> ; rng l r i = return (linLin i (-1) 1 l r)+> ; mk_ctl l r = lfdNoise3 KR rate >>= rng l r+> ; mk_ctl_0 l r = lfdNoise0 KR rate >>= rng l r }+> in do { tonea <- mk_ctl 10 3900+> ; toneb <- mk_ctl 10 3900+> ; tonec <- mk_ctl 10 3900+> ; n <- mk_ctl 0 31+> ; ctl <- mk_ctl_0 0 31+> ; vola <- mk_ctl 0 15+> ; volb <- mk_ctl 0 15+> ; volc <- mk_ctl 0 15+> ; envfreq <- mk_ctl 0 4095+> ; envstyle <- mk_ctl 0 15+> ; let s = ay tonea toneb tonec n ctl vola volb volc envfreq envstyle 0+> in audition (out 0 (pan2 s 0 0.5)) }
+ Help/UGen/External/lpcSynth.help.lhs view
@@ -0,0 +1,44 @@+lpcSynth buffer excitation ptr+lpcVals rate buffer ptr++lpcSynth uses data from a LPC data file to filter a signal.+lpcVals returns pitch, rms and error data from the LPC data+file.++ buffer - the buffer LPC data is stored+ ptr - index into LPC data (0,1)+ excitation - the signal to filter++lpcVals reads LPC data and extracts frequency (cps), +amplitude (rmso) and error signals.++The LPC analysis files read are those generated by +lpanal (see csound).++Note: since the LPC data set will likely exceed the UDP packet +limit, load_data splits the LPC data into 512*4 byte packets.+Alternately use TCP, or write the LPC data to a disk file and use+b_allocRead.++> let { load_data fd b i d = +> if length d < 512 +> then send fd (b_setn1 b i d) +> else do { send fd (b_setn1 b i (take 512 d))+> ; load_data fd b (i + 512) (drop 512 d) }+> ; lpc_instr b n lpc = +> let { x = mouseX KR 0.05 1.5 Linear 0.2+> ; y = mouseY KR 0.25 2.0 Linear 0.2+> ; f = x / constant (lpcAnalysisDuration (lpcHeader lpc))+> ; ptr = lfSaw AR f 1 * 0.5 + 0.5+> ; MCE [cps, rms, err] = lpcVals ar b ptr+> ; nh = floorE (22000 / cps)+> ; voc = blip AR (cps * y) nh * (1 - err)+> ; s = lpcSynth b (voc + (n * err * 20)) ptr }+> in s * 1e-5 * rms }+> in do { lpc <- lpcRead "/home/rohan/tn/tn-56/lpc/fate.lpc"+> ; n <- pinkNoise AR+> ; let { d = lpcSC3 lpc +> ; s = lpc_instr 10 n lpc }+> in withSC3 (\fd -> do { async fd (b_alloc 10 (length d) 1)+> ; load_data fd 10 0 d+> ; play fd (out 0 s) }) }
+ Help/UGen/External/lpcVals.help.lhs view
@@ -0,0 +1,1 @@+See lpcSynth
+ Help/UGen/External/membraneCircle.help.lhs view
@@ -0,0 +1,25 @@+membraneCircle input tension loss+membraneHexagon input tension loss++Triangular waveguide meshes of a drum-like membrane. Input is+an excitation signal, such as a pulse of noise. Tension and+loss are k-rate.++The variants are named after the shape made out of triangular +meshes.++Excite the mesh with some pink noise, triggered by an +impulse generator. mouseX is tension and impulse frequency, +mouseY is duration of excitation, release-time and amplitude.++> let { x = mouseX KR 0 1 Linear 0.2+> ; y = mouseY KR 1e-9 1 Exponential 0.2+> ; loss = linLin y 0 1 0.999999 0.999+> ; wobble = sinOsc KR 2 0+> ; tension = linLin x 0 1 0.01 0.1 + (wobble * 0.0001)+> ; p = envPerc 0.0001 y+> ; tr = impulse KR (linLin x 0 1 3 9) 0+> ; e = envGen KR tr (linLin y 0 1 0.05 0.25) 0 0.1 DoNothing p+> ; m = membraneCircle }+> in do { n <- pinkNoise AR+> ; audition (out (mce2 0 1) (m (n * e) tension loss)) }
+ Help/UGen/External/membraneHexagon.help.lhs view
@@ -0,0 +1,1 @@+See membraneCircle.
+ Help/UGen/External/pv_Invert.help.lhs view
@@ -0,0 +1,9 @@+pv_Invert buffer++> let { s = sinOsc AR 440 0 * 0.4+> ; n = Sound.SC3.UGen.Base.pinkNoise (uid 0) AR * 0.1+> ; i = s + n+> ; c0 = fft' 10 i+> ; c1 = pv_Invert c0 }+> in withSC3 (\fd -> do { async fd (b_alloc 10 2048 1)+> ; audition (out 0 (mce2 i (ifft' c1) * 0.5)) })
+ Help/UGen/External/stkBowed.help.lhs view
@@ -0,0 +1,4 @@+stkBowed rt freq bowPressure bowPosition vibFreq vibGain loudness gate++> let g = toggleFF (impulse KR 1 0)+> in audition (out 0 (stkBowed AR 220 64 64 64 64 64 g))
+ Help/UGen/External/stkFlute.help.lhs view
@@ -0,0 +1,5 @@+stkFlute rate freq jetDelay noisegain vibFreq vibGain breathPressure tr++> let { bp = line KR 76 32 3 RemoveSynth+> ; ng = line KR 16 64 3 DoNothing }+> in audition (out 0 (stkFlute AR 400 64 ng 16 16 bp 1))
+ Help/UGen/External/stkMandolin.help.lhs view
@@ -0,0 +1,25 @@+stkMandolin rate f bs pp dm dt at tr++ f - frequency+ bs - body size+ pp - pick position+ dm - string damping+ dt - string detune+ at - after touch++> let { x = mouseX KR 0.25 4 Linear 0.2 +> ; tr = impulse KR x 0 - 0.5 }+> in do { mn <- tRand 54 66 tr+> ; [bs, pp, dm, dt, at] <- replicateM 5 (tRand 0 127 tr)+> ; audition (out 0 (stkMandolin AR (midiCPS mn) bs pp dm dt at tr)) }++> let { x = mouseX KR 3 16 Linear 0.2 +> ; t = impulse KR x 0 - 0.5 +> ; tr = pulseDivider t 6 0 }+> in do { mn <- tiRand 54 66 t+> ; bs <- tRand 72 94 tr+> ; pp <- tRand 32 42 tr+> ; dm <- tRand 64 72 tr+> ; dt <- tRand 0 4 tr+> ; at <- tRand 2 8 tr+> ; audition (out 0 (stkMandolin AR (midiCPS mn) bs pp dm dt at t)) }
+ Help/UGen/External/stkModalBar.help.lhs view
@@ -0,0 +1,25 @@+stkModalBar freq instrument stickHardness stickPosition + vibratoGain vibratoFreq directStickMix volume trig++ Marimba=0, Vibraphone=1, Agogo=2, Wood1=3, Reso=4,+ Wood2=5, Beats=6, Two Fixed=7, Clump=8++> let { x = mouseX KR 0.25 4 Linear 0.2 +> ; tr = impulse KR x 0 - 0.5+> ; tR = tRand 0 127 tr }+> in do { i <- tRand 0 9 tr+> ; mn <- tiRand 25 96 tr+> ; [sh, sp, vg, vf, mx, v] <- replicateM 6 tR+> ; audition (out 0 (stkModalBar AR (midiCPS mn) i sh sp vg vf mx v tr)) }++> let { x = mouseX KR 1 6 Linear 0.2 +> ; t = impulse KR x 0 - 0.5+> ; tr = pulseDivider t 6 0 }+> in do { mn <- tiRand 52 64 t+> ; sh <- tRand 4 8 tr+> ; sp <- tRand 54 68 tr+> ; vg <- tRand 66 98 tr+> ; vf <- tRand 4 12 tr+> ; mx <- tRand 0 1 tr+> ; v <- tRand 16 48 tr+> ; audition (out 0 (stkModalBar AR (midiCPS mn) 1 sh sp vg vf mx v t)) }
+ Help/UGen/External/stkShakers.help.lhs view
@@ -0,0 +1,24 @@+stkShakers rt instr energy decay nObjects rfreq tr++ instr - model type+ energy - initial energy+ decay - rate of decay of system+ nObjects - number of particles / elements+ rfreq - resonance frequency+ tr - reset trigger++ Maraca=0, Cabasa=1, Sekere=2, Guiro=3, Water Drops =4,+ Bamboo Chimes=5, Tambourine=6, Sleigh Bells=7, Sticks=8,+ Crunch=9, Wrench=10, Sand Paper=11, Coke Can=12, Next+ Mug=13, Penny + Mug=14, Nickle + Mug = 15, Dime + Mug=16,+ Quarter + Mug=17, Franc + Mug=18, Peso + Mug=19, Big+ Rocks=20, Little Rocks=21, Tuned Bamboo Chimes=22++> let { x = mouseX KR 0.25 4 Linear 0.2 +> ; tr = impulse KR x 0 - 0.5 }+> in do { i <- tRand 0 23 tr+> ; [e, sd, no, rf] <- replicateM 4 (tRand 0 127 tr)+> ; audition (out 0 (stkShakers AR i e sd no rf tr)) }++> let tr = impulse KR 1 0 - 0.5+> in audition (out 0 (stkShakers AR 4 64 64 64 64 tr))
+ Help/UGen/External/vosim.help.lhs view
@@ -0,0 +1,32 @@+vosim tr freq nCycles decay++ trig - starts a vosim pulse when a transition from+ non-positive to positive occurs and no other+ vosim is still going. a-rate will produce+ sample accurate triggering.++ freq - sets the frequency of the squared sinewave.++ nCycles - sets the number of squared sinewaves to use+ in one vosim pulse. nCycles gets checked+ when VOSIM receives a trigger.++ decay - sets the decay factor.++> do { p <- tRand 0 1 (impulse AR 6 0)+> ; let { t = impulse AR (9 * ( 1 + ( p >* 0.95))) 0+> ; x = mouseX KR 0.25 2 Linear 0.2+> ; y = mouseY KR 0.25 1.5 Linear 0.2+> ; z = 9 +> ; range i l r = linLin i (-1) 1 l r+> ; mk_n = lfNoise2 KR z >>= return . range 0.25 2 +> ; tR l r = tRand (mce l) (mce r) }+> in do { f <- tR [40, 120, 220] [440, 990, 880] t+> ; n <- tR [4] [8, 16, 32] t+> ; d <- tR [0.2, 0.4, 0.6] [0.6, 0.8, 1] t+> ; a <- tR [0] [0.2, 0.6, 1] t+> ; l <- tR [-1] [1] t+> ; xn <- mk_n+> ; yn <- mk_n+> ; let v = vosim t (f * x * xn) n (d * y * yn) * a+> in audition (out 0 (pan2 (mix v) l 1)) } }
+ Help/UGen/Filter/freeVerb.help.lhs view
@@ -0,0 +1,24 @@+freeVerb in mix room damp+freeVerb2 in1 in2 mix room damp++A simple reverb.++ in, in1, in2 - input signal+ mix - dry/wet balance (0,1)+ room - room size (0,1)+ damp - reverb high frequency damping (0,1)++> let { i = impulse ar 1 0+> ; c = lfCub ar 1200 0+> ; s = decay i 0.25 * c * 0.1+> ; x = mouseX kr 0 1 Linear 0.1+> ; y = mouseY kr 0 1 Linear 0.1+> ; r = freeVerb s y x 0.5 }+> in audition (out 0 r)++> let { i = soundIn (mce2 0 1)+> ; c = mceChannel+> ; x = mouseX kr 0 1 Linear 0.1+> ; y = mouseY kr 0 1 Linear 0.1+> ; r = freeVerb2 (c 0 i) (c 1 i) y x 0.5 }+> in audition (out 0 r)
+ Help/UGen/IO/lagIn.help.lhs view
@@ -0,0 +1,8 @@+lagIn numChannels bus lag++Smooth a control rate input signal.++> withSC3 (\fd -> do { send fd (c_set [(10, 200)])+> ; play fd (out 0 (sinOsc AR (lagIn 1 10 1) 0 * 0.1))+> ; threadDelay 500000+> ; send fd (c_set [(10, 2000)]) })
− Help/UGen/IO/lagIn.lhs
@@ -1,8 +0,0 @@-lagIn numChannels bus lag--Smooth a control rate input signal.--> withSC3 (\fd -> do { send fd (c_set [(10, 200)])-> ; play fd (out 0 (sinOsc AR (lagIn 1 10 1) 0 * 0.1))-> ; threadDelay 500000-> ; send fd (c_set [(10, 2000)]) })
+ Help/UGen/IO/soundIn.help.lhs view
@@ -0,0 +1,12 @@+soundIn channel++Read audio from the sound input hardware.++channel - input channel number to read, + indexed from zero, can be mce.++> audition (out 0 (soundIn 0))++> audition (out 0 (soundIn (mce2 0 1)))++> audition (out 0 (soundIn (mce [0, 2, 1, 3])))
Help/UGen/Information/sampleRate.help.lhs view
@@ -6,3 +6,10 @@ > let f = mce [sampleRate * 0.01, 440] > in audition (out 0 (sinOsc AR f 0 * 0.1))++The server status command can extract nominal and+actual sample rates from a running server.++> withSC3 (\fd -> liftM2 (,)+> (serverSampleRateNominal fd) +> (serverSampleRateActual fd))
+ Help/UGen/MachineListening/beatTrack.help.lhs view
@@ -0,0 +1,57 @@+beatTrack c lock++ c - Audio input to track, already passed through an FFT+ UGen; the expected size of FFT is 1024 for 44100+ and 48000 sampling rate, and 2048 for double+ those. No other sampling rates are supported.++ lock - If this argument is greater than 0.5, the tracker+ will lock at its current periodicity and continue+ from the current phase. Whilst it updates the+ model's phase and period, this is not reflected in+ the output until lock goes back below 0.5.++Autocorrelation based beat tracker; the underlying model+assumes 4/4, but it should work on any isochronous beat+structure, though there are biases to 100-120 bpm; a fast+7/8 may not be tracked in that sense. There are four k-rate+outputs, being ticks at quarter, eighth and sixteenth level+from the determined beat, and the current detected+tempo. Note that the sixteenth note output won't necessarily+make much sense if the music being tracked has swing; it is+provided just as a convenience.++This beat tracker determines the beat, biased to the+midtempo range by weighting functions. It does not determine+the measure level, only a tactus. It is also slow reacting,+using a 6 second temporal window for its autocorrelation+maneouvres. Don't expect human musician level predictive+tracking.++On the other hand, it is tireless, relatively general+(though obviously best at transient 4/4 heavy material+without much expressive tempo variation), and can form the+basis of computer processing that is decidedly faster than+human.++> let { i = soundIn 0+> ; x = mouseX KR (-1) 1 Linear 0.2+> ; MCE [b, h, q, t] = beatTrack (fft' 10 i) x+> ; f = mce [440, 660, 880]+> ; s = mix (sinOsc AR f 0 * 0.1 * decay (mce [b, h, q]) 0.05) }+> in withSC3 (\fd -> do { async fd (b_alloc 10 1024 1)+> ; play fd (out 0 s) })++Davies, M. E. P. and Plumbley, M. D. Beat Tracking With A+Two State Model. Proceedings of the IEEE International+Conference on Acoustics, Speech and Signal Processing+(ICASSP 2005), Philadelphia, USA, March 19-23, 2005++The UGen was converted by Nick Collins for beat tracking+research in the course of his PhD and uses an original C+implementation of Matthew Davies' MATLAB model. It first+appeared as part of BBCut2 as AutoTrack but has now been+added to core to enhance SuperCollider's realtime machine+listening options.++
+ Help/UGen/MachineListening/onsets.help.lhs view
@@ -0,0 +1,100 @@+onsets c threshold odftype relaxtime floor mingap medianspan whtype rawodf+onsets' c threshold odftype++An onset detector for musical audio signals - detects the+beginning of notes/drumbeats/etc. Outputs a control-rate+trigger signal which is 1 when an onset is detected, and 0+otherwise.++ c - an FFT chain++ threshold - the detection threshold, typically between 0+ and 1, although in rare cases you may find+ values outside this range useful++ odftype - the function used to analyse the signal+ (options described below; OK to leave this at+ its default value)++ relaxtime - specifies the time (in seconds) for the+ normalisation to "forget" about a recent+ onset. If you find too much re-triggering+ (e.g. as a note dies away unevenly) then you+ might wish to increase this value.++ floor - is a lower limit, connected to the idea of how+ quiet the sound is expected to get without+ becoming indistinguishable from noise. For+ some cleanly-recorded classical music with+ wide dynamic variations, I found it helpful to+ go down as far as 0.000001.++ mingap - specifies a minimum gap (in seconds) between+ onset detections, a brute-force way to prevent+ too many doubled detections.++ medianspan - specifies the size (in FFT frames) of the+ median window used for smoothing the detection+ function before triggering.++For the FFT chain, you should typically use a frame size of+512 or 1024 (at 44.1 kHz sampling rate) and 50% hop size+(which is the default setting in SC). For different sampling+rates choose an FFT size to cover a similar time-span+(around 10 to 20 ms).++The onset detection should work well for a general range of+monophonic and polyphonic audio signals. The onset detection+is purely based on signal analysis and does not make use of+any "top-down" inferences such as tempo.++> let { x = mouseX KR 0 1 Linear 0.2+> ; i = soundIn 0+> ; c = fft' 10 i+> ; o = onsets' c x (onsetType "rcomplex")+> ; s = sinOsc AR 440 0 * 0.2+> ; e = envGen KR o 1 0 1 DoNothing (envPerc 0.001 0.1) }+> in withSC3 (\fd -> do { async fd (b_alloc 10 512 1)+> ; play fd (out 0 (s * e)) })++The type argument chooses which onset detection function is+used. In many cases the default will be fine. The following+choices are available:++ power - generally OK, good for percussive input, and+ also very efficient++ magsum - generally OK, good for percussive input, and+ also very efficient++ complex - performs generally very well, but more+ CPU-intensive++ rcomplex - performs generally very well, and slightly more+ efficient than complex++ phase - generally good, especially for tonal input,+ medium efficiency++ wphase - generally very good, especially for tonal input,+ medium efficiency++ mkl - generally very good, medium efficiency, pretty+ different from the other methods++Which of these should you choose? The differences aren't+large, so I'd recommend you stick with the default \rcomplex+unless you find specific problems with it. Then maybe try+\wphase. The \mkl type is a bit different from the others so+maybe try that too. They all have slightly different+characteristics, and in tests perform at a similar quality+level.++For more details of all the processes involved, the+different onset detection functions, and their evaluation,+see++D. Stowell and M. D. Plumbley. Adaptive whitening for+improved real-time audio onset detection. Proceedings of the+International Computer Music Conference (ICMC’07),+Copenhagen, Denmark, August 2007.
+ Help/UGen/Oscillator/tChoose.help.lhs view
@@ -0,0 +1,16 @@+tChoose trig inputs++The output is selected randomly on recieving a trigger from an+array of inputs. tChoose is a composite of tiRand and select.++> let x = mouseX kr 1 1000 Exponential 0.1+> in do { t <- dust ar x+> ; f <- liftM midiCPS (tiRand 48 60 t)+> ; o <- let a = mce [ sinOsc ar f 0+> , saw ar (f * 2)+> , pulse ar (f * 0.5) 0.1 ]+> in tChoose t a+> ; audition (out 0 (o * 0.1)) }++;; Note: all the ugens are continously running. This may not be the+;; most efficient way if each input is cpu-expensive.
Help/UGen/Oscillator/twChoose.help.lhs view
@@ -8,14 +8,14 @@ normalize the values. TWChoose is a composite of TWindex and Select -> let { twChoose t a w n = select (twindex t n w) a-> ; x = mouseX KR 1 1000 Exponential 0.1 }+> let x = mouseX KR 1 1000 Exponential 0.1 > in do { d <- dust AR x > ; let { a = mce [ sinOsc AR 220 0-> , saw AR 440-> , pulse AR 110 0.1] +> , saw AR 440+> , pulse AR 110 0.1] > ; w = mce [0.5, 0.35, 0.15] }-> in audition (out 0 (twChoose d a w 0 * 0.1)) }+> in do { o <- twChoose d a w 0+> ; audition (out 0 (o * 0.1)) } } Note: all the ugens are continously running. This may not be the most efficient way if each input is cpu-expensive.
Help/UGen/Oscillator/twindex.help.lhs view
@@ -2,20 +2,20 @@ Triggered windex. When triggered, returns a random index value based on array as a list of probabilities. By default the list of-probabilities should sum to 1.0, when the normalize flag is set to 1,+probabilities should sum to 1, when the normalize flag is set to 1, the values get normalized by the ugen (less efficient) Assuming normalized values > let { p = mce [1/5, 2/5, 2/5] > ; a = mce [400, 500, 600]-> ; t = impulse KR 6 0-> ; f = select (twindex t 0.0 p) a }-> in audition (out 0 (sinOsc AR f 0 * 0.1))+> ; t = impulse KR 6 0 }+> in do { i <- twindex t 0 p+> ; audition (out 0 (sinOsc AR (select i a) 0 * 0.1)) } Modulating probability values > let { p = mce [1/4, 1/2, sinOsc KR 0.3 0 * 0.5 + 0.5] > ; a = mce [400, 500, 600] > ; t = impulse KR 6 0-> ; f = select (twindex t 1.0 p) a }+> ; f = select (twindex t 1 p) a } > in audition (out 0 (sinOsc AR f 0 * 0.1))
+ Help/UGen/Trigger/sendTrig.help.lhs view
@@ -0,0 +1,24 @@+sendTrig in id value++On receiving a trigger (0 to non-zero transition), send a trigger+message from the server back to all registered clients. Clients+register by sending a /notify message to the server.++input - the trigger++id - an integer that will be passed with the trigger message. This+ is useful if you have more than one SendTrig in a SynthDef++value - a UGen or float that will be polled at the time of trigger,+ and its value passed with the trigger message++> withSC3 (\fd -> async fd (notify True))++> do { s <- lfNoise0 KR 10+> ; let o = sinOsc AR (s * 200 + 500) 0 * 0.1+> in audition (mrg [sendTrig s 0 s, out 0 o]) }++> withSC3 (\fd -> do { tr <- wait fd "/tr"+> ; putStrLn (show tr) })++> withSC3 (\fd -> async fd (notify False))
− Help/UGen/Trigger/sendTrig.lhs
@@ -1,24 +0,0 @@-sendTrig in id value--On receiving a trigger (0 to non-zero transition), send a trigger-message from the server back to all registered clients. Clients-register by sending a /notify message to the server.--input - the trigger--id - an integer that will be passed with the trigger message. This- is useful if you have more than one SendTrig in a SynthDef--value - a UGen or float that will be polled at the time of trigger,- and its value passed with the trigger message--> withSC3 (\fd -> async fd (notify True))--> do { s <- lfNoise0 KR 10-> ; let o = sinOsc AR (s * 200 + 500) 0 * 0.1-> in audition (mrg [sendTrig s 0 s, out 0 o]) }--> withSC3 (\fd -> do { tr <- wait fd "/tr"-> ; putStrLn (show tr) })--> withSC3 (\fd -> async fd (notify False))
Help/hsc3.help.lhs view
@@ -266,7 +266,7 @@ > in mrg [b, localOut c] > in do { n <- whiteNoise AR > ; let s = decay (impulse AR 0.3 0) 0.1 * n * 0.2-> in audition (out 0 (ping_pong s)) }+> in audition (out 0 (ppd s)) } * Literals, Overloading, Coercion, Constants @@ -485,6 +485,40 @@ It is the type of audition that determines the type of a, the type is inferred so there is no need to write it.++* Unsafe unit generator constructors++Haskell provides a mechanism to force values+from the IO monad, unsafePerformIO.++Using this we can write unit generator graphs+that have non-deterministic nodes using only+orindary let binding.++> import System.IO.Unsafe++> let { u = unsafePerformIO+> ; a = u (whiteNoise AR)+> ; b = u (whiteNoise AR)+> ; c = a - b }+> in audition (out 0 (c * 0.1))++This is hardly more convenient than do notation,+however we can also insert non-determinstic nodes+directly into function arguments.++> let { n = Sound.SC3.UGen.Unsafe.whiteNoise+> ; x = n AR - n AR }+> in audition (out 0 (x * 0.1))++The above uses the unsafe unit generator functions+provided at Sound.SC3.UGen.Unsafe, and avoids the+lifting operations which, for functions of many+arguments, can be cumbersome.++> let n = whiteNoise+> in do { x <- liftM2 (-) (n AR) (n AR)+> ; audition (out 0 (x * 0.1)) } * Demand Rate, Sharing Again
README view
@@ -1,13 +1,14 @@-hsc3 - Haskell SuperCollider+hsc3 - haskell supercollider hsc3 provides Sound.SC3, a Haskell module that facilitates using Haskell as a client to the SuperCollider synthesis server. The hsc3 interaction environment is written for GNU Emacs. - http://slavepianos.org/rd/+ http://slavepianos.org/rd/f/207949/ http://haskell.org/ http://audiosynth.com/ http://gnu.org/software/emacs/ -(c) rohan drape, 2006-2008, GPL.2, http://gnu.org/copyleft/+(c) rohan drape, 2006-2008+ gpl, http://gnu.org/copyleft/
Sound/SC3/Server/Command.hs view
@@ -1,83 +1,83 @@ module Sound.SC3.Server.Command where +import Data.Word import Sound.OpenSoundControl import Sound.SC3.Server.Utilities-import Data.Word (Word8) -- * Instrument definition commands. -- | Install a bytecode instrument definition. (Asynchronous) d_recv :: [Word8] -> OSC-d_recv b = message "/d_recv" [blob b]+d_recv b = Message "/d_recv" [Blob b] -- | Load an instrument definition from a named file. (Asynchronous) d_load :: String -> OSC-d_load p = message "/d_load" [string p]+d_load p = Message "/d_load" [String p] -- | Load a directory of instrument definitions files. (Asynchronous) d_loadDir :: String -> OSC-d_loadDir p = message "/d_loadDir" [string p]+d_loadDir p = Message "/d_loadDir" [String p] -- | Remove definition once all nodes using it have ended. d_free :: [String] -> OSC-d_free n = message "/d_free" (map string n)+d_free n = Message "/d_free" (map String n) -- * Node commands. -- | Place a node after another. n_after :: [(Int, Int)] -> OSC-n_after l = message "/n_after" (mkDuples int int l)+n_after l = Message "/n_after" (mk_duples Int Int l) -- | Place a node before another. n_before :: [(Int, Int)] -> OSC-n_before l = message "/n_before" (mkDuples int int l)+n_before l = Message "/n_before" (mk_duples Int Int l) -- | Fill ranges of a node's control values. n_fill :: Int -> [(String, Int, Double)] -> OSC-n_fill nid l = message "/n_fill" (int nid : mkTriples string int float l)+n_fill nid l = Message "/n_fill" (Int nid : mk_triples String Int Float l) -- | Delete a node. n_free :: [Int] -> OSC-n_free nid = message "/n_free" (map int nid)+n_free nid = Message "/n_free" (map Int nid) -- | Map a node's controls to read from a bus. n_map :: Int -> [(String, Int)] -> OSC-n_map nid l = message "/n_map" (int nid : mkDuples string int l)+n_map nid l = Message "/n_map" (Int nid : mk_duples String Int l) -- | Map a node's controls to read from buses. n_mapn :: Int -> [(String, Int, Int)] -> OSC-n_mapn nid l = message "/n_mapn" (int nid : mkTriples string int int l)+n_mapn nid l = Message "/n_mapn" (Int nid : mk_triples String Int Int l) -- | Get info about a node. n_query :: [Int] -> OSC-n_query nid = message "/n_query" (map int nid)+n_query nid = Message "/n_query" (map Int nid) -- | Turn node on or off. n_run :: [(Int, Bool)] -> OSC-n_run l = message "/n_run" (mkDuples int (int . fromEnum) l)+n_run l = Message "/n_run" (mk_duples Int (Int . fromEnum) l) -- | Set a node's control values. n_set :: Int -> [(String, Double)] -> OSC-n_set nid c = message "/n_set" (int nid : mkDuples string float c)+n_set nid c = Message "/n_set" (Int nid : mk_duples String Float c) -- | Set ranges of a node's control values. n_setn :: Int -> [(String, [Double])] -> OSC-n_setn nid l = message "/n_setn" (int nid : concatMap f l)- where f (s,d) = string s : int (length d) : (map float d)+n_setn nid l = Message "/n_setn" (Int nid : concatMap f l)+ where f (s,d) = String s : Int (length d) : (map Float d) -- | Trace a node. n_trace :: [Int] -> OSC-n_trace nid = message "/n_trace" (map int nid)+n_trace nid = Message "/n_trace" (map Int nid) -- * Synthesis node commands. -- | Get control values. s_get :: Int -> [String] -> OSC-s_get nid i = message "/s_get" (int nid : map string i)+s_get nid i = Message "/s_get" (Int nid : map String i) -- | Get ranges of control values. s_getn :: Int -> [(String, Int)] -> OSC-s_getn nid l = message "/s_getn" (int nid : mkDuples string int l)+s_getn nid l = Message "/s_getn" (Int nid : mk_duples String Int l) -- | Enumeration of possible locations to add new nodes (s_new and g_new). data AddAction = AddToHead@@ -89,127 +89,127 @@ -- | Create a new synth. s_new :: String -> Int -> AddAction -> Int -> [(String, Double)] -> OSC-s_new n i a t c = message "/s_new" (string n : int i : int (fromEnum a) : int t : mkDuples string float c)+s_new n i a t c = Message "/s_new" (String n : Int i : Int (fromEnum a) : Int t : mk_duples String Float c) -- | Auto-reassign synth's ID to a reserved value. s_noid :: [Int] -> OSC-s_noid nid = message "/s_noid" (map int nid)+s_noid nid = Message "/s_noid" (map Int nid) -- * Group node commands. -- | Free all synths in this group and all its sub-groups. g_deepFree :: [Int] -> OSC-g_deepFree nid = message "/g_deepFree" (map int nid)+g_deepFree nid = Message "/g_deepFree" (map Int nid) -- | Delete all nodes in a group. g_freeAll :: [Int] -> OSC-g_freeAll nid = message "/g_freeAll" (map int nid)+g_freeAll nid = Message "/g_freeAll" (map Int nid) -- | Add node to head of group. g_head :: [(Int, Int)] -> OSC-g_head l = message "/g_head" (mkDuples int int l)+g_head l = Message "/g_head" (mk_duples Int Int l) -- | Create a new group. g_new :: [(Int, AddAction, Int)] -> OSC-g_new l = message "/g_new" (mkTriples int (int . fromEnum) int l)+g_new l = Message "/g_new" (mk_triples Int (Int . fromEnum) Int l) -- | Add node to tail of group. g_tail :: [(Int, Int)] -> OSC-g_tail l = message "/g_tail" (mkDuples int int l)+g_tail l = Message "/g_tail" (mk_duples Int Int l) -- * Unit Generator commands. -- | Send a command to a unit generator. u_cmd :: Int -> Int -> String -> [Datum] -> OSC-u_cmd nid uid cmd arg = message "/u_cmd" ([int nid, int uid, string cmd] ++ arg)+u_cmd nid uid cmd arg = Message "/u_cmd" ([Int nid, Int uid, String cmd] ++ arg) -- * Buffer commands. -- | Allocates zero filled buffer to number of channels and samples. (Asynchronous) b_alloc :: Int -> Int -> Int -> OSC-b_alloc nid frames channels = message "/b_alloc" [int nid, int frames, int channels]+b_alloc nid frames channels = Message "/b_alloc" [Int nid, Int frames, Int channels] -- | Allocate buffer space and read a sound file. b_allocRead :: Int -> String -> Int -> Int -> OSC-b_allocRead nid p f n = message "/b_allocRead" [int nid, string p, int f, int n]+b_allocRead nid p f n = Message "/b_allocRead" [Int nid, String p, Int f, Int n] -- | Close attached soundfile and write header information. b_close :: Int -> OSC-b_close nid = message "/b_close" [int nid]+b_close nid = Message "/b_close" [Int nid] -- | Fill ranges of sample values. b_fill :: Int -> [(Int, Int, Double)] -> OSC-b_fill nid l = message "/b_fill" (int nid : mkTriples int int float l)+b_fill nid l = Message "/b_fill" (Int nid : mk_triples Int Int Float l) -- | Free buffer data. b_free :: Int -> OSC-b_free nid = message "/b_free" [int nid]+b_free nid = Message "/b_free" [Int nid] -- | Call a command to fill a buffer. b_gen :: Int -> String -> [Double] -> OSC-b_gen bid cmd arg = message "/b_gen" (int bid : string cmd : map float arg)+b_gen bid cmd arg = Message "/b_gen" (Int bid : String cmd : map Float arg) -- | Get sample values. b_get :: Int -> [Int] -> OSC-b_get nid i = message "/b_get" (int nid : map int i)+b_get nid i = Message "/b_get" (Int nid : map Int i) -- | Get ranges of sample values. b_getn :: Int -> [(Int, Int)] -> OSC-b_getn nid l = message "/b_getn" (int nid : mkDuples int int l)+b_getn nid l = Message "/b_getn" (Int nid : mk_duples Int Int l) -- | Request \/b_info messages. b_query :: [Int] -> OSC-b_query nid = message "/b_query" (map int nid)+b_query nid = Message "/b_query" (map Int nid) -- | Read sound file data into an existing buffer. b_read :: Int -> String -> Int -> Int -> Int -> Int -> OSC-b_read nid p f n f' z = message "/b_read" [int nid, string p, int f, int n, int f', int z]+b_read nid p f n f' z = Message "/b_read" [Int nid, String p, Int f, Int n, Int f', Int z] -- | Set sample values. b_set :: Int -> [(Int, Double)] -> OSC-b_set nid l = message "/b_set" (int nid : mkDuples int float l)+b_set nid l = Message "/b_set" (Int nid : mk_duples Int Float l) -- | Set ranges of sample values. b_setn :: Int -> [(Int, [Double])] -> OSC-b_setn nid l = message "/b_setn" (int nid : concatMap f l)- where f (i,d) = int i : int (length d) : map float d+b_setn nid l = Message "/b_setn" (Int nid : concatMap f l)+ where f (i,d) = Int i : Int (length d) : map Float d -- | Write sound file data. b_write :: Int -> String -> Int -> Int -> Int -> Int -> Int -> OSC-b_write nid p h t f s z = message "/b_write" [int nid, string p, int h, int t, int f, int s, int z]+b_write nid p h t f s z = Message "/b_write" [Int nid, String p, Int h, Int t, Int f, Int s, Int z] -- | Zero sample data. b_zero :: Int -> OSC-b_zero nid = message "/b_zero" [int nid]+b_zero nid = Message "/b_zero" [Int nid] -- * Control bus commands. -- | Fill ranges of bus values. c_fill :: [(Int, Int, Double)] -> OSC-c_fill l = message "/c_fill" (mkTriples int int float l)+c_fill l = Message "/c_fill" (mk_triples Int Int Float l) -- | Get bus values. c_get :: [Int] -> OSC-c_get nid = message "/c_get" (map int nid)+c_get nid = Message "/c_get" (map Int nid) -- | Get ranges of bus values. c_getn :: [(Int, Int)] -> OSC-c_getn l = message "/c_getn" (mkDuples int int l)+c_getn l = Message "/c_getn" (mk_duples Int Int l) -- | Set bus values. c_set :: [(Int, Double)] -> OSC-c_set l = message "/c_set" (mkDuples int float l)+c_set l = Message "/c_set" (mk_duples Int Float l) -- | Set ranges of bus values. c_setn :: [(Int, [Double])] -> OSC-c_setn l = message "/c_setn" (concatMap f l)- where f (i,d) = int i : int (length d) : map float d+c_setn l = Message "/c_setn" (concatMap f l)+ where f (i,d) = Int i : Int (length d) : map Float d -- * Server operation commands. -- | Remove all bundles from the scheduling queue. clearSched :: OSC-clearSched = message "/clearSched" []+clearSched = Message "/clearSched" [] -- | Enumeration of OSC printer types. data PrintLevel = NoPrinter@@ -220,23 +220,23 @@ -- | Select printing of incoming Open Sound Control messages. dumpOSC :: PrintLevel -> OSC-dumpOSC c = message "/dumpOSC" [int (fromEnum c)]+dumpOSC c = Message "/dumpOSC" [Int (fromEnum c)] -- | Select reception of notification messages. (Asynchronous) notify :: Bool -> OSC-notify c = message "/notify" [int (fromEnum c)]+notify c = Message "/notify" [Int (fromEnum c)] -- | Stop synthesis server. quit :: OSC-quit = message "/quit" []+quit = Message "/quit" [] -- | Request \/status.reply message. status :: OSC-status = message "/status" []+status = Message "/status" [] --- | Request \/synced message when all current asynchronous commands complete.+-- | Request \/synced Message when all current asynchronous commands complete. sync :: Int -> OSC-sync sid = message "/sync" [int sid]+sync sid = Message "/sync" [Int sid] -- * Variants to simplify common cases. @@ -247,6 +247,14 @@ -- | Set a range of sample values. b_setn1 :: Int -> Int -> [Double] -> OSC b_setn1 nid i xs = b_setn nid [(i,xs)]++-- | Set single bus values.+c_set1 :: Int -> Double -> OSC+c_set1 i x = c_set [(i, x)]++-- | Set a signle node control value.+n_set1 :: Int -> String -> Double -> OSC+n_set1 nid k n = n_set nid [(k, n)] -- Local Variables: -- truncate-lines:t
Sound/SC3/Server/NRT.hs view
@@ -1,13 +1,13 @@ module Sound.SC3.Server.NRT ( encodeNRT , writeNRT ) where -import Sound.OpenSoundControl import qualified Data.ByteString.Lazy as B+import Sound.OpenSoundControl -- | Encode and prefix with encoded length. oscWithSize :: OSC -> B.ByteString oscWithSize o = B.append l b- where b = encodeOSC_NTP o+ where b = encodeOSCNTP o l = encode_i32 (fromIntegral (B.length b)) -- | Encode a list of OSC bundles as an NRT score.
Sound/SC3/Server/Play.hs view
@@ -2,9 +2,9 @@ , withSC3, audition ) where import Sound.OpenSoundControl-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.Server.Synthdef import Sound.SC3.Server.Command+import Sound.SC3.Server.Synthdef+import Sound.SC3.UGen.UGen -- | Construct an instrument definition, send /d_recv and /s_new -- | messages to scsynth.
Sound/SC3/Server/Status.hs view
@@ -1,10 +1,36 @@-module Sound.SC3.Server.Status (serverStatus) where+module Sound.SC3.Server.Status ( serverStatus+ , serverSampleRateNominal+ , serverSampleRateActual ) where +import Control.Monad import Sound.OpenSoundControl-import Sound.SC3.Server.Command (status)+import Sound.SC3.Server.Command +-- | Collect server status information.+serverStatus :: Transport t => t -> IO [String]+serverStatus fd = liftM statusFormat (serverStatusData fd)++-- | Read nominal sample rate of server.+serverSampleRateNominal :: (Transport t) => t -> IO Double+serverSampleRateNominal fd = liftM (extractDouble . (!! 7)) (serverStatusData fd)++-- | Read actual sample rate of server.+serverSampleRateActual :: (Transport t) => t -> IO Double+serverSampleRateActual fd = liftM (extractDouble . (!! 8)) (serverStatusData fd)++extractDouble :: Datum -> Double+extractDouble (Float f) = f+extractDouble (Double f) = f+extractDouble _ = error "extractDouble"++serverStatusData :: Transport t => t -> IO [Datum]+serverStatusData fd = do send fd status + (Message _ d) <- wait fd "status.reply"+ return d+ statusFields :: [String]-statusFields = ["# UGens ", +statusFields = ["Unused ",+ "# UGens ", "# Synths ", "# Groups ", "# Instruments ",@@ -13,18 +39,8 @@ "Sample Rate (Nominal) ", "Sample Rate (Actual) "] -statusInfo :: OSC -> [String]-statusInfo o = maybe [] f (address o)- where f a = if a == "status.reply" - then maybe [] (map show . tail) (arguments o) - else []--statusFormat :: OSC -> [String]-statusFormat r = s : zipWith (++) statusFields (statusInfo r)+statusFormat :: [Datum] -> [String]+statusFormat d = s : zipWith (++) + (tail statusFields) + (map show (tail d)) where s = "***** SuperCollider Server Status *****"---- | Collect server status information.-serverStatus :: Transport t => t -> IO [String]-serverStatus fd = do send fd status - r <- wait fd "status.reply"- return (statusFormat r)
Sound/SC3/Server/Synthdef.hs view
@@ -2,16 +2,18 @@ , synth, synthdef ) where import qualified Data.ByteString.Lazy as B+import qualified Data.Char as C import qualified Data.IntMap as M-import Data.Char (ord) import Data.List import Data.Word-import Sound.OpenSoundControl.Byte+import Sound.OpenSoundControl import Sound.SC3.UGen.UGen-import Sound.SC3.UGen.UGen.Predicate import Sound.SC3.UGen.Rate +-- | Node identifier. type NodeId = Int++-- | Port index. type PortIndex = Int -- | Type to represent unit generator graph.@@ -26,11 +28,11 @@ , node_c_value :: Double } | NodeK { node_id :: NodeId , node_k_rate :: Rate- , node_k_name :: Name+ , node_k_name :: String , node_k_default :: Double } | NodeU { node_id :: NodeId , node_u_rate :: Rate- , node_u_name :: Name+ , node_u_name :: String , node_u_inputs :: [FromPort] , node_u_outputs :: [Output] , node_u_special :: Special@@ -47,6 +49,19 @@ | U NodeId PortIndex deriving (Eq, Show) +-- | Transform a unit generator into a graph.+synth :: UGen -> Graph+synth u = let (_, g) = mk_node (prepare_root u) empty_graph+ (Graph _ cs ks us) = g+ us' = if null ks + then reverse us+ else implicit (length ks) : reverse us+ in Graph (-1) cs ks us'++-- | Transform a unit generator into bytecode.+synthdef :: String -> UGen -> [Word8]+synthdef s u = B.unpack (encode_graphdef s (synth u))+ as_from_port :: Node -> FromPort as_from_port (NodeC n _) = C n as_from_port (NodeK n _ _ _) = K n@@ -76,12 +91,12 @@ mk_node_c _ _ = error "mk_node_c" -- Predicate to locate control, names must be unique.-find_k_p :: Name -> Node -> Bool+find_k_p :: String -> Node -> Bool find_k_p x (NodeK _ _ y _) = x == y find_k_p _ _ = error "find_k_p" -- Insert a control node into the graph.-push_k :: (Rate, Name, Double) -> Graph -> (Node, Graph)+push_k :: (Rate, String, Double) -> Graph -> (Node, Graph) push_k (r, nm, d) g = let n = NodeK (nextId g) r nm d in (n, g { controls = n : controls g@@ -99,7 +114,7 @@ acc (x:xs) ys g = let (y, g') = mk_node x g in acc xs (y:ys) g' -type UGenParts = (Rate, Name, [FromPort], [Output], Special, Maybe UGenId)+type UGenParts = (Rate, String, [FromPort], [Output], Special, Maybe UGenId) -- Predicate to locate primitive, names must be unique. find_u_p :: UGenParts -> Node -> Bool@@ -138,6 +153,7 @@ in mk_node_p n (proxyIndex u) g' | isMRG u = let (_, g') = mk_node (mrgRight u) g in mk_node (mrgLeft u) g'+ | isMCE u = error "mk_node: mce" | otherwise = error "mk_node" type Map = M.IntMap Int@@ -148,7 +164,7 @@ mk_maps (Graph _ cs ks us) = ( M.fromList (zip (map node_id cs) [0..]) , M.fromList (zip (map node_id ks) [0..])- , M.fromList (zip (map node_id (us)) [0..]) )+ , M.fromList (zip (map node_id us) [0..]) ) -- Locate index in map give node identifer. fetch :: NodeId -> Map -> Int@@ -167,10 +183,6 @@ encode_input :: Input -> B.ByteString encode_input (Input u p) = B.append (encode_i16 u) (encode_i16 p) --- Pascal strings are length prefixed byte strings.-str_pstr :: String -> [Word8]-str_pstr s = (fromIntegral (length s)) : map (fromIntegral . ord) s- -- Byte-encode control node. encode_node_k :: Maps -> Node -> B.ByteString encode_node_k (_, ks, _) (NodeK n _ nm _) =@@ -221,16 +233,3 @@ | isMCE u = mrg (mceProxies u) | isMRG u = MRG (prepare_root (mrgLeft u)) (prepare_root (mrgRight u)) | otherwise = u---- | Transform a unit generator into a graph.-synth :: UGen -> Graph-synth u = let (_, g) = mk_node (prepare_root u) empty_graph- (Graph _ cs ks us) = g- us' = if null ks - then reverse us- else implicit (length ks) : reverse us- in Graph (-1) cs ks us'---- | Transform a unit generator into bytecode.-synthdef :: String -> UGen -> [Word8]-synthdef s u = B.unpack (encode_graphdef s (synth u))
Sound/SC3/Server/Utilities.hs view
@@ -1,8 +1,8 @@ module Sound.SC3.Server.Utilities where -mkDuples :: (a -> c) -> (b -> c) -> [(a, b)] -> [c]-mkDuples a b = concatMap (\(x,y) -> [a x, b y])+mk_duples :: (a -> c) -> (b -> c) -> [(a, b)] -> [c]+mk_duples a b = concatMap (\(x,y) -> [a x, b y]) -mkTriples :: (a -> d) -> (b -> d) -> (c -> d) -> [(a, b, c)] -> [d]-mkTriples a b c = concatMap (\(x,y,z) -> [a x, b y, c z])+mk_triples :: (a -> d) -> (b -> d) -> (c -> d) -> [(a, b, c)] -> [d]+mk_triples a b c = concatMap (\(x,y,z) -> [a x, b y, c z])
Sound/SC3/UGen.hs view
@@ -7,6 +7,9 @@ module Sound.SC3.UGen.Envelope, module Sound.SC3.UGen.Envelope.Construct, module Sound.SC3.UGen.Enum,+ module Sound.SC3.UGen.External,+ module Sound.SC3.UGen.External.ATS,+ module Sound.SC3.UGen.External.LPC, module Sound.SC3.UGen.FFT, module Sound.SC3.UGen.FFT.Monadic, module Sound.SC3.UGen.Filter,@@ -21,10 +24,6 @@ module Sound.SC3.UGen.Panner, module Sound.SC3.UGen.Rate, module Sound.SC3.UGen.UGen,- module Sound.SC3.UGen.UGen.Construct,- module Sound.SC3.UGen.UGen.Math,- module Sound.SC3.UGen.UGen.MCE,- module Sound.SC3.UGen.UGen.Predicate, module Sound.SC3.UGen.UId) where import Sound.SC3.UGen.Analysis@@ -36,6 +35,9 @@ import Sound.SC3.UGen.Envelope import Sound.SC3.UGen.Envelope.Construct import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.External+import Sound.SC3.UGen.External.ATS+import Sound.SC3.UGen.External.LPC import Sound.SC3.UGen.FFT import Sound.SC3.UGen.FFT.Monadic import Sound.SC3.UGen.Filter@@ -50,8 +52,4 @@ import Sound.SC3.UGen.Panner import Sound.SC3.UGen.Rate import Sound.SC3.UGen.UGen-import Sound.SC3.UGen.UGen.Construct-import Sound.SC3.UGen.UGen.Math-import Sound.SC3.UGen.UGen.MCE-import Sound.SC3.UGen.UGen.Predicate import Sound.SC3.UGen.UId
Sound/SC3/UGen/Analysis.hs view
@@ -1,8 +1,7 @@ module Sound.SC3.UGen.Analysis where -import Sound.SC3.UGen.Rate (Rate(KR))-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct (mkFilter, mkOsc)+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Amplitude follower. amplitude :: Rate -> UGen -> UGen -> UGen -> UGen
Sound/SC3/UGen/Buffer.hs view
@@ -1,10 +1,9 @@ module Sound.SC3.UGen.Buffer where -import Sound.SC3.UGen.Rate (Rate(AR))-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct (mkFilter, mkFilterMCE, mkOsc, mkOscMCE)-import Sound.SC3.UGen.Enum (Loop, Interpolation(..))-import Sound.SC3.UGen.Utilities (fromLoop, fromInterpolation)+import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.Utilities -- * Buffer query UGens. @@ -36,45 +35,45 @@ -- | Allpass filter (cubic interpolation). bufAllpassC :: UGen -> UGen -> UGen -> UGen -> UGen-bufAllpassC buf i dly dcy = mkFilter "BufAllpassC" [buf,i,dly,dcy] 1+bufAllpassC buf i dly dcy = mkFilter "BufAllpassC" [buf, i, dly, dcy] 1 -- | Allpass filter (linear interpolation). bufAllpassL :: UGen -> UGen -> UGen -> UGen -> UGen-bufAllpassL buf i dly dcy = mkFilter "BufAllpassL" [buf,i,dly,dcy] 1+bufAllpassL buf i dly dcy = mkFilter "BufAllpassL" [buf, i, dly, dcy] 1 -- | Allpass filter (no interpolation). bufAllpassN :: UGen -> UGen -> UGen -> UGen -> UGen-bufAllpassN buf i dly dcy = mkFilter "BufAllpassN" [buf,i,dly,dcy] 1+bufAllpassN buf i dly dcy = mkFilter "BufAllpassN" [buf, i, dly, dcy] 1 -- | Comb filter (cubic interpolation). bufCombC :: UGen -> UGen -> UGen -> UGen -> UGen-bufCombC buf i dly dcy = mkFilter "BufCombC" [buf,i,dly,dcy] 1+bufCombC buf i dly dcy = mkFilter "BufCombC" [buf, i, dly, dcy] 1 -- | Comb filter (linear interpolation). bufCombL :: UGen -> UGen -> UGen -> UGen -> UGen-bufCombL buf i dly dcy = mkFilter "BufCombL" [buf,i,dly,dcy] 1+bufCombL buf i dly dcy = mkFilter "BufCombL" [buf, i, dly, dcy] 1 -- | Comb filter (no interpolation). bufCombN :: UGen -> UGen -> UGen -> UGen -> UGen-bufCombN buf i dly dcy = mkFilter "BufCombN" [buf,i,dly,dcy] 1+bufCombN buf i dly dcy = mkFilter "BufCombN" [buf, i, dly, dcy] 1 -- | Delay line (cubic interpolation). bufDelayC :: UGen -> UGen -> UGen -> UGen-bufDelayC buf i dly = mkFilter "BufDelayC" [buf,i,dly] 1+bufDelayC buf i dly = mkFilter "BufDelayC" [buf, i, dly] 1 -- | Delay line (linear interpolation). bufDelayL :: UGen -> UGen -> UGen -> UGen-bufDelayL buf i dly = mkFilter "BufDelayL" [buf,i,dly] 1+bufDelayL buf i dly = mkFilter "BufDelayL" [buf, i, dly] 1 -- | Delay line (no interpolation). bufDelayN :: UGen -> UGen -> UGen -> UGen-bufDelayN buf i dly = mkFilter "BufDelayN" [buf,i,dly] 1+bufDelayN buf i dly = mkFilter "BufDelayN" [buf, i, dly] 1 -- * Buffer I\/O. -- | Buffer reader. bufRd :: Int -> Rate -> UGen -> UGen -> Loop -> Interpolation -> UGen-bufRd n r buf phs lp intp = mkOsc r "BufRd" [buf,phs,fromLoop lp,fromInterpolation intp] n+bufRd n r buf phs lp intp = mkOsc r "BufRd" [buf, phs, from_loop lp, from_interpolation intp] n -- | Buffer reader (no interpolation). bufRdN :: Int -> Rate -> UGen -> UGen -> Loop -> UGen@@ -90,7 +89,7 @@ -- | Buffer writer. bufWr :: UGen -> UGen -> Loop -> UGen -> UGen-bufWr buf phs lp i = mkFilterMCE "BufWr" [buf,phs,fromLoop lp] i 0+bufWr buf phs lp i = mkFilterMCE "BufWr" [buf, phs, from_loop lp] i 0 -- | Search a buffer for a value. detectIndex :: UGen -> UGen -> UGen@@ -110,15 +109,15 @@ -- | Buffer playback. playBuf :: Int -> UGen -> UGen -> UGen -> UGen -> Loop -> UGen-playBuf n b r' t s l = mkOsc AR "PlayBuf" [b,r',t,s,fromLoop l] n+playBuf n b r t s l = mkOsc AR "PlayBuf" [b, r, t, s, from_loop l] n -- | Buffer recording. recordBuf :: UGen -> UGen -> UGen -> UGen -> UGen -> Loop -> UGen -> UGen -> UGen-recordBuf b o rl pl r l t i = mkOscMCE AR "RecordBuf" [b, o, rl, pl, r, fromLoop l, t] i 0+recordBuf b o rl pl r l t i = mkOscMCE AR "RecordBuf" [b, o, rl, pl, r, from_loop l, t] i 0 -- | Triggered buffer shuffler (grain generator). tGrains :: Int -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-tGrains n t b r c d p a i = mkFilter "TGrains" [t,b,r,c,d,p,a,i] n+tGrains n t b r c d p a i = mkFilter "TGrains" [t, b, r, c, d, p, a, i] n -- | Three variable wavetable oscillator. vOsc3 :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen
Sound/SC3/UGen/Chaos.hs view
@@ -1,8 +1,7 @@ module Sound.SC3.UGen.Chaos where -import Sound.SC3.UGen.Rate (Rate)-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct (mkOsc)+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Chaotic noise. crackle :: Rate -> UGen -> UGen
Sound/SC3/UGen/Composite.hs view
@@ -1,14 +1,34 @@ module Sound.SC3.UGen.Composite where +import Sound.SC3.UGen.Demand.Monadic import Sound.SC3.UGen.Filter+import Sound.SC3.UGen.Information+import Sound.SC3.UGen.IO import Sound.SC3.UGen.Oscillator+import Sound.SC3.UGen.Noise.Monadic import Sound.SC3.UGen.Panner import Sound.SC3.UGen.Rate-import Sound.SC3.UGen.UGen (UGen, mce, mceProxies)-import Sound.SC3.UGen.UGen.Math ()-import Sound.SC3.UGen.UGen.MCE-import Sound.SC3.UGen.UGen.Predicate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UId +-- | Demand rate (:) function.+dcons :: (UId m) => UGen -> UGen -> m UGen+dcons x xs = do i <- dseq 1 (mce2 0 1)+ a <- dseq 1 (mce2 x xs)+ dswitch i a++-- | Dynamic klank, set of non-fixed resonating filters.+dynKlank :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen+dynKlank i fs fo ds s = gen (mceChannels s)+ where gen (f:a:d:xs) = ringz i (f * fs + fo) (d * ds) * a + gen xs+ gen _ = 0++-- | Frequency shifter, in terms of Hilbert UGen.+freqShift :: UGen -> UGen -> UGen -> UGen+freqShift i f p = mix (h * o)+ where o = sinOsc AR f (mce [p + 0.5 * pi, p])+ h = hilbert i+ -- | Collapse multiple channel expansion by summing. mix :: UGen -> UGen mix u | isMCE u = sum (mceProxies u)@@ -22,12 +42,14 @@ mixFillM :: (Monad m) => Int -> (Int -> m UGen) -> m UGen mixFillM n f = mapM f [0 .. n - 1] >>= return . sum --- | Frequency shifter, in terms of Hilbert UGen.-freqShift :: UGen -> UGen -> UGen -> UGen-freqShift i f p = mix (h * o)- where o = sinOsc AR f (mce [p + 0.5 * pi, p])- h = hilbert i+-- | PM oscillator.+pmOsc :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen+pmOsc r cf mf pm mp = sinOsc r cf (sinOsc r mf mp * pm) +-- | Zero indexed audio input buses.+soundIn :: UGen -> UGen+soundIn n = in' 1 AR (numOutputBuses + n)+ -- | Pan a set of channels across the stereo field. splay :: UGen -> UGen -> UGen -> UGen -> UGen splay i s l c = mix (pan2 i (mce p * s + c) 1) * l * (sqrt (1 / n))@@ -35,12 +57,10 @@ m = n - 1 p = map ( (+ (-1.0)) . (* (2 / m)) ) [0 .. m] --- | Dynamic klank, set of non-fixed resonating filters.-dynKlank :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen-dynKlank i fs fo ds s = gen (mceChannels s)- where gen (f:a:d:xs) = ringz i (f * fs + fo) (d * ds) * a + gen xs- gen _ = 0+tChoose :: (UId m) => UGen -> UGen -> m UGen+tChoose t a = do r <- tiRand 0 (constant (length (mceChannels a))) t+ return (select r a) --- | PM oscillator.-pmOsc :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen-pmOsc r cf mf pm mp = sinOsc r cf (sinOsc r mf mp * pm)+twChoose :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen+twChoose t a w n = do i <- twindex t n w+ return (select i a)
Sound/SC3/UGen/Demand.hs view
@@ -1,11 +1,9 @@ module Sound.SC3.UGen.Demand where -import Sound.SC3.UGen.Rate (Rate)-import Sound.SC3.UGen.UGen (UGen(Constant))-import Sound.SC3.UGen.UGen.Construct (mkOsc, mkOscMCE, mkFilterKeyed)-import Sound.SC3.UGen.UGen.MCE (mceChannels)-import Sound.SC3.UGen.Enum (DoneAction)-import Sound.SC3.UGen.Utilities (fromDoneAction)+import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.Utilities -- | Infinte repeat counter for demand rate unit generators. dinf :: UGen@@ -18,12 +16,16 @@ -- | Demand envlope generator. demandEnvGen :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> DoneAction -> UGen-demandEnvGen r l d s c g rst ls lb ts a = mkOsc r "DemandEnvGen" [l,d,s,c,g,rst,ls,lb,ts,fromDoneAction a] 1+demandEnvGen r l d s c g rst ls lb ts a = mkOsc r "DemandEnvGen" [l, d, s, c, g, rst, ls, lb, ts, from_done_action a] 1 -- | Demand results from demand rate ugens. duty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen-duty rate d r act l = mkOsc rate "Duty" [d, r, fromDoneAction act, l] 1+duty rate d r act l = mkOsc rate "Duty" [d, r, from_done_action act, l] 1 -- | Demand results as trigger from demand rate ugens.-tDuty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen-tDuty r d rst act l = mkOscMCE r "TDuty" [d,rst,fromDoneAction act] l 1+tDuty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen -> UGen+tDuty r d rst act l gap = mkOsc r "TDuty" [d, rst, from_done_action act, l, gap] 1++-- Local Variables:+-- truncate-lines:t+-- End:
Sound/SC3/UGen/Demand/Base.hs view
@@ -1,18 +1,17 @@ module Sound.SC3.UGen.Demand.Base where -import Sound.SC3.UGen.Rate (Rate(DR))-import Sound.SC3.UGen.UGen (UGen, UGenId)-import Sound.SC3.UGen.UGen.Construct (mkOscId, mkOscMCEId) import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen import Sound.SC3.UGen.Utilities -- | Buffer demand ugen. dbufrd :: UGenId -> UGen -> UGen -> Loop -> UGen-dbufrd z b p l = mkOscId z DR "Dbufrd" [b, p, fromLoop l] 1+dbufrd z b p l = mkOscId z DR "Dbufrd" [b, p, from_loop l] 1 -- | Buffer write on demand unit generator. dbufwr :: UGenId -> UGen -> UGen -> UGen -> Loop -> UGen-dbufwr z b p i l = mkOscId z DR "Dbufwr" [b, p, i, fromLoop l] 1+dbufwr z b p i l = mkOscId z DR "Dbufwr" [b, p, i, from_loop l] 1 -- | Demand rate white noise. dwhite :: UGenId -> UGen -> UGen -> UGen -> UGen@@ -57,3 +56,7 @@ -- | Demand rate input switching. dswitch1 :: UGenId -> UGen -> UGen -> UGen dswitch1 z l array = mkOscMCEId z DR "Dswitch1" [l] array 1++-- | Demand rate input switching.+dswitch :: UGenId -> UGen -> UGen -> UGen+dswitch z l array = mkOscMCEId z DR "Dswitch" [l] array 1
Sound/SC3/UGen/Demand/Monadic.hs view
@@ -1,7 +1,7 @@ module Sound.SC3.UGen.Demand.Monadic where -import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UGen.Lift import qualified Sound.SC3.UGen.Demand.Base as D import Sound.SC3.UGen.UId import Sound.SC3.UGen.Enum@@ -57,3 +57,7 @@ -- | Demand rate input switching. dswitch1 :: (UId m) => UGen -> UGen -> m UGen dswitch1 = liftU2 D.dswitch1++-- | Demand rate input switching.+dswitch :: (UId m) => UGen -> UGen -> m UGen+dswitch = liftU2 D.dswitch
+ Sound/SC3/UGen/Demand/Unsafe.hs view
@@ -0,0 +1,62 @@+module Sound.SC3.UGen.Demand.Unsafe where++import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UGen.Lift+import qualified Sound.SC3.UGen.Demand.Monadic as D+import Sound.SC3.UGen.Enum++-- | Buffer demand ugen.+dbufrd :: UGen -> UGen -> Loop -> UGen+dbufrd = liftP3 D.dbufrd++-- | Buffer write on demand unit generator.+dbufwr :: UGen -> UGen -> UGen -> Loop -> UGen+dbufwr = liftP4 D.dbufwr++-- | Demand rate white noise.+dwhite :: UGen -> UGen -> UGen -> UGen+dwhite = liftP3 D.dwhite++-- | Demand rate integer white noise.+diwhite :: UGen -> UGen -> UGen -> UGen+diwhite = liftP3 D.diwhite++-- | Demand rate brown noise.+dbrown :: UGen -> UGen -> UGen -> UGen -> UGen+dbrown = liftP4 D.dbrown++-- | Demand rate integer brown noise.+dibrown :: UGen -> UGen -> UGen -> UGen -> UGen+dibrown = liftP4 D.dibrown++-- | Demand rate random selection.+drand :: UGen -> UGen -> UGen+drand = liftP2 D.drand++-- | Demand rate random selection with no immediate repetition.+dxrand :: UGen -> UGen -> UGen+dxrand = liftP2 D.dxrand++-- | Demand rate arithmetic series.+dseries :: UGen -> UGen -> UGen -> UGen+dseries = liftP3 D.dseries++-- | Demand rate geometric series.+dgeom :: UGen -> UGen -> UGen -> UGen+dgeom = liftP3 D.dgeom++-- | Demand rate sequence generator.+dseq :: UGen -> UGen -> UGen+dseq = liftP2 D.dseq++-- | Demand rate series generator.+dser :: UGen -> UGen -> UGen+dser = liftP2 D.dser++-- | Demand rate input switching.+dswitch1 :: UGen -> UGen -> UGen+dswitch1 = liftP2 D.dswitch1++-- | Demand rate input switching.+dswitch :: UGen -> UGen -> UGen+dswitch = liftP2 D.dswitch
Sound/SC3/UGen/Enum.hs view
@@ -1,6 +1,6 @@ module Sound.SC3.UGen.Enum where -import Sound.SC3.UGen.UGen (UGen)+import Sound.SC3.UGen.UGen -- | Loop indicator input. data Loop = Loop
Sound/SC3/UGen/Envelope.hs view
@@ -1,23 +1,22 @@ module Sound.SC3.UGen.Envelope where -import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct (mkOsc, mkFilter)-import Sound.SC3.UGen.Rate (Rate)-import Sound.SC3.UGen.Enum (DoneAction)-import Sound.SC3.UGen.Utilities (fromDoneAction)+import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.Utilities -- | Segment based envelope generator. envGen :: Rate -> UGen -> UGen -> UGen -> UGen -> DoneAction -> [UGen] -> UGen envGen r gate lvl bias scale act pts = mkOsc r "EnvGen" i 1- where i = [gate, lvl, bias, scale, fromDoneAction act] ++ pts+ where i = [gate, lvl, bias, scale, from_done_action act] ++ pts -- | Line generator. line :: Rate -> UGen -> UGen -> UGen -> DoneAction -> UGen-line r start end dur act = mkOsc r "Line" [start, end, dur, fromDoneAction act] 1+line r start end dur act = mkOsc r "Line" [start, end, dur, from_done_action act] 1 -- | Exponential line generator. xLine :: Rate -> UGen -> UGen -> UGen -> DoneAction -> UGen-xLine r start end dur act = mkOsc r "XLine" [start, end, dur, fromDoneAction act] 1+xLine r start end dur act = mkOsc r "XLine" [start, end, dur, from_done_action act] 1 -- | Free node on trigger. freeSelf :: UGen -> UGen@@ -45,7 +44,7 @@ -- | Raise specified done action when input goes silent. detectSilence :: UGen -> UGen -> UGen -> DoneAction -> UGen-detectSilence i a t act = mkFilter "DetectSilence" [i, a, t, fromDoneAction act] 0+detectSilence i a t act = mkFilter "DetectSilence" [i, a, t, from_done_action act] 0 -- | When triggered free specified node. free :: UGen -> UGen -> UGen@@ -53,5 +52,4 @@ -- | Linear envelope generator. linen :: UGen -> UGen -> UGen -> UGen -> DoneAction -> UGen-linen g at sl rt da = mkFilter "Linen" [g,at,sl,rt,fromDoneAction da] 1-+linen g at sl rt da = mkFilter "Linen" [g, at, sl, rt, from_done_action da] 1
Sound/SC3/UGen/Envelope/Construct.hs view
@@ -1,10 +1,9 @@ module Sound.SC3.UGen.Envelope.Construct where -import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Math ()-import Sound.SC3.UGen.Math ((>=*), (<=*))-import Sound.SC3.UGen.Enum (EnvCurve(..))-import Sound.SC3.UGen.Utilities (dbl, d_dx, env_curve, env_value)+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.Math+import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.Utilities -- | Basic envelope data constructor. env :: [UGen] -> [UGen] -> [EnvCurve] -> UGen -> UGen -> [UGen]
+ Sound/SC3/UGen/External.hs view
@@ -0,0 +1,68 @@+module Sound.SC3.UGen.External where++import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen++-- | Resynthesize sinusoidal ATS analysis data.+atsSynth :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+atsSynth b np ps pk fp m a = mkOsc AR "AtsSynth" [b, np, ps, pk, fp, m, a] 1++-- | Resynthesize sinusoidal and critical noise ATS analysis data.+atsNoiSynth :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+atsNoiSynth b np ps pk fp sr nr m a nb bs bk = mkOsc AR "AtsNoiSynth" [b, np, ps, pk, fp, sr, nr, m, a, nb, bs, bk] 1++-- | Emulation of AY (aka YM) soundchip, used in Spectrum/Atari.+ay :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+ay ta tb tc n c va vb vc ef es ct = mkOsc AR "AY" [ta, tb, tc, n, c, va, vb, vc, ef, es, ct] 1++-- | Convert frequency value to value appropriate for AY tone inputs.+ayFreqToTone :: Fractional a => a -> a+ayFreqToTone f = 110300 / (f - 0.5)++-- | Triangular waveguide mesh of a drum-like membrane.+membraneCircle :: UGen -> UGen -> UGen -> UGen+membraneCircle i t l = mkOsc AR "MembraneCircle" [i, t, l] 1++-- | Triangular waveguide mesh of a drum-like membrane.+membraneHexagon :: UGen -> UGen -> UGen -> UGen+membraneHexagon i t l = mkOsc AR "MembraneHexagon" [i, t, l] 1++-- | Extract cps, rmso and err signals from LPC data.+lpcVals :: Rate -> UGen -> UGen -> UGen+lpcVals r b ptr = mkOsc r "LPCVals" [b, ptr] 3++-- | Resynthesize LPC analysis data.+lpcSynth :: UGen -> UGen -> UGen -> UGen+lpcSynth b s ptr = mkOsc AR "LPCSynth" [b, s, ptr] 1++-- | Invert FFT amplitude data.+pv_Invert :: UGen -> UGen+pv_Invert b = mkOsc KR "PV_Invert" [b] 1++-- | STK flute model.+stkFlute :: Rate-> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+stkFlute rt f jd ng vf vg bp tr = mkOsc rt "StkFlute" [f, jd, ng, vf, vg, bp, tr] 1++-- | STK modal bar models.+stkModalBar :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+stkModalBar rt f i sh sp vg vf mx v tr = mkOsc rt "StkModalBar" [f, i, sh, sp, vg, vf, mx, v, tr] 1++-- | STK bowed string model.+stkBowed :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+stkBowed rt f pr po vf vg l g = mkOsc rt "StkBowed" [f, pr, po, vf, vg, l, g] 1++-- | STK mandolin model.+stkMandolin :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+stkMandolin rt f bs pp dm dt at tr = mkOsc rt "StkMandolin" [f, bs, pp, dm, dt, at, tr] 1 ++-- | STK shaker models.+stkShakers :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+stkShakers rt i e d o rf tr = mkOsc rt "StkShakers" [i, e, d, o, rf, tr] 1++-- | Vocal simulation due to W. Kaegi.+vosim :: UGen -> UGen -> UGen -> UGen -> UGen+vosim t f nc d = mkOsc AR "VOSIM" [t, f, nc, d] 1++-- Local Variables:+-- truncate-lines:t+-- End:
+ Sound/SC3/UGen/External/ATS.hs view
@@ -0,0 +1,97 @@+module Sound.SC3.UGen.External.ATS ( ATS(..)+ , ATSHeader(..)+ , ATSFrame+ , atsRead+ , atsSC3 ) where++import Control.Monad+import qualified Data.ByteString.Lazy as B+import Data.List+import Sound.OpenSoundControl+import System.IO++-- | ATS analysis data.+data ATS = ATS { atsHeader :: ATSHeader+ , atsFrames :: [ATSFrame] }+ deriving (Eq, Show)++-- | ATS analysis meta-data.+data ATSHeader = ATSHeader { atsSampleRate :: Double+ , atsFrameSize :: Int+ , atsWindowSize :: Int+ , atsNPartials :: Int+ , atsNFrames :: Int+ , atsMaxAmplitude :: Double+ , atsMaxFrequency :: Double+ , atsAnalysisDuration :: Double+ , atsFileType :: Int+ } deriving (Eq, Show)++-- | ATS analysis frame data. +type ATSFrame = [Double]++-- | Read an ATS data file.+atsRead :: FilePath -> IO ATS+atsRead fn = do+ h <- openFile fn ReadMode+ v <- B.hGet h 8+ let reader = get_reader v+ hdr_r <- replicateM 9 (reader h)+ let f j = hdr_r !! (j - 1)+ g = floor . f+ ft = g 9+ (n, x) = ftype_n ft+ np = g 4+ nf = g 5+ fl = np * n + x+ hdr = ATSHeader (f 1) (g 2) (g 3) np nf (f 6) (f 7) (f 8) ft+ get_f = replicateM fl (reader h)+ d <- replicateM nf get_f+ hClose h+ return (ATS hdr d)++-- | Analysis data in format required by the sc3 ATS UGens.+atsSC3 :: ATS -> [Double]+atsSC3 (ATS h d) = + let f = fromIntegral+ td = transpose d+ in ( f (atsFileType h) :+ f (atsNPartials h) :+ f (atsNFrames h) :+ f (atsWindowSize h) :+ concatMap (td !!) (atsSC3Indices h) )++-- be+read_f64 :: Handle -> IO Double+read_f64 h = B.hGet h 8 >>= return . decode_f64++-- le+read_f64LE :: Handle -> IO Double+read_f64LE h = B.hGet h 8 >>= return . decode_f64 . B.reverse++-- Determine endianess and hence reader.+get_reader :: B.ByteString -> (Handle -> IO Double)+get_reader v = if decode_f64 v == 123.0+ then read_f64+ else read_f64LE++-- Calculate partial depth and frame constant.+ftype_n :: Int -> (Int, Int)+ftype_n 1 = (2, 1)+ftype_n 2 = (3, 1)+ftype_n 3 = (2, 26)+ftype_n 4 = (3, 26)+ftype_n _ = undefined++-- Indices for track data in the order required by sc3.+atsSC3Indices :: ATSHeader -> [Int]+atsSC3Indices h = + let np = atsNPartials h+ o = 3 * (np - 1)+ a = [1,4 .. (1 + o)]+ f = map (+ 1) a+ p = map (+ 1) f+ n = map (+ (4+o)) [0..24]+ in if atsFileType h == 4+ then a ++ f ++ p ++ n+ else error "atsSC3Indices: illegal ATS file type (/= 4)"
+ Sound/SC3/UGen/External/LPC.hs view
@@ -0,0 +1,61 @@+module Sound.SC3.UGen.External.LPC ( LPC(..)+ , LPCHeader(..)+ , LPCFrame+ , lpcRead+ , lpcSC3 ) where++import Control.Monad+import qualified Data.ByteString.Lazy as B+import Data.List+import Sound.OpenSoundControl+import System.IO++-- | LPC analysis data.+data LPC = LPC { lpcHeader :: LPCHeader+ , lpcFrames :: [LPCFrame] }+ deriving (Eq, Show)++-- | LPC analysis meta-data.+data LPCHeader = LPCHeader { lpcHeaderSize :: Int+ , lpcMagic :: Int+ , lpcNPoles :: Int+ , lpcFrameSize :: Int+ , lpcFrameRate :: Double+ , lpcSampleRate :: Double+ , lpcAnalysisDuration :: Double+ , lpcNFrames :: Int+ } deriving (Eq, Show)++-- | LPC analysis frame data.+type LPCFrame = [Double]++-- | Read an lpanal format LPC data file.+lpcRead :: FilePath -> IO LPC+lpcRead fn = do+ h <- openFile fn ReadMode+ l <- hFileSize h+ [hs, lm, np, fs] <- replicateM 4 (read_i32 h)+ [fr, sr, fd] <- replicateM 3 (read_f32 h)+ let nf = ((fromIntegral l - hs) `div` 4) `div` fs+ hdr = LPCHeader hs lm np fs fr sr fd nf+ hc = hs - (7 * 4)+ get_f = replicateM fs (read_f32 h)+ B.hGet h hc+ d <- replicateM nf get_f+ hClose h+ return (LPC hdr d)++-- | Analysis data in format required by the sc3 LPC UGens.+lpcSC3 :: LPC -> [Double]+lpcSC3 (LPC h d) = let f = fromIntegral+ np = f (lpcNPoles h)+ nf = f (lpcNFrames h)+ fs = f (lpcFrameSize h)+ in np : nf : fs : concat (transpose d)++read_i32 :: Handle -> IO Int+read_i32 h = B.hGet h 4 >>= return . decode_i32++read_f32 :: Handle -> IO Double+read_f32 h = B.hGet h 4 >>= return . decode_f32+
Sound/SC3/UGen/FFT.hs view
@@ -1,10 +1,7 @@ module Sound.SC3.UGen.FFT where import Sound.SC3.UGen.Rate-import Sound.SC3.UGen.UGen (UGen, constant, mce)-import Sound.SC3.UGen.UGen.Construct-import Sound.SC3.UGen.UGen.Math ()-import Sound.SC3.UGen.UGen.MCE+import Sound.SC3.UGen.UGen -- | Fast fourier transform. fft :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
Sound/SC3/UGen/FFT/Base.hs view
@@ -1,8 +1,7 @@ module Sound.SC3.UGen.FFT.Base where -import Sound.SC3.UGen.Rate (Rate(KR))-import Sound.SC3.UGen.UGen (UGen, UGenId)-import Sound.SC3.UGen.UGen.Construct (mkOscId)+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Randomize order of bins. pv_BinScramble :: UGenId -> UGen -> UGen -> UGen -> UGen -> UGen@@ -15,3 +14,7 @@ -- | Cross fade, copying bins in random order. pv_RandWipe :: UGenId -> UGen -> UGen -> UGen -> UGen -> UGen pv_RandWipe z ba bb wp trg = mkOscId z KR "PV_RandWipe" [ba,bb,wp,trg] 1++-- Local Variables:+-- truncate-lines:t+-- End:
Sound/SC3/UGen/FFT/Monadic.hs view
@@ -1,7 +1,7 @@ module Sound.SC3.UGen.FFT.Monadic where -import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UGen.Lift import qualified Sound.SC3.UGen.FFT.Base as F import Sound.SC3.UGen.UId
+ Sound/SC3/UGen/FFT/Unsafe.hs view
@@ -0,0 +1,17 @@+module Sound.SC3.UGen.FFT.Unsafe where++import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UGen.Lift+import qualified Sound.SC3.UGen.FFT.Monadic as F++-- | Randomize order of bins.+pv_BinScramble :: UGen -> UGen -> UGen -> UGen -> UGen+pv_BinScramble = liftP4 F.pv_BinScramble++-- | Randomly clear bins.+pv_RandComb :: UGen -> UGen -> UGen -> UGen+pv_RandComb = liftP3 F.pv_RandComb++-- | Cross fade, copying bins in random order.+pv_RandWipe :: UGen -> UGen -> UGen -> UGen -> UGen+pv_RandWipe = liftP4 F.pv_RandWipe
Sound/SC3/UGen/Filter.hs view
@@ -1,20 +1,19 @@ module Sound.SC3.UGen.Filter where -import Sound.SC3.UGen.UGen (UGen, mce)-import Sound.SC3.UGen.UGen.Construct (mkFilter, mkFilterMCE)-import Data.List (transpose)+import Data.List+import Sound.SC3.UGen.UGen -- | Allpass filter (no interpolation) allpassN :: UGen -> UGen -> UGen -> UGen -> UGen-allpassN i maxTime dly dcy = mkFilter "AllpassN" [i, maxTime, dly, dcy] 1+allpassN i mt dly dcy = mkFilter "AllpassN" [i, mt, dly, dcy] 1 -- | Allpass filter (linear interpolation) allpassL :: UGen -> UGen -> UGen -> UGen -> UGen-allpassL i maxTime dly dcy = mkFilter "AllpassL" [i, maxTime, dly, dcy] 1+allpassL i mt dly dcy = mkFilter "AllpassL" [i, mt, dly, dcy] 1 -- | Allpass filter (cubic interpolation) allpassC :: UGen -> UGen -> UGen -> UGen -> UGen-allpassC i maxTime dly dcy = mkFilter "AllpassC" [i, maxTime, dly, dcy] 1+allpassC i mt dly dcy = mkFilter "AllpassC" [i, mt, dly, dcy] 1 -- | Basic psychoacoustic amplitude compensation. ampComp :: UGen -> UGen -> UGen -> UGen@@ -26,7 +25,7 @@ -- | Bandpass filter bpf :: UGen -> UGen -> UGen -> UGen-bpf i freq rq = mkFilter "BPF" [i,freq,rq] 1+bpf i freq rq = mkFilter "BPF" [i, freq, rq] 1 -- | Two zero fixed midpass filter. bpz2 :: UGen -> UGen@@ -34,7 +33,7 @@ -- | Band reject filter brf :: UGen -> UGen -> UGen -> UGen-brf i freq rq = mkFilter "BRF" [i,freq,rq] 1+brf i freq rq = mkFilter "BRF" [i, freq, rq] 1 -- | Two zero fixed midcut filter. brz2 :: UGen -> UGen@@ -42,19 +41,19 @@ -- | Clip input between lower and upper bounds. clip :: UGen -> UGen -> UGen -> UGen-clip i l h = mkFilter "Clip" [i,l,h] 1+clip i l h = mkFilter "Clip" [i, l, h] 1 -- | Comb filter (no interpolation) combN :: UGen -> UGen -> UGen -> UGen -> UGen-combN i maxTime dly dcy = mkFilter "CombN" [i, maxTime, dly, dcy] 1+combN i mt dly dcy = mkFilter "CombN" [i, mt, dly, dcy] 1 -- | Comb filter (linear interpolation) combL :: UGen -> UGen -> UGen -> UGen -> UGen-combL i maxTime dly dcy = mkFilter "CombL" [i, maxTime, dly, dcy] 1+combL i mt dly dcy = mkFilter "CombL" [i, mt, dly, dcy] 1 -- | Comb filter (cubic interpolation) combC :: UGen -> UGen -> UGen -> UGen -> UGen-combC i maxTime dly dcy = mkFilter "CombC" [i, maxTime, dly, dcy] 1+combC i mt dly dcy = mkFilter "CombC" [i, mt, dly, dcy] 1 -- | Convert signal to modal pitch. degreeToKey :: UGen -> UGen -> UGen -> UGen@@ -62,11 +61,11 @@ -- | Exponential decay. decay :: UGen -> UGen -> UGen-decay i dcy = mkFilter "Decay" [i,dcy] 1+decay i dcy = mkFilter "Decay" [i, dcy] 1 -- | Exponential decay (equvalent to $decay dcy - decay atk$). decay2 :: UGen -> UGen -> UGen -> UGen-decay2 i atk dcy = mkFilter "Decay2" [i,atk,dcy] 1+decay2 i atk dcy = mkFilter "Decay2" [i, atk, dcy] 1 -- | Single sample delay. delay1 :: UGen -> UGen@@ -78,27 +77,35 @@ -- | Simple delay line (cubic interpolation). delayC :: UGen -> UGen -> UGen -> UGen-delayC i maxTime dly = mkFilter "DelayC" [i,maxTime,dly] 1+delayC i mt dly = mkFilter "DelayC" [i, mt, dly] 1 -- | Simple delay line (linear interpolation). delayL :: UGen -> UGen -> UGen -> UGen-delayL i maxTime dly = mkFilter "DelayL" [i,maxTime,dly] 1+delayL i mt dly = mkFilter "DelayL" [i, mt, dly] 1 -- | Simple delay line (no interpolation). delayN :: UGen -> UGen -> UGen -> UGen-delayN i maxTime dly = mkFilter "DelayN" [i,maxTime,dly] 1+delayN i mt dly = mkFilter "DelayN" [i, mt, dly] 1 -- | FOF like filter. formlet :: UGen -> UGen -> UGen -> UGen -> UGen-formlet i f a d = mkFilter "Formlet" [i,f,a,d] 1+formlet i f a d = mkFilter "Formlet" [i, f, a, d] 1 -- | First order filter section. fos :: UGen -> UGen -> UGen -> UGen -> UGen-fos i a0 a1 b1 = mkFilter "FOS" [i,a0,a1,b1] 1+fos i a0 a1 b1 = mkFilter "FOS" [i, a0, a1, b1] 1 +-- | A simple reverb.+freeVerb :: UGen -> UGen -> UGen -> UGen -> UGen+freeVerb i mx room damp = mkFilter "FreeVerb" [i, mx, room, damp] 1++-- | A simple reverb (two channel).+freeVerb2 :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen+freeVerb2 i1 i2 mx room damp = mkFilter "FreeVerb2" [i1, i2, mx, room, damp] 2+ -- | Gate. gate :: UGen -> UGen -> UGen-gate i t = mkFilter "Gate" [i,t] 1+gate i t = mkFilter "Gate" [i, t] 1 -- | Hash input values. hasher :: UGen -> UGen@@ -110,7 +117,7 @@ -- | Highpass filter. hpf :: UGen -> UGen -> UGen-hpf i f = mkFilter "HPF" [i,f] 1+hpf i f = mkFilter "HPF" [i, f] 1 -- | Two point difference filter. hpz1 :: UGen -> UGen@@ -122,11 +129,11 @@ -- | Is signal within specified range. inRange :: UGen -> UGen -> UGen -> UGen-inRange i lo hi = mkFilter "InRange" [i,lo,hi] 1+inRange i lo hi = mkFilter "InRange" [i, lo, hi] 1 -- | Fixed resonator filter bank. klank :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen-klank i fs fp d s = mkFilterMCE "Klank" [i,fs,fp,d] s 1+klank i fs fp d s = mkFilterMCE "Klank" [i, fs, fp, d] s 1 -- | Format frequency, amplitude and decay time data as required for klank. klankSpec :: [UGen] -> [UGen] -> [UGen] -> UGen@@ -134,39 +141,39 @@ -- | Simple averaging filter. lag :: UGen -> UGen -> UGen-lag i t = mkFilter "Lag" [i,t] 1+lag i t = mkFilter "Lag" [i, t] 1 -- | Nested lag filter. lag2 :: UGen -> UGen -> UGen-lag2 i t = mkFilter "Lag2" [i,t] 1+lag2 i t = mkFilter "Lag2" [i, t] 1 -- | Twice nested lag filter. lag3 :: UGen -> UGen -> UGen-lag3 i t = mkFilter "Lag3" [i,t] 1+lag3 i t = mkFilter "Lag3" [i, t] 1 -- | Last value before chang above threshhold. lastValue :: UGen -> UGen -> UGen-lastValue i t = mkFilter "LastValue" [i,t] 1+lastValue i t = mkFilter "LastValue" [i, t] 1 -- | Sample and hold. latch :: UGen -> UGen -> UGen-latch i t = mkFilter "Latch" [i,t] 1+latch i t = mkFilter "Latch" [i, t] 1 -- | Remove DC offset. leakDC :: UGen -> UGen -> UGen-leakDC i coef = mkFilter "LeakDC" [i,coef] 1+leakDC i coef = mkFilter "LeakDC" [i, coef] 1 -- | Map from one linear range to another linear range. linLin :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen-linLin i sl sh dl dh = mkFilter "LinLin" [i,sl,sh,dl,dh] 1+linLin i sl sh dl dh = mkFilter "LinLin" [i, sl, sh, dl, dh] 1 -- | Map from a linear range to an exponential range. linExp :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen-linExp i sl sh dl dh = mkFilter "LinExp" [i,sl,sh,dl,dh] 1+linExp i sl sh dl dh = mkFilter "LinExp" [i, sl, sh, dl, dh] 1 -- | Lowpass filter. lpf :: UGen -> UGen -> UGen-lpf i f = mkFilter "LPF" [i,f] 1+lpf i f = mkFilter "LPF" [i, f] 1 -- | Two point average filter. lpz1 :: UGen -> UGen@@ -178,11 +185,11 @@ -- | Masks off bits in the mantissa of signal. mantissaMask :: UGen -> UGen -> UGen-mantissaMask i bits = mkFilter "MantissaMask" [i,bits] 1+mantissaMask i bits = mkFilter "MantissaMask" [i, bits] 1 -- | Median filter. median :: UGen -> UGen -> UGen-median size i = mkFilter "Median" [size,i] 1+median size i = mkFilter "Median" [size, i] 1 -- | Moog VCF implementation. moogFF :: UGen -> UGen -> UGen -> UGen -> UGen@@ -190,31 +197,31 @@ -- | Most changed input. mostChange :: UGen -> UGen -> UGen-mostChange a b = mkFilter "MostChange" [a,b] 1+mostChange a b = mkFilter "MostChange" [a, b] 1 -- | Multiply add ternary operator. mulAdd :: UGen -> UGen -> UGen -> UGen-mulAdd s m a = mkFilter "MulAdd" [s,m,a] 1+mulAdd s m a = mkFilter "MulAdd" [s, m, a] 1 -- | Flattens dynamics. normalizer :: UGen -> UGen -> UGen -> UGen-normalizer i level dur = mkFilter "Normalizer" [i,level,dur] 1+normalizer i level dur = mkFilter "Normalizer" [i, level, dur] 1 -- | One pole filter. onePole :: UGen -> UGen -> UGen-onePole i coef = mkFilter "OnePole" [i,coef] 1+onePole i coef = mkFilter "OnePole" [i, coef] 1 -- | One zero filter. oneZero :: UGen -> UGen -> UGen-oneZero i coef = mkFilter "OneZero" [i,coef] 1+oneZero i coef = mkFilter "OneZero" [i, coef] 1 -- | Maximum value. peak :: UGen -> UGen -> UGen-peak t r = mkFilter "Peak" [t,r] 1+peak t r = mkFilter "Peak" [t, r] 1 -- | Simple time domain pitch shifter. pitchShift :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen-pitchShift i w p d t = mkFilter "PitchShift" [i,w,p,d,t] 1+pitchShift i w p d t = mkFilter "PitchShift" [i, w, p, d, t] 1 -- | Karplus-Strong synthesis. pluck :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen@@ -222,7 +229,7 @@ -- | Trigger counter. pulseCount :: UGen -> UGen -> UGen-pulseCount t r = mkFilter "PulseCount" [t,r] 1+pulseCount t r = mkFilter "PulseCount" [t, r] 1 -- | Pass every nth trigger. pulseDivider :: UGen -> UGen -> UGen -> UGen@@ -230,31 +237,31 @@ -- | Resonant highpass filter. rhpf :: UGen -> UGen -> UGen -> UGen-rhpf i freq rq = mkFilter "RHPF" [i,freq,rq] 1+rhpf i freq rq = mkFilter "RHPF" [i, freq, rq] 1 -- | Resonant lowpass filter. rlpf :: UGen -> UGen -> UGen -> UGen-rlpf i freq rq = mkFilter "RLPF" [i,freq,rq] 1+rlpf i freq rq = mkFilter "RLPF" [i, freq, rq] 1 -- | Resonant filter. resonz :: UGen -> UGen -> UGen -> UGen-resonz i freq bwr = mkFilter "Resonz" [i,freq,bwr] 1+resonz i freq bwr = mkFilter "Resonz" [i, freq, bwr] 1 -- | Ringing filter (equivalent to Resonz). ringz :: UGen -> UGen -> UGen -> UGen-ringz i freq dcy = mkFilter "Ringz" [i,freq,dcy] 1+ringz i freq dcy = mkFilter "Ringz" [i, freq, dcy] 1 -- | Track maximum level. runningMax :: UGen -> UGen -> UGen-runningMax i t = mkFilter "RunningMax" [i,t] 1+runningMax i t = mkFilter "RunningMax" [i, t] 1 -- | Track minimum level. runningMin :: UGen -> UGen -> UGen-runningMin i t = mkFilter "RunningMin" [i,t] 1+runningMin i t = mkFilter "RunningMin" [i, t] 1 -- | Running sum. runningSum :: UGen -> UGen -> UGen-runningSum i n = mkFilter "RunningSum" [i,n] 1+runningSum i n = mkFilter "RunningSum" [i, n] 1 -- | Select output from array of inputs. select :: UGen -> UGen -> UGen@@ -266,31 +273,31 @@ -- | Set-reset flip flop. setResetFF :: UGen -> UGen -> UGen-setResetFF t r = mkFilter "SetResetFF" [t,r] 1+setResetFF t r = mkFilter "SetResetFF" [t, r] 1 -- | Wave shaper. shaper :: UGen -> UGen -> UGen-shaper b s = mkFilter "Shaper" [b,s] 1+shaper b s = mkFilter "Shaper" [b, s] 1 -- | Remove transients and higher frequencies. slew :: UGen -> UGen -> UGen -> UGen-slew i up dn = mkFilter "Slew" [i,up,dn] 1+slew i up dn = mkFilter "Slew" [i, up, dn] 1 -- | Second order filter section (biquad). sos :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-sos i a0 a1 a2 b1 b2 = mkFilter "SOS" [i,a0,a1,a2,b1,b2] 1+sos i a0 a1 a2 b1 b2 = mkFilter "SOS" [i, a0, a1, a2, b1, b2] 1 -- | Stepper pulse counter. stepper :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-stepper t r minTime maxTime s v = mkFilter "Stepper" [t,r,minTime,maxTime,s,v] 1+stepper t r mn mx s v = mkFilter "Stepper" [t, r, mn, mx, s, v] 1 -- | Triggered linear ramp. sweep :: UGen -> UGen -> UGen-sweep t r = mkFilter "Sweep" [t,r] 1+sweep t r = mkFilter "Sweep" [t, r] 1 -- | Delay trigger by specified interval. tDelay :: UGen -> UGen -> UGen-tDelay i d = mkFilter "TDelay" [i,d] 1+tDelay i d = mkFilter "TDelay" [i, d] 1 -- | Time since last triggered. timer :: UGen -> UGen@@ -302,25 +309,21 @@ -- | When triggered output trigger for specified duration. trig :: UGen -> UGen -> UGen-trig i d = mkFilter "Trig" [i,d] 1+trig i d = mkFilter "Trig" [i, d] 1 -- | When triggered output unit signal for specified duration. trig1 :: UGen -> UGen -> UGen-trig1 i d = mkFilter "Trig1" [i,d] 1---- | Triggered windex.-twindex :: UGen -> UGen -> UGen -> UGen-twindex i n a = mkFilterMCE "TWindex" [i,n] a 1+trig1 i d = mkFilter "Trig1" [i, d] 1 -- | Two pole filter. twoPole :: UGen -> UGen -> UGen -> UGen-twoPole i freq radius = mkFilter "TwoPole" [i,freq,radius] 1+twoPole i freq radius = mkFilter "TwoPole" [i, freq, radius] 1 -- | Two zero filter. twoZero :: UGen -> UGen -> UGen -> UGen-twoZero i freq radius = mkFilter "TwoZero" [i,freq,radius] 1+twoZero i freq radius = mkFilter "TwoZero" [i, freq, radius] 1 -- | Index into a table with a signal. wrapIndex :: UGen -> UGen -> UGen-wrapIndex b i = mkFilter "WrapIndex" [b,i] 1+wrapIndex b i = mkFilter "WrapIndex" [b, i] 1
Sound/SC3/UGen/Granular.hs view
@@ -1,8 +1,7 @@ module Sound.SC3.UGen.Granular where -import Sound.SC3.UGen.Rate (Rate(AR))-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Granular synthesis with sound stored in a buffer. grainBuf :: Int -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
− Sound/SC3/UGen/Graph/Naive.hs
@@ -1,73 +0,0 @@-module Sound.SC3.UGen.Graph.Naive ( Graph(..)- , Input(..)- , graph- , nodeIndex- , makeInput ) where--import Sound.SC3.UGen.Rate (Rate(KR))-import Sound.SC3.UGen.UGen (UGen(..), Special(..))-import Sound.SC3.UGen.UGen.Predicate--import Data.Maybe (fromMaybe)-import Data.List (nub, elemIndex)--data Graph = Graph { constants :: [UGen]- , controls :: [UGen]- , primitives :: [UGen] }- deriving (Eq, Show)-data Input = Input Int Int deriving (Eq, Show)---- | The list of all UGens referenced in a UGen graph.-nodes :: UGen -> [UGen]-nodes u@(Primitive _ _ i _ _ _) = u : concatMap nodes i-nodes (Proxy u _) = u : nodes u-nodes (MCE u) = concatMap nodes u-nodes (MRG x y) = nodes x ++ nodes y-nodes u = [u]---- | Construct implicit control UGen (k-rate only).-implicit :: Int -> UGen-implicit n = Primitive KR "Control" [] (replicate n KR) (Special 0) Nothing---- | Construct a UGen graph.-graph :: UGen -> Graph-graph root = Graph n c u'- where e = (nub . reverse) (nodes root)- n = filter isConstant e- c = filter isControl e- u = filter isUGen e- u' = if null c then u else implicit (length c) : u---- | Determine index of a node in the Graph.-elemIndex' :: (Eq a, Show a) => a -> [a] -> Int-elemIndex' e l = fromMaybe (error ("node not in graph?" ++ show (e,l))) - (elemIndex e l)- --- | Determine index of UGen in Graph.-ugenIndex :: Graph -> UGen -> Int-ugenIndex (Graph _ _ u) x = elemIndex' x u---- | Determine index of Constant in Graph.-constantIndex :: Graph -> UGen -> Int-constantIndex (Graph n _ _) x = elemIndex' x n---- | Determine index of Control in Graph.-controlIndex :: Graph -> UGen -> Int-controlIndex (Graph _ c _) x = elemIndex' x c---- | Determine index of any node in Graph.-nodeIndex :: Graph -> UGen -> Int-nodeIndex g u@(Constant _) = constantIndex g u-nodeIndex g u@(Control _ _ _) = controlIndex g u-nodeIndex g u@(Primitive _ _ _ _ _ _) = ugenIndex g u-nodeIndex g (MRG u _) = ugenIndex g u-nodeIndex _ _ = error "nodeIndex: illegal input"---- | Construct Input value for UGen in Graph.-makeInput :: Graph -> UGen -> Input-makeInput g u@(Primitive _ _ _ _ _ _) = Input (ugenIndex g u) 0-makeInput g u@(Constant _) = Input (-1) (constantIndex g u)-makeInput g u@(Control _ _ _) = Input 0 (controlIndex g u)-makeInput g (Proxy u n) = Input (ugenIndex g u) n-makeInput g (MRG u _) = makeInput g u-makeInput _ u = error ("makeInput: illegal input: " ++ show u)
Sound/SC3/UGen/IO.hs view
@@ -1,10 +1,9 @@ module Sound.SC3.UGen.IO where -import Sound.SC3.UGen.Rate (Rate(KR,AR))-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct-import Sound.SC3.UGen.Enum (Warp)-import Sound.SC3.UGen.Utilities (fromWarp)+import Sound.SC3.UGen.Enum+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.Utilities -- | Read signal from an audio or control bus. in' :: Int -> Rate -> UGen -> UGen@@ -14,6 +13,7 @@ localIn :: Int -> Rate -> UGen localIn nc r = mkOsc r "LocalIn" [] nc +-- | Control rate bus input with lag. lagIn :: Int -> UGen -> UGen -> UGen lagIn nc bus lag = mkOsc KR "LagIn" [bus, lag] nc @@ -57,15 +57,15 @@ -- | Report the status of the first pointer button. mouseButton :: Rate -> UGen -> UGen -> UGen -> UGen-mouseButton r minVal maxVal lag = mkOsc r "MouseButton" [minVal, maxVal, lag] 1+mouseButton r ll rl lag = mkOsc r "MouseButton" [ll, rl, lag] 1 -- | Cursor UGen, X axis. mouseX :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen-mouseX r minVal maxVal warp lag = mkOsc r "MouseX" [minVal, maxVal, fromWarp warp, lag] 1+mouseX r ll rl w lag = mkOsc r "MouseX" [ll, rl, from_warp w, lag] 1 -- | Cursor UGen, Y axis. mouseY :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen-mouseY r minVal maxVal warp lag = mkOsc r "MouseY" [minVal, maxVal, fromWarp warp, lag] 1+mouseY r ll rl w lag = mkOsc r "MouseY" [ll, rl, from_warp w, lag] 1 -- | Control variant. trigControl :: Int -> Rate -> UGen
Sound/SC3/UGen/Information.hs view
@@ -1,48 +1,47 @@ module Sound.SC3.UGen.Information where -import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.Utilities (mkInfoUGen)+import Sound.SC3.UGen.UGen -- | Sample rate of synthesis server, frames per second. sampleRate :: UGen-sampleRate = mkInfoUGen "SampleRate"+sampleRate = mkInfo "SampleRate" -- | Duration of one sample, seconds. sampleDur :: UGen-sampleDur = mkInfoUGen "SampleDur"+sampleDur = mkInfo "SampleDur" -- | Duration of one sample, radians. radiansPerSample :: UGen-radiansPerSample = mkInfoUGen "RadiansPerSample"+radiansPerSample = mkInfo "RadiansPerSample" -- | Control rate of synthesis server, periods per second. controlRate :: UGen-controlRate = mkInfoUGen "ControlRate"+controlRate = mkInfo "ControlRate" -- | Sub-sample accurate scheduling offset. subsampleOffset :: UGen-subsampleOffset = mkInfoUGen "SubsampleOffset"+subsampleOffset = mkInfo "SubsampleOffset" -- | Number of allocated output audio rate buses. numOutputBuses :: UGen-numOutputBuses = mkInfoUGen "NumOutputBuses"+numOutputBuses = mkInfo "NumOutputBuses" -- | Number of allocated input audio rate buses. numInputBuses :: UGen-numInputBuses = mkInfoUGen "NumInputBuses"+numInputBuses = mkInfo "NumInputBuses" -- | Number of allocated audio rate buses. numAudioBuses :: UGen-numAudioBuses = mkInfoUGen "NumAudioBuses"+numAudioBuses = mkInfo "NumAudioBuses" -- | Number of allocated control rate buses. numControlBuses :: UGen-numControlBuses = mkInfoUGen "NumControlBuses"+numControlBuses = mkInfo "NumControlBuses" -- | Number of allocated buffers. numBuffers :: UGen-numBuffers = mkInfoUGen "NumBuffers"+numBuffers = mkInfo "NumBuffers" -- | Number of runnings synthesis nodes. numRunningSynths :: UGen-numRunningSynths = mkInfoUGen "NumRunningSynths"+numRunningSynths = mkInfo "NumRunningSynths"
Sound/SC3/UGen/MachineListening.hs view
@@ -2,15 +2,17 @@ import Data.List import Data.Maybe-import Sound.SC3.UGen.Rate (Rate(KR))-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.Math ()-import Sound.SC3.UGen.UGen.Construct (mkOsc)+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Autocorrelation beat tracker. beatTrack :: UGen -> UGen -> UGen beatTrack fft lock = mkOsc KR "BeatTrack" [fft, lock] 4 +-- | Template matching beat tracker.+beatTrack2 :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+beatTrack2 b mf ws pa lk w = mkOsc KR "BeatTrack2" [b, mf, ws, pa, lk, w] 6+ -- | Extraction of instantaneous loudness in sones. loudness :: UGen -> UGen -> UGen -> UGen loudness fft smask tmask = mkOsc KR "Compander" [fft, smask, tmask] 1@@ -21,16 +23,29 @@ where t = ["power", "magsum", "complex", "rcomplex", "phase", "wphase", "mkl"] -- | Onset detector.-onsets :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-onsets c t o r f mg ms w = mkOsc KR "Onsets" [c, t, o, r, f, mg, ms, w] 1+onsets :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+onsets c t o r f mg ms wt rw = mkOsc KR "Onsets" [c, t, o, r, f, mg, ms, wt, rw] 1 -- | Onset detector with default values for minor parameters. onsets' :: UGen -> UGen -> UGen -> UGen-onsets' c t o = onsets c t o 1.0 0.1 10.0 11.0 1.0+onsets' c t o = onsets c t o 1 0.1 10 11 1 0 -- | Key tracker. keyTrack :: UGen -> UGen -> UGen -> UGen -> UGen keyTrack fft kd cl _ = mkOsc KR "KeyTrack" [fft, kd, cl] 1++-- | Mel frequency cepstral coefficients.+mfcc :: Int -> UGen -> UGen+mfcc nc b = mkOsc KR "MFCC" [b, constant nc] nc++specFlatness :: UGen -> UGen+specFlatness b = mkOsc KR "SpecFlatness" [b] 1++specPcile :: UGen -> UGen -> UGen -> UGen+specPcile b f i = mkOsc KR "SpecPcile" [b, f, i] 1++specCentroid :: UGen -> UGen+specCentroid b = mkOsc KR "SpecFlatness" [b] 1 -- Local Variables: -- truncate-lines:t
Sound/SC3/UGen/Math.hs view
@@ -1,9 +1,7 @@ module Sound.SC3.UGen.Math where import Sound.SC3.UGen.Operator-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct-import Sound.SC3.UGen.UGen.Math ()+import Sound.SC3.UGen.UGen -- The Eq and Ord classes in the Prelude require Bool, hence the name -- mangling. True is 1.0, False is 0.0
Sound/SC3/UGen/Noise/Base.hs view
@@ -1,8 +1,7 @@ module Sound.SC3.UGen.Noise.Base where -import Sound.SC3.UGen.Rate (Rate(IR))-import Sound.SC3.UGen.UGen (UGen, UGenId)-import Sound.SC3.UGen.UGen.Construct (mkOscId, mkFilterId)+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Brown noise. brownNoise :: UGenId -> Rate -> UGen@@ -14,7 +13,7 @@ -- | Randomly pass or block triggers. coinGate :: UGenId -> UGen -> UGen -> UGen-coinGate z prob i = mkFilterId z "CoinGate" [prob,i] 1+coinGate z prob i = mkFilterId z "CoinGate" [prob, i] 1 -- | Random impulses in (-1, 1). dust2 :: UGenId -> Rate -> UGen -> UGen@@ -26,7 +25,7 @@ -- | Random value in exponential distribution. expRand :: UGenId -> UGen -> UGen -> UGen-expRand z lo hi = mkOscId z IR "ExpRand" [lo,hi] 1+expRand z lo hi = mkOscId z IR "ExpRand" [lo, hi] 1 -- | Gray noise. grayNoise :: UGenId -> Rate -> UGen@@ -34,7 +33,7 @@ -- | Random integer in uniform distribution. iRand :: UGenId -> UGen -> UGen -> UGen-iRand z lo hi = mkOscId z IR "IRand" [lo,hi] 1+iRand z lo hi = mkOscId z IR "IRand" [lo, hi] 1 -- | Clip noise. lfClipNoise :: UGenId -> Rate -> UGen -> UGen@@ -48,7 +47,7 @@ lfdNoise0 :: UGenId -> Rate -> UGen -> UGen lfdNoise0 z r freq = mkOscId z r "LFDNoise0" [freq] 1 --- | Dynamic ramp noise. +-- | Dynamic ramp noise. lfdNoise1 :: UGenId -> Rate -> UGen -> UGen lfdNoise1 z r freq = mkOscId z r "LFDNoise1" [freq] 1 @@ -74,11 +73,11 @@ -- | Random value in skewed linear distribution. linRand :: UGenId -> UGen -> UGen -> UGen -> UGen-linRand z lo hi m = mkOscId z IR "LinRand" [lo,hi,m] 1+linRand z lo hi m = mkOscId z IR "LinRand" [lo, hi, m] 1 -- | Random value in sum of n linear distribution. nRand :: UGenId -> UGen -> UGen -> UGen -> UGen-nRand z lo hi n = mkOscId z IR "NRand" [lo,hi,n] 1+nRand z lo hi n = mkOscId z IR "NRand" [lo, hi, n] 1 -- | Pink noise. pinkNoise :: UGenId -> Rate -> UGen@@ -86,19 +85,23 @@ -- | Random value in uniform distribution. rand :: UGenId -> UGen -> UGen -> UGen-rand z lo hi = mkOscId z IR "Rand" [lo,hi] 1+rand z lo hi = mkOscId z IR "Rand" [lo, hi] 1 -- | Random value in exponential distribution on trigger. tExpRand :: UGenId -> UGen -> UGen -> UGen -> UGen-tExpRand z lo hi trig = mkFilterId z "TExpRand" [lo,hi,trig] 1+tExpRand z lo hi trig = mkFilterId z "TExpRand" [lo, hi, trig] 1 -- | Random integer in uniform distribution on trigger. tiRand :: UGenId -> UGen -> UGen -> UGen -> UGen-tiRand z lo hi trig = mkFilterId z "TIRand" [lo,hi,trig] 1+tiRand z lo hi trig = mkFilterId z "TIRand" [lo, hi, trig] 1 -- | Random value in uniform distribution on trigger. tRand :: UGenId -> UGen -> UGen -> UGen -> UGen-tRand z lo hi trig = mkFilterId z "TRand" [lo,hi,trig] 1+tRand z lo hi trig = mkFilterId z "TRand" [lo, hi, trig] 1++-- | Triggered windex.+twindex :: UGenId -> UGen -> UGen -> UGen -> UGen+twindex z i n a = mkFilterMCEId z "TWindex" [i, n] a 1 -- | White noise. whiteNoise :: UGenId -> Rate -> UGen
Sound/SC3/UGen/Noise/Monadic.hs view
@@ -1,8 +1,8 @@ module Sound.SC3.UGen.Noise.Monadic where -import Sound.SC3.UGen.Rate (Rate)-import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UGen.Lift import qualified Sound.SC3.UGen.Noise.Base as N import Sound.SC3.UGen.UId @@ -50,7 +50,7 @@ lfdNoise0 :: (UId m) => Rate -> UGen -> m UGen lfdNoise0 = liftU2 N.lfdNoise0 --- | Dynamic ramp noise. +-- | Dynamic ramp noise. lfdNoise1 :: (UId m) => Rate -> UGen -> m UGen lfdNoise1 = liftU2 N.lfdNoise1 @@ -101,6 +101,10 @@ -- | Random value in uniform distribution on trigger. tRand :: (UId m) => UGen -> UGen -> UGen -> m UGen tRand = liftU3 N.tRand++-- | Triggered windex.+twindex :: (UId m) => UGen -> UGen -> UGen -> m UGen+twindex = liftU3 N.twindex -- | White noise. whiteNoise :: (UId m) => Rate -> m UGen
+ Sound/SC3/UGen/Noise/Unsafe.hs view
@@ -0,0 +1,110 @@+module Sound.SC3.UGen.Noise.Unsafe where++import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UGen.Lift+import qualified Sound.SC3.UGen.Noise.Monadic as N++-- | Brown noise.+brownNoise :: Rate -> UGen+brownNoise = liftP N.brownNoise++-- | Clip noise.+clipNoise :: Rate -> UGen+clipNoise = liftP N.clipNoise++-- | Randomly pass or block triggers.+coinGate :: UGen -> UGen -> UGen+coinGate = liftP2 N.coinGate++-- | Random impulses in (-1, 1).+dust2 :: Rate -> UGen -> UGen+dust2 = liftP2 N.dust2++-- | Random impulse in (0,1).+dust :: Rate -> UGen -> UGen+dust = liftP2 N.dust++-- | Random value in exponential distribution.+expRand :: UGen -> UGen -> UGen+expRand = liftP2 N.expRand++-- | Gray noise.+grayNoise :: Rate -> UGen+grayNoise = liftP N.grayNoise++-- | Random integer in uniform distribution.+iRand :: UGen -> UGen -> UGen+iRand = liftP2 N.iRand++-- | Clip noise.+lfClipNoise :: Rate -> UGen -> UGen+lfClipNoise = liftP2 N.lfClipNoise++-- | Dynamic clip noise.+lfdClipNoise :: Rate -> UGen -> UGen+lfdClipNoise = liftP2 N.lfdClipNoise++-- | Dynamic step noise.+lfdNoise0 :: Rate -> UGen -> UGen+lfdNoise0 = liftP2 N.lfdNoise0++-- | Dynamic ramp noise.+lfdNoise1 :: Rate -> UGen -> UGen+lfdNoise1 = liftP2 N.lfdNoise1++-- | Dynamic quadratic noise+lfdNoise2 :: Rate -> UGen -> UGen+lfdNoise2 = liftP2 N.lfdNoise2++-- | Dynamic cubic noise+lfdNoise3 :: Rate -> UGen -> UGen+lfdNoise3 = liftP2 N.lfdNoise3++-- | Step noise.+lfNoise0 :: Rate -> UGen -> UGen+lfNoise0 = liftP2 N.lfNoise0++-- | Ramp noise.+lfNoise1 :: Rate -> UGen -> UGen+lfNoise1 = liftP2 N.lfNoise1++-- | Quadratic noise.+lfNoise2 :: Rate -> UGen -> UGen+lfNoise2 = liftP2 N.lfNoise2++-- | Random value in skewed linear distribution.+linRand :: UGen -> UGen -> UGen -> UGen+linRand = liftP3 N.linRand++-- | Random value in sum of n linear distribution.+nRand :: UGen -> UGen -> UGen -> UGen+nRand = liftP3 N.nRand++-- | Pink noise.+pinkNoise :: Rate -> UGen+pinkNoise = liftP N.pinkNoise++-- | Random value in uniform distribution.+rand :: UGen -> UGen -> UGen+rand = liftP2 N.rand++-- | Random value in exponential distribution on trigger.+tExpRand :: UGen -> UGen -> UGen -> UGen+tExpRand = liftP3 N.tExpRand++-- | Random integer in uniform distribution on trigger.+tiRand :: UGen -> UGen -> UGen -> UGen+tiRand = liftP3 N.tiRand++-- | Random value in uniform distribution on trigger.+tRand :: UGen -> UGen -> UGen -> UGen+tRand = liftP3 N.tRand++-- | Triggered windex.+twindex :: UGen -> UGen -> UGen -> UGen+twindex = liftP3 N.twindex++-- | White noise.+whiteNoise :: Rate -> UGen+whiteNoise = liftP N.whiteNoise
Sound/SC3/UGen/Oscillator.hs view
@@ -1,9 +1,8 @@ module Sound.SC3.UGen.Oscillator where -import Sound.SC3.UGen.Rate (Rate(AR))-import Sound.SC3.UGen.UGen (UGen, mce)-import Sound.SC3.UGen.UGen.Construct (mkOsc, mkOscMCE)-import Data.List(transpose)+import Data.List+import Sound.SC3.UGen.Rate+import Sound.SC3.UGen.UGen -- | Band Limited ImPulse generator. blip :: Rate -> UGen -> UGen -> UGen@@ -77,7 +76,7 @@ sinOsc :: Rate -> UGen -> UGen -> UGen sinOsc r freq phase = mkOsc r "SinOsc" [freq, phase] 1 --- | Sawtooth oscillator hard synched to a fundamental. +-- | Sawtooth oscillator hard synched to a fundamental. syncSaw :: Rate -> UGen -> UGen -> UGen syncSaw r syncFreq sawFreq = mkOsc r "SyncSaw" [syncFreq, sawFreq] 1
Sound/SC3/UGen/Panner.hs view
@@ -1,7 +1,6 @@ module Sound.SC3.UGen.Panner where -import Sound.SC3.UGen.UGen (UGen)-import Sound.SC3.UGen.UGen.Construct (mkFilter, mkFilterMCE)+import Sound.SC3.UGen.UGen -- | Two channel equal power panner. pan2 :: UGen -> UGen -> UGen -> UGen@@ -39,7 +38,7 @@ panAz nc i p l w o = mkFilterMCE "PanAz" [i, p, l, w, o] nc 0 xFade2 :: UGen -> UGen -> UGen -> UGen -> UGen-xFade2 inA inB pan level = mkFilter "XFade" [inA, inB, pan, level] 2+xFade2 inA inB pan level = mkFilter "XFade2" [inA, inB, pan, level] 2 linXFade2 :: UGen -> UGen -> UGen -> UGen-linXFade2 inA inB pan = mkFilter "XFade" [inA, inB, pan] 2+linXFade2 inA inB pan = mkFilter "LinXFade2" [inA, inB, pan] 2
Sound/SC3/UGen/Rate.hs view
@@ -1,17 +1,28 @@-module Sound.SC3.UGen.Rate (Rate(..), rateId) where+module Sound.SC3.UGen.Rate ( Rate(..)+ , rateId+ , ar, kr, ir, dr ) where --- | Operating rate of UGen.-data Rate = IR | KR | AR | DR deriving (Eq, Show, Enum)+-- | Operating rate of unit generator.+data Rate = IR | KR | AR | DR + deriving (Eq, Show, Enum) instance Ord Rate where- compare a b = compare (rateOrd a) (rateOrd b)+ compare a b = compare (rate_ord a) (rate_ord b) -rateOrd :: Rate -> Int-rateOrd IR = 0-rateOrd KR = 1-rateOrd AR = 2-rateOrd DR = 3+-- | Rate constructors.+ar, kr, ir, dr :: Rate+ar = AR+kr = KR+ir = IR+dr = DR -- | Integer rate identifier, as required for scsynth bytecode. rateId :: Rate -> Int rateId = fromEnum++-- Rates as ordered for filter rate selection.+rate_ord :: Rate -> Int+rate_ord IR = 0+rate_ord KR = 1+rate_ord AR = 2+rate_ord DR = 3
Sound/SC3/UGen/UGen.hs view
@@ -1,24 +1,19 @@-module Sound.SC3.UGen.UGen ( Name, UGenId(..), UGen(..), Output, Special(..)- , constant, control- , mce, mce2- , mrg, mrg2- , proxy- , clone, uid ) where+module Sound.SC3.UGen.UGen where -import Control.Monad (liftM, replicateM)-import Sound.SC3.UGen.Rate (Rate)+import Control.Monad+import Data.List+import Sound.SC3.UGen.Operator+import Sound.SC3.UGen.Rate import Sound.SC3.UGen.UId+import System.Random -type Name = String-type Output = Rate-newtype Special = Special Int deriving (Eq, Show)-newtype UGenId = UGenId Int deriving (Eq, Show)+-- | Unit generator. data UGen = Constant { constantValue :: Double }- | Control { controlRate_ :: Rate- , controlName :: Name+ | Control { controlOperatingRate :: Rate+ , controlName :: String , controlDefault :: Double } | Primitive { ugenRate :: Rate- , ugenName :: Name+ , ugenName :: String , ugenInputs :: [UGen] , ugenOutputs :: [Output] , ugenSpecial :: Special@@ -30,40 +25,344 @@ , mrgRight :: UGen } deriving (Eq, Show) --- | UGen identifier constructor.+-- | Unit generator output descriptor.+type Output = Rate++-- | Operating mode of unary and binary operators.+newtype Special = Special Int + deriving (Eq, Show)++-- | Identifier for non-functional unit generators.+newtype UGenId = UGenId Int + deriving (Eq, Show)++-- * Unit generator node constructors.++-- | Unit generator identifier constructor. uid :: Int -> UGenId uid = UGenId --- | Constant value constructor.+-- | Constant value node constructor. constant :: (Real a) => a -> UGen constant = Constant . realToFrac --- | Control input constructor.-control :: Rate -> Name -> Double -> UGen+-- | Control input node constructor.+control :: Rate -> String -> Double -> UGen control = Control --- | Multiple channel expansion constructor.+-- | Multiple channel expansion node constructor. mce :: [UGen] -> UGen mce = MCE +-- | Multiple root graph node constructor.+mrg2 :: UGen -> UGen -> UGen+mrg2 = MRG++-- | Unit generator proxy node constructor.+proxy :: UGen -> Int -> UGen+proxy = Proxy++-- * Unit generator node predicates.++-- | Constant node predicate.+isConstant :: UGen -> Bool+isConstant (Constant _) = True+isConstant _ = False++-- | Control node predicate.+isControl :: UGen -> Bool+isControl (Control _ _ _) = True+isControl _ = False++-- | Unit generator primitive node predicate.+isUGen :: UGen -> Bool+isUGen (Primitive _ _ _ _ _ _) = True+isUGen _ = False++-- | Proxy node predicate.+isProxy :: UGen -> Bool+isProxy (Proxy _ _) = True+isProxy _ = False++-- | Multiple channel expansion node predicate.+isMCE :: UGen -> Bool+isMCE (MCE _) = True+isMCE _ = False++-- | MRG predicate.+isMRG :: UGen -> Bool+isMRG (MRG _ _) = True+isMRG _ = False++-- * Multiple channel expansion.+ -- | Multiple channel expansion for two inputs. mce2 :: UGen -> UGen -> UGen mce2 x y = mce [x, y] +-- | Clone a unit generator (mce . replicateM).+clone :: (UId m) => Int -> m UGen -> m UGen+clone n u = liftM mce (replicateM n u)++-- | Number of channels to expand to.+mceDegree :: UGen -> Int+mceDegree (MCE l) = length l+mceDegree (MRG u _) = mceDegree u+mceDegree _ = error "mceDegree: illegal ugen"++-- | Extend UGen to specified degree.+mceExtend :: Int -> UGen -> [UGen]+mceExtend n (MCE l) = take n (cycle l)+mceExtend n (MRG x y) = (MRG r y : rs) where (r:rs) = mceExtend n x+mceExtend n u = replicate n u++-- | Apply MCE transformation.+mceTransform :: UGen -> UGen+mceTransform (Primitive r n i o s d) = MCE (map f i')+ where f j = Primitive r n j o s d+ upr = maximum (map mceDegree (filter isMCE i))+ i' = transpose (map (mceExtend upr) i)+mceTransform _ = error "mceTransform: illegal ugen"++-- | Apply MCE transformation if required.+mceExpand :: UGen -> UGen+mceExpand (MCE l) = MCE (map mceExpand l)+mceExpand (MRG x y) = MRG (mceExpand x) y+mceExpand u = if required u then mceExpand (mceTransform u) else u+ where required (Primitive _ _ i _ _ _) = not (null (filter isMCE i))+ required _ = False++-- | Apply UGen list operation on MCE contents.+mceEdit :: ([UGen] -> [UGen]) -> UGen -> UGen+mceEdit f (MCE l) = MCE (f l)+mceEdit _ _ = error "mceEdit: non MCE value"++-- | Reverse order of channels at MCE.+mceReverse :: UGen -> UGen+mceReverse = mceEdit reverse++-- | Obtain indexed channel at MCE.+mceChannel :: Int -> UGen -> UGen+mceChannel n (MCE l) = l !! n+mceChannel _ _ = error "mceChannel: non MCE value"++-- | Output channels of UGen as a list.+mceChannels :: UGen -> [UGen]+mceChannels (MCE l) = l+mceChannels (MRG x y) = (MRG r y) : rs where (r:rs) = mceChannels x+mceChannels u = [u]++-- | Transpose rows and columns, ie. {{a,b},{c,d}} to {{a,c},{b,d}}.+mceTranspose :: UGen -> UGen+mceTranspose u = mce (map mce (transpose (map mceChannels (mceChannels u))))++-- * Multiple root graphs.+ -- | Multiple root graph constructor. mrg :: [UGen] -> UGen mrg [] = undefined mrg [x] = x mrg (x:xs) = MRG x (mrg xs) --- | Multiple root graph with two inputs.-mrg2 :: UGen -> UGen -> UGen-mrg2 = MRG+-- * Unit generator function builders. -proxy :: UGen -> Int -> UGen-proxy = Proxy+-- | Apply proxy transformation if required.+proxify :: UGen -> UGen+proxify u + | isMCE u = mce (map proxify (mceProxies u))+ | isMRG u = mrg [proxify (mrgLeft u), mrgRight u]+ | isUGen u = let o = ugenOutputs u+ in case o of+ (_:_:_) -> mce (map (proxy u) [0..(length o - 1)])+ _ -> u+ | otherwise = error "proxify: illegal ugen" --- | Clone UGen.-clone :: (UId m) => Int -> m UGen -> m UGen-clone n u = liftM mce (replicateM n u)+-- | Determine the rate of a UGen.+rateOf :: UGen -> Rate+rateOf u+ | isConstant u = IR+ | isControl u = controlOperatingRate u+ | isUGen u = ugenRate u+ | isProxy u = rateOf (proxySource u)+ | isMCE u = maximum (map rateOf (mceProxies u))+ | isMRG u = rateOf (mrgLeft u)+ | otherwise = undefined +-- True is input is a sink UGen, ie. has no outputs.+is_sink :: UGen -> Bool+is_sink u+ | isUGen u = null (ugenOutputs u)+ | isMCE u = all is_sink (mceProxies u)+ | isMRG u = is_sink (mrgLeft u)+ | otherwise = False++-- Ensure input UGen is valid, ie. not a sink.+check_input :: UGen -> UGen+check_input u = if is_sink u + then error ("illegal input" ++ show u) + else u++-- | Construct proxied and multiple channel expanded UGen.+mkUGen :: Rate -> String -> [UGen] -> [Output] -> Special -> Maybe UGenId -> UGen+mkUGen r n i o s z = proxify (mceExpand u)+ where u = Primitive r n (map check_input i) o s z++-- | Operator UGen constructor.+mkOperator :: String -> [UGen] -> Int -> UGen+mkOperator c i s = mkUGen r c i [r] (Special s) Nothing+ where r = maximum (map rateOf i)++-- | Unary math constructor with constant optimization.+mkUnaryOperator :: Unary -> (Double -> Double) -> UGen -> UGen+mkUnaryOperator i f a + | isConstant a = constant (f (constantValue a))+ | otherwise = mkOperator "UnaryOpUGen" [a] (fromEnum i)++-- | Binary math constructor with constant optimization.+mkBinaryOperator :: Binary -> (Double -> Double -> Double) -> UGen -> UGen -> UGen+mkBinaryOperator i f a b + | isConstant a && isConstant b = let a' = constantValue a+ b' = constantValue b+ in constant (f a' b')+ | otherwise = mkOperator "BinaryOpUGen" [a, b] (fromEnum i)++mk_osc :: Maybe UGenId -> Rate -> String -> [UGen] -> Int -> UGen+mk_osc z r c i o = mkUGen r c i (replicate o r) (Special 0) z++-- | Oscillator constructor.+mkOsc :: Rate -> String -> [UGen] -> Int -> UGen+mkOsc = mk_osc Nothing++-- | Oscillator constructor, setting identifier.+mkOscId :: UGenId -> Rate -> String -> [UGen] -> Int -> UGen+mkOscId z = mk_osc (Just z)++mk_osc_mce :: Maybe UGenId -> Rate -> String -> [UGen] -> UGen -> Int -> UGen+mk_osc_mce z r c i j o = mk_osc z r c (i ++ mceChannels j) o++-- | Variant oscillator constructor with MCE collapsing input.+mkOscMCE :: Rate -> String -> [UGen] -> UGen -> Int -> UGen+mkOscMCE = mk_osc_mce Nothing++-- | Variant oscillator constructor with MCE collapsing input.+mkOscMCEId :: UGenId -> Rate -> String -> [UGen] -> UGen -> Int -> UGen+mkOscMCEId z = mk_osc_mce (Just z)++mk_filter :: Maybe UGenId -> String -> [UGen] -> Int -> UGen+mk_filter z c i o = mkUGen r c i o' (Special 0) z+ where r = maximum (map rateOf i)+ o'= replicate o r++-- | Filter UGen constructor.+mkFilter :: String -> [UGen] -> Int -> UGen+mkFilter = mk_filter Nothing++-- | Filter UGen constructor.+mkFilterId :: UGenId -> String -> [UGen] -> Int -> UGen+mkFilterId z = mk_filter (Just z)++-- | Variant filter with rate derived from keyed input.+mkFilterKeyed :: String -> Int -> [UGen] -> Int -> UGen+mkFilterKeyed c k i o = mkUGen r c i o' (Special 0) Nothing+ where r = rateOf (i !! k)+ o' = replicate o r++mk_filter_mce :: Maybe UGenId -> String -> [UGen] -> UGen -> Int -> UGen+mk_filter_mce z c i j o = mk_filter z c (i ++ mceChannels j) o++-- | Variant filter constructor with MCE collapsing input.+mkFilterMCE :: String -> [UGen] -> UGen -> Int -> UGen+mkFilterMCE = mk_filter_mce Nothing++-- | Variant filter constructor with MCE collapsing input.+mkFilterMCEId :: UGenId -> String -> [UGen] -> UGen -> Int -> UGen+mkFilterMCEId z = mk_filter_mce (Just z)++-- | Information unit generators are very specialized.+mkInfo :: String -> UGen+mkInfo name = mkOsc IR name [] 1++-- Unit generators are numbers.+instance Num UGen where+ negate = mkUnaryOperator Neg negate+ (+) = mkBinaryOperator Add (+)+ (-) = mkBinaryOperator Sub (-)+ (*) = mkBinaryOperator Mul (*)+ abs = mkUnaryOperator Abs abs+ signum = mkUnaryOperator Sign signum+ fromInteger = Constant . fromInteger++-- Unit generators are fractional.+instance Fractional UGen where+ recip = mkUnaryOperator Recip recip+ (/) = mkBinaryOperator FDiv (/)+ fromRational = Constant . fromRational++-- Unit generators are floating point.+instance Floating UGen where+ pi = Constant pi+ exp = mkUnaryOperator Exp exp+ log = mkUnaryOperator Log log+ sqrt = mkUnaryOperator Sqrt sqrt+ (**) = mkBinaryOperator Pow (**)+ logBase a b = log b / log a+ sin = mkUnaryOperator Sin sin+ cos = mkUnaryOperator Cos cos+ tan = mkUnaryOperator Tan tan+ asin = mkUnaryOperator ArcSin asin+ acos = mkUnaryOperator ArcCos acos+ atan = mkUnaryOperator ArcTan atan+ sinh = mkUnaryOperator SinH sinh+ cosh = mkUnaryOperator CosH cosh+ tanh = mkUnaryOperator TanH tanh+ asinh x = log (sqrt (x*x+1) + x)+ acosh x = log (sqrt (x*x-1) + x)+ atanh x = (log (1+x) - log (1-x)) / 2++-- Unit generators are real.+instance Real UGen where+ toRational (Constant n) = toRational n+ toRational _ = error "toRational at non-constant UGen"++-- Unit generators are integral.+instance Integral UGen where+ quot = mkBinaryOperator IDiv undefined+ rem = mkBinaryOperator Mod undefined+ quotRem a b = (quot a b, rem a b)+ div = mkBinaryOperator IDiv undefined+ mod = mkBinaryOperator Mod undefined+ toInteger (Constant n) = floor n+ toInteger _ = error "toInteger at non-constant UGen"++-- Unit generators are orderable.+instance Ord UGen where+ (Constant a) < (Constant b) = a < b+ _ < _ = error "< at UGen is partial, see <*"+ (Constant a) <= (Constant b) = a <= b+ _ <= _ = error "<= at UGen is partial, see <=*"+ (Constant a) > (Constant b) = a < b+ _ > _ = error "> at UGen is partial, see >*"+ (Constant a) >= (Constant b) = a >= b+ _ >= _ = error ">= at UGen is partial, see >=*"+ min = mkBinaryOperator Min min+ max = mkBinaryOperator Max max++-- Unit generators are enumerable.+instance Enum UGen where+ succ u = u + 1+ pred u = u - 1+ toEnum i = constant i+ fromEnum (Constant n) = truncate n+ fromEnum _ = error "cannot enumerate non-constant UGens"+ enumFrom = iterate (+1)+ enumFromThen n m = iterate (+(m-n)) n+ enumFromTo n m = takeWhile (<= m+1/2) (enumFrom n)+ enumFromThenTo n n' m = takeWhile (p (m + (n'-n)/2)) (enumFromThen n n')+ where p = if n' >= n then (>=) else (<=)++-- Unit generators are stochastic.+instance Random UGen where+ randomR (Constant l, Constant r) g = let (n, g') = randomR (l,r) g+ in (Constant n, g')+ randomR _ _ = error "randomR: non constant (l,r)"+ random g = randomR (-1.0, 1.0) g
− Sound/SC3/UGen/UGen/Construct.hs
@@ -1,136 +0,0 @@-module Sound.SC3.UGen.UGen.Construct ( mkUnaryOperator, mkBinaryOperator- , mkOscId, mkOsc- , mkOscMCEId, mkOscMCE- , mkFilterId, mkFilter, mkFilterKeyed- , mkFilterMCE- , liftU, liftU2, liftU3, liftU4 ) where--import Sound.SC3.UGen.Operator-import Sound.SC3.UGen.Rate-import Sound.SC3.UGen.UGen-import Sound.SC3.UGen.UGen.MCE-import Sound.SC3.UGen.UGen.Predicate-import Sound.SC3.UGen.UId---- * UGen Constructors.---- | Apply proxy transformation if required.-proxify :: UGen -> UGen-proxify u - | isMCE u = mce (map proxify (mceProxies u))- | isMRG u = mrg [proxify (mrgLeft u), mrgRight u]- | isUGen u = let o = ugenOutputs u- in case o of- (_:_:_) -> mce (map (proxy u) [0..(length o - 1)])- _ -> u- | otherwise = error "proxify: illegal ugen"---- | Determine the rate of a UGen.-rateOf :: UGen -> Rate-rateOf u- | isConstant u = IR- | isControl u = controlRate_ u- | isUGen u = ugenRate u- | isProxy u = rateOf (proxySource u)- | isMCE u = maximum (map rateOf (mceProxies u))- | isMRG u = rateOf (mrgLeft u)- | otherwise = undefined---- | True is input is a sink UGen, ie. has no outputs.-isSink :: UGen -> Bool-isSink u- | isUGen u = null (ugenOutputs u)- | isMCE u = all isSink (mceProxies u)- | isMRG u = isSink (mrgLeft u)- | otherwise = False---- | Ensure input UGen is valid, ie. not a sink.-checkInput :: UGen -> UGen-checkInput u = if isSink u then error ("illegal input" ++ show u) else u---- | Construct proxied and multiple channel expanded UGen.-mkUGen :: Rate -> Name -> [UGen] -> [Output] -> Special -> Maybe UGenId -> UGen-mkUGen r n i o s z = proxify (mceExpand u)- where u = Primitive r n (map checkInput i) o s z---- | Operator UGen constructor.-mkOperator :: Name -> [UGen] -> Int -> UGen-mkOperator c i s = mkUGen r c i [r] (Special s) Nothing- where r = maximum (map rateOf i)---- | Unary math constructor with constant optimization.-mkUnaryOperator :: Unary -> (Double -> Double) -> UGen -> UGen-mkUnaryOperator i f a - | isConstant a = constant (f (constantValue a))- | otherwise = mkOperator "UnaryOpUGen" [a] (fromEnum i)---- | Binary math constructor with constant optimization.-mkBinaryOperator :: Binary -> (Double -> Double -> Double) -> UGen -> UGen -> UGen-mkBinaryOperator i f a b - | isConstant a && isConstant b = let a' = constantValue a- b' = constantValue b- in constant (f a' b')- | otherwise = mkOperator "BinaryOpUGen" [a, b] (fromEnum i)--mkOsc_ :: Maybe UGenId -> Rate -> Name -> [UGen] -> Int -> UGen-mkOsc_ z r c i o = mkUGen r c i (replicate o r) (Special 0) z---- | Oscillator constructor.-mkOsc :: Rate -> Name -> [UGen] -> Int -> UGen-mkOsc = mkOsc_ Nothing---- | Oscillator constructor, setting identifier.-mkOscId :: UGenId -> Rate -> Name -> [UGen] -> Int -> UGen-mkOscId z = mkOsc_ (Just z)--mkOscMCE_ :: Maybe UGenId -> Rate -> Name -> [UGen] -> UGen -> Int -> UGen-mkOscMCE_ z r c i j o = mkOsc_ z r c (i ++ mceChannels j) o---- | Variant oscillator constructor with MCE collapsing input.-mkOscMCE :: Rate -> Name -> [UGen] -> UGen -> Int -> UGen-mkOscMCE = mkOscMCE_ Nothing---- | Variant oscillator constructor with MCE collapsing input.-mkOscMCEId :: UGenId -> Rate -> Name -> [UGen] -> UGen -> Int -> UGen-mkOscMCEId z = mkOscMCE_ (Just z)--mkFilter_ :: Maybe UGenId -> Name -> [UGen] -> Int -> UGen-mkFilter_ z c i o = mkUGen r c i o' (Special 0) z- where r = maximum (map rateOf i)- o'= replicate o r---- | Filter UGen constructor.-mkFilter :: Name -> [UGen] -> Int -> UGen-mkFilter = mkFilter_ Nothing---- | Filter UGen constructor.-mkFilterId :: UGenId -> Name -> [UGen] -> Int -> UGen-mkFilterId z = mkFilter_ (Just z)---- | Variant filter with rate derived from keyed input.-mkFilterKeyed :: Name -> Int -> [UGen] -> Int -> UGen-mkFilterKeyed c k i o = mkUGen r c i o' (Special 0) Nothing- where r = rateOf (i !! k)- o' = replicate o r---- | Variant filter constructor with MCE collapsing input.-mkFilterMCE :: Name -> [UGen] -> UGen -> Int -> UGen-mkFilterMCE c i j o = mkFilter c (i ++ mceChannels j) o---- | Lifting UGenId requiring UGens to UId-liftU :: (UId m) => (UGenId -> a -> UGen) -> (a -> m UGen)-liftU f a = do n <- generateUId- return (f (UGenId n) a)--liftU2 :: (UId m) => (UGenId -> a -> b -> UGen) -> (a -> b -> m UGen)-liftU2 f a b = do n <- generateUId- return (f (UGenId n) a b)--liftU3 :: (UId m) => (UGenId -> a -> b -> c -> UGen) -> (a -> b -> c -> m UGen)-liftU3 f a b c = do n <- generateUId- return (f (UGenId n) a b c)--liftU4 :: (UId m) => (UGenId -> a -> b -> c -> d -> UGen) -> (a -> b -> c -> d -> m UGen)-liftU4 f a b c d = do n <- generateUId- return (f (UGenId n) a b c d)-
+ Sound/SC3/UGen/UGen/Lift.hs view
@@ -0,0 +1,41 @@+module Sound.SC3.UGen.UGen.Lift where++import Sound.SC3.UGen.UGen+import Sound.SC3.UGen.UId+import System.IO.Unsafe++-- | Lift base UGen to monadic form.+liftU :: (UId m) => (UGenId -> a -> UGen) -> (a -> m UGen)+liftU f a = do n <- generateUId+ return (f (UGenId n) a)++-- | Lift base UGen to monadic form.+liftU2 :: (UId m) => (UGenId -> a -> b -> UGen) -> (a -> b -> m UGen)+liftU2 f a b = do n <- generateUId+ return (f (UGenId n) a b)++-- | Lift base UGen to monadic form.+liftU3 :: (UId m) => (UGenId -> a -> b -> c -> UGen) -> (a -> b -> c -> m UGen)+liftU3 f a b c = do n <- generateUId+ return (f (UGenId n) a b c)++-- | Lift base UGen to monadic form.+liftU4 :: (UId m) => (UGenId -> a -> b -> c -> d -> UGen) -> (a -> b -> c -> d -> m UGen)+liftU4 f a b c d = do n <- generateUId+ return (f (UGenId n) a b c d)++-- | Lift monadic UGen to unsafe form.+liftP :: (a -> IO UGen) -> (a -> UGen)+liftP f a = unsafePerformIO (f a)++-- | Lift monadic UGen to unsafe form.+liftP2 :: (a -> b -> IO UGen) -> (a -> b -> UGen)+liftP2 f a b = unsafePerformIO (f a b)++-- | Lift monadic UGen to unsafe form.+liftP3 :: (a -> b -> c -> IO UGen) -> (a -> b -> c -> UGen)+liftP3 f a b c = unsafePerformIO (f a b c)++-- | Lift monadic UGen to unsafe form.+liftP4 :: (a -> b -> c -> d -> IO UGen) -> (a -> b -> c -> d -> UGen)+liftP4 f a b c d = unsafePerformIO (f a b c d)
− Sound/SC3/UGen/UGen/MCE.hs
@@ -1,60 +0,0 @@-module Sound.SC3.UGen.UGen.MCE where--import Data.List (transpose)-import Sound.SC3.UGen.UGen-import Sound.SC3.UGen.UGen.Predicate---- * Multiple Channel Expansion---- | Number of channels to expand to.-mceDegree :: UGen -> Int-mceDegree (MCE l) = length l-mceDegree (MRG u _) = mceDegree u-mceDegree _ = error "mceDegree: illegal ugen"---- | Extend UGen to specified degree.-mceExtend :: Int -> UGen -> [UGen]-mceExtend n (MCE l) = take n (cycle l)-mceExtend n (MRG x y) = (MRG r y : rs) where (r:rs) = mceExtend n x-mceExtend n u = replicate n u---- | Apply MCE transformation.-mceTransform :: UGen -> UGen-mceTransform (Primitive r n i o s d) = MCE (map f i')- where f j = Primitive r n j o s d- upr = maximum (map mceDegree (filter isMCE i))- i' = transpose (map (mceExtend upr) i)-mceTransform _ = error "mceTransform: illegal ugen"---- | Apply MCE transformation if required.-mceExpand :: UGen -> UGen-mceExpand (MCE l) = MCE (map mceExpand l)-mceExpand (MRG x y) = MRG (mceExpand x) y-mceExpand u = if required u then mceExpand (mceTransform u) else u- where required (Primitive _ _ i _ _ _) = not (null (filter isMCE i))- required (MCE l) = any required l- required _ = False---- | Apply UGen list operation on MCE contents.-mceEdit :: ([UGen] -> [UGen]) -> UGen -> UGen-mceEdit f (MCE l) = MCE (f l)-mceEdit _ _ = error "mceEdit: non MCE value"---- | Reverse order of channels at MCE.-mceReverse :: UGen -> UGen-mceReverse = mceEdit reverse---- | Obtain indexed channel at MCE.-mceChannel :: Int -> UGen -> UGen-mceChannel n (MCE l) = l !! n-mceChannel _ _ = error "mceChannel: non MCE value"---- | Output channels of UGen as a list.-mceChannels :: UGen -> [UGen]-mceChannels (MCE l) = l-mceChannels (MRG x y) = (MRG r y) : rs where (r:rs) = mceChannels x-mceChannels u = [u]---- | Transpose rows and columns, ie. {{a,b},{c,d}} to {{a,c},{b,d}}.-mceTranspose :: UGen -> UGen-mceTranspose u = mce (map mce (transpose (map mceChannels (mceChannels u))))
− Sound/SC3/UGen/UGen/Math.hs
@@ -1,83 +0,0 @@-module Sound.SC3.UGen.UGen.Math () where--import System.Random (Random, randomR, random)-import Sound.SC3.UGen.Operator (Unary(..),Binary(..))-import Sound.SC3.UGen.UGen-import Sound.SC3.UGen.UGen.Construct--instance Num UGen where- negate = mkUnaryOperator Neg negate- (+) = mkBinaryOperator Add (+)- (-) = mkBinaryOperator Sub (-)- (*) = mkBinaryOperator Mul (*)- abs = mkUnaryOperator Abs abs- signum = mkUnaryOperator Sign signum- fromInteger = Constant . fromInteger--instance Fractional UGen where- recip = mkUnaryOperator Recip recip- (/) = mkBinaryOperator FDiv (/)- fromRational = Constant . fromRational--instance Floating UGen where- pi = Constant pi- exp = mkUnaryOperator Exp exp- log = mkUnaryOperator Log log- sqrt = mkUnaryOperator Sqrt sqrt- (**) = mkBinaryOperator Pow (**)- logBase a b = log b / log a- sin = mkUnaryOperator Sin sin- cos = mkUnaryOperator Cos cos- tan = mkUnaryOperator Tan tan- asin = mkUnaryOperator ArcSin asin- acos = mkUnaryOperator ArcCos acos- atan = mkUnaryOperator ArcTan atan- sinh = mkUnaryOperator SinH sinh- cosh = mkUnaryOperator CosH cosh- tanh = mkUnaryOperator TanH tanh- asinh x = log (sqrt (x*x+1) + x)- acosh x = log (sqrt (x*x-1) + x)- atanh x = (log (1+x) - log (1-x)) / 2--instance Real UGen where- toRational (Constant n) = toRational n- toRational _ = error "toRational at non-constant UGen"--instance Integral UGen where- quot = mkBinaryOperator IDiv undefined- rem = mkBinaryOperator Mod undefined- quotRem a b = (quot a b, rem a b)- div = mkBinaryOperator IDiv undefined- mod = mkBinaryOperator Mod undefined- toInteger (Constant n) = floor n- toInteger _ = error "toInteger at non-constant UGen"--instance Ord UGen where- (Constant a) < (Constant b) = a < b- _ < _ = error "< at UGen is partial, see <*"- (Constant a) <= (Constant b) = a <= b- _ <= _ = error "<= at UGen is partial, see <=*"- (Constant a) > (Constant b) = a < b- _ > _ = error "> at UGen is partial, see >*"- (Constant a) >= (Constant b) = a >= b- _ >= _ = error ">= at UGen is partial, see >=*"- min = mkBinaryOperator Min min- max = mkBinaryOperator Max max--instance Enum UGen where- succ u = u + 1- pred u = u - 1- toEnum i = constant i- fromEnum (Constant n) = truncate n- fromEnum _ = error "cannot enumerate non-constant UGens"- enumFrom = iterate (+1)- enumFromThen n m = iterate (+(m-n)) n- enumFromTo n m = takeWhile (<= m+1/2) (enumFrom n)- enumFromThenTo n n' m = takeWhile (p (m + (n'-n)/2)) (enumFromThen n n')- where p = if n' >= n then (>=) else (<=)--instance Random UGen where- randomR (Constant l, Constant r) g = let (n, g') = randomR (l,r) g- in (Constant n, g')- randomR _ _ = error "randomR: non constant (l,r)"- random g = randomR (-1.0, 1.0) g
− Sound/SC3/UGen/UGen/Predicate.hs
@@ -1,34 +0,0 @@-module Sound.SC3.UGen.UGen.Predicate where--import Sound.SC3.UGen.UGen---- | Constant predicate.-isConstant :: UGen -> Bool-isConstant (Constant _) = True-isConstant _ = False---- | Control predicate.-isControl :: UGen -> Bool-isControl (Control _ _ _) = True-isControl _ = False---- | UGen predicate.-isUGen :: UGen -> Bool-isUGen (Primitive _ _ _ _ _ _) = True-isUGen _ = False---- | Proxy predicate.-isProxy :: UGen -> Bool-isProxy (Proxy _ _) = True-isProxy _ = False---- | MCE predicate.-isMCE :: UGen -> Bool-isMCE (MCE _) = True-isMCE _ = False---- | MRG predicate.-isMRG :: UGen -> Bool-isMRG (MRG _ _) = True-isMRG _ = False-
+ Sound/SC3/UGen/Unsafe.hs view
@@ -0,0 +1,7 @@+module Sound.SC3.UGen.Unsafe (module Sound.SC3.UGen.Demand.Unsafe,+ module Sound.SC3.UGen.FFT.Unsafe,+ module Sound.SC3.UGen.Noise.Unsafe) where++import Sound.SC3.UGen.Demand.Unsafe+import Sound.SC3.UGen.FFT.Unsafe+import Sound.SC3.UGen.Noise.Unsafe
Sound/SC3/UGen/Utilities.hs view
@@ -1,45 +1,43 @@ module Sound.SC3.UGen.Utilities where import Sound.SC3.UGen.Enum-import Sound.SC3.UGen.UGen (UGen(..))-import Sound.SC3.UGen.UGen.Construct (mkOsc)-import Sound.SC3.UGen.Rate (Rate(IR))+import Sound.SC3.UGen.UGen -fromLoop :: Loop -> UGen-fromLoop NoLoop = Constant 0-fromLoop Loop = Constant 1-fromLoop (WithLoop u) = u+from_loop :: Loop -> UGen+from_loop NoLoop = Constant 0+from_loop Loop = Constant 1+from_loop (WithLoop u) = u -fromInterpolation :: Interpolation -> UGen-fromInterpolation NoInterpolation = Constant 1-fromInterpolation LinearInterpolation = Constant 2-fromInterpolation CubicInterpolation = Constant 4-fromInterpolation (Interpolation u) = u+from_interpolation :: Interpolation -> UGen+from_interpolation NoInterpolation = Constant 1+from_interpolation LinearInterpolation = Constant 2+from_interpolation CubicInterpolation = Constant 4+from_interpolation (Interpolation u) = u -fromDoneAction :: DoneAction -> UGen-fromDoneAction DoNothing = Constant 0-fromDoneAction PauseSynth = Constant 1-fromDoneAction RemoveSynth = Constant 2-fromDoneAction (DoneAction u) = u+from_done_action :: DoneAction -> UGen+from_done_action DoNothing = Constant 0+from_done_action PauseSynth = Constant 1+from_done_action RemoveSynth = Constant 2+from_done_action (DoneAction u) = u -fromWarp :: Warp -> UGen-fromWarp Linear = Constant 0-fromWarp Exponential = Constant 1-fromWarp (Warp u) = u+from_warp :: Warp -> UGen+from_warp Linear = Constant 0+from_warp Exponential = Constant 1+from_warp (Warp u) = u env_curve :: EnvCurve -> UGen-env_curve EnvStep = Constant 0.0-env_curve EnvLin = Constant 1.0-env_curve EnvExp = Constant 2.0 -env_curve EnvSin = Constant 3.0-env_curve EnvCos = Constant 4.0+env_curve EnvStep = Constant 0.0+env_curve EnvLin = Constant 1.0+env_curve EnvExp = Constant 2.0 +env_curve EnvSin = Constant 3.0+env_curve EnvCos = Constant 4.0 env_curve (EnvNum _) = Constant 5.0-env_curve EnvSqr = Constant 6.0-env_curve EnvCub = Constant 7.0+env_curve EnvSqr = Constant 6.0+env_curve EnvCub = Constant 7.0 env_value :: EnvCurve -> UGen env_value (EnvNum u) = u-env_value _ = Constant 0.0+env_value _ = Constant 0.0 d_dx :: (Num a) => [a] -> [a] d_dx [] = []@@ -48,8 +46,4 @@ d_dx (x:y:r) = y - x : d_dx (y:r) dbl :: a -> [a]-dbl x = [x,x]--mkInfoUGen :: String -> UGen-mkInfoUGen name = mkOsc IR name [] 1-+dbl x = [x, x]
hsc3.cabal view
@@ -1,446 +1,498 @@-Name: hsc3-Version: 0.2-License: GPL-Copyright: Rohan Drape, 2006-2008-Author: Rohan Drape-Maintainer: rd@slavepianos.org-Stability: Experimental-Homepage: http://slavepianos.org/rd/f/207949/-Synopsis: Haskell SuperCollider-Description: Haskell client for the SuperCollider synthesis server-Category: Sound-Tested-With: GHC==6.8.2-Build-Type: Simple-Build-Depends: base, binary, bytestring, containers, hosc == 0.2,- network, random-GHC-Options: -Wall -fno-warn-orphans -fwarn-tabs -O2-Exposed-modules: Sound.SC3- Sound.SC3.UGen- Sound.SC3.UGen.Analysis- Sound.SC3.UGen.Base- Sound.SC3.UGen.Buffer- Sound.SC3.UGen.Chaos- Sound.SC3.UGen.Composite- Sound.SC3.UGen.Demand- Sound.SC3.UGen.Demand.Base- Sound.SC3.UGen.Demand.Monadic- Sound.SC3.UGen.Envelope- Sound.SC3.UGen.Envelope.Construct- Sound.SC3.UGen.Enum- Sound.SC3.UGen.FFT- Sound.SC3.UGen.FFT.Base- Sound.SC3.UGen.FFT.Monadic- Sound.SC3.UGen.Filter- Sound.SC3.UGen.Graph.Naive- Sound.SC3.UGen.Granular- Sound.SC3.UGen.Information- Sound.SC3.UGen.IO- Sound.SC3.UGen.MachineListening- Sound.SC3.UGen.Math- Sound.SC3.UGen.Noise.Base- Sound.SC3.UGen.Noise.Monadic- Sound.SC3.UGen.Operator- Sound.SC3.UGen.Oscillator- Sound.SC3.UGen.Panner- Sound.SC3.UGen.Rate- Sound.SC3.UGen.UGen- Sound.SC3.UGen.UGen.Construct- Sound.SC3.UGen.UGen.Math- Sound.SC3.UGen.UGen.MCE- Sound.SC3.UGen.UGen.Predicate- Sound.SC3.UGen.UId- Sound.SC3.Server- Sound.SC3.Server.Command- Sound.SC3.Server.Play- Sound.SC3.Server.Status- Sound.SC3.Server.Synthdef- Sound.SC3.Server.NRT-Other-modules: Sound.SC3.Server.Utilities- Sound.SC3.UGen.Utilities+Name: hsc3+Version: 0.3+Synopsis: Haskell SuperCollider+Description: hsc3 provides Sound.SC3, a haskell module that + facilitates using haskell as a client to the + SuperCollider synthesis server. +License: GPL+Category: Sound+Copyright: (c) Rohan Drape, 2006-2008+Author: Rohan Drape+Maintainer: rd@slavepianos.org+Stability: Experimental+Homepage: http://slavepianos.org/rd/f/207949/+Tested-With: GHC==6.8.2+Build-Type: Simple+Cabal-Version: >= 1.2 -Data-files: README- emacs/hsc3.el- -- The below is appended by:- -- find Help -name "*.*hs" | sort | \- -- sed "s/^/ /" >> hsc3.cabal- Help/Graphs/aleatoric-quartet.lhs- Help/Graphs/analog-bubbles.lhs- Help/Graphs/babbling-brook.lhs- Help/Graphs/bit-reduction.lhs- Help/Graphs/bowed-string.lhs- Help/Graphs/ccomb.lhs- Help/Graphs/chain-saw.lhs- Help/Graphs/chrd.lhs- Help/Graphs/cricket.lhs- Help/Graphs/crotale.lhs- Help/Graphs/cut-outs.lhs- Help/Graphs/cymbalism.lhs- Help/Graphs/deep-sea.lhs- Help/Graphs/demanding-studies.lhs- Help/Graphs/dial-history.lhs- Help/Graphs/discretion.lhs- Help/Graphs/drummer.lhs- Help/Graphs/eggcrate.lhs- Help/Graphs/forest-sounds.lhs- Help/Graphs/fwalk.lhs- Help/Graphs/half-life.lhs- Help/Graphs/harmonic-swimming.lhs- Help/Graphs/harmonic-tumbling.lhs- Help/Graphs/h-chatter.lhs- Help/Graphs/hh-808.lhs- Help/Graphs/implosion.lhs- Help/Graphs/karplus-strong.lhs- Help/Graphs/klink.lhs- Help/Graphs/k-ppr.lhs- Help/Graphs/lfo-modulation.lhs- Help/Graphs/lf-pulses.lhs- Help/Graphs/modal-space.lhs- Help/Graphs/moto-rev.lhs- Help/Graphs/mouse-clatter.lhs- Help/Graphs/noise-burst-sweep.lhs- Help/Graphs/one-line.lhs- Help/Graphs/oscillator-cluster.lhs- Help/Graphs/pattern-buffer.lhs- Help/Graphs/plucked-strings.lhs- Help/Graphs/police-state.lhs- Help/Graphs/pulsing-bottles.lhs- Help/Graphs/record-scratcher.lhs- Help/Graphs/red-frik.lhs- Help/Graphs/reverberated-sine-percussion.lhs- Help/Graphs/sample-and-hold-liquidities.lhs- Help/Graphs/s-chirp.lhs- Help/Graphs/scratchy.lhs- Help/Graphs/scritto.lhs- Help/Graphs/shepard-tones.lhs- Help/Graphs/shifting-pulses.lhs- Help/Graphs/snare-909.lhs- Help/Graphs/spe.lhs- Help/Graphs/sprinkler.lhs- Help/Graphs/strummable-guitar.lhs- Help/Graphs/sweepy-noise.lhs- Help/Graphs/synthetic-piano.lhs- Help/Graphs/tank.lhs- Help/Graphs/theremin.lhs- Help/Graphs/three-cpsw.lhs- Help/Graphs/tsort.lhs- Help/Graphs/what-was-i-thinking.lhs- Help/Graphs/wind-metals.lhs- Help/Graphs/xy-interference.lhs- Help/hsc3.help.lhs- Help/Server/b_alloc.help.lhs- Help/Server/b_allocRead.help.lhs- Help/Server/b_close.help.lhs- Help/Server/b_fill.help.lhs- Help/Server/b_free.help.lhs- Help/Server/b_gen.help.lhs- Help/Server/b_get.help.lhs- Help/Server/b_getn.help.lhs- Help/Server/b_query.help.lhs- Help/Server/b_read.help.lhs- Help/Server/b_set.help.lhs- Help/Server/b_setn.help.lhs- Help/Server/b_write.help.lhs- Help/Server/b_zero.help.lhs- Help/Server/c_fill.help.lhs- Help/Server/c_get.help.lhs- Help/Server/c_getn.help.lhs- Help/Server/clearSched.help.lhs- Help/Server/c_set.help.lhs- Help/Server/c_setn.help.lhs- Help/Server/d_free.help.lhs- Help/Server/d_loadDir.help.lhs- Help/Server/d_load.help.lhs- Help/Server/d_recv.help.lhs- Help/Server/dumpOSC.help.lhs- Help/Server/g_deepFree.help.lhs- Help/Server/g_freeAll.help.lhs- Help/Server/g_head.help.lhs- Help/Server/g_new.help.lhs- Help/Server/g_tail.help.lhs- Help/Server/n_after.help.lhs- Help/Server/n_before.help.lhs- Help/Server/n_fill.help.lhs- Help/Server/n_free.help.lhs- Help/Server/n_map.help.lhs- Help/Server/n_mapn.help.lhs- Help/Server/notify.help.lhs- Help/Server/n_query.help.lhs- Help/Server/n_run.help.lhs- Help/Server/n_set.help.lhs- Help/Server/n_setn.help.lhs- Help/Server/n_trace.help.lhs- Help/Server/quit.help.lhs- Help/Server/s_get.help.lhs- Help/Server/s_getn.help.lhs- Help/Server/s_new.help.lhs- Help/Server/s_noid.help.lhs- Help/Server/status.help.lhs- Help/Server/sync.help.lhs- Help/Server/tr.help.lhs- Help/Server/u_cmd.help.lhs- Help/Tutorial/Tutorial.lhs- Help/UGen/Analysis/amplitude.help.lhs- Help/UGen/Analysis/compander.help.lhs- Help/UGen/Analysis/pitch.help.lhs- Help/UGen/Analysis/runningSum.help.lhs- Help/UGen/Analysis/slope.help.lhs- Help/UGen/Analysis/zeroCrossing.help.lhs- Help/UGen/Buffer/bufAllpassC.help.lhs- Help/UGen/Buffer/bufAllpassL.help.lhs- Help/UGen/Buffer/bufAllpassN.help.lhs- Help/UGen/Buffer/bufChannels.help.lhs- Help/UGen/Buffer/bufCombC.help.lhs- Help/UGen/Buffer/bufCombL.help.lhs- Help/UGen/Buffer/bufCombN.help.lhs- Help/UGen/Buffer/bufDelayC.help.lhs- Help/UGen/Buffer/bufDelayL.help.lhs- Help/UGen/Buffer/bufDelayN.help.lhs- Help/UGen/Buffer/bufDur.help.lhs- Help/UGen/Buffer/bufFrames.help.lhs- Help/UGen/Buffer/bufRateScale.help.lhs- Help/UGen/Buffer/bufRd.help.lhs- Help/UGen/Buffer/bufSampleRate.help.lhs- Help/UGen/Buffer/detectIndex.help.lhs- Help/UGen/Buffer/index.help.lhs- Help/UGen/Buffer/indexInBetween.help.lhs- Help/UGen/Buffer/osc.help.lhs- Help/UGen/Buffer/playBuf.help.lhs- Help/UGen/Buffer/recordBuf.help.lhs- Help/UGen/Buffer/vOsc.help.lhs- Help/UGen/Chaos/crackle.help.lhs- Help/UGen/Chaos/cuspL.help.lhs- Help/UGen/Chaos/cuspN.help.lhs- Help/UGen/Chaos/fbSineC.help.lhs- Help/UGen/Chaos/fbSineL.help.lhs- Help/UGen/Chaos/fbSineN.help.lhs- Help/UGen/Chaos/henonC.help.lhs- Help/UGen/Chaos/henonL.help.lhs- Help/UGen/Chaos/henonN.help.lhs- Help/UGen/Chaos/latoocarfianC.help.lhs- Help/UGen/Chaos/linCongC.help.lhs- Help/UGen/Chaos/linCongL.help.lhs- Help/UGen/Chaos/linCongN.help.lhs- Help/UGen/Chaos/logistic.help.lhs- Help/UGen/Chaos/lorenzL.help.lhs- Help/UGen/Chaos/quadC.help.lhs- Help/UGen/Chaos/quadL.help.lhs- Help/UGen/Chaos/quadN.help.lhs- Help/UGen/Chaos/rossler.help.lhs- Help/UGen/Demand/dbrown.help.lhs- Help/UGen/Demand/dbufrd.help.lhs- Help/UGen/Demand/dbufwr.help.lhs- Help/UGen/Demand/demandEnvGen.help.lhs- Help/UGen/Demand/demand.help.lhs- Help/UGen/Demand/dgeom.help.lhs- Help/UGen/Demand/dibrown.help.lhs- Help/UGen/Demand/diwhite.help.lhs- Help/UGen/Demand/drand.help.lhs- Help/UGen/Demand/dseq.help.lhs- Help/UGen/Demand/dser.help.lhs- Help/UGen/Demand/dseries.help.lhs- Help/UGen/Demand/dswitch1.help.lhs- Help/UGen/Demand/duty.help.lhs- Help/UGen/Demand/dwhite.help.lhs- Help/UGen/Demand/dxrand.help.lhs- Help/UGen/Demand/tDuty.help.lhs- Help/UGen/Envelope/detectSilence.help.lhs- Help/UGen/Envelope/done.help.lhs- Help/UGen/Envelope/envGen.help.lhs- Help/UGen/Envelope/free.help.lhs- Help/UGen/Envelope/freeSelf.help.lhs- Help/UGen/Envelope/freeSelfWhenDone.help.lhs- Help/UGen/Envelope/line.help.lhs- Help/UGen/Envelope/linen.help.lhs- Help/UGen/Envelope/pause.help.lhs- Help/UGen/Envelope/pauseSelf.help.lhs- Help/UGen/Envelope/pauseSelfWhenDone.help.lhs- Help/UGen/Envelope/xLine.help.lhs- Help/UGen/FFT/convolution.help.lhs- Help/UGen/FFT/fft.help.lhs- Help/UGen/FFT/ifft.help.lhs- Help/UGen/FFT/packFFT.help.lhs- Help/UGen/FFT/pv_BinScramble.help.lhs- Help/UGen/FFT/pv_BinShift.help.lhs- Help/UGen/FFT/pv_BinWipe.help.lhs- Help/UGen/FFT/pv_BrickWall.help.lhs- Help/UGen/FFT/pvcollect.help.lhs- Help/UGen/FFT/pv_ConformalMap.help.lhs- Help/UGen/FFT/pv_Copy.help.lhs- Help/UGen/FFT/pv_Diffuser.help.lhs- Help/UGen/FFT/pv_LocalMax.help.lhs- Help/UGen/FFT/pv_MagAbove.help.lhs- Help/UGen/FFT/pv_MagBelow.help.lhs- Help/UGen/FFT/pv_MagClip.help.lhs- Help/UGen/FFT/pv_MagFreeze.help.lhs- Help/UGen/FFT/pv_RandComb.help.lhs- Help/UGen/FFT/pv_RandWipe.help.lhs- Help/UGen/FFT/pv_RectComb.help.lhs- Help/UGen/Filter/allpassC.help.lhs- Help/UGen/Filter/allpassL.help.lhs- Help/UGen/Filter/allpassN.help.lhs- Help/UGen/Filter/bpf.help.lhs- Help/UGen/Filter/bpz2.help.lhs- Help/UGen/Filter/brf.help.lhs- Help/UGen/Filter/clip.help.lhs- Help/UGen/Filter/combC.help.lhs- Help/UGen/Filter/combL.help.lhs- Help/UGen/Filter/combN.help.lhs- Help/UGen/Filter/decay2.help.lhs- Help/UGen/Filter/decay.help.lhs- Help/UGen/Filter/degreeToKey.help.lhs- Help/UGen/Filter/delay1.help.lhs- Help/UGen/Filter/delay2.help.lhs- Help/UGen/Filter/delayA.help.lhs- Help/UGen/Filter/delayL.help.lhs- Help/UGen/Filter/delayN.help.lhs- Help/UGen/Filter/formlet.help.lhs- Help/UGen/Filter/fos.help.lhs- Help/UGen/Filter/freqShift.help.lhs- Help/UGen/Filter/hasher.help.lhs- Help/UGen/Filter/hpf.help.lhs- Help/UGen/Filter/hpz1.help.lhs- Help/UGen/Filter/hpz2.help.lhs- Help/UGen/Filter/klank.help.lhs- Help/UGen/Filter/lag2.help.lhs- Help/UGen/Filter/lag3.help.lhs- Help/UGen/Filter/lag.help.lhs- Help/UGen/Filter/latch.help.lhs- Help/UGen/Filter/leakDC.help.lhs- Help/UGen/Filter/limiter.help.lhs- Help/UGen/Filter/linExp.help.lhs- Help/UGen/Filter/linLin.help.lhs- Help/UGen/Filter/lpf.help.lhs- Help/UGen/Filter/lpz1.help.lhs- Help/UGen/Filter/lpz2.help.lhs- Help/UGen/Filter/mantissaMask.help.lhs- Help/UGen/Filter/median.help.lhs- Help/UGen/Filter/moogFF.help.lhs- Help/UGen/Filter/normalizer.help.lhs- Help/UGen/Filter/onePole.help.lhs- Help/UGen/Filter/oneZero.help.lhs- Help/UGen/Filter/pitchShift.help.lhs- Help/UGen/Filter/pluck.help.lhs- Help/UGen/Filter/resonz.help.lhs- Help/UGen/Filter/rhpf.help.lhs- Help/UGen/Filter/ringz.help.lhs- Help/UGen/Filter/rlpf.help.lhs- Help/UGen/Filter/select.help.lhs- Help/UGen/Filter/shaper.help.lhs- Help/UGen/Filter/slew.help.lhs- Help/UGen/Filter/sos.help.lhs- Help/UGen/Filter/twoPole.help.lhs- Help/UGen/Filter/twoZero.help.lhs- Help/UGen/Filter/wrapIndex.help.lhs- Help/UGen/Granular/grainBuf.help.lhs- Help/UGen/Granular/grainFM.help.lhs- Help/UGen/Granular/grainIn.help.lhs- Help/UGen/Granular/grainSin.help.lhs- Help/UGen/Granular/warp1.help.lhs- Help/UGen/Information/controlRate.help.lhs- Help/UGen/Information/numAudioBuses.help.lhs- Help/UGen/Information/numBuffers.help.lhs- Help/UGen/Information/numControlBuses.help.lhs- Help/UGen/Information/numInputBuses.help.lhs- Help/UGen/Information/numOutputBuses.help.lhs- Help/UGen/Information/numRunningSynths.help.lhs- Help/UGen/Information/radiansPerSample.help.lhs- Help/UGen/Information/sampleDur.help.lhs- Help/UGen/Information/sampleRate.help.lhs- Help/UGen/Information/subsampleOffset.help.lhs- Help/UGen/IO/inFeedback.help.lhs- Help/UGen/IO/in.help.lhs- Help/UGen/IO/inTrig.help.lhs- Help/UGen/IO/keyState.help.lhs- Help/UGen/IO/lagIn.lhs- Help/UGen/IO/localIn.help.lhs- Help/UGen/IO/localOut.help.lhs- Help/UGen/IO/mouseButton.help.lhs- Help/UGen/IO/mouseX.help.lhs- Help/UGen/IO/mouseY.help.lhs- Help/UGen/IO/offsetOut.help.lhs- Help/UGen/IO/out.help.lhs- Help/UGen/IO/replaceOut.help.lhs- Help/UGen/IO/xOut.help.lhs- Help/UGen/Math/absDif.help.lhs- Help/UGen/Math/abs.help.lhs- Help/UGen/Math/amClip.help.lhs- Help/UGen/Math/atan2.help.lhs- Help/UGen/Math/clip2.help.lhs- Help/UGen/Math/difSqr.help.lhs- Help/UGen/Math/distort.help.lhs- Help/UGen/Math/fold2.help.lhs- Help/UGen/Math/hypot.help.lhs- Help/UGen/Math/ring1.help.lhs- Help/UGen/Math/scaleNeg.help.lhs- Help/UGen/Math/softClip.help.lhs- Help/UGen/Math/sumSqr.help.lhs- Help/UGen/Math/thresh.help.lhs- Help/UGen/Noise/brownNoise.help.lhs- Help/UGen/Noise/clipNoise.help.lhs- Help/UGen/Noise/coinGate.help.lhs- Help/UGen/Noise/dust2.help.lhs- Help/UGen/Noise/dust.help.lhs- Help/UGen/Noise/expRand.help.lhs- Help/UGen/Noise/grayNoise.help.lhs- Help/UGen/Noise/iRand.help.lhs- Help/UGen/Noise/lfClipNoise.help.lhs- Help/UGen/Noise/lfdClipNoise.help.lhs- Help/UGen/Noise/lfdNoise0.help.lhs- Help/UGen/Noise/lfdNoise1.help.lhs- Help/UGen/Noise/lfdNoise3.help.lhs- Help/UGen/Noise/lfNoise0.help.lhs- Help/UGen/Noise/lfNoise1.help.lhs- Help/UGen/Noise/lfNoise2.help.lhs- Help/UGen/Noise/linRand.help.lhs- Help/UGen/Noise/nRand.help.lhs- Help/UGen/Noise/pinkNoise.help.lhs- Help/UGen/Noise/rand.help.lhs- Help/UGen/Noise/randID.help.lhs- Help/UGen/Noise/randSeed.help.lhs- Help/UGen/Noise/tExpRand.help.lhs- Help/UGen/Noise/tiRand.help.lhs- Help/UGen/Noise/tRand.help.lhs- Help/UGen/Noise/whiteNoise.help.lhs- Help/UGen/Oscillator/blip.help.lhs- Help/UGen/Oscillator/formant.help.lhs- Help/UGen/Oscillator/fSinOsc.help.lhs- Help/UGen/Oscillator/gendy1.help.lhs- Help/UGen/Oscillator/impulse.help.lhs- Help/UGen/Oscillator/klang.help.lhs- Help/UGen/Oscillator/lfCub.help.lhs- Help/UGen/Oscillator/lfPar.help.lhs- Help/UGen/Oscillator/lfPulse.help.lhs- Help/UGen/Oscillator/lfSaw.help.lhs- Help/UGen/Oscillator/lfTri.help.lhs- Help/UGen/Oscillator/oscN.help.lhs- Help/UGen/Oscillator/pulse.help.lhs- Help/UGen/Oscillator/saw.help.lhs- Help/UGen/Oscillator/silent.help.lhs- Help/UGen/Oscillator/sinOsc.help.lhs- Help/UGen/Oscillator/syncSaw.help.lhs- Help/UGen/Oscillator/tGrains.help.lhs- Help/UGen/Oscillator/twChoose.help.lhs- Help/UGen/Oscillator/twindex.help.lhs- Help/UGen/Panner/linPan2.help.lhs- Help/UGen/Panner/pan2.help.lhs- Help/UGen/Panner/rotate2.help.lhs- Help/UGen/Panner/splay.help.lhs- Help/UGen/Trigger/gate.help.lhs- Help/UGen/Trigger/inRange.help.lhs- Help/UGen/Trigger/lastValue.help.lhs- Help/UGen/Trigger/mostChange.help.lhs- Help/UGen/Trigger/peak.help.lhs- Help/UGen/Trigger/phasor.help.lhs- Help/UGen/Trigger/pulseCount.help.lhs- Help/UGen/Trigger/pulseDivider.help.lhs- Help/UGen/Trigger/runningMax.help.lhs- Help/UGen/Trigger/runningMin.help.lhs- Help/UGen/Trigger/sendTrig.lhs- Help/UGen/Trigger/setResetFF.help.lhs- Help/UGen/Trigger/stepper.help.lhs- Help/UGen/Trigger/sweep.help.lhs- Help/UGen/Trigger/tDelay.help.lhs- Help/UGen/Trigger/timer.help.lhs- Help/UGen/Trigger/toggleFF.help.lhs- Help/UGen/Trigger/trig1.help.lhs- Help/UGen/Trigger/trig.help.lhs+Data-files: README+ emacs/hsc3.el+ -- The below is appended by:+ -- find Help -name "*.*hs" | sort | \+ -- sed "s/^/ /" >> hsc3.cabal+ Help/Graphs/adso.lhs+ Help/Graphs/aleatoric-quartet.lhs+ Help/Graphs/analog-bubbles.lhs+ Help/Graphs/babbling-brook.lhs+ Help/Graphs/bit-reduction.lhs+ Help/Graphs/bottle.lhs+ Help/Graphs/bowed-string.lhs+ Help/Graphs/ccomb.lhs+ Help/Graphs/chain-saw.lhs+ Help/Graphs/chrd.lhs+ Help/Graphs/cricket.lhs+ Help/Graphs/crotale.lhs+ Help/Graphs/cut-outs.lhs+ Help/Graphs/cymbalism.lhs+ Help/Graphs/deep-sea.lhs+ Help/Graphs/demanding-studies.lhs+ Help/Graphs/dial-history.lhs+ Help/Graphs/diffraction.lhs+ Help/Graphs/discretion.lhs+ Help/Graphs/drummer.lhs+ Help/Graphs/eggcrate.lhs+ Help/Graphs/e-lamell.lhs+ Help/Graphs/feedr.lhs+ Help/Graphs/f-lets.lhs+ Help/Graphs/fm-iter.lhs+ Help/Graphs/fm-kltr.lhs+ Help/Graphs/forest-sounds.lhs+ Help/Graphs/fwalk.lhs+ Help/Graphs/half-life.lhs+ Help/Graphs/harmonic-swimming.lhs+ Help/Graphs/harmonic-tumbling.lhs+ Help/Graphs/h-chatter.lhs+ Help/Graphs/hh-808.lhs+ Help/Graphs/implosion.lhs+ Help/Graphs/karplus-strong.lhs+ Help/Graphs/klink.lhs+ Help/Graphs/k-ppr.lhs+ Help/Graphs/lfo-modulation.lhs+ Help/Graphs/lf-pulses.lhs+ Help/Graphs/lg-timed.lhs+ Help/Graphs/lin-sosc.lhs+ Help/Graphs/modal-space.lhs+ Help/Graphs/moto-rev.lhs+ Help/Graphs/mouse-clatter.lhs+ Help/Graphs/nharm.lhs+ Help/Graphs/noise-burst-sweep.lhs+ Help/Graphs/one-line.lhs+ Help/Graphs/oscillator-cluster.lhs+ Help/Graphs/pattern-buffer.lhs+ Help/Graphs/plucked-strings.lhs+ Help/Graphs/police-state.lhs+ Help/Graphs/pulsing-bottles.lhs+ Help/Graphs/record-scratcher.lhs+ Help/Graphs/red-frik.lhs+ Help/Graphs/reverberated-sine-percussion.lhs+ Help/Graphs/rm-octaver.lhs+ Help/Graphs/rzblp.lhs+ Help/Graphs/sample-and-hold-liquidities.lhs+ Help/Graphs/s-chirp.lhs+ Help/Graphs/scratchy.lhs+ Help/Graphs/scritto.lhs+ Help/Graphs/shepard-tones.lhs+ Help/Graphs/shifting-pulses.lhs+ Help/Graphs/snare-909.lhs+ Help/Graphs/sosc-lp.lhs+ Help/Graphs/spe.lhs+ Help/Graphs/sprinkler.lhs+ Help/Graphs/strummable-guitar.lhs+ Help/Graphs/sweepy-noise.lhs+ Help/Graphs/synthetic-piano.lhs+ Help/Graphs/tank.lhs+ Help/Graphs/tgb.lhs+ Help/Graphs/tgr-rpr.lhs+ Help/Graphs/theremin.lhs+ Help/Graphs/three-cpsw.lhs+ Help/Graphs/tipnso.lhs+ Help/Graphs/trkl.lhs+ Help/Graphs/trmlo.lhs+ Help/Graphs/tr-out.lhs+ Help/Graphs/tsort.lhs+ Help/Graphs/vlc-distrtn.lhs+ Help/Graphs/voscil.lhs+ Help/Graphs/what-was-i-thinking.lhs+ Help/Graphs/wial.lhs+ Help/Graphs/wind-metals.lhs+ Help/Graphs/xy-interference.lhs+ Help/hsc3.help.lhs+ Help/Server/b_alloc.help.lhs+ Help/Server/b_allocRead.help.lhs+ Help/Server/b_close.help.lhs+ Help/Server/b_fill.help.lhs+ Help/Server/b_free.help.lhs+ Help/Server/b_gen.help.lhs+ Help/Server/b_get.help.lhs+ Help/Server/b_getn.help.lhs+ Help/Server/b_query.help.lhs+ Help/Server/b_read.help.lhs+ Help/Server/b_set.help.lhs+ Help/Server/b_setn.help.lhs+ Help/Server/b_write.help.lhs+ Help/Server/b_zero.help.lhs+ Help/Server/c_fill.help.lhs+ Help/Server/c_get.help.lhs+ Help/Server/c_getn.help.lhs+ Help/Server/clearSched.help.lhs+ Help/Server/c_set.help.lhs+ Help/Server/c_setn.help.lhs+ Help/Server/d_free.help.lhs+ Help/Server/d_loadDir.help.lhs+ Help/Server/d_load.help.lhs+ Help/Server/d_recv.help.lhs+ Help/Server/dumpOSC.help.lhs+ Help/Server/g_deepFree.help.lhs+ Help/Server/g_freeAll.help.lhs+ Help/Server/g_head.help.lhs+ Help/Server/g_new.help.lhs+ Help/Server/g_tail.help.lhs+ Help/Server/n_after.help.lhs+ Help/Server/n_before.help.lhs+ Help/Server/n_fill.help.lhs+ Help/Server/n_free.help.lhs+ Help/Server/n_map.help.lhs+ Help/Server/n_mapn.help.lhs+ Help/Server/notify.help.lhs+ Help/Server/n_query.help.lhs+ Help/Server/n_run.help.lhs+ Help/Server/n_set.help.lhs+ Help/Server/n_setn.help.lhs+ Help/Server/n_trace.help.lhs+ Help/Server/quit.help.lhs+ Help/Server/s_get.help.lhs+ Help/Server/s_getn.help.lhs+ Help/Server/s_new.help.lhs+ Help/Server/s_noid.help.lhs+ Help/Server/status.help.lhs+ Help/Server/sync.help.lhs+ Help/Server/tr.help.lhs+ Help/Server/u_cmd.help.lhs+ Help/Tutorial/Tutorial.lhs+ Help/UGen/Analysis/amplitude.help.lhs+ Help/UGen/Analysis/compander.help.lhs+ Help/UGen/Analysis/pitch.help.lhs+ Help/UGen/Analysis/runningSum.help.lhs+ Help/UGen/Analysis/slope.help.lhs+ Help/UGen/Analysis/zeroCrossing.help.lhs+ Help/UGen/Buffer/bufAllpassC.help.lhs+ Help/UGen/Buffer/bufAllpassL.help.lhs+ Help/UGen/Buffer/bufAllpassN.help.lhs+ Help/UGen/Buffer/bufChannels.help.lhs+ Help/UGen/Buffer/bufCombC.help.lhs+ Help/UGen/Buffer/bufCombL.help.lhs+ Help/UGen/Buffer/bufCombN.help.lhs+ Help/UGen/Buffer/bufDelayC.help.lhs+ Help/UGen/Buffer/bufDelayL.help.lhs+ Help/UGen/Buffer/bufDelayN.help.lhs+ Help/UGen/Buffer/bufDur.help.lhs+ Help/UGen/Buffer/bufFrames.help.lhs+ Help/UGen/Buffer/bufRateScale.help.lhs+ Help/UGen/Buffer/bufRd.help.lhs+ Help/UGen/Buffer/bufSampleRate.help.lhs+ Help/UGen/Buffer/detectIndex.help.lhs+ Help/UGen/Buffer/index.help.lhs+ Help/UGen/Buffer/indexInBetween.help.lhs+ Help/UGen/Buffer/osc.help.lhs+ Help/UGen/Buffer/playBuf.help.lhs+ Help/UGen/Buffer/recordBuf.help.lhs+ Help/UGen/Buffer/vOsc.help.lhs+ Help/UGen/Chaos/crackle.help.lhs+ Help/UGen/Chaos/cuspL.help.lhs+ Help/UGen/Chaos/cuspN.help.lhs+ Help/UGen/Chaos/fbSineC.help.lhs+ Help/UGen/Chaos/fbSineL.help.lhs+ Help/UGen/Chaos/fbSineN.help.lhs+ Help/UGen/Chaos/henonC.help.lhs+ Help/UGen/Chaos/henonL.help.lhs+ Help/UGen/Chaos/henonN.help.lhs+ Help/UGen/Chaos/latoocarfianC.help.lhs+ Help/UGen/Chaos/linCongC.help.lhs+ Help/UGen/Chaos/linCongL.help.lhs+ Help/UGen/Chaos/linCongN.help.lhs+ Help/UGen/Chaos/logistic.help.lhs+ Help/UGen/Chaos/lorenzL.help.lhs+ Help/UGen/Chaos/quadC.help.lhs+ Help/UGen/Chaos/quadL.help.lhs+ Help/UGen/Chaos/quadN.help.lhs+ Help/UGen/Chaos/rossler.help.lhs+ Help/UGen/Control/mrg2.help.lhs+ Help/UGen/Demand/dbrown.help.lhs+ Help/UGen/Demand/dbufrd.help.lhs+ Help/UGen/Demand/dbufwr.help.lhs+ Help/UGen/Demand/demandEnvGen.help.lhs+ Help/UGen/Demand/demand.help.lhs+ Help/UGen/Demand/dgeom.help.lhs+ Help/UGen/Demand/dibrown.help.lhs+ Help/UGen/Demand/diwhite.help.lhs+ Help/UGen/Demand/drand.help.lhs+ Help/UGen/Demand/dseq.help.lhs+ Help/UGen/Demand/dser.help.lhs+ Help/UGen/Demand/dseries.help.lhs+ Help/UGen/Demand/dswitch1.help.lhs+ Help/UGen/Demand/dswitch.help.lhs+ Help/UGen/Demand/duty.help.lhs+ Help/UGen/Demand/dwhite.help.lhs+ Help/UGen/Demand/dxrand.help.lhs+ Help/UGen/Demand/tDuty.help.lhs+ Help/UGen/Envelope/detectSilence.help.lhs+ Help/UGen/Envelope/done.help.lhs+ Help/UGen/Envelope/envGen.help.lhs+ Help/UGen/Envelope/free.help.lhs+ Help/UGen/Envelope/freeSelf.help.lhs+ Help/UGen/Envelope/freeSelfWhenDone.help.lhs+ Help/UGen/Envelope/line.help.lhs+ Help/UGen/Envelope/linen.help.lhs+ Help/UGen/Envelope/pause.help.lhs+ Help/UGen/Envelope/pauseSelf.help.lhs+ Help/UGen/Envelope/pauseSelfWhenDone.help.lhs+ Help/UGen/Envelope/xLine.help.lhs+ Help/UGen/External/atsNoiSynth.help.lhs+ Help/UGen/External/atsSynth.help.lhs+ Help/UGen/External/ay.help.lhs+ Help/UGen/External/lpcSynth.help.lhs+ Help/UGen/External/lpcVals.help.lhs+ Help/UGen/External/membraneCircle.help.lhs+ Help/UGen/External/membraneHexagon.help.lhs+ Help/UGen/External/pv_Invert.help.lhs+ Help/UGen/External/stkBowed.help.lhs+ Help/UGen/External/stkFlute.help.lhs+ Help/UGen/External/stkMandolin.help.lhs+ Help/UGen/External/stkModalBar.help.lhs+ Help/UGen/External/stkShakers.help.lhs+ Help/UGen/External/vosim.help.lhs+ Help/UGen/FFT/convolution.help.lhs+ Help/UGen/FFT/fft.help.lhs+ Help/UGen/FFT/ifft.help.lhs+ Help/UGen/FFT/packFFT.help.lhs+ Help/UGen/FFT/pv_BinScramble.help.lhs+ Help/UGen/FFT/pv_BinShift.help.lhs+ Help/UGen/FFT/pv_BinWipe.help.lhs+ Help/UGen/FFT/pv_BrickWall.help.lhs+ Help/UGen/FFT/pvcollect.help.lhs+ Help/UGen/FFT/pv_ConformalMap.help.lhs+ Help/UGen/FFT/pv_Copy.help.lhs+ Help/UGen/FFT/pv_Diffuser.help.lhs+ Help/UGen/FFT/pv_LocalMax.help.lhs+ Help/UGen/FFT/pv_MagAbove.help.lhs+ Help/UGen/FFT/pv_MagBelow.help.lhs+ Help/UGen/FFT/pv_MagClip.help.lhs+ Help/UGen/FFT/pv_MagFreeze.help.lhs+ Help/UGen/FFT/pv_RandComb.help.lhs+ Help/UGen/FFT/pv_RandWipe.help.lhs+ Help/UGen/FFT/pv_RectComb.help.lhs+ Help/UGen/Filter/allpassC.help.lhs+ Help/UGen/Filter/allpassL.help.lhs+ Help/UGen/Filter/allpassN.help.lhs+ Help/UGen/Filter/bpf.help.lhs+ Help/UGen/Filter/bpz2.help.lhs+ Help/UGen/Filter/brf.help.lhs+ Help/UGen/Filter/clip.help.lhs+ Help/UGen/Filter/combC.help.lhs+ Help/UGen/Filter/combL.help.lhs+ Help/UGen/Filter/combN.help.lhs+ Help/UGen/Filter/decay2.help.lhs+ Help/UGen/Filter/decay.help.lhs+ Help/UGen/Filter/degreeToKey.help.lhs+ Help/UGen/Filter/delay1.help.lhs+ Help/UGen/Filter/delay2.help.lhs+ Help/UGen/Filter/delayA.help.lhs+ Help/UGen/Filter/delayL.help.lhs+ Help/UGen/Filter/delayN.help.lhs+ Help/UGen/Filter/formlet.help.lhs+ Help/UGen/Filter/fos.help.lhs+ Help/UGen/Filter/freeVerb.help.lhs+ Help/UGen/Filter/freqShift.help.lhs+ Help/UGen/Filter/hasher.help.lhs+ Help/UGen/Filter/hpf.help.lhs+ Help/UGen/Filter/hpz1.help.lhs+ Help/UGen/Filter/hpz2.help.lhs+ Help/UGen/Filter/klank.help.lhs+ Help/UGen/Filter/lag2.help.lhs+ Help/UGen/Filter/lag3.help.lhs+ Help/UGen/Filter/lag.help.lhs+ Help/UGen/Filter/latch.help.lhs+ Help/UGen/Filter/leakDC.help.lhs+ Help/UGen/Filter/limiter.help.lhs+ Help/UGen/Filter/linExp.help.lhs+ Help/UGen/Filter/linLin.help.lhs+ Help/UGen/Filter/lpf.help.lhs+ Help/UGen/Filter/lpz1.help.lhs+ Help/UGen/Filter/lpz2.help.lhs+ Help/UGen/Filter/mantissaMask.help.lhs+ Help/UGen/Filter/median.help.lhs+ Help/UGen/Filter/moogFF.help.lhs+ Help/UGen/Filter/normalizer.help.lhs+ Help/UGen/Filter/onePole.help.lhs+ Help/UGen/Filter/oneZero.help.lhs+ Help/UGen/Filter/pitchShift.help.lhs+ Help/UGen/Filter/pluck.help.lhs+ Help/UGen/Filter/resonz.help.lhs+ Help/UGen/Filter/rhpf.help.lhs+ Help/UGen/Filter/ringz.help.lhs+ Help/UGen/Filter/rlpf.help.lhs+ Help/UGen/Filter/select.help.lhs+ Help/UGen/Filter/shaper.help.lhs+ Help/UGen/Filter/slew.help.lhs+ Help/UGen/Filter/sos.help.lhs+ Help/UGen/Filter/twoPole.help.lhs+ Help/UGen/Filter/twoZero.help.lhs+ Help/UGen/Filter/wrapIndex.help.lhs+ Help/UGen/Granular/grainBuf.help.lhs+ Help/UGen/Granular/grainFM.help.lhs+ Help/UGen/Granular/grainIn.help.lhs+ Help/UGen/Granular/grainSin.help.lhs+ Help/UGen/Granular/warp1.help.lhs+ Help/UGen/Information/controlRate.help.lhs+ Help/UGen/Information/numAudioBuses.help.lhs+ Help/UGen/Information/numBuffers.help.lhs+ Help/UGen/Information/numControlBuses.help.lhs+ Help/UGen/Information/numInputBuses.help.lhs+ Help/UGen/Information/numOutputBuses.help.lhs+ Help/UGen/Information/numRunningSynths.help.lhs+ Help/UGen/Information/radiansPerSample.help.lhs+ Help/UGen/Information/sampleDur.help.lhs+ Help/UGen/Information/sampleRate.help.lhs+ Help/UGen/Information/subsampleOffset.help.lhs+ Help/UGen/IO/inFeedback.help.lhs+ Help/UGen/IO/in.help.lhs+ Help/UGen/IO/inTrig.help.lhs+ Help/UGen/IO/keyState.help.lhs+ Help/UGen/IO/lagIn.help.lhs+ Help/UGen/IO/localIn.help.lhs+ Help/UGen/IO/localOut.help.lhs+ Help/UGen/IO/mouseButton.help.lhs+ Help/UGen/IO/mouseX.help.lhs+ Help/UGen/IO/mouseY.help.lhs+ Help/UGen/IO/offsetOut.help.lhs+ Help/UGen/IO/out.help.lhs+ Help/UGen/IO/replaceOut.help.lhs+ Help/UGen/IO/soundIn.help.lhs+ Help/UGen/IO/xOut.help.lhs+ Help/UGen/MachineListening/beatTrack.help.lhs+ Help/UGen/MachineListening/onsets.help.lhs+ Help/UGen/Math/absDif.help.lhs+ Help/UGen/Math/abs.help.lhs+ Help/UGen/Math/amClip.help.lhs+ Help/UGen/Math/atan2.help.lhs+ Help/UGen/Math/clip2.help.lhs+ Help/UGen/Math/difSqr.help.lhs+ Help/UGen/Math/distort.help.lhs+ Help/UGen/Math/fold2.help.lhs+ Help/UGen/Math/hypot.help.lhs+ Help/UGen/Math/ring1.help.lhs+ Help/UGen/Math/scaleNeg.help.lhs+ Help/UGen/Math/softClip.help.lhs+ Help/UGen/Math/sumSqr.help.lhs+ Help/UGen/Math/thresh.help.lhs+ Help/UGen/Noise/brownNoise.help.lhs+ Help/UGen/Noise/clipNoise.help.lhs+ Help/UGen/Noise/coinGate.help.lhs+ Help/UGen/Noise/dust2.help.lhs+ Help/UGen/Noise/dust.help.lhs+ Help/UGen/Noise/expRand.help.lhs+ Help/UGen/Noise/grayNoise.help.lhs+ Help/UGen/Noise/iRand.help.lhs+ Help/UGen/Noise/lfClipNoise.help.lhs+ Help/UGen/Noise/lfdClipNoise.help.lhs+ Help/UGen/Noise/lfdNoise0.help.lhs+ Help/UGen/Noise/lfdNoise1.help.lhs+ Help/UGen/Noise/lfdNoise3.help.lhs+ Help/UGen/Noise/lfNoise0.help.lhs+ Help/UGen/Noise/lfNoise1.help.lhs+ Help/UGen/Noise/lfNoise2.help.lhs+ Help/UGen/Noise/linRand.help.lhs+ Help/UGen/Noise/nRand.help.lhs+ Help/UGen/Noise/pinkNoise.help.lhs+ Help/UGen/Noise/rand.help.lhs+ Help/UGen/Noise/randID.help.lhs+ Help/UGen/Noise/randSeed.help.lhs+ Help/UGen/Noise/tExpRand.help.lhs+ Help/UGen/Noise/tiRand.help.lhs+ Help/UGen/Noise/tRand.help.lhs+ Help/UGen/Noise/whiteNoise.help.lhs+ Help/UGen/Oscillator/blip.help.lhs+ Help/UGen/Oscillator/formant.help.lhs+ Help/UGen/Oscillator/fSinOsc.help.lhs+ Help/UGen/Oscillator/gendy1.help.lhs+ Help/UGen/Oscillator/impulse.help.lhs+ Help/UGen/Oscillator/klang.help.lhs+ Help/UGen/Oscillator/lfCub.help.lhs+ Help/UGen/Oscillator/lfPar.help.lhs+ Help/UGen/Oscillator/lfPulse.help.lhs+ Help/UGen/Oscillator/lfSaw.help.lhs+ Help/UGen/Oscillator/lfTri.help.lhs+ Help/UGen/Oscillator/oscN.help.lhs+ Help/UGen/Oscillator/pulse.help.lhs+ Help/UGen/Oscillator/saw.help.lhs+ Help/UGen/Oscillator/silent.help.lhs+ Help/UGen/Oscillator/sinOsc.help.lhs+ Help/UGen/Oscillator/syncSaw.help.lhs+ Help/UGen/Oscillator/tChoose.help.lhs+ Help/UGen/Oscillator/tGrains.help.lhs+ Help/UGen/Oscillator/twChoose.help.lhs+ Help/UGen/Oscillator/twindex.help.lhs+ Help/UGen/Panner/linPan2.help.lhs+ Help/UGen/Panner/pan2.help.lhs+ Help/UGen/Panner/rotate2.help.lhs+ Help/UGen/Panner/splay.help.lhs+ Help/UGen/Trigger/gate.help.lhs+ Help/UGen/Trigger/inRange.help.lhs+ Help/UGen/Trigger/lastValue.help.lhs+ Help/UGen/Trigger/mostChange.help.lhs+ Help/UGen/Trigger/peak.help.lhs+ Help/UGen/Trigger/phasor.help.lhs+ Help/UGen/Trigger/pulseCount.help.lhs+ Help/UGen/Trigger/pulseDivider.help.lhs+ Help/UGen/Trigger/runningMax.help.lhs+ Help/UGen/Trigger/runningMin.help.lhs+ Help/UGen/Trigger/sendTrig.help.lhs+ Help/UGen/Trigger/setResetFF.help.lhs+ Help/UGen/Trigger/stepper.help.lhs+ Help/UGen/Trigger/sweep.help.lhs+ Help/UGen/Trigger/tDelay.help.lhs+ Help/UGen/Trigger/timer.help.lhs+ Help/UGen/Trigger/toggleFF.help.lhs+ Help/UGen/Trigger/trig1.help.lhs+ Help/UGen/Trigger/trig.help.lhs++Library+ Build-Depends: base, binary, bytestring, containers, hosc == 0.3,+ network, random+ GHC-Options: -Wall -fwarn-tabs -O2+ Exposed-modules: Sound.SC3+ Sound.SC3.Server+ Sound.SC3.Server.Command+ Sound.SC3.Server.NRT+ Sound.SC3.Server.Play+ Sound.SC3.Server.Status+ Sound.SC3.Server.Synthdef+ Sound.SC3.UGen+ Sound.SC3.UGen.Analysis+ Sound.SC3.UGen.Base+ Sound.SC3.UGen.Buffer+ Sound.SC3.UGen.Chaos+ Sound.SC3.UGen.Composite+ Sound.SC3.UGen.Demand+ Sound.SC3.UGen.Demand.Base+ Sound.SC3.UGen.Demand.Monadic+ Sound.SC3.UGen.Demand.Unsafe+ Sound.SC3.UGen.Enum+ Sound.SC3.UGen.Envelope+ Sound.SC3.UGen.Envelope.Construct+ Sound.SC3.UGen.External+ Sound.SC3.UGen.External.ATS+ Sound.SC3.UGen.External.LPC+ Sound.SC3.UGen.FFT+ Sound.SC3.UGen.FFT.Base+ Sound.SC3.UGen.FFT.Monadic+ Sound.SC3.UGen.FFT.Unsafe+ Sound.SC3.UGen.Filter+ Sound.SC3.UGen.Granular+ Sound.SC3.UGen.IO+ Sound.SC3.UGen.Information+ Sound.SC3.UGen.MachineListening+ Sound.SC3.UGen.Math+ Sound.SC3.UGen.Noise.Base+ Sound.SC3.UGen.Noise.Monadic+ Sound.SC3.UGen.Noise.Unsafe+ Sound.SC3.UGen.Operator+ Sound.SC3.UGen.Oscillator+ Sound.SC3.UGen.Panner+ Sound.SC3.UGen.Rate+ Sound.SC3.UGen.UGen+ Sound.SC3.UGen.UId+ Sound.SC3.UGen.Unsafe+ Other-modules: Sound.SC3.Server.Utilities+ Sound.SC3.UGen.Utilities+ Sound.SC3.UGen.UGen.Lift