hsc3 0.17 → 0.18
raw patch · 526 files changed
+3492/−3504 lines, 526 filesdep ~hosc
Dependency ranges changed: hosc
Files
- Help/Server/b_alloc.help.lhs +1/−1
- Help/Server/b_allocRead.help.lhs +14/−13
- Help/Server/b_allocReadChannel.help.lhs +17/−13
- Help/Server/b_close.help.lhs +1/−1
- Help/Server/b_fill.help.lhs +1/−1
- Help/Server/b_free.help.lhs +1/−1
- Help/Server/b_gen.help.lhs +1/−1
- Help/Server/b_get.help.lhs +1/−1
- Help/Server/b_getn.help.lhs +24/−11
- Help/Server/b_query.help.lhs +1/−1
- Help/Server/b_read.help.lhs +1/−1
- Help/Server/b_readChannel.help.lhs +1/−1
- Help/Server/b_set.help.lhs +1/−1
- Help/Server/b_setn.help.lhs +1/−1
- Help/Server/b_write.help.lhs +1/−1
- Help/Server/b_zero.help.lhs +1/−1
- Help/Server/c_fill.help.lhs +1/−1
- Help/Server/c_get.help.lhs +9/−5
- Help/Server/c_getn.help.lhs +1/−1
- Help/Server/c_set.help.lhs +1/−1
- Help/Server/c_setn.help.lhs +1/−1
- Help/Server/clearSched.help.lhs +1/−1
- Help/Server/d_free.help.lhs +1/−1
- Help/Server/d_load.help.lhs +1/−1
- Help/Server/d_loadDir.help.lhs +1/−1
- Help/Server/d_recv.help.lhs +1/−1
- Help/Server/dumpOSC.help.lhs +1/−1
- Help/Server/g_deepFree.help.lhs +1/−1
- Help/Server/g_freeAll.help.lhs +1/−1
- Help/Server/g_head.help.lhs +1/−1
- Help/Server/g_new.help.lhs +5/−3
- Help/Server/g_queryTree.help.lhs +1/−1
- Help/Server/g_tail.help.lhs +1/−1
- Help/Server/n_after.help.lhs +1/−1
- Help/Server/n_before.help.lhs +1/−1
- Help/Server/n_fill.help.lhs +1/−1
- Help/Server/n_free.help.lhs +1/−1
- Help/Server/n_map.help.lhs +1/−1
- Help/Server/n_mapn.help.lhs +1/−1
- Help/Server/n_query.help.lhs +14/−7
- Help/Server/n_run.help.lhs +1/−1
- Help/Server/n_set.help.lhs +1/−1
- Help/Server/n_setn.help.lhs +5/−1
- Help/Server/n_trace.help.lhs +1/−1
- Help/Server/notify.help.lhs +1/−1
- Help/Server/quit.help.lhs +1/−1
- Help/Server/s_get.help.lhs +1/−1
- Help/Server/s_getn.help.lhs +1/−1
- Help/Server/s_new.help.lhs +1/−1
- Help/Server/s_noid.help.lhs +1/−1
- Help/Server/status.help.lhs +1/−1
- Help/Server/sync.help.lhs +1/−1
- Help/Server/tr.help.lhs +1/−1
- Help/Server/u_cmd.help.lhs +1/−1
- Help/UGen/abs.help.lhs +0/−3
- Help/UGen/absDif.help.lhs +0/−3
- Help/UGen/add.help.lhs +6/−3
- Help/UGen/allpassN.help.lhs +9/−3
- Help/UGen/amClip.help.lhs +0/−3
- Help/UGen/ampComp.help.lhs +0/−3
- Help/UGen/ampDb.help.lhs +10/−0
- Help/UGen/amplitude.help.lhs +0/−3
- Help/UGen/atan2.help.lhs +0/−3
- Help/UGen/atari2600.help.lhs +9/−11
- Help/UGen/atsNoiSynth.help.lhs +27/−21
- Help/UGen/atsSynth.help.lhs +34/−18
- Help/UGen/audioMSG.help.lhs +3/−6
- Help/UGen/ay.help.lhs +6/−7
- Help/UGen/bAllpass.help.lhs +0/−3
- Help/UGen/bBandPass.help.lhs +0/−3
- Help/UGen/bBandStop.help.lhs +0/−3
- Help/UGen/bHiPass.help.lhs +0/−3
- Help/UGen/bHiPass4.help.lhs +0/−3
- Help/UGen/bHiShelf.help.lhs +0/−3
- Help/UGen/bLowPass.help.lhs +3/−4
- Help/UGen/bLowPass4.help.lhs +0/−3
- Help/UGen/bLowShelf.help.lhs +0/−3
- Help/UGen/bMoog.help.lhs +2/−8
- Help/UGen/bPeakEQ.help.lhs +0/−3
- Help/UGen/balance2.help.lhs +0/−3
- Help/UGen/beatTrack.help.lhs +0/−3
- Help/UGen/blip.help.lhs +0/−3
- Help/UGen/blitB3.help.lhs +4/−7
- Help/UGen/blitB3Saw.help.lhs +4/−7
- Help/UGen/blitB3Square.help.lhs +5/−8
- Help/UGen/blitB3Tri.help.lhs +3/−6
- Help/UGen/blockSize.help.lhs +0/−3
- Help/UGen/bpf.help.lhs +0/−3
- Help/UGen/brf.help.lhs +0/−3
- Help/UGen/brownNoise.help.lhs +0/−3
- Help/UGen/bufAllpassC.help.lhs +0/−3
- Help/UGen/bufChannels.help.lhs +0/−2
- Help/UGen/bufCombC.help.lhs +0/−3
- Help/UGen/bufDelayC.help.lhs +0/−3
- Help/UGen/bufDur.help.lhs +1/−4
- Help/UGen/bufFrames.help.lhs +0/−3
- Help/UGen/bufRateScale.help.lhs +13/−8
- Help/UGen/bufRd.help.lhs +0/−3
- Help/UGen/bufSampleRate.help.lhs +0/−3
- Help/UGen/bufWr.help.lhs +0/−3
- Help/UGen/cOsc.help.lhs +0/−3
- Help/UGen/changed.help.lhs +1/−4
- Help/UGen/choose.help.lhs +1/−1
- Help/UGen/clip.help.lhs +1/−4
- Help/UGen/clip2.help.lhs +1/−4
- Help/UGen/clipNoise.help.lhs +1/−4
- Help/UGen/coinGate.help.lhs +0/−3
- Help/UGen/compander.help.lhs +0/−3
- Help/UGen/complexRes.help.lhs +2/−5
- Help/UGen/concat.help.lhs +0/−3
- Help/UGen/controlDur.help.lhs +0/−3
- Help/UGen/controlRate.help.lhs +0/−3
- Help/UGen/convolution.help.lhs +0/−3
- Help/UGen/coyote.help.lhs +2/−5
- Help/UGen/crackle.help.lhs +0/−3
- Help/UGen/crossoverDistortion.help.lhs +3/−6
- Help/UGen/cuspL.help.lhs +8/−6
- Help/UGen/dNoiseRing.help.lhs +2/−5
- Help/UGen/dWGBowed.help.lhs +25/−0
- Help/UGen/dWGBowedTor.help.lhs +25/−0
- Help/UGen/dWGPlucked2.help.lhs +5/−8
- Help/UGen/dWGPluckedStiff.help.lhs +4/−7
- Help/UGen/dbAmp.help.lhs +0/−3
- Help/UGen/dbrown.help.lhs +0/−3
- Help/UGen/dbufrd.help.lhs +0/−3
- Help/UGen/dbufwr.help.lhs +0/−3
- Help/UGen/dc.help.lhs +0/−3
- Help/UGen/dconst.help.lhs +12/−0
- Help/UGen/decay.help.lhs +0/−3
- Help/UGen/decay2.help.lhs +0/−3
- Help/UGen/degreeToKey.help.lhs +5/−8
- Help/UGen/delay1.help.lhs +0/−3
- Help/UGen/delay2.help.lhs +1/−4
- Help/UGen/delayL.help.lhs +9/−0
- Help/UGen/delayN.help.lhs +14/−3
- Help/UGen/demand.help.lhs +16/−6
- Help/UGen/demandEnvGen.help.lhs +5/−7
- Help/UGen/detectIndex.help.lhs +0/−3
- Help/UGen/detectSilence.help.lhs +2/−5
- Help/UGen/dfm1.help.lhs +5/−8
- Help/UGen/dgeom.help.lhs +1/−4
- Help/UGen/difSqr.help.lhs +1/−4
- Help/UGen/diodeRingMod.help.lhs +6/−9
- Help/UGen/disintegrator.help.lhs +2/−5
- Help/UGen/diskIn.help.lhs +0/−3
- Help/UGen/diskOut.help.lhs +0/−3
- Help/UGen/distort.help.lhs +0/−3
- Help/UGen/div.help.lhs +14/−0
- Help/UGen/diwhite.help.lhs +0/−3
- Help/UGen/done.help.lhs +0/−3
- Help/UGen/doubleWell3.help.lhs +3/−6
- Help/UGen/dpw3Tri.help.lhs +5/−8
- Help/UGen/dpw4Saw.help.lhs +3/−6
- Help/UGen/drand.help.lhs +16/−4
- Help/UGen/dseq.help.lhs +3/−6
- Help/UGen/dser.help.lhs +1/−4
- Help/UGen/dseries.help.lhs +1/−4
- Help/UGen/dshuf.help.lhs +0/−3
- Help/UGen/dstutter.help.lhs +3/−6
- Help/UGen/dswitch.help.lhs +1/−4
- Help/UGen/dswitch1.help.lhs +1/−4
- Help/UGen/dust.help.lhs +0/−3
- Help/UGen/dust2.help.lhs +0/−3
- Help/UGen/duty.help.lhs +1/−4
- Help/UGen/dwhite.help.lhs +0/−3
- Help/UGen/dwrand.help.lhs +1/−4
- Help/UGen/dxrand.help.lhs +0/−3
- Help/UGen/dynKlang.help.lhs +11/−3
- Help/UGen/dynKlank.help.lhs +0/−3
- Help/UGen/envADSR.help.lhs +0/−3
- Help/UGen/envCoord.help.lhs +0/−2
- Help/UGen/envDetect.help.lhs +2/−5
- Help/UGen/envFollow.help.lhs +2/−5
- Help/UGen/envGate.help.lhs +0/−2
- Help/UGen/envGen.help.lhs +24/−21
- Help/UGen/envLinen.help.lhs +0/−1
- Help/UGen/envPairs.help.lhs +1/−2
- Help/UGen/envPerc.help.lhs +0/−1
- Help/UGen/envSine.help.lhs +0/−1
- Help/UGen/envStep.help.lhs +0/−1
- Help/UGen/envTrapezoid.help.lhs +0/−2
- Help/UGen/envTriangle.help.lhs +0/−1
- Help/UGen/envXYC.help.lhs +0/−1
- Help/UGen/equal_to.help.lhs +18/−0
- Help/UGen/excess.help.lhs +1/−4
- Help/UGen/expRand.help.lhs +0/−3
- Help/UGen/fSinOsc.help.lhs +0/−3
- Help/UGen/fbSineC.help.lhs +20/−11
- Help/UGen/fdiv.help.lhs +1/−4
- Help/UGen/fft.help.lhs +0/−2
- Help/UGen/fftTrigger.help.lhs +1/−2
- Help/UGen/fm7.help.lhs +3/−6
- Help/UGen/fmGrain.help.lhs +0/−3
- Help/UGen/fmGrainB.help.lhs +2/−5
- Help/UGen/fold2.help.lhs +1/−4
- Help/UGen/formant.help.lhs +1/−4
- Help/UGen/formlet.help.lhs +0/−3
- Help/UGen/free.help.lhs +2/−5
- Help/UGen/freeSelf.help.lhs +1/−4
- Help/UGen/freeSelfWhenDone.help.lhs +0/−3
- Help/UGen/freeVerb.help.lhs +0/−3
- Help/UGen/freqShift.help.lhs +0/−3
- Help/UGen/gVerb.help.lhs +0/−3
- Help/UGen/gate.help.lhs +0/−3
- Help/UGen/gaussTrig.help.lhs +2/−5
- Help/UGen/gbmanN.help.lhs +0/−3
- Help/UGen/gendy1.help.lhs +4/−7
- Help/UGen/grainBuf.help.lhs +0/−3
- Help/UGen/grainFM.help.lhs +0/−3
- Help/UGen/grainIn.help.lhs +0/−3
- Help/UGen/grainSin.help.lhs +16/−4
- Help/UGen/grayNoise.help.lhs +0/−3
- Help/UGen/greater_than.help.lhs +2/−0
- Help/UGen/greyholeRaw.help.lhs +2/−5
- Help/UGen/gt.help.lhs +0/−22
- Help/UGen/hasher.help.lhs +0/−3
- Help/UGen/henonN.help.lhs +9/−3
- Help/UGen/hilbertFIR.help.lhs +0/−3
- Help/UGen/hpf.help.lhs +1/−4
- Help/UGen/hpz1.help.lhs +6/−9
- Help/UGen/hpz2.help.lhs +0/−3
- Help/UGen/hypot.help.lhs +3/−6
- Help/UGen/iEnvGen.help.lhs +0/−3
- Help/UGen/iRand.help.lhs +0/−3
- Help/UGen/ifft.help.lhs +0/−4
- Help/UGen/iirFilter.help.lhs +2/−5
- Help/UGen/impulse.help.lhs +0/−3
- Help/UGen/in.help.lhs +4/−3
- Help/UGen/inFeedback.help.lhs +0/−3
- Help/UGen/inRange.help.lhs +4/−3
- Help/UGen/inTrig.help.lhs +0/−3
- Help/UGen/index.help.lhs +1/−4
- Help/UGen/indexInBetween.help.lhs +1/−4
- Help/UGen/indexL.help.lhs +0/−3
- Help/UGen/integrator.help.lhs +2/−5
- Help/UGen/ix.md +19/−32
- Help/UGen/jPverbRaw.help.lhs +4/−5
- Help/UGen/k2a.help.lhs +0/−3
- Help/UGen/keyState.help.lhs +0/−3
- Help/UGen/keyTrack.help.lhs +9/−0
- Help/UGen/klang.help.lhs +0/−3
- Help/UGen/klank.help.lhs +0/−3
- Help/UGen/ladspa.help.lhs +16/−19
- Help/UGen/lag.help.lhs +0/−3
- Help/UGen/lag2.help.lhs +0/−3
- Help/UGen/lag3.help.lhs +0/−3
- Help/UGen/lagIn.help.lhs +0/−3
- Help/UGen/lagUD.help.lhs +0/−3
- Help/UGen/latch.help.lhs +0/−3
- Help/UGen/latoocarfianC.help.lhs +10/−4
- Help/UGen/leakDC.help.lhs +0/−3
- Help/UGen/lfBrownNoise0.help.lhs +2/−4
- Help/UGen/lfBrownNoise2.help.lhs +5/−7
- Help/UGen/lfClipNoise.help.lhs +0/−3
- Help/UGen/lfCub.help.lhs +0/−3
- Help/UGen/lfGauss.help.lhs +0/−3
- Help/UGen/lfNoise0.help.lhs +0/−3
- Help/UGen/lfNoise1.help.lhs +0/−3
- Help/UGen/lfNoise2.help.lhs +0/−3
- Help/UGen/lfPar.help.lhs +0/−3
- Help/UGen/lfPulse.help.lhs +0/−3
- Help/UGen/lfSaw.help.lhs +0/−3
- Help/UGen/lfTri.help.lhs +1/−4
- Help/UGen/lfdClipNoise.help.lhs +0/−3
- Help/UGen/lfdNoise0.help.lhs +0/−3
- Help/UGen/lfdNoise3.help.lhs +5/−6
- Help/UGen/linCongC.help.lhs +9/−3
- Help/UGen/linExp.help.lhs +17/−4
- Help/UGen/linLin.help.lhs +0/−3
- Help/UGen/linPan2.help.lhs +0/−3
- Help/UGen/linRand.help.lhs +0/−3
- Help/UGen/linXFade2.help.lhs +10/−12
- Help/UGen/line.help.lhs +0/−3
- Help/UGen/linen.help.lhs +1/−4
- Help/UGen/localBuf.help.lhs +15/−14
- Help/UGen/localIn.help.lhs +1/−4
- Help/UGen/localOut.help.lhs +0/−3
- Help/UGen/logistic.help.lhs +3/−4
- Help/UGen/loopBuf.help.lhs +14/−12
- Help/UGen/lorenzL.help.lhs +4/−3
- Help/UGen/lorenzTrig.help.lhs +2/−5
- Help/UGen/loudness.help.lhs +0/−3
- Help/UGen/lpcAnalyzer.help.lhs +6/−9
- Help/UGen/lpcSynth.help.lhs +16/−18
- Help/UGen/lpf.help.lhs +0/−3
- Help/UGen/lpz2.help.lhs +0/−3
- Help/UGen/lti.help.lhs +3/−6
- Help/UGen/max.help.lhs +0/−3
- Help/UGen/membraneCircle.help.lhs +0/−3
- Help/UGen/metro.help.lhs +4/−7
- Help/UGen/midEQ.help.lhs +0/−3
- Help/UGen/mix.help.lhs +0/−3
- Help/UGen/mod.help.lhs +1/−4
- Help/UGen/moogFF.help.lhs +0/−3
- Help/UGen/moogLadder.help.lhs +3/−6
- Help/UGen/moogVCF.help.lhs +0/−3
- Help/UGen/mostChange.help.lhs +1/−4
- Help/UGen/mouseButton.help.lhs +0/−3
- Help/UGen/mouseX.help.lhs +0/−3
- Help/UGen/mouseY.help.lhs +0/−3
- Help/UGen/mrg2.help.lhs +21/−15
- Help/UGen/mul.help.lhs +6/−0
- Help/UGen/mulAdd.help.lhs +24/−3
- Help/UGen/mzPokey.help.lhs +5/−8
- Help/UGen/nRand.help.lhs +0/−3
- Help/UGen/nestedAllpassC.help.lhs +8/−11
- Help/UGen/nhHall.help.lhs +2/−5
- Help/UGen/nodeId.help.lhs +8/−0
- Help/UGen/numAudioBuses.help.lhs +0/−3
- Help/UGen/numBuffers.help.lhs +0/−3
- Help/UGen/numControlBuses.help.lhs +0/−2
- Help/UGen/numInputBuses.help.lhs +0/−2
- Help/UGen/numOutputBuses.help.lhs +0/−2
- Help/UGen/numRunningSynths.help.lhs +0/−3
- Help/UGen/offsetOut.help.lhs +0/−3
- Help/UGen/onsets.help.lhs +0/−3
- Help/UGen/osc.help.lhs +0/−3
- Help/UGen/osc1.help.lhs +16/−7
- Help/UGen/oteyPianoStrings.help.lhs +13/−0
- Help/UGen/oteySoundBoard.help.lhs +13/−0
- Help/UGen/out.help.lhs +0/−3
- Help/UGen/packFFT.help.lhs +17/−20
- Help/UGen/pan2.help.lhs +0/−3
- Help/UGen/panAz.help.lhs +0/−3
- Help/UGen/partConv.help.lhs +0/−3
- Help/UGen/pause.help.lhs +1/−4
- Help/UGen/pauseSelf.help.lhs +0/−3
- Help/UGen/pauseSelfWhenDone.help.lhs +4/−5
- Help/UGen/peak.help.lhs +1/−4
- Help/UGen/perlin3.help.lhs +2/−5
- Help/UGen/phasor.help.lhs +5/−9
- Help/UGen/pinkNoise.help.lhs +0/−3
- Help/UGen/pitch.help.lhs +9/−6
- Help/UGen/pitchShift.help.lhs +0/−3
- Help/UGen/playBuf.help.lhs +16/−15
- Help/UGen/playBufCF.help.lhs +0/−2
- Help/UGen/pluck.help.lhs +2/−4
- Help/UGen/pmOsc.help.lhs +1/−2
- Help/UGen/poll.help.lhs +8/−3
- Help/UGen/pow.help.lhs +5/−4
- Help/UGen/pulse.help.lhs +0/−3
- Help/UGen/pulseDPW.help.lhs +3/−5
- Help/UGen/pulseDivider.help.lhs +0/−3
- Help/UGen/pv_BinDelay.help.lhs +0/−3
- Help/UGen/pv_Compander.help.lhs +0/−3
- Help/UGen/pv_Copy.help.lhs +0/−3
- Help/UGen/pv_Diffuser.help.lhs +6/−5
- Help/UGen/pv_Freeze.help.lhs +2/−2
- Help/UGen/pv_MagFreeze.help.lhs +1/−1
- Help/UGen/pv_RandWipe.help.lhs +1/−1
- Help/UGen/pv_SpectralMap.help.lhs +4/−3
- Help/UGen/pvcollect.help.lhs +43/−41
- Help/UGen/qitch.help.lhs +23/−16
- Help/UGen/quadN.help.lhs +1/−4
- Help/UGen/rMEQ.help.lhs +17/−0
- Help/UGen/rMShelf.help.lhs +23/−0
- Help/UGen/radiansPerSample.help.lhs +0/−3
- Help/UGen/ramp.help.lhs +0/−3
- Help/UGen/rand.help.lhs +0/−3
- Help/UGen/randID.help.lhs +0/−2
- Help/UGen/randSeed.help.lhs +0/−3
- Help/UGen/recordBuf.help.lhs +0/−3
- Help/UGen/redPhasor.help.lhs +7/−10
- Help/UGen/replaceOut.help.lhs +11/−14
- Help/UGen/resonz.help.lhs +22/−3
- Help/UGen/rhpf.help.lhs +0/−3
- Help/UGen/ringz.help.lhs +0/−3
- Help/UGen/rlpf.help.lhs +0/−3
- Help/UGen/rlpfD.help.lhs +7/−0
- Help/UGen/rlpfd.help.lhs +7/−0
- Help/UGen/rotate2.help.lhs +0/−3
- Help/UGen/roundUp.help.lhs +2/−5
- Help/UGen/runningMax.help.lhs +1/−4
- Help/UGen/runningMin.help.lhs +1/−4
- Help/UGen/runningSum.help.lhs +0/−3
- Help/UGen/sampleDur.help.lhs +0/−3
- Help/UGen/sampleRate.help.lhs +0/−3
- Help/UGen/saw.help.lhs +0/−3
- Help/UGen/sawDPW.help.lhs +3/−6
- Help/UGen/scaleNeg.help.lhs +1/−4
- Help/UGen/schmidt.help.lhs +0/−3
- Help/UGen/select.help.lhs +5/−3
- Help/UGen/selectX.help.lhs +3/−4
- Help/UGen/sendReply.help.lhs +0/−3
- Help/UGen/sendTrig.help.lhs +0/−3
- Help/UGen/shaper.help.lhs +0/−3
- Help/UGen/silent.help.lhs +2/−6
- Help/UGen/sinOsc.help.lhs +13/−4
- Help/UGen/sinOscFB.help.lhs +0/−3
- Help/UGen/sineShaper.help.lhs +3/−6
- Help/UGen/slew.help.lhs +0/−3
- Help/UGen/slope.help.lhs +0/−3
- Help/UGen/sms.help.lhs +3/−6
- Help/UGen/softClip.help.lhs +0/−3
- Help/UGen/softClipAmp.help.lhs +0/−3
- Help/UGen/sos.help.lhs +20/−8
- Help/UGen/soundIn.help.lhs +0/−2
- Help/UGen/specCentroid.help.lhs +0/−3
- Help/UGen/specFlatness.help.lhs +0/−3
- Help/UGen/splay.help.lhs +6/−7
- Help/UGen/spreader.help.lhs +18/−0
- Help/UGen/squiz.help.lhs +3/−5
- Help/UGen/standard2DL.help.lhs +0/−2
- Help/UGen/standardL.help.lhs +2/−2
- Help/UGen/stepper.help.lhs +48/−38
- Help/UGen/stkBandedWG.help.lhs +32/−0
- Help/UGen/stkBowed.help.lhs +17/−17
- Help/UGen/stkFlute.help.lhs +16/−16
- Help/UGen/stkMandolin.help.lhs +20/−16
- Help/UGen/stkModalBar.help.lhs +25/−19
- Help/UGen/stkMoog.help.lhs +40/−0
- Help/UGen/stkPluck.help.lhs +11/−0
- Help/UGen/stkShakers.help.lhs +11/−11
- Help/UGen/streson.help.lhs +3/−6
- Help/UGen/sub.help.lhs +14/−0
- Help/UGen/subsampleOffset.help.lhs +0/−3
- Help/UGen/sum3.help.lhs +2/−3
- Help/UGen/sum4.help.lhs +0/−3
- Help/UGen/sumSqr.help.lhs +0/−3
- Help/UGen/svf.help.lhs +5/−8
- Help/UGen/sweep.help.lhs +2/−5
- Help/UGen/switchDelay.help.lhs +4/−7
- Help/UGen/syncSaw.help.lhs +0/−3
- Help/UGen/t2a.help.lhs +0/−3
- Help/UGen/t2k.help.lhs +0/−3
- Help/UGen/tBetaRand.help.lhs +5/−8
- Help/UGen/tBrownRand.help.lhs +5/−8
- Help/UGen/tChoose.help.lhs +0/−3
- Help/UGen/tDelay.help.lhs +0/−3
- Help/UGen/tDuty.help.lhs +0/−3
- Help/UGen/tExpRand.help.lhs +4/−3
- Help/UGen/tGaussRand.help.lhs +2/−5
- Help/UGen/tGrains.help.lhs +0/−3
- Help/UGen/tRand.help.lhs +0/−3
- Help/UGen/tWindex.help.lhs +0/−3
- Help/UGen/tanh.help.lhs +0/−3
- Help/UGen/tartini.help.lhs +27/−15
- Help/UGen/thresh.help.lhs +0/−3
- Help/UGen/tiRand.help.lhs +4/−3
- Help/UGen/timer.help.lhs +0/−3
- Help/UGen/toggleFF.help.lhs +0/−3
- Help/UGen/tpv.help.lhs +2/−5
- Help/UGen/trig.help.lhs +0/−3
- Help/UGen/trig1.help.lhs +0/−3
- Help/UGen/twChoose.help.lhs +0/−2
- Help/UGen/twoPole.help.lhs +0/−3
- Help/UGen/twoTube.help.lhs +11/−0
- Help/UGen/twoZero.help.lhs +0/−3
- Help/UGen/vDiskIn.help.lhs +0/−3
- Help/UGen/vOsc.help.lhs +0/−3
- Help/UGen/vOsc3.help.lhs +0/−3
- Help/UGen/varLag.help.lhs +11/−7
- Help/UGen/varSaw.help.lhs +1/−4
- Help/UGen/vibrato.help.lhs +4/−7
- Help/UGen/vosim.help.lhs +6/−9
- Help/UGen/warp1.help.lhs +0/−3
- Help/UGen/waveTerrain.help.lhs +2/−5
- Help/UGen/whiteNoise.help.lhs +11/−9
- Help/UGen/wrapIndex.help.lhs +0/−3
- Help/UGen/wt_FilterScale.help.lhs +0/−3
- Help/UGen/wt_TimeWipe.help.lhs +0/−3
- Help/UGen/xFade2.help.lhs +0/−3
- Help/UGen/xLine.help.lhs +0/−3
- Help/UGen/xOut.help.lhs +3/−4
- Help/UGen/zeroCrossing.help.lhs +0/−3
- Help/UGen/zitaRev.help.lhs +6/−6
- README +40/−21
- Sound/SC3/Common.hs +3/−0
- Sound/SC3/Common/Base.hs +29/−3
- Sound/SC3/Common/Buffer.hs +4/−7
- Sound/SC3/Common/Buffer/Gen.hs +0/−2
- Sound/SC3/Common/Enum.hs +122/−0
- Sound/SC3/Common/Envelope.hs +4/−0
- Sound/SC3/Common/Math.hs +94/−35
- Sound/SC3/Common/Math/Noise.hs +47/−0
- Sound/SC3/Common/Math/Operator.hs +490/−0
- Sound/SC3/Common/Rate.hs +60/−0
- Sound/SC3/Common/UId.hs +6/−1
- Sound/SC3/Server.hs +1/−0
- Sound/SC3/Server/Command/Generic.hs +70/−43
- Sound/SC3/Server/Command/Plain.hs +8/−4
- Sound/SC3/Server/Graphdef.hs +26/−5
- Sound/SC3/Server/Graphdef/Graph.hs +1/−1
- Sound/SC3/Server/Graphdef/Read.hs +15/−2
- Sound/SC3/Server/Help.hs +0/−35
- Sound/SC3/Server/NRT.hs +14/−1
- Sound/SC3/Server/NRT/UGen.hs +33/−0
- Sound/SC3/Server/Options.hs +94/−0
- Sound/SC3/Server/Param.hs +67/−0
- Sound/SC3/Server/Recorder.hs +2/−1
- Sound/SC3/Server/Status.hs +18/−5
- Sound/SC3/Server/Synthdef.hs +16/−10
- Sound/SC3/Server/Transport/FD.hs +11/−3
- Sound/SC3/Server/Transport/Monad.hs +46/−16
- Sound/SC3/UGen.hs +1/−3
- Sound/SC3/UGen/Bindings/Composite.hs +43/−50
- Sound/SC3/UGen/Bindings/Composite/External.hs +19/−0
- Sound/SC3/UGen/Bindings/DB.hs +86/−110
- Sound/SC3/UGen/Bindings/DB/External.hs +9/−3
- Sound/SC3/UGen/Bindings/HW.hs +8/−8
- Sound/SC3/UGen/Bindings/HW/Construct.hs +1/−1
- Sound/SC3/UGen/Bindings/HW/External/F0.hs +5/−5
- Sound/SC3/UGen/Bindings/HW/External/SC3_Plugins.hs +6/−4
- Sound/SC3/UGen/Bindings/HW/External/Wavelets.hs +1/−1
- Sound/SC3/UGen/Bindings/HW/External/Zita.hs +1/−1
- Sound/SC3/UGen/Bindings/Monad.hs +77/−57
- Sound/SC3/UGen/Enum.hs +4/−73
- Sound/SC3/UGen/Envelope.hs +12/−8
- Sound/SC3/UGen/Graph.hs +1/−1
- Sound/SC3/UGen/Graph/Reconstruct.hs +3/−3
- Sound/SC3/UGen/Graph/Transform.hs +1/−1
- Sound/SC3/UGen/Help.hs +0/−109
- Sound/SC3/UGen/Help/Graph.hs +2/−2
- Sound/SC3/UGen/Math.hs +6/−330
- Sound/SC3/UGen/Math/Composite.hs +2/−2
- Sound/SC3/UGen/Name.hs +29/−23
- Sound/SC3/UGen/Operator.hs +0/−211
- Sound/SC3/UGen/Optimise.hs +4/−15
- Sound/SC3/UGen/PP.hs +3/−2
- Sound/SC3/UGen/Plain.hs +2/−2
- Sound/SC3/UGen/Protect.hs +0/−58
- Sound/SC3/UGen/Rate.hs +0/−70
- Sound/SC3/UGen/Type.hs +171/−38
- Sound/SC3/UGen/UGen.hs +14/−15
- emacs/hsc3.el +23/−148
- hsc3.cabal +14/−10
Help/Server/b_alloc.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/b_alloc"+ Sound.SC3.Lang.Help.viewServerHelp "/b_alloc" Buffer indices are not restricted by the number of available buffers at the server. Below allocates a buffer at index 2 ^ 15. Note the
Help/Server/b_allocRead.help.lhs view
@@ -1,13 +1,14 @@- Sound.SC3.Server.Help.viewServerHelp "/b_allocRead"+ Sound.SC3.Lang.Help.viewServerHelp "/b_allocRead" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -} Read a large audio file into a buffer. -> fn = "/home/rohan/data/audio/xenakis/jonchaies.wav"+> f_00 = "/home/rohan/data/audio/xenakis/jonchaies.wav"+> m_00 = b_allocRead 0 f_00 0 0 - withSC3 (async (b_allocRead 0 fn 0 0))+ withSC3 (async m_00) Audio data is loaded in IEEE 32-bit form, so in-memory storage can be greater than on-disk storage.@@ -25,20 +26,20 @@ Query buffer. -> q0 :: Connection UDP ()-> q0 = do-> sendMessage (b_query [0])-> r <- waitReply "/b_info"-> liftIO (print r)+> q_00 :: Connection UDP ()+> q_00 = do+> sendMessage (b_query [0])+> r <- waitReply "/b_info"+> liftIO (print r) - withSC3 q0+ withSC3 q_00 Play buffer. -> g0 =-> let n = 257-> s = bufRateScale KR n-> in playBuf 1 AR n s 1 0 NoLoop RemoveSynth+> g_00 =+> let bufnum = 257+> s = bufRateScale KR bufnum+> in playBuf 1 AR bufnum s 1 0 NoLoop RemoveSynth Re-read file into buffer with the same identifier. The existing buffer is freed but not before further memory is allocated,
Help/Server/b_allocReadChannel.help.lhs view
@@ -1,29 +1,33 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_allocReadChannel"+ Sound.SC3.Lang.Help.viewServerHelp "/b_allocReadChannel" -> import Sound.SC3+> import Data.List {- base -}+> import Data.List.Split {- split -}+> import Sound.SC3 {- hsc3 -} -Read an audio file with many channels (here 2000)+Read an audio file with many channels (here 1024) -> let fn = "/home/rohan/sw/hsc3-sf/au/mc-12-2000.au"+> fn_00 = "/home/rohan/sw/hsc3-sf/data/au/mc-10-1024.au" -> withSC3 (async (b_allocRead 0 fn 0 0))+> m_00 = b_allocRead 0 fn_00 0 0 + > withSC3 (async_ m_00)+ Query buffer -> withSC3 (b_query1_unpack 0)+ > withSC3 (b_query1_unpack 0) Read only specified channels -> withSC3 (async (b_allocReadChannel 0 fn 0 0 [0..1023]))+> m_01 = b_allocReadChannel 0 fn_00 0 0 [0 .. 7] + > withSC3 (async_ m_01)+ Query buffer -> withSC3 (b_query1_unpack 0)+ > withSC3 (b_query1_unpack 0) Examine buffer -> import Data.List {- base -}-> import Data.List.Split {- split -}-> let (nf,nc) = (12,1024)-> d <- withSC3 (b_getn1_data_segment 128 0 (0,nf * nc))-> (putStrLn . unlines . transpose . chunksOf nc . map (\n -> if n > 0 then '1' else '0')) d+ > let (nf,nc) = (10,8)+ > d <- withSC3 (b_getn1_data_segment 128 0 (0,nf * nc))+ > (putStrLn . unlines . transpose . chunksOf nc . map (\n -> if n > 0 then '1' else '0')) d
Help/Server/b_close.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_close"+ Sound.SC3.Lang.Help.viewServerHelp "/b_close"
Help/Server/b_fill.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_fill"+ Sound.SC3.Lang.Help.viewServerHelp "/b_fill"
Help/Server/b_free.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/b_free"+ Sound.SC3.Lang.Help.viewServerHelp "/b_free" > import Sound.SC3 {- hsc3 -}
Help/Server/b_gen.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_gen"+ Sound.SC3.Lang.Help.viewServerHelp "/b_gen"
Help/Server/b_get.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_get"+ Sound.SC3.Lang.Help.viewServerHelp "/b_get"
Help/Server/b_getn.help.lhs view
@@ -1,4 +1,4 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_getn"+ Sound.SC3.Lang.Help.viewServerHelp "/b_getn" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}@@ -6,27 +6,40 @@ Allocate and generate wavetable buffer (256 frames) -> withSC3 (do {_ <- async (b_alloc 0 256 1)-> ;let f = [Normalise,Clear]-> in send (b_gen_sine1 0 f [1,1/2,1/3,1/4,1/5])})+> x_00 :: DuplexOSC m => m ()+> x_00 = do+> async_ (b_alloc 0 256 1)+> let f = [Normalise,Clear]+> sendMessage (b_gen_sine1 0 f [1,1/2,1/3,1/4,1/5]) + > withSC3 x_00+ Run simple read... -> d0 <- withSC3 (b_getn1_data 0 (0,255))+ > d0 <- withSC3 (b_getn1_data 0 (0,255)) and draw buffer -> plotTable [d0]+ > plotTable [d0] Load sound file -> let fn = "/home/rohan/data/audio/pf-c5.aif"-> in withSC3 (async (b_allocRead 1 fn 0 0))+> fn_00 = "/tmp/dx7.wav" -Run segmented read (2^15 frames in 1024 frame segments)...+> m_00 = b_allocRead 1 fn_00 0 0 -> d1 <- withSC3 (b_getn1_data_segment 1024 1 (0,2^15))+ > withSC3 (async_ m_00) +Run segmented read (n-frames of data in m-frame segments)...++> x_01 :: DuplexOSC m => m [Double]+> x_01 = do+> let m = 155+> n = m * 3+> b_getn1_data_segment m 1 (0,n)++ > d1 <- withSC3 x_01+ and draw buffer -> plotTable [d1]+ > plotImpulses [d1]
Help/Server/b_query.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/b_query"+ Sound.SC3.Lang.Help.viewServerHelp "/b_query" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/b_read.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_read"+ Sound.SC3.Lang.Help.viewServerHelp "/b_read"
Help/Server/b_readChannel.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_readChannel"+ Sound.SC3.Lang.Help.viewServerHelp "/b_readChannel"
Help/Server/b_set.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_set"+ Sound.SC3.Lang.Help.viewServerHelp "/b_set"
Help/Server/b_setn.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_setn"+ Sound.SC3.Lang.Help.viewServerHelp "/b_setn"
Help/Server/b_write.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_write"+ Sound.SC3.Lang.Help.viewServerHelp "/b_write"
Help/Server/b_zero.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/b_zero"+ Sound.SC3.Lang.Help.viewServerHelp "/b_zero"
Help/Server/c_fill.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/c_fill"+ Sound.SC3.Lang.Help.viewServerHelp "/c_fill"
Help/Server/c_get.help.lhs view
@@ -1,10 +1,14 @@-> Sound.SC3.Server.Help.viewServerHelp "/c_get"+ Sound.SC3.Lang.Help.viewServerHelp "/c_get" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -} -> audition (out 0 (tRand 'α' 220 2200 (dust 'β' KR 1)))+> g_01 = out 0 (tRand 'α' 220 2200 (dust 'β' KR 1)) -> withSC3 (do {send (c_get [0])-> ;r <- waitReply "/c_set"-> ;liftIO (print r)})+> x_01 :: Transport m => m ()+> x_01 = do+> sendMessage (c_get [0])+> r <- waitReply "/c_set"+> liftIO (print r)++ > withSC3 x_01
Help/Server/c_getn.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/c_getn"+ Sound.SC3.Lang.Help.viewServerHelp "/c_getn" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/c_set.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/c_set"+ Sound.SC3.Lang.Help.viewServerHelp "/c_set"
Help/Server/c_setn.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/c_setn"+ Sound.SC3.Lang.Help.viewServerHelp "/c_setn"
Help/Server/clearSched.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/clearSched"+ Sound.SC3.Lang.Help.viewServerHelp "/clearSched"
Help/Server/d_free.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/d_free"+ Sound.SC3.Lang.Help.viewServerHelp "/d_free"
Help/Server/d_load.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/d_load"+ Sound.SC3.Lang.Help.viewServerHelp "/d_load"
Help/Server/d_loadDir.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/d_loadDir"+ Sound.SC3.Lang.Help.viewServerHelp "/d_loadDir"
Help/Server/d_recv.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/d_recv"+ Sound.SC3.Lang.Help.viewServerHelp "/d_recv"
Help/Server/dumpOSC.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/dumpOSC"+ Sound.SC3.Lang.Help.viewServerHelp "/dumpOSC" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/g_deepFree.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/g_deepFree"+ Sound.SC3.Lang.Help.viewServerHelp "/g_deepFree"
Help/Server/g_freeAll.help.lhs view
@@ -1,4 +1,4 @@- > Sound.SC3.Server.Help.viewServerHelp "/g_freeAll"+ Sound.SC3.Lang.Help.viewServerHelp "/g_freeAll" > import Sound.OSC > import Sound.SC3
Help/Server/g_head.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/g_head"+ Sound.SC3.Lang.Help.viewServerHelp "/g_head"
Help/Server/g_new.help.lhs view
@@ -1,10 +1,12 @@-> Sound.SC3.Server.Help.viewServerHelp "/g_new"+ Sound.SC3.Lang.Help.viewServerHelp "/g_new" The root node of the synthesiser tree is a group with ID zero. By convention there is a group with ID one at the root group, but this is only a convention. We need to make the group. -> import Sound.SC3+> import Sound.SC3 {- hsc3 -} -> withSC3 (send (g_new [(1,AddToTail,0)]))+> m_01 = g_new [(1,AddToTail,0)]++ > withSC3 (send m_00)
Help/Server/g_queryTree.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/g_queryTree"+ Sound.SC3.Lang.Help.viewServerHelp "/g_queryTree" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/g_tail.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/g_tail"+ Sound.SC3.Lang.Help.viewServerHelp "/g_tail"
Help/Server/n_after.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_after"+ Sound.SC3.Lang.Help.viewServerHelp "/n_after"
Help/Server/n_before.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_before"+ Sound.SC3.Lang.Help.viewServerHelp "/n_before"
Help/Server/n_fill.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_fill"+ Sound.SC3.Lang.Help.viewServerHelp "/n_fill"
Help/Server/n_free.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_free"+ Sound.SC3.Lang.Help.viewServerHelp "/n_free"
Help/Server/n_map.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_map"+ Sound.SC3.Lang.Help.viewServerHelp "/n_map"
Help/Server/n_mapn.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/n_mapn"+ Sound.SC3.Lang.Help.viewServerHelp "/n_mapn" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/n_query.help.lhs view
@@ -1,14 +1,21 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_query"+ Sound.SC3.Lang.Help.viewServerHelp "/n_query" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -} -> let d = let {f = control KR "freq" 440-> ;o = saw AR f * 0.1}-> in synthdef "saw" (out 0 o)+> d_00 =+> let f = control KR "freq" 440+> o = saw AR f * 0.1+> in synthdef "saw" (out 0 o) -> withSC3 (async (d_recv d) >> send (s_new0 "saw" 1000 AddToTail 1))+> m_00 = s_new0 "saw" 1000 AddToTail 1 -> r <- withSC3 (withNotifications (send (n_query [1000]) >> waitReply "/n_info"))+ > withSC3 (async_ (d_recv d_00) >> sendMessage m_00) -> print r+> x_01 :: Transport m => m Message+> x_01 = withNotifications $ do+> sendMessage (n_query [1000])+> waitReply "/n_info"++ > r <- withSC3 x_01+ > print r
Help/Server/n_run.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_run"+ Sound.SC3.Lang.Help.viewServerHelp "/n_run"
Help/Server/n_set.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/n_set"+ Sound.SC3.Lang.Help.viewServerHelp "/n_set"
Help/Server/n_setn.help.lhs view
@@ -1,1 +1,5 @@- Sound.SC3.Server.Help.viewServerHelp "/n_setn"+ Sound.SC3.Lang.Help.viewServerHelp "/n_setn"++At some point /n_setn was broken at scsynth, it no longer behaves as specified.++/n_setn only works correctly with <int> indices, and not when the index is given as a <string>.
Help/Server/n_trace.help.lhs view
@@ -1,4 +1,4 @@- > Sound.SC3.Server.Help.viewServerHelp "/n_trace"+ Sound.SC3.Lang.Help.viewServerHelp "/n_trace" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/notify.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/notify"+ Sound.SC3.Lang.Help.viewServerHelp "/notify" > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/Server/quit.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/quit"+ Sound.SC3.Lang.Help.viewServerHelp "/quit"
Help/Server/s_get.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/s_get"+ Sound.SC3.Lang.Help.viewServerHelp "/s_get"
Help/Server/s_getn.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/s_getn"+ Sound.SC3.Lang.Help.viewServerHelp "/s_getn"
Help/Server/s_new.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/s_new"+ Sound.SC3.Lang.Help.viewServerHelp "/s_new"
Help/Server/s_noid.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/s_noid"+ Sound.SC3.Lang.Help.viewServerHelp "/s_noid"
Help/Server/status.help.lhs view
@@ -1,4 +1,4 @@- Sound.SC3.Server.Help.viewServerHelp "/status"+ Sound.SC3.Lang.Help.viewServerHelp "/status" > import Sound.SC3 {- hsc3 -}
Help/Server/sync.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/sync"+ Sound.SC3.Lang.Help.viewServerHelp "/sync"
Help/Server/tr.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/tr"+ Sound.SC3.Lang.Help.viewServerHelp "/tr"
Help/Server/u_cmd.help.lhs view
@@ -1,1 +1,1 @@-> Sound.SC3.Server.Help.viewServerHelp "/u_cmd"+ Sound.SC3.Lang.Help.viewServerHelp "/u_cmd"
Help/UGen/abs.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.abs"- > :t abs- > import Sound.SC3 {- hsc3 -} > g_01 = abs (syncSaw AR 100 440 * 0.1)
Help/UGen/absDif.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.absdif"- > :t absDif- > import Sound.SC3 {- hsc3 -} Finding the magnitude of the difference of two values is a common operation.
Help/UGen/add.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.+"- > :t (+)- > import Sound.SC3 {- hsc3 -} > g_01 =@@ -11,3 +8,9 @@ DC offset. > g_02 = fSinOsc AR 440 0 * 0.1 + 0.5++Optimises identity++> g_03 = (sinOsc AR 440 0 + 0) * 0.1++> g_04 = (0 + sinOsc AR 440 0) * 0.1
Help/UGen/allpassN.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "AllpassN"- > Sound.SC3.UGen.DB.ugenSummary "AllpassN"- > import Sound.SC3 {- hsc3 -} Since the allpass delay has no audible effect as a resonator on steady@@ -42,3 +39,12 @@ > d = dust 'ζ' AR 1 > src = decay (d * 0.5) 0.2 * n > in allpassN src 0.2 0.2 3++Phasing++> g_06 =+> let i = soundIn (mce2 0 1) -- two channels of input signal+> f = mouseX KR 0.1 1.0 Linear 0.2 -- phaser freq+> e = allpassN i 0.02 (sinOsc KR f 0 * 0.01 + 0.01) 1 -- max delay of 20msec+> in i + e -- sum phase-shifted signal to original signal+
Help/UGen/amClip.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.amclip"- > :t amClip- > import Sound.SC3 {- hsc3 -} > g_01 = amClip (whiteNoise 'α' AR) (fSinOsc KR 1 0 * 0.2)
Help/UGen/ampComp.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "AmpComp"- > Sound.SC3.UGen.DB.ugenSummary "AmpComp"- > import Sound.SC3 {- hsc3 -} mouse X axis frequency control
+ Help/UGen/ampDb.help.lhs view
@@ -0,0 +1,10 @@+> import Sound.SC3 {- hsc3 -}++ > let amp = map (2 **) [0 .. 15]+ > let db = [0,-6 .. -90]+ > map (round . ampDb . (/) 1) amp == db+ > map (round . amp_to_db . (/) 1) amp == db+ > zip amp db++ > db_to_amp (-3) == 0.7079457843841379+ > amp_to_db 0.7079457843841379 == -3
Help/UGen/amplitude.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Amplitude"- > Sound.SC3.UGen.DB.ugenSummary "Amplitude"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/atan2.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.atan2"- > :t atan2- > import Sound.SC3 {- hsc3 -} Add a pan to the hypot doppler examples by using atan2 to find the
Help/UGen/atari2600.help.lhs view
@@ -1,35 +1,33 @@- Sound.SC3.UGen.Help.viewSC3Help "Atari2600"- Sound.SC3.UGen.DB.ugenSummary "Atari2600"- > import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.HW.External.F0 as X {- hsc3 -}+ > import Sound.SC3.Lang.Pattern {- hsc3-lang -}-> import Sound.SC3.UGen.Bindings.HW.External.F0 {- hsc3 -} -> gr_00 = atari2600 1 2 3 4 5 5 1+> gr_00 = X.atari2600 1 2 3 4 5 5 1 -> gr_01 = atari2600 2 3 10 10 5 5 1+> gr_01 = X.atari2600 2 3 10 10 5 5 1 > gr_02 = > let x = mouseX KR 0 15 Linear 0.1 > y = mouseY KR 0 15 Linear 0.1-> in atari2600 x y 10 10 5 5 1+> in X.atari2600 x y 10 10 5 5 1 > gr_03 = > let x = mouseX KR 0 31 Linear 0.1 > y = mouseY KR 0 31 Linear 0.1-> in atari2600 2 3 x y 5 5 1+> in X.atari2600 2 3 x y 5 5 1 > gr_04 = > let x = mouseX KR 0 15 Linear 0.1 > y = mouseY KR 0 15 Linear 0.1-> in atari2600 2 3 10 10 x y 1+> in X.atari2600 2 3 10 10 x y 1 > gr_05 = > let x = mouseX KR 0 15 Linear 0.1 > o1 = sinOsc KR 0.35 0 * 7.5 + 7.5 > y = mouseY KR 0 31 Linear 0.1 > o2 = sinOsc KR 0.3 0 * 5.5 + 5.5-> in atari2600 x o1 10 y o2 5 1+> in X.atari2600 x o1 10 y o2 5 1 > ati_syn = > let gate' = control KR "gate" 1@@ -42,7 +40,7 @@ > pan = control KR "pan" 0 > e = envASR 0.01 amp 0.05 (EnvNum (-4)) > eg = envGen KR gate' 1 0 1 RemoveSynth e-> z = atari2600 tone0 tone1 freq0 freq1 15 15 rate+> z = X.atari2600 tone0 tone1 freq0 freq1 15 15 rate > o = out 0 (pan2 (z * eg) pan 1) > in synthdef "atari2600" o
Help/UGen/atsNoiSynth.help.lhs view
@@ -1,37 +1,43 @@- Sound.SC3.UGen.Help.viewSC3Help "AtsNoiSynth"- Sound.SC3.UGen.DB.ugenSummary "AtsNoiSynth"- > import System.IO.Unsafe {- base -} > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}-> import Sound.SC3.Data.ATS {- hsc3-data -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> ats_fn_0 = "/home/rohan/data/audio/pf-c5.4.ats"-> ats_fn_1 = "/home/rohan/cvs/tn/tn-56/ats/metal.ats"+> import qualified Sound.SC3.Data.ATS as ATS {- hsc3-data -} +> ats_fn_0 = "/home/rohan/sw/hsc3-data/data/ats/pf-c5.4.ats"+> ats_fn_1 = "/home/rohan/sw/hsc3-data/data/ats/metal.ats"+ load ATS file at scsynth - > ats_load_sc3 0 ats_fn_0+ > ATS.ats_load_sc3 0 ats_fn_0 -- ats_fn_1 > withSC3 (b_query1_unpack 0) read ATS header -> ats_hdr_0 = unsafePerformIO (fmap ats_header (ats_read ats_fn_0))-> ats_hdr_1 = unsafePerformIO (fmap ats_header (ats_read ats_fn_1))+> ats_hdr_0 = unsafePerformIO (fmap ATS.ats_header (ATS.ats_read ats_fn_0))+> ats_hdr_1 = unsafePerformIO (fmap ATS.ats_header (ATS.ats_read ats_fn_1)) - > putStrLn $ ats_header_pp ats_hdr_0- > putStrLn $ ats_header_pp ats_hdr_1+ > putStrLn $ ATS.ats_header_pp ats_hdr_0+ > putStrLn $ ATS.ats_header_pp ats_hdr_1 -run re-synthesis+run re-synthesis, sine & noise levels are at X and Y mouse controls > g_01 =-> let np = constant (ats_n_partials ats_hdr_0)-> ptr = lfSaw KR (constant (1 / ats_analysis_duration ats_hdr_0)) 1 * 0.5 + 0.5-> in atsNoiSynth AR 0 np 0 1 ptr 1 0.1 1 0 25 0 1+> let numPartials = constant (ATS.ats_n_partials ats_hdr_0)+> dur = constant (ATS.ats_analysis_duration ats_hdr_0)+> filePointer = lfSaw KR (1 / dur) 1 * 0.5 + 0.5+> sinePct = mouseX KR 0 1 Linear 0.2+> noisePct = mouseY KR 0 1 Linear 0.2+> in X.atsNoiSynth AR 0 numPartials 0 1 filePointer sinePct noisePct 1 0 25 0 1 -> g_02 =-> let x = mouseX KR 0.0 1.0 Linear 0.2-> y = mouseY KR 0.0 1.0 Linear 0.2-> np = constant (ats_n_partials ats_hdr_0)-> in atsNoiSynth AR 0 np 0 1 x (1 - y) y 1 0 25 0 1+run re-synthesis, filePointer is at X-axis, sine & noise levels are both at Y +> f_02 numBands bandStart bandSkip =+> let numPartials = constant (ATS.ats_n_partials ats_hdr_0)+> filePointer = mouseX KR 0.0 1.0 Linear 0.2+> noisePct = mouseY KR 0.0 1.0 Linear 0.2+> in X.atsNoiSynth AR 0 numPartials 0 1 filePointer (1 - noisePct) noisePct 1 0 25 0 1++> g_02 = f_02 25 0 1+> g_03 = f_02 25 1 2+> g_04 = f_02 12 12 1
Help/UGen/atsSynth.help.lhs view
@@ -1,30 +1,46 @@- Sound.SC3.UGen.Help.viewSC3Help "AtsSynth"- Sound.SC3.UGen.DB.ugenSummary "AtsSynth"- > import System.IO.Unsafe {- base -} > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}-> import Sound.SC3.Data.ATS {- hsc3-data -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}+> import qualified Sound.SC3.Data.ATS as ATS {- hsc3-data -} -> ats_fn_0 = "/home/rohan/data/audio/pf-c5.4.ats"-> ats_fn_1 = "/home/rohan/cvs/tn/tn-56/ats/metal.ats"+> ats_fn_0 = "/home/rohan/sw/hsc3-data/data/ats/pf-c5.4.ats"+> ats_fn_1 = "/home/rohan/sw/hsc3-data/data/ats/metal.ats" - > ats_load_sc3 0 ats_fn+load ATS file at scsynth++ > ATS.ats_load_sc3 0 ats_fn_0 > withSC3 (b_query1_unpack 0) -read file+read ATS header -> ats_hdr_0 = unsafePerformIO (fmap ats_header (ats_read ats_fn_0))-> ats_hdr_1 = unsafePerformIO (fmap ats_header (ats_read ats_fn_1))+> ats_hdr_0 = unsafePerformIO (fmap ATS.ats_header (ATS.ats_read ats_fn_0))+> ats_hdr_1 = unsafePerformIO (fmap ATS.ats_header (ATS.ats_read ats_fn_1)) -show header+ > putStrLn $ ATS.ats_header_pp ats_hdr_0+ > putStrLn $ ATS.ats_header_pp ats_hdr_1 - > putStrLn $ ats_header_pp ats_hdr_0+simple re-synthesiser, ATS data is at buffer 0, X is file pointer, Y is freq multiplier -simple re-synthesiser, ATS data is at buffer 0+> g_00 =+> let numPartials = constant (ATS.ats_n_partials ats_hdr_0)+> filePointer = mouseX KR 0.0 1.0 Linear 0.2+> freqMul = mouseY KR 0.75 1.25 Linear 0.2+> in X.atsSynth AR 0 numPartials 0 1 filePointer freqMul 0 +> f_01 numPartials partialStart partialSkip freqMul freqAdd =+> let dur = constant (ATS.ats_analysis_duration ats_hdr_0)+> filePointer = lfSaw KR (1 / dur) 1 * 0.5 + 0.5+> in X.atsSynth AR 0 numPartials partialStart partialSkip filePointer freqMul freqAdd++resynthesize only the top half of the partials+ > g_01 =-> let x = mouseX KR 0.0 1.0 Linear 0.2-> y = mouseY KR 0.75 1.25 Linear 0.2-> np = constant (ats_n_partials ats_hdr_0)-> in atsSynth AR 0 np 0 1 x y 0+> let np = constant (ATS.ats_n_partials ats_hdr_0)+> in f_01 (np / 2) (np / 2) 3 1 0++> f_02 = f_01 (constant (ATS.ats_n_partials ats_hdr_0))++> g_02 = f_02 0 1 1 0 -- default+> g_03 = f_02 0 1 1.5 0 -- multiply frequencies by 1.5+> g_04 = f_02 0 1 1 100 -- add 100 to all frequencies+> g_05 = f_02 0 3 1 0 -- resynthesize every third partial only (partial skip)
Help/UGen/audioMSG.help.lhs view
@@ -1,10 +1,7 @@- Sound.SC3.UGen.Help.viewSC3Help "AudioMSG"- Sound.SC3.UGen.DB.ugenSummary "AudioMSG"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = audioMSG AR (sinOsc AR 220 0 * 0.1) (mouseX KR 0 (2 * pi) Linear 0.2)+> g_01 = X.audioMSG AR (sinOsc AR 220 0 * 0.1) (mouseX KR 0 (2 * pi) Linear 0.2) -> g_02 = audioMSG AR (soundIn 0) (mouseX KR 0 (2 * pi) Linear 0.2)+> g_02 = X.audioMSG AR (soundIn 0) (mouseX KR 0 (2 * pi) Linear 0.2)
Help/UGen/ay.help.lhs view
@@ -1,11 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "AY"- Sound.SC3.UGen.DB.ugenSummary "AY"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = ay 1777 1666 1555 1 7 15 15 15 4 1 0+default parameters +> g_01 = X.ay 1777 1666 1555 1 7 15 15 15 4 1 0+ > g_02 = > let tonea = mouseY KR 10 3900 Exponential 0.2 > toneb = mouseX KR 10 3900 Exponential 0.2@@ -13,7 +12,7 @@ > vola = 14 > volb = 14 > volc = 0-> s = ay tonea toneb 1555 1 ctl vola volb volc 4 1 0+> s = X.ay tonea toneb 1555 1 ctl vola volb volc 4 1 0 > in pan2 s 0 0.25 > g_03 =@@ -31,5 +30,5 @@ > volc = mk_ctl 'θ' 0 15 > efreq = mk_ctl 'ι' 0 4095 > estyle = mk_ctl 'κ' 0 15-> s = ay tonea toneb tonec n ctl vola volb volc efreq estyle 0+> s = X.ay tonea toneb tonec n ctl vola volb volc efreq estyle 0 > in pan2 s 0 0.5
Help/UGen/bAllpass.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BAllPass"- > Sound.SC3.UGen.DB.ugenSummary "BAllPass"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/bBandPass.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BBandPass"- Sound.SC3.UGen.DB.ugenSummary "BBandPass"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/bBandStop.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BBandStop"- Sound.SC3.UGen.DB.ugenSummary "BBandStop"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/bHiPass.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BHiPass"- Sound.SC3.UGen.DB.ugenSummary "BHiPass"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/bHiPass4.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BHiPass4"- > :t bHiPass4- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/bHiShelf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BHiShelf"- Sound.SC3.UGen.DB.ugenSummary "BHiShelf"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/bLowPass.help.lhs view
@@ -1,7 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BLowPass"- > Sound.SC3.UGen.DB.ugenSummary "BLowPass"- > :t bLowPassCoef- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -} @@ -25,3 +21,6 @@ > rq = mouseY KR 0.1 1 Linear 0.2 > (a0, a1, a2, b1, b2) = bLowPassCoef sampleRate f rq > in sos i a0 a1 a2 b1 b2++> g_04 = bLowPass (whiteNoise 'α' AR) (xLine KR 24000 20 10 DoNothing) 1+> g_05 = bLowPass (whiteNoise 'α' AR) 1200 (xLine KR 0.5 100 10 DoNothing)
Help/UGen/bLowPass4.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BLowPass4"- > :t bLowPass4- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/bLowShelf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BLowShelf"- Sound.SC3.UGen.DB.ugenSummary "BLowShelf"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/bMoog.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "BMoog"- Sound.SC3.UGen.DB.ugenSummary "BMoog"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > f_01 md = > let dup x = mce2 x x@@ -10,15 +7,12 @@ > o = dup (lfSaw AR (mce2 (x * 0.99) (x * 1.01)) 0 * 0.1) > cf = sinOsc KR (sinOsc KR 0.1 0) (1.5 * pi) * 1550 + 1800 > y = mouseY KR 1 0 Linear 0.2-> sig = bMoog o cf y md 0.95+> sig = X.bMoog o cf y md 0.95 > in (combN sig 0.5 (mce2 0.4 0.35) 2 * 0.4) + (sig * 0.5) modes are: 0 = lowpass, 1 = highpass, 2 = bandpass > g_01 = f_01 0- > g_02 = f_01 1- > g_03 = f_01 2- > g_04 = f_01 (lfSaw KR 1 0 * 3)
Help/UGen/bPeakEQ.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BPeakEQ"- Sound.SC3.UGen.DB.ugenSummary "BPeakEQ"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.Common.Math.Filter.BEQ {- hsc3 -}
Help/UGen/balance2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Balance2"- Sound.SC3.UGen.DB.ugenSummary "Balance2"- > import Sound.SC3 {- hsc3 -} {Balance2.ar(LFSaw.ar(44),Pulse.ar(33),FSinOsc.kr(0.5),0.1)}.play
Help/UGen/beatTrack.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BeatTrack"- Sound.SC3.UGen.DB.ugenSummary "BeatTrack"- > import Sound.SC3 {- hsc3 -} > withSC3 (async (b_alloc 10 1024 1))
Help/UGen/blip.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Blip"- Sound.SC3.UGen.DB.ugenSummary "Blip"- > import Sound.SC3 {- hsc3 -} > g_01 = blip AR 440 200 * 0.1
Help/UGen/blitB3.help.lhs view
@@ -1,10 +1,7 @@- Sound.SC3.UGen.Help.viewSC3Help "BlitB3Square"- Sound.SC3.UGen.DB.ugenSummary "BlitB3Square"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = blitB3 AR (xLine KR 10000 20 10 DoNothing) * 0.2+> g_01 = X.blitB3 AR (xLine KR 10000 20 10 DoNothing) * 0.2 spot the aliasing @@ -14,11 +11,11 @@ > g_03 = > let x = mouseX KR 20 1000 Exponential 0.2-> in leakDC (integrator (blitB3 AR x * 0.2) 0.99) 0.995+> in leakDC (integrator (X.blitB3 AR x * 0.2) 0.99) 0.995 sawtooth; super-saw, can integrate mix leaks dealt with one by one so don't accumulate > g_04 = > let x = mouseX KR 1 4 Linear 0.2-> in mix (leakDC (integrator (blitB3 AR (x * mce [220,221,223,224]) * 0.125) 0.99) 0.995)+> in mix (leakDC (integrator (X.blitB3 AR (x * mce [220,221,223,224]) * 0.125) 0.99) 0.995)
Help/UGen/blitB3Saw.help.lhs view
@@ -1,20 +1,17 @@- Sound.SC3.UGen.Help.viewSC3Help "BlitB3Saw"- Sound.SC3.UGen.DB.ugenSummary "BlitB3Saw"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let f = xLine KR 1000 20 10 DoNothing-> in blitB3Saw AR f 0.99 * 0.1+> in X.blitB3Saw AR f 0.99 * 0.1 aliasing suddenly appears for very high frequencies > g_02 = > let f = mouseX KR 10 10000 Exponential 0.2 > c = mouseY KR 0.01 0.99 Linear 0.2-> in blitB3Saw AR f c * 0.1+> in X.blitB3Saw AR f c * 0.1 comparison -> g_03 = mce2 (saw AR 20) (blitB3Saw AR 20 0.99) * 0.1+> g_03 = mce2 (saw AR 20) (X.blitB3Saw AR 20 0.99) * 0.1
Help/UGen/blitB3Square.help.lhs view
@@ -1,23 +1,20 @@- Sound.SC3.UGen.Help.viewSC3Help "BlitB3Square"- Sound.SC3.UGen.DB.ugenSummary "BlitB3Square"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_00 = > let x = mouseX KR 20 400 Exponential 0.2-> in blitB3Square AR x 0.99 * 0.1+> in X.blitB3Square AR x 0.99 * 0.1 > g_01 = > let f = xLine KR 1000 20 10 DoNothing-> in blitB3Square AR f 0.99 * 0.1+> in X.blitB3Square AR f 0.99 * 0.1 aliasing suddenly appears for very high frequencies > g_02 = > let f = mouseX KR 20 10000 Exponential 0.2 > c = mouseY KR 0.001 0.999 Linear 0.2-> in blitB3Square AR f c * 0.1+> in X.blitB3Square AR f c * 0.1 difference in CPU usage (excessive wire use,-w 1024) @@ -27,5 +24,5 @@ > o z = pan2 (sqr_osc AR (f z) * 0.1) (l z) 0.1 > in sum (map o [0::Int .. 99]) -> g_03 = f_03 (\rt f -> blitB3Square rt f 0.99)+> g_03 = f_03 (\rt f -> X.blitB3Square rt f 0.99) > g_04 = f_03 (\rt f -> pulse rt f 0.5)
Help/UGen/blitB3Tri.help.lhs view
@@ -1,10 +1,7 @@- Sound.SC3.UGen.Help.viewSC3Help "BlitB3Tri"- Sound.SC3.UGen.DB.ugenSummary "BlitB3Tri"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = E.blitB3Tri AR (xLine KR 1000 20 10 DoNothing) 0.99 0.99 * 0.1+> g_01 = X.blitB3Tri AR (xLine KR 1000 20 10 DoNothing) 0.99 0.99 * 0.1 unfortunately, aliasing returns at higher frequencies (over 5000Hz or so) with a vengence (very beautiful in point scope)@@ -12,7 +9,7 @@ > g_02 = > let x = mouseX KR 20 8000 Exponential 0.2 > y = mouseY KR 0.001 0.99 Linear 0.2-> in E.blitB3Tri AR x 0.99 y * 0.1+> in X.blitB3Tri AR x 0.99 y * 0.1 more efficient, some aliasing from 3000, but not so scary over 5000 Duller sound (less high harmonics included for lower fundamentals)
Help/UGen/blockSize.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BlockSize"- > Sound.SC3.UGen.DB.ugenSummary "BlockSize"- > import Sound.SC3 {- hsc3 -} default block size is 64 samples
Help/UGen/bpf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BPF"- Sound.SC3.UGen.DB.ugenSummary "BPF"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/brf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BRF"- Sound.SC3.UGen.DB.ugenSummary "BRF"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/brownNoise.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BrownNoise"- Sound.SC3.UGen.DB.ugenSummary "BrownNoise"- > import Sound.SC3 {- hsc3 -} > g_01 = brownNoise 'α' AR * 0.1
Help/UGen/bufAllpassC.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufAllpassC"- > Sound.SC3.UGen.DB.ugenSummary "BufAllpassC"- > import Sound.SC3 {- hsc3 -} Allocate buffer
Help/UGen/bufChannels.help.lhs view
@@ -1,2 +0,0 @@- Sound.SC3.UGen.Help.viewSC3Help "BufChannels"- Sound.SC3.UGen.DB.ugenSummary "BufChannels"
Help/UGen/bufCombC.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufCombC"- > Sound.SC3.UGen.DB.ugenSummary "BufCombC"- > import Sound.SC3 {- hsc3 -} Allocate buffer zero (required for examples below)
Help/UGen/bufDelayC.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufDelayC"- > Sound.SC3.UGen.DB.ugenSummary "BufDelayC"- > import Sound.SC3 {- hsc3 -} Allocate buffer zero (required for examples below)
Help/UGen/bufDur.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "BufDur"- Sound.SC3.UGen.DB.ugenSummary "BufDur"- > import Sound.SC3 {- hsc3 -} Load sound file to buffer zero (required for examples)@@ -16,4 +13,4 @@ > g_01 = > let t = impulse AR (recip (bufDur KR 0)) 0 > p = sweep t (bufSampleRate KR 0)-> in bufRdL 1 AR 0 p NoLoop+> in bufRd 1 AR 0 p NoLoop LinearInterpolation
Help/UGen/bufFrames.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufFrames"- > Sound.SC3.UGen.DB.ugenSummary "BufFrames"- > import Sound.SC3 Load sound file to buffer zero (required for examples)
Help/UGen/bufRateScale.help.lhs view
@@ -1,19 +1,24 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufRateScale"- > Sound.SC3.UGen.DB.ugenSummary "BufRateScale"- > import Sound.SC3 {- hsc 3 -} Load sound file to buffer zero (required for examples) -> fn_01 = "/home/rohan/data/audio/pf-c5.aif"+> fn_01 = "/home/rohan/rd/j/2019-04-21/FAIRLIGHT/IIX/REEDS/clarmdhi.snd" > m_01 = b_allocRead 0 fn_01 0 0 > withSC3 (async m_01) -Read buffer at 3/4 reported sample rate.--> g_01 =-> let r = 0.75 * bufRateScale KR 0+> f_01 m =+> let r = m * bufRateScale KR 0 > p = phasor AR 0 r 0 (bufFrames KR 0) 0 > in bufRdL 1 AR 0 p NoLoop++> g_01 = f_01 1.0 * 0.5++ > audition (sinOsc AR (midiCPS 69) 0 * 0.2)++Read buffer at ~ 3/4 reported sample rate.++> g_02 = f_01 (midiRatio (-5)) * 0.5++ > audition (sinOsc AR (midiCPS 64) 0 * 0.2)
Help/UGen/bufRd.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufRd"- > Sound.SC3.UGen.DB.ugenSummary "BufRd"- > import Sound.SC3 {- hsc3 -} Load sound file to buffer zero (required for examples)
Help/UGen/bufSampleRate.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufSampleRate"- > Sound.SC3.UGen.DB.ugenSummary "BufSampleRate"- > import Sound.SC3 {- hsc3 -} Load sound file to buffer zero (required for examples)
Help/UGen/bufWr.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "BufWr"- > Sound.SC3.UGen.DB.ugenSummary "BufWr"- > import Sound.SC3 {- hsc3 -} allocate a buffer (id = 0) for writing into
Help/UGen/cOsc.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "COsc"- > Sound.SC3.UGen.DB.ugenSummary "COsc"- > import Sound.SC3 {- hsc3 -} Allocate and fill buffer.
Help/UGen/changed.help.lhs view
@@ -1,9 +1,6 @@- > Sound.SC3.UGen.Help.viewSC3Help "Changed"- > Sound.SC3.UGen.DB.ugenSummary "Changed"- > import Sound.SC3 {- hsc3 -} -simple composition of hpz1 and >*+simple composition of hpz1 and greater_than > g_01 = > let s = lfNoise0 'α' KR 2
Help/UGen/choose.help.lhs view
@@ -3,7 +3,7 @@ choose is a composite of iRand and select. > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let f = uclone 'α' 2 (choose 'β' (mce [440,460 .. 880])) > in sinOsc AR f 0 * 0.1
Help/UGen/clip.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Clip"- > Sound.SC3.UGen.DB.ugenSummary "Clip"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = clip (sinOsc AR 440 0 * 0.4) (-0.25) 0.25
Help/UGen/clip2.help.lhs view
@@ -1,10 +1,7 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.clip2"- > :t clip2- > import Sound.SC3 {- hsc3 -} clipping distortion > g_01 = clip2 (fSinOsc AR 400 0) 0.2->+ > g_02 = clip2 (fSinOsc AR 400 0) (line KR 0 1 8 RemoveSynth)
Help/UGen/clipNoise.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "ClipNoise"- Sound.SC3.UGen.DB.ugenSummary "ClipNoise"- > import Sound.SC3->+ > g_01 = clipNoise 'α' AR * 0.1 {- hsc3 -} Drawings
Help/UGen/coinGate.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "CoinGate"- Sound.SC3.UGen.DB.ugenSummary "CoinGate"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/compander.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Compander"- Sound.SC3.UGen.DB.ugenSummary "Compander"- > import Sound.SC3 {- hsc3 -} Example signal to process.
Help/UGen/complexRes.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "ComplexRes"- Sound.SC3.UGen.DB.ugenSummary "ComplexRes"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let s = pulse AR 0.1 0.001 * 0.1 > fr = 50 + 5000 * sinOsc AR 50 0 > dt = 0.5-> in External.complexRes s fr dt+> in X.complexRes s fr dt
Help/UGen/concat.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Concat"- Sound.SC3.UGen.DB.ugenSummary "Concat"- > import Sound.SC3 {- hsc3 -} > fn_01 = "/home/rohan/data/audio/pf-c5.snd"
Help/UGen/controlDur.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "ControlDur"- > Sound.SC3.UGen.DB.ugenSummary "ControlDur"- > import Sound.SC3 {- hsc3 -} default block size = 64, default sample rate = 48000
Help/UGen/controlRate.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "ControlRate"- > Sound.SC3.UGen.DB.ugenSummary "ControlRate"- > import Sound.SC3 {- hsc3 -} play a sine tone at control rate, the reciprocal of controlDur
Help/UGen/convolution.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Convolution"- > Sound.SC3.UGen.DB.ugenSummary "Convolution"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/coyote.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "Coyote"- Sound.SC3.UGen.DB.ugenSummary "Coyote"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let i = soundIn 0-> c = coyote KR i 0.2 0.2 0.01 0.5 0.05 0.1+> c = X.coyote KR i 0.2 0.2 0.01 0.5 0.05 0.1 > o = pinkNoise 'α' AR * decay c 1 > in mce2 i o
Help/UGen/crackle.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Crackle"- Sound.SC3.UGen.DB.ugenSummary "Crackle"- > import Sound.SC3 {- hsc3 -} > g_01 = crackle AR 1.95 * 0.2
Help/UGen/crossoverDistortion.help.lhs view
@@ -1,19 +1,16 @@- Sound.SC3.UGen.Help.viewSC3Help "CrossoverDistortion"- Sound.SC3.UGen.DB.ugenSummary "CrossoverDistortion"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} {CrossoverDistortion.ar(SinOsc.ar([400, 404], 0, 0.2), MouseX.kr(0, 1), MouseY.kr(0, 1))}.play > g_01 = > let x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> in crossoverDistortion (sinOsc AR (mce2 400 404) 0 * 0.2) x y+> in X.crossoverDistortion (sinOsc AR (mce2 400 404) 0 * 0.2) x y {CrossoverDistortion.ar(SoundIn.ar, MouseX.kr(0, 1), MouseY.kr(0, 1))}.play > g_02 = > let x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> in crossoverDistortion (soundIn 0) x y+> in X.crossoverDistortion (soundIn 0) x y
Help/UGen/cuspL.help.lhs view
@@ -1,12 +1,14 @@- Sound.SC3.UGen.Help.viewSC3Help "CuspL"- Sound.SC3.UGen.DB.ugenSummary "CuspL"- > import Sound.SC3 {- hsc3 -}+> import Sound.SC3.Common.Math.Noise {- hsc3 -} +Default values++> g_00 = cuspL AR 22050 1.0 1.9 0.0 * 0.1+ Vary frequency > g_01 =-> let x = mouseX KR 20 sampleRate Linear 0.1+> let x = mouseX KR 20 (sampleRate / 2) Linear 0.1 > in cuspL AR x 1.0 1.99 0 * 0.3 Mouse-controlled parameters.@@ -26,8 +28,8 @@ Haskell implementation of equation. -> cuspl_hs a b = iterate (\x -> a - (b * sqrt (abs x))) 0+> cusp_hs a b = iterate (cusp_f a b) 0 import Sound.SC3.Plot {- hsc3-plot -}- plotTable1 (take 600 (cuspl_hs 1.0 1.9))+ plotTable1 (take 600 (cusp_hs 1.0 1.9)) plot_ugen_nrt (600,1) 1.0 (cuspL AR 600 1.0 1.9 0)
Help/UGen/dNoiseRing.help.lhs view
@@ -1,13 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "DNoiseRing"- Sound.SC3.UGen.DB.ugenSummary "DNoiseRing"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let tr = impulse AR 10 0 > x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> nr = demand tr 0 (External.dNoiseRing x y 1.0 32.0 0.0)+> nr = demand tr 0 (X.dNoiseRing x y 1.0 32.0 0.0) > freq = midiCPS (linLin nr 0 (2**32) 40 (40 + 48)) > in sinOsc AR freq 0 * 0.1
+ Help/UGen/dWGBowed.help.lhs view
@@ -0,0 +1,25 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let k = control KR+> out_ = k "out" 0+> freq = k "freq" 440+> amp = k "amp" 0.5+> force = k "force" 1+> gate_ = k "gate" 1+> pos = k "pos" 0.07+> c1 = k "c1" 0.25+> c3 = k "c3" 31+> pan = k "pan" 0+> vib = gendy1 'α' KR 1 1 1 1 0.1 4 0.5 0.5 12 0 * 0.003 + 1+> s1 = X.dWGBowed AR (freq *vib) amp force gate_ pos 0.1 c1 c3 0.55 2+> s2 = X.dWGSoundBoard AR s1 20 20 0.8 199 211 223 227 229 233 239 241+> s3 = bpf s2 118 1 + s2+> s4 = bpf s3 430 1 + s3+> s5 = bpf s4 490 1 + s4+> s6 = lpf s5 6000+> in out out_ (pan2 (s6 * 0.1) pan 1)++ > import Sound.OSC {- hosc -}+ > withSC3 (sendMessage (n_set1 (-1) "gate" 0))
+ Help/UGen/dWGBowedTor.help.lhs view
@@ -0,0 +1,25 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let k = control KR+> out_ = k "out" 0+> freq = k "freq" 440+> amp = k "amp" 0.5+> force = k "force" 1+> gate_ = k "gate" 1+> pos = k "pos" 0.07+> c1 = k "c1" 0.25+> c3 = k "c3" 31+> pan = k "pan" 0+> vib = gendy1 'α' KR 1 1 1 1 0.1 4 0.5 0.5 12 0 * 0.003 + 1+> s1 = X.dWGBowedTor AR (freq *vib) amp force gate_ pos 0.1 c1 c3 0.55 2 5.2 1 3000 1.8+> s2 = X.dWGSoundBoard AR s1 20 20 0.8 199 211 223 227 229 233 239 241+> s3 = bpf s2 118 1 + s2+> s4 = bpf s3 430 1 + s3+> s5 = bpf s4 490 1 + s4+> s6 = lpf s5 6000+> in out out_ (pan2 (s6 * 0.1) pan 1)++ > import Sound.OSC {- hosc -}+ > withSC3 (sendMessage (n_set1 (-1) "gate" 0))
Help/UGen/dWGPlucked2.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "DWGPlucked2"- Sound.SC3.UGen.DB.ugenSummary "DWGPlucked2"--> import Sound.SC3-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} self deleting @@ -13,7 +10,7 @@ > c3 = 20 > inp = let e = envelope [0,1,1,0] [0.001,0.006,0.0005] (map EnvNum [5,-5,-8]) > in amp * lfClipNoise 'α' AR 2000 * envGen AR gate_ 1 0 1 DoNothing e-> ps = E.dWGPlucked2 AR freq amp gate_ 0.1 1 c3 inp 0.1 1.008 0.55 0.01+> ps = X.dWGPlucked2 AR freq amp gate_ 0.1 1 c3 inp 0.1 1.008 0.55 0.01 > pan = 0 > z = detectSilence ps 0.001 0.1 RemoveSynth > in mrg2 (pan2 ps pan 0.1) z@@ -37,9 +34,9 @@ > in amp * lfClipNoise 'κ' AR 2000 * env -- pluck signal > release = tRand 'λ' 0.05 0.15 t -- release time (seconds, def = 0.1) > mistune = tRand 'μ' 0.992 1.008 t -- factor for detuning second string (def = 1.008)-> mp = tRand 'ν' 0.35 0.65 t -- exitation mixer (def = 0.55)+> mp = tRand 'ν' 0.35 0.65 t -- excitation mixer (def = 0.55) > gc = tRand 'ξ' 0.001 0.020 t -- coupling string factor (def = 0.01)-> ps = E.dWGPlucked2 AR freq amp gate_ pos c1 c3 inp release mistune mp gc+> ps = X.dWGPlucked2 AR freq amp gate_ pos c1 c3 inp release mistune mp gc > pan = tRand 'ο' (-1) 1 t > in pan2 ps pan 0.1
Help/UGen/dWGPluckedStiff.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "DWGPluckedStiff"- Sound.SC3.UGen.DB.ugenSummary "DWGPluckedStiff"--> import Sound.SC3-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} self deleting @@ -17,7 +14,7 @@ > in amp * lfClipNoise 'α' AR 2000 * envGen AR gate_ 1 0 1 DoNothing e > release = 0.1 > fB = 2.0-> ps = E.dWGPluckedStiff AR freq amp gate_ pos c1 c3 inp release fB+> ps = X.dWGPluckedStiff AR freq amp gate_ pos c1 c3 inp release fB > pan = 0 > z = detectSilence ps 0.001 0.1 RemoveSynth > in mrg2 (pan2 ps pan 0.1) z@@ -41,6 +38,6 @@ > in amp * lfClipNoise 'κ' AR 2000 * env -- pluck signal > release = tRand 'λ' 0.05 0.15 t -- release time (seconds, def = 0.1) > fB = tRand 'μ' 1.0 4.0 t -- inharmonicity factor (def = 2.0)-> ps = E.dWGPluckedStiff AR freq amp gate_ pos c1 c3 inp release fB+> ps = X.dWGPluckedStiff AR freq amp gate_ pos c1 c3 inp release fB > pan = tRand 'ο' (-1) 1 t > in pan2 ps pan 0.1
Help/UGen/dbAmp.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.dbamp"- > :t dbAmp- > import Sound.SC3 {- hsc3 -} Linear db motion is exponential amplitude decay
Help/UGen/dbrown.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Dbrown"- Sound.SC3.UGen.DB.ugenSummary "Dbrown"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/dbufrd.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dbufrd"- > Sound.SC3.UGen.DB.ugenSummary "Dbufrd"- > import Sound.SC3 {- hsc3 -} > import System.Random {- random -}
Help/UGen/dbufwr.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dbufwr"- > Sound.SC3.UGen.DB.ugenSummary "Dbufwr"- > import Sound.SC3 {- hsc3 -} allocate buffer
Help/UGen/dc.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "DC"- > Sound.SC3.UGen.DB.ugenSummary "DC"- > import Sound.SC3 {- hsc3 -} error...
+ Help/UGen/dconst.help.lhs view
@@ -0,0 +1,12 @@+> import Sound.SC3 {- hsc3 -}++fast notes of random duration for 0.5 seconds, then a single note for 0.5 seconds++there is no Dexprand++> dexprand z rp l r = lin_exp (dwhite z rp 0 1) 0 1 l r++> g_01 =+> let t = dconst 'α' 0.5 (dwhite 'β' dinf 0.05 0.08) 0.001+> f = duty KR (dseq 'γ' dinf (mce2 t 0.5)) 0 DoNothing (dexprand 'δ' dinf 200 600)+> in varSaw AR (lag f 0.02) 0 0.3 * 0.1
Help/UGen/decay.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Decay"- Sound.SC3.UGen.DB.ugenSummary "Decay"- > import Sound.SC3 {- hsc3 -} Used as an envelope.
Help/UGen/decay2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Decay2"- Sound.SC3.UGen.DB.ugenSummary "Decay2"- > import Sound.SC3 {- hsc3 -} Used as an envelope
Help/UGen/degreeToKey.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "DegreeToKey"- > Sound.SC3.UGen.DB.ugenSummary "DegreeToKey"- > import Sound.SC3 {- hsc3 -} allocate & initialise buffer zero@@ -11,11 +8,11 @@ modal space, mouse x controls discrete pitch in dorian mode -> f_01 b =-> let n = lfNoise1 'α' KR (mce [3,3.05])-> x = mouseX KR 0 15 Linear 0.1-> k = degreeToKey b x 12-> f b = let o = sinOsc AR (midiCPS (b + k + n * 0.04)) 0 * 0.1+> f_01 buf =+> let x = mouseX KR 0 15 Linear 0.1+> k = degreeToKey buf x 12+> f b = let n = lfNoise1 'α' KR (mce [3,3.05])+> o = sinOsc AR (midiCPS (b + k + n * 0.04)) 0 * 0.1 > t = lfPulse AR (midiCPS (mce [48,55])) 0.15 0.5 > d = rlpf t (midiCPS (sinOsc KR 0.1 0 * 10 + b)) 0.1 * 0.1 > m = o + d
Help/UGen/delay1.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Delay1"- Sound.SC3.UGen.DB.ugenSummary "Delay1"- > import Sound.SC3 {- hsc3 -} > g_01 = let s = impulse AR 1 0 in s + (delay1 s)
Help/UGen/delay2.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Delay2"- > Sound.SC3.UGen.DB.ugenSummary "Delay2"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = let s = impulse AR 1 0 in s + (delay2 s)
Help/UGen/delayL.help.lhs view
@@ -1,1 +1,10 @@ See delayN++> import Sound.SC3 {- hsc3 -}++> g_01 =+> let t = mouseX KR 0.001 0.2 Exponential 0.2+> s = impulse AR 1 0+> d = delayL s 0.6 t+> in mce2 d s+
Help/UGen/delayN.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "DelayN"- Sound.SC3.UGen.DB.ugenSummary "DelayN"- > import Sound.SC3 {- hsc3 -} Dust randomly triggers Decay to create an exponential decay envelope@@ -18,3 +15,17 @@ > maxdelaytime = 0.005 > delaytime = mouseX KR 0.0 maxdelaytime Linear 0.15 > in i + delayN i maxdelaytime delaytime++Flanging++> f_03 lp_f =+> let f = 0.1 -- flanger freq+> g = 0.1 -- feedback+> i = soundIn (mce2 0 1) -- two channels of input signal+> fb = i + localIn 2 AR 0 -- add feedback+> e = delayN fb 0.02 (sinOsc KR f 0 * 0.005 + 0.005) -- max delay of 20msec+> o = localOut (lp_f e * g)+> in mrg2 (i + e) o++> g_03 = f_03 id+> g_04 = f_03 (\x -> bpf x (mouseX KR 1000 10000 Linear 0.2) 0.1) -- filter in the feedback loop
Help/UGen/demand.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Demand"- > Sound.SC3.UGen.DB.ugenSummary "Demand"- > import Sound.SC3 {- hsc3 -}->+ > g_01 :: UId m => m UGen > g_01 = do > r <- dustM KR 1@@ -11,7 +8,7 @@ > f = demand t r s > o = sinOsc AR (mce [f,f + 0.7]) 0 > return (max (cubed o) 0 * 0.1)->+ > g_02 = > let n = diwhite 'α' dinf 60 72 > t = impulse KR 10 0@@ -30,6 +27,19 @@ > x1 = demand t 0 d > x2 = latch i t > s = mce2 x1 x2-> p = poll t s (mce2 (label "x1") (label "x2")) 0+> p = poll t s 0 (mce2 (label "x1") (label "x2")) > o = sinOsc AR (s * 300 + 400) 0 * 0.1 > in mrg2 o p++> g_04 =+> let t = impulse AR 5 0+> d1 = dseq 'α' dinf (mce [1,0,1,1,0,1,0,0,1,0,1])+> d2 = dseq 'β' dinf (mce [0,1,0,0,1,0,1,1,0,1,0])+> x = demand t 0 (mce2 d1 d2) * t+> in decay x 1 * brownNoise 'γ' AR * 0.1++> g_05 =+> let t = impulse AR 5 0+> d = drand 'α' dinf (mce [dseq 'β' 1 (mce [1,1,1,1]),dseq 'γ' 1 (mce [1,0,0,0])])+> x = demand t 0 d * t+> in decay x 1 * brownNoise 'δ' AR * 0.1
Help/UGen/demandEnvGen.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "DemandEnvGen"- Sound.SC3.UGen.DB.ugenSummary "DemandEnvGen"- > import Sound.SC3 {- hsc3 -} Frequency ramp, exponential curve.@@ -45,7 +42,7 @@ > g_05 = > let n = roundTo (dwhite 'α' dinf 300 1000) 100 > x = mouseX KR 0 1 Linear 0.2-> g = x >* 0.5+> g = x >** 0.5 > f = demandEnvGen AR n 0.1 5 0.3 g 1 1 0 1 DoNothing > in sinOsc AR (f * mce2 1 1.21) 0 * 0.1 @@ -56,9 +53,9 @@ > g_06 = > let l = dseq 'α' 2 (mce [dseries 'β' 5 400 200,500,800,530,4000,900]) > x = mouseX KR 0 1 Linear 0.2-> g = (x >* 0.5) - 0.1+> g = (x >** 0.5) - 0.1 > b = mouseButton KR 0 1 0.2-> r = (b >* 0.5) * 2+> r = (b >** 0.5) * 2 > s = env_curve_shape EnvSin > f = demandEnvGen KR l 0.1 s 0 g r 1 0 1 DoNothing > in sinOsc AR (f * mce2 1 1.001) 0 * 0.1@@ -81,7 +78,8 @@ change envelope by setting values or indeed reallocating buffer - > withSC3 (send (b_set1 0 1 0.1))+ > import Sound.OSC {- hosc -}+ > withSC3 (sendMessage (b_set1 0 1 0.1)) > withSC3 (async (b_alloc_setn1 0 0 [0.5,0.9,0.1,0.1,1,0.01])) read envelope break-points from buffer, here simply duration/level pairs.
Help/UGen/detectIndex.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "DetectIndex"- > Sound.SC3.UGen.DB.ugenSummary "DetectIndex"- > import Sound.SC3 {- hsc3 -} Find indexes and map to an audible frequency range.
Help/UGen/detectSilence.help.lhs view
@@ -1,9 +1,6 @@- > Sound.SC3.UGen.Help.viewSC3Help "DetectSilence"- > Sound.SC3.UGen.DB.ugenSummary "DetectSilence"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let s = sinOsc AR 440 0 * mouseY KR 0 0.2 Linear 0.1-> d = detectSilence s 0.1 0.1 RemoveSynth+> d = detectSilence s 0.01 0.1 RemoveSynth > in mrg [s,d]
Help/UGen/dfm1.help.lhs view
@@ -1,20 +1,17 @@- Sound.SC3.UGen.Help.viewSC3Help "DFM1"- Sound.SC3.UGen.DB.ugenSummary "DFM1"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} Play it with the mouse -> gr_01 =+> g_01 = > let n = pinkNoise 'α' AR * 0.5 > x = mouseX KR 80 5000 Exponential 0.1 > y = mouseY KR 0.1 1.2 Linear 0.1-> in dfm1 n x y 1 0 3e-4+> in X.dfm1 n x y 1 0 3e-4 Bass... -> gr_02 =+> g_02 = > let i = mix (pulse AR (mce2 100 100.1) 0.5) * 0.4 > f = range 80 2000 (sinOsc KR (range 0.2 5 (sinOsc KR 0.3 0)) 0)-> in dfm1 i f 1.1 2 0 0.0003 * 0.1+> in X.dfm1 i f 1.1 2 0 0.0003 * 0.1
Help/UGen/dgeom.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dgeom"- > Sound.SC3.UGen.DB.ugenSummary "Dgeom"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = dgeom 'α' 15 1 1.2 > x = mouseX KR 1 40 Exponential 0.1
Help/UGen/difSqr.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.difsqr"- > :t difSqr- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let a = fSinOsc AR 800 0 > b = fSinOsc AR (xLine KR 200 500 5 DoNothing) 0
Help/UGen/diodeRingMod.help.lhs view
@@ -1,26 +1,23 @@- Sound.SC3.UGen.Help.viewSC3Help "DiodeRingMod"- Sound.SC3.UGen.DB.ugenSummary "DiodeRingMod"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > o_01 = sinOsc AR 440 0 > o_02 = sinOsc AR (xLine KR 1 100 10 DoNothing) 0 > o_03 = sinOsc AR (xLine KR 200 500 5 DoNothing) 0-> g_01 = External.diodeRingMod o_01 o_02 * 0.125+> g_01 = X.diodeRingMod o_01 o_02 * 0.125 > g_02 = (o_01 * o_02) * 0.125-> g_03 = External.diodeRingMod o_01 o_03 * 0.125+> g_03 = X.diodeRingMod o_01 o_03 * 0.125 > g_04 = (o_01 * o_03) * 0.125 > g_05 = > let s1 = sinOsc AR (3700 * mce [1, 1.1, 1.2] * range 1 2 (sinOsc AR 200 0)) 0 > s2 = sinOsc AR (100 * mce [0.75, 1, 0.5]) 0-> s3 = External.diodeRingMod s1 s2+> s3 = X.diodeRingMod s1 s2 > in mix s3 * lfPulse AR (10.3 * 0.5) 0 0.04 * 0.1 > mf_sin = sinOsc AR -> mf_square f _ = External.blitB3Square AR f 0.99+> mf_square f _ = X.blitB3Square AR f 0.99 c_freq = carrier frequency (mf = six-octave range, 2-130 and 60-4000 hz) @@ -39,7 +36,7 @@ > lfo = range_2oct (lfo_type lfo_freq lfo_ph * lfo_amp) > car_sig = sinOsc AR (car_freq * lfo) car_ph > mod_sig_post = mod_sig * drive-> in xFade2 mod_sig_post (External.diodeRingMod car_sig mod_sig_post) x_mix 1+> in xFade2 mod_sig_post (X.diodeRingMod car_sig mod_sig_post) x_mix 1 > g_07 = > let c_freq = 6.25
Help/UGen/disintegrator.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "Disintegrator"- Sound.SC3.UGen.DB.ugenSummary "Disintegrator"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > gr_01 = > let x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2 > s = sinOsc AR (mce2 400 404) 0 * 0.2-> in disintegrator 'α' s x y+> in X.disintegrator 'α' s x y
Help/UGen/diskIn.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "DiskIn"- Sound.SC3.UGen.DB.ugenSummary "DiskIn"- > import Sound.SC3 {- hsc3 -} > fn_01 = "/home/rohan/data/audio/pf-c5.snd"
Help/UGen/diskOut.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "DiskOut"- Sound.SC3.UGen.DB.ugenSummary "DiskOut"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/UGen/distort.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.distort"- > :t distort- > import Sound.SC3 {- hsc3 -} > g_01 =
+ Help/UGen/div.help.lhs view
@@ -0,0 +1,14 @@+ Sound.SC3.UGen.Help.viewSC3Help "Operator./"+ :t (/)++> import Sound.SC3 {- hsc3 -}++> g_01 = sinOsc AR 440 0 / 6++Creates a beating effect (subaudio rate).++> g_02 = (pinkNoise 'α' AR / fSinOsc KR 5 0) * 0.1++Optimises identity++> g_04 = sinOsc AR 440 0 / 1 * 0.1
Help/UGen/diwhite.help.lhs view
@@ -1,4 +1,1 @@- > Sound.SC3.UGen.Help.viewSC3Help "Diwhite"- > Sound.SC3.UGen.DB.ugenSummary "Diwhite"- See dwhite
Help/UGen/done.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Done"- > Sound.SC3.UGen.DB.ugenSummary "Done"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/doubleWell3.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "DoubleWell3"- Sound.SC3.UGen.DB.ugenSummary "DoubleWell3"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} bass synth @@ -10,11 +7,11 @@ > let x = mouseX KR 0 200 Linear 0.2 > y = mouseY KR 0.5 4.0 Linear 0.2 > f = sinOsc AR x 0 * y-> in doubleWell3 AR 0 0.01 f 0.25 0 0+> in X.doubleWell3 AR 0 0.01 f 0.25 0 0 gradually changing > g_02 = > let f = lfSaw AR (line KR 10 1000 10 DoNothing) 0 > delta = line KR 0.0 0.3 20 DoNothing-> in doubleWell3 AR 0 0.05 f delta 0 0+> in X.doubleWell3 AR 0 0.05 f delta 0 0
Help/UGen/dpw3Tri.help.lhs view
@@ -1,18 +1,15 @@- Sound.SC3.UGen.Help.viewSC3Help "DPW3Tri"- Sound.SC3.UGen.DB.ugenSummary "DPW3Tri"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -} distortion creeps in under 200Hz -> g_01 = E.dpw3Tri AR (xLine KR 2000 20 10 DoNothing) * 0.1+> g_01 = X.dpw3Tri AR (xLine KR 2000 20 10 DoNothing) * 0.1 very fast sweeps can have transient distortion effects -> g_02 = E.dpw3Tri AR (mouseX KR 200 12000 Exponential 0.2) * 0.2+> g_02 = X.dpw3Tri AR (mouseX KR 200 12000 Exponential 0.2) * 0.2 compare @@ -21,7 +18,7 @@ less efficient than LFTri > g_04 = let f = RDU.randN 50 'α' 50 5000-> in splay (E.dpw3Tri AR f) 1 0.1 0 True+> in splay (X.dpw3Tri AR f) 1 0.1 0 True > g_05 = let f = RDU.randN 50 'α' 50 5000 > in splay (lfTri AR f 0) 1 0.1 0 True@@ -35,7 +32,7 @@ differentiation of triangle is square > g_07 = let f = mouseX KR 440 8800 Exponential 0.2-> o = E.dpw3Tri AR f+> o = X.dpw3Tri AR f > in hpz1 (o * 2) * 0.25 compare
Help/UGen/dpw4Saw.help.lhs view
@@ -1,13 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "DPW4Saw"- Sound.SC3.UGen.DB.ugenSummary "DPW4Saw"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -} -> g_01 = E.dpw4Saw AR (xLine KR 2000 20 10 DoNothing) * 0.1+> g_01 = X.dpw4Saw AR (xLine KR 2000 20 10 DoNothing) * 0.1 -> g_02 = E.dpw4Saw AR (mouseX KR 200 12000 Exponential 0.2) * 0.2+> g_02 = X.dpw4Saw AR (mouseX KR 200 12000 Exponential 0.2) * 0.2 > g_03 = saw AR (mouseX KR 200 12000 Exponential 0.2) * 0.1
Help/UGen/drand.help.lhs view
@@ -1,11 +1,23 @@- > Sound.SC3.UGen.Help.viewSC3Help "Drand"- > Sound.SC3.UGen.DB.ugenSummary "Drand"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = drand 'α' dinf (mce [1, 3, 2, 7, 8]) > x = mouseX KR 1 400 Exponential 0.1 > t = impulse KR x 0 > f = demand t 0 n * 30 + 340 > in sinOsc AR f 0 * 0.1++> g_02 =+> let d = drand 'α' dinf+> (mce [dseq 'β' 1 (mce [2, 0, 2, 0, 1, 0, 1, 1])+> ,dseq 'γ' 1 (mce [2, 0, 1, 0, 1, 0, 1, 0])+> ,dseq 'δ' 1 (mce [2, 0, 1, 1, 1, 1, 1, 0])+> ,dseq 'ε' 1 (mce [2, 0.3, 0.3, 1, 0.3, 0.3, 1, 0.3])+> ,dseq 'ζ' 1 (mce [2, 0, 0.3, 0, 0.3, 0, 0.3, 0])+> ,dseq 'η' 1 (mce [2, 0, 0, 1, 0, 0, 0, 0])+> ,dseq 'θ' 1 (mce [2, 0, 0, 0, 0, 0, 0, 0])+> ,dseq 'ι' 1 (mce [0, 1, 0, 1, 0, 1, 0, 1])+> ,dseq 'κ' 1 (mce [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0])])+> t = impulse AR 10 0+> x = demand t 0 d * t+> in decay x 1 * pinkNoise 'λ' AR * 0.1
Help/UGen/dseq.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "Dseq"- Sound.SC3.UGen.DB.ugenSummary "Dseq"- > import Sound.SC3 {- hsc3 -} At control rate. -> gr_01 =+> g_01 = > let n = dseq 'α' 3 (mce [1,3,2,7,8]) > x = mouseX KR 1 40 Exponential 0.1 > t = impulse KR x 0@@ -14,7 +11,7 @@ At audio rate. -> gr_02 =+> g_02 = > let n = dseq 'α' dinf (mce [1,3,2,7,8,32,16,18,12,24]) > x = mouseX KR 1 10000 Exponential 0.1 > t = impulse AR x 0@@ -23,7 +20,7 @@ The SC2 Sequencer UGen is somewhat like the sequ function below -> gr_03 =+> g_03 = > let sequ e s tr = demand tr 0 (dseq e dinf (mce s)) > t = impulse AR 6 0 > n0 = sequ 'α' [60,62,63,58,48,55] t
Help/UGen/dser.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dser"- > Sound.SC3.UGen.DB.ugenSummary "Dser"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let a = dser 'α' 7 (mce [1, 3, 2, 7, 8]) > x = mouseX KR 1 40 Exponential 0.1
Help/UGen/dseries.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dseries"- > Sound.SC3.UGen.DB.ugenSummary "Dseries"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = dseries 'α' 15 0 1 > x = mouseX KR 1 40 Exponential 0.1
Help/UGen/dshuf.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dshuf"- > Sound.SC3.UGen.DB.ugenSummary "Dshuf"- > import Sound.SC3 {- hsc3 -} > import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -}
Help/UGen/dstutter.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dstutter"- > Sound.SC3.UGen.DB.ugenSummary "Dstutter"- > import Sound.SC3 {- hsc3-}->+ > g_01 = > let inp = dseq 'α' dinf (mce [1,2,3]) > nse = diwhite 'β' dinf 2 8@@ -17,10 +14,10 @@ > let a z = let xr = dxrand z dinf (mce [0.1,0.2,0.3,0.4,0.5]) > lf = dstutter z 2 xr > du = duty AR lf 0 DoNothing lf-> tr = abs (hpz1 du) >* 0+> tr = abs (hpz1 du) >** 0 > ph = sweep tr (1/du) > in linExp ph 0 1 (rand z 50 100) (rand z 500 2000)-> f = mce (map a ['a'..'h'])+> f = mce (map a (id_seq 8 'α')) > [s0,s1] = mceChannels (splay (sinOsc AR f 0) 1 1 0 True) > o = limiter (rotate2 s0 s1 (lfSaw KR 0.1 0)) 1 1e-2 > in o * 0.25
Help/UGen/dswitch.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dswitch"- > Sound.SC3.UGen.DB.ugenSummary "Dswitch"- > import Sound.SC3 {- hsc3 -}->+ > mk_g :: UId m => (UGen -> UGen -> m UGen) -> m UGen > mk_g sw = do > a0 <- dwhiteM 2 3 4
Help/UGen/dswitch1.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dswitch1"- > Sound.SC3.UGen.DB.ugenSummary "Dswitch1"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let x = mouseX KR 0 4 Linear 0.1 > y = mouseY KR 1 15 Linear 0.1
Help/UGen/dust.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Dust"- Sound.SC3.UGen.DB.ugenSummary "Dust"- > import Sound.SC3 {- hsc3 -} > g_01 = dust 'α' AR 2 * 0.25
Help/UGen/dust2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Dust2"- Sound.SC3.UGen.DB.ugenSummary "Dust2"- > import Sound.SC3 {- hsc3 -} > g_01 = dust2 'α' AR 200 * 0.5
Help/UGen/duty.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Duty"- > Sound.SC3.UGen.DB.ugenSummary "Duty"- > import Sound.SC3 {- hsc3 -}->+ > g_01 :: UId m => m UGen > g_01 = do > n0 <- drandM dinf (mce [0.01,0.2,0.4])
Help/UGen/dwhite.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dwhite"- > Sound.SC3.UGen.DB.ugenSummary "Dwhite"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/dwrand.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dwrand"- > Sound.SC3.UGen.DB.ugenSummary "Dwrand"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = dwrand 'α' dinf (mce [0.3,0.2,0.1,0.2,0.2]) (mce [1,3,2,7,8]) > x = mouseX KR 1 400 Exponential 0.1
Help/UGen/dxrand.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Dxrand"- > Sound.SC3.UGen.DB.ugenSummary "Dxrand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/dynKlang.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "DynKlang"- > Sound.SC3.UGen.DB.ugenSummary "DynKlang"- > import Sound.SC3 {- hsc3 -} fixed@@ -23,3 +20,14 @@ > a = mce3 0.3 0.3 0.3 > p = mce3 pi pi pi > in dynKlang AR 1 0 (klangSpec_mce f a p) * 0.1++-- <https://www.listarc.bham.ac.uk/lists/sc-users/msg66911.html>++> f_04 k =+> let f i = (((fromIntegral i ** range_hs (0.3,0.7) (lag (lfNoise0 i KR 1) 0.1)) + 1) * 99+> ,max 0 (lfNoise1 i KR (linRand i 0 10 0)))+> (frq,amp) = unzip (map f [0::Int .. k - 1])+> s = dynKlang AR 1 0 (klangSpec frq amp (replicate k 0)) * 0.01+> in pan2 s 0 1++> g_04 = f_04 16
Help/UGen/dynKlank.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "DynKlank"- > Sound.SC3.UGen.DB.ugenSummary "DynKlank"- > import Sound.SC3 {- hsc3 -} {s=`[[800,1071,1153,1723],nil,[1,1,1,1]]
Help/UGen/envADSR.help.lhs view
@@ -1,7 +1,4 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*adsr"- :i Sound.SC3.ADSR- :t Sound.SC3.envADSR_r- :t Sound.SC3.envADSR > import Sound.SC3 {- hsc3 -}
Help/UGen/envCoord.help.lhs view
@@ -1,5 +1,3 @@- :t envCoord- > import Sound.SC3 {- hsc3 -} co-ordinate (break-point) envelope
Help/UGen/envDetect.help.lhs view
@@ -1,12 +1,9 @@- Sound.SC3.UGen.Help.viewSC3Help "EnvDetect"- Sound.SC3.UGen.DB.ugenSummary "EnvDetect"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let i = soundIn 0-> c = envDetect AR i 0.01 0.1+> c = X.envDetect AR i 0.01 0.1 > p = pitch i 440 60 4000 100 16 1 0.01 0.5 1 0 > f = mceChannel 0 p * 3 > e = lagUD (mceChannel 1 p) 0 0.1
Help/UGen/envFollow.help.lhs view
@@ -1,12 +1,9 @@- > Sound.SC3.UGen.Help.viewSC3Help "EnvFollow"- > Sound.SC3.UGen.DB.ugenSummary "EnvFollow"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let z = soundIn 0 > d = mouseX KR 0.990 0.999 Linear 0.2-> c = envFollow KR z d+> c = X.envFollow KR z d > o = pinkNoise 'α' AR * c > in mce2 z o
Help/UGen/envGate.help.lhs view
@@ -1,5 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "EnvGate"- > import Sound.SC3 {- hsc3 -} Make envGate, giving the /default/ arguments, as used by envGate_def.
Help/UGen/envGen.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "EnvGen"- > Sound.SC3.UGen.DB.ugenSummary "EnvGen"- See also help files for the following envelope constructors: - envADSR@@ -21,31 +18,31 @@ env_circle joins the end of the envelope to the start > e_01 :: Fractional n => Envelope n-> e_01 = Envelope [6000,700,100] [1,1] [EnvExp,EnvLin] Nothing Nothing 0+> e_01 = envelope [6000,700,100] [1,1] [EnvExp,EnvLin]+> a_01 = envelope_sc3_array e_01 - import Sound.SC3.Plot {- hsc3-plot -}- plotEnvelope [e_01]+ > a_01 == Just [6000,2,-99,-99,700,1,2,0,100,1,1,0]+ > import Sound.SC3.Plot {- hsc3-plot -}+ > plotEnvelope [e_01] -> e_01_c :: Fractional n => Envelope n-> e_01_c = env_circle_0 e_01+{var e = Env([6000,700,100],[1,1],['exp','lin'])+;var e_c = Env([6000,700,100],[1,1],['exp','lin']).circle(1,\lin)+;e.asArray.postln+;e_c.asArray.postln+;SinOsc.ar(e_c.kr,0) * 0.1}.draw - plotEnvelope [e_01_c]+> e_01_c :: Fractional t => Envelope t+> e_01_c = env_circle_z 0 1 EnvLin e_01+> a_01_c = envelope_sc3_array e_01_c + > a_01_c == Just [0,4,3,0,6000,0,1,0,700,1,2,0,100,1,1,0,0,1,1,0]+ > plotEnvelope [e_01_c]+ > g_01 = > let f = envGen KR 1 1 0 1 DoNothing e_01_c > in sinOsc AR f 0 * 0.1 + impulse AR 1 0 -Env([6000,700,100],[1,1],['exp','lin']).circle.asArray == [6000,2,-99,-99,700,1,2,0,100,1,1,0]-- > r = [0,4,3,0,6000,0,1,0,700,1,2,0,100,1,1,0,0,9e8,1,0]- > envelope_sc3_array (env_circle e_01 0 EnvLin) == Just r--Env([0,1],[0.1]).asArray == [0,1,-99,-99,1,0.1,1,0]-- > e = Envelope [0,1] [0.1] [EnvLin] Nothing Nothing 0- > envelope_sc3_array e == Just [0,1,-99,-99,1,0.1,1,0]--https://www.listarc.bham.ac.uk/lists/sc-users/msg14815.html+<https://www.listarc.bham.ac.uk/lists/sc-users/msg14815.html> > e_02 = > let n = range 0.01 0.15 (lfNoise1 'α' KR 2)@@ -67,7 +64,13 @@ plotEnvelope [e_03] > f_03 rt ts = sinOsc rt 0 (envGen rt 1 1 0 ts DoNothing e_03_c)- > g_03 = soundIn 0 * range 0.25 1 (f_03 KR 2) plot_ugen 0.1 (f_03 AR 0.1)++Env([0,1],[0.1]).asArray == [0,1,-99,-99,1,0.1,1,0]++> e_04 = envelope [0,1] [0.1] [EnvLin]+> a_04 = envelope_sc3_array e_04++ a_04 == Just [0,1,-99,-99,1,0.1,1,0]
Help/UGen/envLinen.help.lhs view
@@ -1,6 +1,5 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*linen" :i Sound.SC3.LINEN- :t envLinen > import Sound.SC3 {- hsc3 -}
Help/UGen/envPairs.help.lhs view
@@ -1,5 +1,4 @@- Sound.SC3.UGen.Help.viewSC3Help "Env.*pairs"- :t envPairs+ Sound.SC3.Lang.Help.viewSC3Help "Env.*pairs" > import Sound.SC3 {- hsc3 -}
Help/UGen/envPerc.help.lhs view
@@ -1,5 +1,4 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*perc"- :t envPerc' > import Sound.SC3 {- hsc3 -}
Help/UGen/envSine.help.lhs view
@@ -1,5 +1,4 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*sine"- :t Sound.SC3.envSine > import Sound.SC3 {- hsc3 -}
Help/UGen/envStep.help.lhs view
@@ -1,5 +1,4 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*step"- :i Sound.SC3.envStep > import Sound.SC3 {- hsc3 -}
Help/UGen/envTrapezoid.help.lhs view
@@ -1,5 +1,3 @@- :t Sound.SC3.envTrapezoid- > import Sound.SC3 > g_01 =
Help/UGen/envTriangle.help.lhs view
@@ -1,5 +1,4 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*triangle"- :t envTriangle > import Sound.SC3 {- hsc3 -}
Help/UGen/envXYC.help.lhs view
@@ -1,5 +1,4 @@ Sound.SC3.UGen.Help.viewSC3Help "Env.*xyc"- :t Sound.SC3.envXYC > import Sound.SC3 {- hsc3 -}
+ Help/UGen/equal_to.help.lhs view
@@ -0,0 +1,18 @@+The star suffixes (==**,/=**,<**,<=**,>**,>=**) are because the result of the+operators is not of type Bool, as is required by the signature for the+classes Eq and Ord.++> import Sound.SC3 {- hsc3 -}++> g_01 =+> let o = sinOsc KR 1 0+> t = [o >** 0+> ,o >=** 0+> ,o <** 0+> ,o <=** 0+> ,o ==** 0+> ,(o <** 0.001) * (o >** (-0.001))]+> f = [220, 330, 440, 550, 660, 770]+> p = envPerc 0.01 1+> e = envGen KR (mce t) 0.1 0 1 DoNothing p+> in mix (sinOsc AR (mce f) 0 * e)
Help/UGen/excess.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.excess"- > :t excess- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let o = fSinOsc AR 1000 0 > l = line KR 0 1 8 DoNothing
Help/UGen/expRand.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "ExpRand"- > Sound.SC3.UGen.DB.ugenSummary "ExpRand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/fSinOsc.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "FSinOsc"- > Sound.SC3.UGen.DB.ugenSummary "FSinOsc"- Note: SC2 did not have the initial phase argument. > import Sound.SC3 {- hsc3 -}
Help/UGen/fbSineC.help.lhs view
@@ -1,12 +1,14 @@- > Sound.SC3.UGen.Help.viewSC3Help "FBSineC"- > Sound.SC3.UGen.DB.ugenSummary "FBSineC"- > import Sound.SC3 {- hsc3 -}+> import Sound.SC3.Common.Math.Noise {- hsc3 -} SC3 default values. -> g_01 = fbSineC AR (sampleRate / 4) 1 0.1 1.1 0.5 0.1 0.1 * 0.2+> g_00 = fbSineC AR (sampleRate / 2) 1 0.1 1.1 0.5 0.1 0.1 * 0.2 +FB generating noise++> g_01 = fbSineC AR (sampleRate / 2) 1 4 1.1 0.5 0.1 0.1 * 0.2+ Increase feedback > g_02 =@@ -22,12 +24,19 @@ Randomly modulate parameters > g_04 =-> let madd a m = (+ a) . (* m)-> x = mouseX KR 1 12 Linear 0.1+> let x = mouseX KR 1 12 Linear 0.1 > n e = lfNoise2 e KR x-> n0 = madd 1e4 1e4 (n 'α')-> n1 = madd 33 32 (n 'β')-> n2 = madd 0 0.5 (n 'γ')-> n3 = madd 1.05 0.05 (n 'δ')-> n4 = madd 0.3 0.3 (n 'ε')+> n0 = n 'α' * 1e4 + 1e4+> n1 = n 'β' * 32 + 33+> n2 = n 'γ' * 0.5+> n3 = n 'δ' * 0.05 + 1.05+> n4 = n 'ε' * 0.3 + 0.3 > in fbSineC AR n0 n1 n2 n3 n4 0.1 0.1 * 0.2++Haskell implementation of equation.++> fbSineC_hs im fb a c = map fst (iterate (fbSine_f im fb a c) (0.1,0.1))++ import Sound.SC3.Plot {- hsc3-plot -}+ plotTable1 (take 600 (fbSineC_hs 1.0 4.0 1.1 0.5))+ plot_ugen_nrt (600,1) 1.0 (fbSineC AR 600 1.0 4.0 1.1 0.5 0.1 0.1)
Help/UGen/fdiv.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator./"- > :t (/)- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let o = fSinOsc KR 10 0.5 > n = pinkNoise 'α' AR
Help/UGen/fft.help.lhs view
@@ -1,5 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "FFT"- Sound.SC3.UGen.DB.ugenSummary "FFT" :t fft' > import Sound.SC3 {- hsc3 -}
Help/UGen/fftTrigger.help.lhs view
@@ -1,2 +1,1 @@- > Sound.SC3.UGen.Help.viewSC3Help "FFTTrigger"- > Sound.SC3.UGen.DB.ugenSummary "FFTTrigger"+See example at packFFT
Help/UGen/fm7.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "FM7"- Sound.SC3.UGen.DB.ugenSummary "FM7"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.Composite.External as X {- hsc3 -} two of six... @@ -19,7 +16,7 @@ > ,[0,0,0,0,0,0] > ,[0,0,0,0,0,0] > ,[0,0,0,0,0,0] ]-> [l,r,_,_,_,_] = mceChannels (fm7_mx c m)+> [l,r,_,_,_,_] = mceChannels (X.fm7_mx c m) > in mce2 l r * 0.1 An algorithmically generated graph courtesy f0.@@ -81,7 +78,7 @@ > ,[1.0,0.5,-1/6,0.5]]] > cs = map (map (\[f,p,m,a] -> sinOsc AR f p * m + a)) x > ms = map (map (\[f,w,m,a] -> pulse AR f w * m + a)) y-> [c1,c2,c3,c4,c5,c6] = mceChannels (fm7_mx cs ms)+> [c1,c2,c3,c4,c5,c6] = mceChannels (X.fm7_mx cs ms) > g3 = linLin (lfSaw KR 0.1 0) (-1) 1 0 (dbAmp (-12)) > g6 = dbAmp (-3) > in mce [c1 + c3 * g3 + c5,c2 + c4 + c6 * g6]
Help/UGen/fmGrain.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "FMGrain"- > Sound.SC3.UGen.DB.ugenSummary "FMGrain"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/fmGrainB.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "FMGrainB"- Sound.SC3.UGen.DB.ugenSummary "FMGrainB"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > m_01 = > [b_alloc 10 512 1@@ -15,4 +12,4 @@ > n = linLin (lfNoise1 'α' KR 1) (-1) 1 1 10 > s = envSine 9 0.1 > e = envGen KR 1 1 0 1 RemoveSynth s-> in fmGrainB t 0.2 440 220 n 10 * e+> in X.fmGrainB t 0.2 440 220 n 10 * e
Help/UGen/fold2.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.fold2"- > :t fold2- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let o = fSinOsc AR 1000 0 > l = line KR 0 1 8 DoNothing
Help/UGen/formant.help.lhs view
@@ -1,7 +1,4 @@- Sound.SC3.UGen.Help.viewSC3Help "Formant"- Sound.SC3.UGen.DB.ugenSummary "Formant"--> import Sound.SC3+> import Sound.SC3 {- hsc3 -} Default values
Help/UGen/formlet.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Formlet"- > Sound.SC3.UGen.DB.ugenSummary "Formlet"- > import Sound.SC3 {- hsc3 -} > g_01 = formlet (impulse AR 20 0.5) 1000 0.01 0.1
Help/UGen/free.help.lhs view
@@ -1,10 +1,7 @@- > Sound.SC3.UGen.Help.viewSC3Help "Free"- > Sound.SC3.UGen.DB.ugenSummary "Free"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = out 0 (sinOsc AR 880 0 * 0.1)->+ > g_02 = > let n0 = pinkNoise 'α' AR > n1 = dust 'β' KR 20
Help/UGen/freeSelf.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "FreeSelf"- > Sound.SC3.UGen.DB.ugenSummary "FreeSelf"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = dust 'α' KR 0.5 > in mrg [sinOsc AR 440 0 * 0.1,freeSelf n]
Help/UGen/freeSelfWhenDone.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "FreeSelfWhenDone"- > Sound.SC3.UGen.DB.ugenSummary "FreeSelfWhenDone"- > import Sound.SC3 {- hsc3 -} using RemoveSynth doneAction
Help/UGen/freeVerb.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "FreeVerb"- > Sound.SC3.UGen.DB.ugenSummary "FreeVerb"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/freqShift.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "FreqShift"- Sound.SC3.UGen.DB.ugenSummary "FreqShift"- > import Sound.SC3 {- hcs3 -} Shifting a 100Hz tone by 1 Hz rising to 500Hz
Help/UGen/gVerb.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "GVerb"- > Sound.SC3.UGen.DB.ugenSummary "GVerb"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/gate.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Gate"- Sound.SC3.UGen.DB.ugenSummary "Gate"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/gaussTrig.help.lhs view
@@ -1,12 +1,9 @@- Sound.SC3.UGen.Help.viewSC3Help "GaussTrig"- Sound.SC3.UGen.DB.ugenSummary "GaussTrig"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let x = mouseX KR 0 0.9 Linear 0.2-> t1 = gaussTrig KR 10 x * abs (whiteNoise 'α' KR) * 0.5+> t1 = X.gaussTrig KR 10 x * abs (whiteNoise 'α' KR) * 0.5 > t2 = dust 'β' KR 10 * 0.5 > n = pinkNoise 'γ' AR * decay (mce2 t1 t2) 0.02 * 0.5 > in fold2 (ringz n 2000 0.02) 0.5
Help/UGen/gbmanN.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "GbmanN"- Sound.SC3.UGen.DB.ugenSummary "GbmanN"- > import Sound.SC3 {- hsc3 -} default initial params
Help/UGen/gendy1.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Gendy1"- > Sound.SC3.UGen.DB.ugenSummary "Gendy1"- > import Data.Char {- base -} > import Sound.SC3 {- base -} @@ -93,17 +90,17 @@ > g_14 = > let node e = let f = rand e 130 160.3-> r0 = rand e 0 6-> r1 = rand (toUpper e) 0 6+> r0 = rand ('α',e) 0 6+> r1 = rand ('β',e) 0 6 > l = rand e (-1) 1 > ad = sinOsc KR 0.10 0 * 0.49 + 0.51 > dd = sinOsc KR 0.13 0 * 0.49 + 0.51 > as = sinOsc KR 0.17 0 * 0.49 + 0.51 > ds = sinOsc KR 0.19 0 * 0.49 + 0.51-> g = gendy1 'α' AR r0 r1 ad dd f f as ds 12 12+> g = gendy1 'γ' AR r0 r1 ad dd f f as ds 12 12 > o = sinOsc AR (g * 200 + 400) 0 > in pan2 o l 0.1-> in mix (mce (map node (take 10 (enumFrom 'β'))))+> in mix (mce (map node (id_seq 10 'δ'))) Try durscale 10.0 and 0.0 too.
Help/UGen/grainBuf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "GrainBuf"- Sound.SC3.UGen.DB.ugenSummary "GrainBuf"- > import Sound.SC3 {- hsc3 -} > fn_01 = "/home/rohan/data/audio/pf-c5.snd"
Help/UGen/grainFM.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "GrainFM"- Sound.SC3.UGen.DB.ugenSummary "GrainFM"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/grainIn.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "GrainIn"- Sound.SC3.UGen.DB.ugenSummary "GrainIn"- > import Sound.SC3 {- hsc3 -} > f_01 s =
Help/UGen/grainSin.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "GrainSin"- > Sound.SC3.UGen.DB.ugenSummary "GrainSin"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = whiteNoise 'α' KR > x = mouseX KR (-0.5) 0.5 Linear 0.1@@ -10,3 +7,18 @@ > f = n * y + 440 > t = impulse KR 10 0 > in grainSin 2 t 0.1 f x (-1) 512 * 0.1++-- <https://www.listarc.bham.ac.uk/lists/sc-users/msg66911.html>++> f_02 k =+> let t = impulse AR (mouseY KR 1 999 Linear 0.2) 0+> f i = ((fromIntegral i ** range_hs (0.3,0.7) (lfNoise0 i KR 1)) + 1) * 99+> l = mce (map f [0::Int .. k - 1])+> in grainSin 2 t (mouseX KR 0.001 0.5 Exponential 0.2) (tChoose 'α' t l) 0 (-1) 512 * 0.01++> g_02 = f_02 16++> g_03 =+> let (s1,s2) = unmce2 g_02+> in freeVerb2 s1 s2 0.9 0.1 0.5+
Help/UGen/grayNoise.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "GrayNoise"- > Sound.SC3.UGen.DB.ugenSummary "GrayNoise"- > import Sound.SC3 {- hsc3 -} > g_01 = grayNoise 'α' AR * 0.1
+ Help/UGen/greater_than.help.lhs view
@@ -0,0 +1,2 @@+See equal_to+
Help/UGen/greyholeRaw.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "GreyholeRaw"- Sound.SC3.UGen.DB.ugenSummary "GreyholeRaw"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} default values > g_01 = > let (i1,i2) = (soundIn 0,soundIn 1)-> in External.greyholeRaw i1 i2 0.0 2.0 0.5 0.9 0.1 2.0 1.0+> in X.greyholeRaw i1 i2 0.0 2.0 0.5 0.9 0.1 2.0 1.0
− Help/UGen/gt.help.lhs
@@ -1,22 +0,0 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.=="- > :t (==*)--The star suffixes (<*,<=*,>*,>=*) are because the result of the-operators is not of type Bool, as is required by the signature for the-class Ord. At some point `<*` was written into the standard prelude...--> import Prelude hiding ((<*)) {- base -}-> import Sound.SC3 {- hsc3 -}->-> g_01 =-> let o = sinOsc KR 1 0-> t = [o >* 0-> ,o >=* 0-> ,o <* 0-> ,o <=* 0-> ,o ==* 0-> ,(o <* 0.001) * (o >* (-0.001))]-> f = [220, 330, 440, 550, 660, 770]-> p = envPerc 0.01 1-> e = envGen KR (mce t) 0.1 0 1 DoNothing p-> in mix (sinOsc AR (mce f) 0 * e)
Help/UGen/hasher.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Hasher"- Sound.SC3.UGen.DB.ugenSummary "Hasher"- > import Sound.SC3 {- hsc3 -} noise
Help/UGen/henonN.help.lhs view
@@ -1,7 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "HenonN"- > Sound.SC3.UGen.DB.ugenSummary "HenonN"- > import Sound.SC3 {- hsc3 -}+> import Sound.SC3.Common.Math.Noise {- hsc3 -} With SC3 default initial parameters. @@ -38,3 +36,11 @@ > plot_ugen1 0.1 (henonN AR 2500 1.4 0.3 0 0 * 0.1) ++In haskell:++> henon_hs a b = map snd (iterate (henon_f a b) (0.0,0.0))++ import Sound.SC3.Plot {- hsc3-plot -}+ plotTable1 (take 600 (henon_hs 1.4 0.3))+ plot_ugen_nrt (600,1) 1.0 (henonN AR 600 1.4 0.3 0 0)
Help/UGen/hilbertFIR.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "HilbertFIR"- Sound.SC3.UGen.DB.ugenSummary "HilbertFIR"- > import Sound.SC3 {- hsc3 -} composite UGen
Help/UGen/hpf.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "HPF"- > Sound.SC3.UGen.DB.ugenSummary "HPF"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let f = fSinOsc KR (xLine KR 0.7 300 20 RemoveSynth) 0 * 3600 + 4000 > in hpf (saw AR 200 * 0.2) f
Help/UGen/hpz1.help.lhs view
@@ -1,19 +1,16 @@- > Sound.SC3.UGen.Help.viewSC3Help "HPZ1"- > Sound.SC3.UGen.DB.ugenSummary "HPZ1"- > import Sound.SC3 {- hsc3 -} > g_01 = let n = whiteNoise 'α' AR in hpz1 (n * 0.25) - import Sound.SC3.Plot.FFT {- hsc3-plot -}- plot_ugen_fft1 0.05 (hpz1 (whiteNoise 'α' AR))+ > import Sound.SC3.Plot.FFT {- hsc3-plot -}+ > plot_ugen_fft1 0.05 (hpz1 (whiteNoise 'α' AR)) detect changes in a signal (see also hpz2) > g_02 =-> let n = lfNoise0 'a' AR 1000+> let n = lfNoise0 'α' AR 1000 > h = hpz1 n-> in mce [h,h >* 0,abs h >* 0]+> in mce [h,h >** 0,abs h >** 0] - import Sound.SC3.Plot {- hsc3-plot -}- plot_ugen 0.01 g_02+ > import Sound.SC3.Plot {- hsc3-plot -}+ > plot_ugen 0.01 g_02
Help/UGen/hpz2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "HPZ2"- Sound.SC3.UGen.DB.ugenSummary "HPZ2"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/hypot.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.hypot"- > :t hypot- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let x = mouseX KR 0 0.1 Linear 0.1 > y = mouseY KR 0 0.1 Linear 0.1@@ -15,11 +12,11 @@ > let x = 10 > y = lfSaw KR (1 / 6) 0 * 100 > d = hypot x y+> a = 10 / (squared d) > v = slope d > r = (344 - v) / 344-> a = 10 / (squared d) > in fSinOsc AR (1000 * r) 0 * a->+ > g_03 = > let x = 10 > y = lfSaw KR (1 / 6) 0 * 100
Help/UGen/iEnvGen.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "IEnvGen"- Sound.SC3.UGen.DB.ugenSummary "IEnvGen"- > import Sound.SC3 {- hsc3 -} > e_01 :: (Fractional n,Ord n) => Envelope n
Help/UGen/iRand.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "IRand"- Sound.SC3.UGen.DB.ugenSummary "IRand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/ifft.help.lhs view
@@ -1,5 +1,1 @@- > Sound.SC3.UGen.Help.viewSC3Help "IFFT"- > Sound.SC3.UGen.DB.ugenSummary "IFFT"- > :t ifft'- # ifft' is a variant with the default window type and size
Help/UGen/iirFilter.help.lhs view
@@ -1,13 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "IIRFilter"- Sound.SC3.UGen.DB.ugenSummary "IIRFilter"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let x = mouseX KR 20 12000 Exponential 0.2 > y = mouseY KR 0.01 1 Linear 0.2 > o = lfSaw AR (mce [x * 0.99,x * 1.01]) 0 * 0.1 > freq = sinOsc KR (sinOsc KR 0.1 0) (1.5 * pi) * 1550 + 1800-> s = iirFilter o freq y+> s = X.iirFilter o freq y > in combN s 0.5 (mce2 0.4 0.35) 2 * 0.4 + s * 0.5
Help/UGen/impulse.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Impulse"- > Sound.SC3.UGen.DB.ugenSummary "Impulse"- Note: SC2 had no phase input. > import Sound.SC3 {- hsc3 -}
Help/UGen/in.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "In"- > Sound.SC3.UGen.DB.ugenSummary "In"- Note: `hsc3` renames UGen to `in'` since `in` is a reserved keyword > import Sound.OSC {- hosc -}@@ -55,3 +52,7 @@ Audio rate graph reading control buses 0 & 1. > g_07 = sinOsc AR (in' 1 KR 0) 0 * decay (in' 1 KR 1) 0.2 * 0.1++Patch mono input to stereo output++> g_08 = pan2 (in' 1 AR numOutputBuses) 0 1
Help/UGen/inFeedback.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "InFeedback"- Sound.SC3.UGen.DB.ugenSummary "InFeedback"- > import Sound.SC3 {- hsc3 -} Audio feedback modulation
Help/UGen/inRange.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "InRange"- > Sound.SC3.UGen.DB.ugenSummary "InRange"- > import Sound.SC3 {- hsc3 -} trigger noise burst@@ -10,3 +7,7 @@ > x = mouseX KR 1 2 Linear 0.1 > o = sinOsc KR x 0 * 0.2 > in inRange o (-0.15) 0.15 * n++i-rate...++> g_02 = sinOsc AR 440 0 * inRange (rand 'α' 0 1) 0.5 1.0 * 0.1
Help/UGen/inTrig.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "InTrig"- > Sound.SC3.UGen.DB.ugenSummary "InTrig"- > import Sound.SC3 {- hsc3 -} Run an oscillator with the trigger at bus 10.
Help/UGen/index.help.lhs view
@@ -1,13 +1,10 @@- > Sound.SC3.UGen.Help.viewSC3Help "Index"- > Sound.SC3.UGen.DB.ugenSummary "Index"- > import Sound.SC3 {- hsc3 -} Index buffer for frequency values > g_01 = > let b = asLocalBuf 'α' [50,100,200,400,800,1600]-> f = index b (lfSaw KR 2 3 * 4)+> f = index b (range 0 6 (lfSaw KR 2 0)) > in sinOsc AR (mce [f,f * 9]) 0 * 0.1 > g_02 =
Help/UGen/indexInBetween.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "IndexInBetween"- > Sound.SC3.UGen.DB.ugenSummary "IndexInBetween"- > import Sound.SC3 {- hsc3 -} Index into buffer for frequency values@@ -18,5 +15,5 @@ > let from = asLocalBuf 'α' [1, 2, 4, 8, 16] > to = asLocalBuf 'β' [0, 1, 0, -1, 0] > x = mouseX KR 1 16 Linear 0.1-> i = indexL KR to (indexInBetween from x)+> i = indexL to (indexInBetween from x) > in sinOsc AR (linLin i (-1) 1 440 880) 0 * 0.1
Help/UGen/indexL.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "IndexL"- > Sound.SC3.UGen.DB.ugenSummary "IndexL"- > import Sound.SC3 {- hsc3 -} Index buffer for frequency values
Help/UGen/integrator.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Integrator"- > Sound.SC3.UGen.DB.ugenSummary "Integrator"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let x = mouseX KR 0.001 0.999 Exponential 0.2 > o = lfPulse AR 300 0.2 0.1 * 0.1@@ -12,7 +9,7 @@ > g_02 = > let i = lfPulse AR 3 0.2 0.0004-> o = sinOsc AR 700 0+> o = sinOsc AR 700 0 * 0.1 > in integrator i 0.999 * o
Help/UGen/ix.md view
@@ -8,7 +8,7 @@ [beatTrack](?t=hsc3&e=Help/UGen/beatTrack.help.lhs), [beatTrack2](?t=hsc3&e=Help/UGen/beatTrack2.help.lhs),-[mFCC](?t=hsc3&e=Help/UGen/mFCC.help.lhs),+[mfcc](?t=hsc3&e=Help/UGen/mfcc.help.lhs), [onsets](?t=hsc3&e=Help/UGen/onsets.help.lhs), [runningSum](?t=hsc3&e=Help/UGen/runningSum.help.lhs), [slope](?t=hsc3&e=Help/UGen/slope.help.lhs)@@ -73,11 +73,11 @@ ## Conversion -[a2K](?t=hsc3&e=Help/UGen/a2K.help.lhs),+[a2k](?t=hsc3&e=Help/UGen/a2k.help.lhs), [degreeToKey](?t=hsc3&e=Help/UGen/degreeToKey.help.lhs),-[k2A](?t=hsc3&e=Help/UGen/k2A.help.lhs),-[t2A](?t=hsc3&e=Help/UGen/t2A.help.lhs),-[t2K](?t=hsc3&e=Help/UGen/t2K.help.lhs)+[k2a](?t=hsc3&e=Help/UGen/k2a.help.lhs),+[t2a](?t=hsc3&e=Help/UGen/t2a.help.lhs),+[t2k](?t=hsc3&e=Help/UGen/t2k.help.lhs) ## Convolution@@ -180,7 +180,7 @@ [convolution2](?t=hsc3&e=Help/UGen/convolution2.help.lhs), [convolution2L](?t=hsc3&e=Help/UGen/convolution2L.help.lhs), [fft](?t=hsc3&e=Help/UGen/fft.help.lhs),-[fFTTrigger](?t=hsc3&e=Help/UGen/fFTTrigger.help.lhs),+[fftTrigger](?t=hsc3&e=Help/UGen/fftTrigger.help.lhs), [ifft](?t=hsc3&e=Help/UGen/ifft.help.lhs), [pv_Add](?t=hsc3&e=Help/UGen/pv_Add.help.lhs), [pv_BinScramble](?t=hsc3&e=Help/UGen/pv_BinScramble.help.lhs),@@ -240,7 +240,7 @@ [bAllPass](?t=hsc3&e=Help/UGen/bAllPass.help.lhs), [bBandPass](?t=hsc3&e=Help/UGen/bBandPass.help.lhs), [bBandStop](?t=hsc3&e=Help/UGen/bBandStop.help.lhs),-[bEQSuite](?t=hsc3&e=Help/UGen/bEQSuite.help.lhs),+[beqSuite](?t=hsc3&e=Help/UGen/beqSuite.help.lhs), [bHiPass](?t=hsc3&e=Help/UGen/bHiPass.help.lhs), [bHiShelf](?t=hsc3&e=Help/UGen/bHiShelf.help.lhs), [bLowPass](?t=hsc3&e=Help/UGen/bLowPass.help.lhs),@@ -314,9 +314,9 @@ [chaosGen](?t=hsc3&e=Help/UGen/chaosGen.help.lhs), [cuspL](?t=hsc3&e=Help/UGen/cuspL.help.lhs), [cuspN](?t=hsc3&e=Help/UGen/cuspN.help.lhs),-[fBSineC](?t=hsc3&e=Help/UGen/fBSineC.help.lhs),-[fBSineL](?t=hsc3&e=Help/UGen/fBSineL.help.lhs),-[fBSineN](?t=hsc3&e=Help/UGen/fBSineN.help.lhs),+[fbSineC](?t=hsc3&e=Help/UGen/fbSineC.help.lhs),+[fbSineL](?t=hsc3&e=Help/UGen/fbSineL.help.lhs),+[fbSineN](?t=hsc3&e=Help/UGen/fbSineN.help.lhs), [gbmanL](?t=hsc3&e=Help/UGen/gbmanL.help.lhs), [gbmanN](?t=hsc3&e=Help/UGen/gbmanN.help.lhs), [henonC](?t=hsc3&e=Help/UGen/henonC.help.lhs),@@ -516,7 +516,7 @@ [randID](?t=hsc3&e=Help/UGen/randID.help.lhs), [randSeed](?t=hsc3&e=Help/UGen/randSeed.help.lhs), [tExpRand](?t=hsc3&e=Help/UGen/tExpRand.help.lhs),-[tIRand](?t=hsc3&e=Help/UGen/tIRand.help.lhs),+[tiRand](?t=hsc3&e=Help/UGen/tiRand.help.lhs), [tRand](?t=hsc3&e=Help/UGen/tRand.help.lhs), [tWindex](?t=hsc3&e=Help/UGen/tWindex.help.lhs) @@ -558,11 +558,11 @@ [setResetFF](?t=hsc3&e=Help/UGen/setResetFF.help.lhs), [stepper](?t=hsc3&e=Help/UGen/stepper.help.lhs), [sweep](?t=hsc3&e=Help/UGen/sweep.help.lhs),-[t2A](?t=hsc3&e=Help/UGen/t2A.help.lhs),-[t2K](?t=hsc3&e=Help/UGen/t2K.help.lhs),+[t2a](?t=hsc3&e=Help/UGen/t2a.help.lhs),+[t2k](?t=hsc3&e=Help/UGen/t2k.help.lhs), [tDelay](?t=hsc3&e=Help/UGen/tDelay.help.lhs), [tExpRand](?t=hsc3&e=Help/UGen/tExpRand.help.lhs),-[tIRand](?t=hsc3&e=Help/UGen/tIRand.help.lhs),+[tiRand](?t=hsc3&e=Help/UGen/tiRand.help.lhs), [tRand](?t=hsc3&e=Help/UGen/tRand.help.lhs), [tWindex](?t=hsc3&e=Help/UGen/tWindex.help.lhs), [timer](?t=hsc3&e=Help/UGen/timer.help.lhs),@@ -576,21 +576,8 @@ [apf](?t=hsc3&e=Help/UGen/apf.help.lhs), [audioControl](?t=hsc3&e=Help/UGen/audioControl.help.lhs), [blockSize](?t=hsc3&e=Help/UGen/blockSize.help.lhs),-[dustR](?t=hsc3&e=Help/UGen/dustR.help.lhs), [nodeID](?t=hsc3&e=Help/UGen/nodeID.help.lhs), [pauseSelfWhenDone](?t=hsc3&e=Help/UGen/pauseSelfWhenDone.help.lhs),-[rDelayMap](?t=hsc3&e=Help/UGen/rDelayMap.help.lhs),-[rDelaySet](?t=hsc3&e=Help/UGen/rDelaySet.help.lhs),-[rDelaySetB](?t=hsc3&e=Help/UGen/rDelaySetB.help.lhs),-[rFreezer](?t=hsc3&e=Help/UGen/rFreezer.help.lhs),-[rLoopSet](?t=hsc3&e=Help/UGen/rLoopSet.help.lhs),-[rPlayTrace](?t=hsc3&e=Help/UGen/rPlayTrace.help.lhs),-[rShufflerB](?t=hsc3&e=Help/UGen/rShufflerB.help.lhs),-[rShufflerL](?t=hsc3&e=Help/UGen/rShufflerL.help.lhs),-[rTraceRd](?t=hsc3&e=Help/UGen/rTraceRd.help.lhs),-[rTraceRdX](?t=hsc3&e=Help/UGen/rTraceRdX.help.lhs),-[rTraceRdY](?t=hsc3&e=Help/UGen/rTraceRdY.help.lhs),-[rTraceRdZ](?t=hsc3&e=Help/UGen/rTraceRdZ.help.lhs), [scopeOut](?t=hsc3&e=Help/UGen/scopeOut.help.lhs), [scopeOut2](?t=hsc3&e=Help/UGen/scopeOut2.help.lhs), [trigControl](?t=hsc3&e=Help/UGen/trigControl.help.lhs)@@ -646,7 +633,7 @@ [sqrDif](?t=hsc3&e=Help/UGen/sqrDif.help.lhs), [absDif](?t=hsc3&e=Help/UGen/absDif.help.lhs), [thresh](?t=hsc3&e=Help/UGen/thresh.help.lhs),-[aMClip](?t=hsc3&e=Help/UGen/aMClip.help.lhs),+[amClip](?t=hsc3&e=Help/UGen/amClip.help.lhs), [scaleNeg](?t=hsc3&e=Help/UGen/scaleNeg.help.lhs), [clip2](?t=hsc3&e=Help/UGen/clip2.help.lhs), [excess](?t=hsc3&e=Help/UGen/excess.help.lhs),@@ -676,14 +663,14 @@ [sqrt](?t=hsc3&e=Help/UGen/sqrt.help.lhs), [exp](?t=hsc3&e=Help/UGen/exp.help.lhs), [recip](?t=hsc3&e=Help/UGen/recip.help.lhs),-[mIDICPS](?t=hsc3&e=Help/UGen/mIDICPS.help.lhs),-[cPSMIDI](?t=hsc3&e=Help/UGen/cPSMIDI.help.lhs),-[mIDIRatio](?t=hsc3&e=Help/UGen/mIDIRatio.help.lhs),+[midicps](?t=hsc3&e=Help/UGen/midicps.help.lhs),+[cpsmidi](?t=hsc3&e=Help/UGen/cpsmidi.help.lhs),+[midiRatio](?t=hsc3&e=Help/UGen/midiRatio.help.lhs), [ratioMIDI](?t=hsc3&e=Help/UGen/ratioMIDI.help.lhs), [dbAmp](?t=hsc3&e=Help/UGen/dbAmp.help.lhs), [ampDb](?t=hsc3&e=Help/UGen/ampDb.help.lhs), [octCPS](?t=hsc3&e=Help/UGen/octCPS.help.lhs),-[cPSOct](?t=hsc3&e=Help/UGen/cPSOct.help.lhs),+[cpsOct](?t=hsc3&e=Help/UGen/cpsOct.help.lhs), [log](?t=hsc3&e=Help/UGen/log.help.lhs), [log2](?t=hsc3&e=Help/UGen/log2.help.lhs), [log10](?t=hsc3&e=Help/UGen/log10.help.lhs),
Help/UGen/jPverbRaw.help.lhs view
@@ -1,10 +1,9 @@- Sound.SC3.UGen.Help.viewSC3Help "JPverbRaw"- Sound.SC3.UGen.DB.ugenSummary "JPverbRaw"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} +default values+ > g_01 = > let (i1,i2) = (soundIn 0,soundIn 1)-> in External.jPverbRaw i1 i2 0 0.707 2000 1 500 1 0.1 2 1 1 1+> in X.jPverbRaw i1 i2 0 0.707 2000 1 500 1 0.1 2 1 1 1
Help/UGen/k2a.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "K2A"- > Sound.SC3.UGen.DB.ugenSummary "K2A"- > import Sound.SC3 {- hsc3 -} > g_01 = k2a (whiteNoise 'α' KR * 0.3)
Help/UGen/keyState.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "KeyState"- Sound.SC3.UGen.DB.ugenSummary "KeyState"- > import Sound.SC3 {- hsc3 -} The keycode 38 is the A key on my keyboard. Under X the xev(1)
+ Help/UGen/keyTrack.help.lhs view
@@ -0,0 +1,9 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let s = soundIn (mce2 0 1)+> t = fft' (localBuf 'α' 1 4096) (mix s)+> k = keyTrack KR t 2.0 0.5+> p = poll (impulse KR 1 0) k 0 (label "key")+> in mrg2 s p
Help/UGen/klang.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Klang"- > Sound.SC3.UGen.DB.ugenSummary "Klang"- Note: SC2 had mul/add inputs. > import Sound.SC3 {- hsc3 -}
Help/UGen/klank.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Klank"- > Sound.SC3.UGen.DB.ugenSummary "Klank"- > import Sound.SC3 {- hsc3 -} The klankSpec family of functions can help create the 'spec' entry.
Help/UGen/ladspa.help.lhs view
@@ -1,15 +1,12 @@- Sound.SC3.UGen.Help.viewSC3Help "LADSPA"- Sound.SC3.UGen.DB.ugenSummary "LADSPA"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.HW.External as X {- hsc3 -} Note: debian sc3-plugins doesn't build ladspalist, to build type: cd opt/src/sc3-plugins/source/LadspaUGen gcc -ldl search.c ladspalist.c -o ladspalist -CAPS = http://quitte.de/dsp/caps.html, http://packages.debian.org/stretch/caps+CAPS = http://quitte.de/dsp/caps.html, http://packages.debian.org/stable/caps # 1767 C* ChorusI - Mono chorus/flanger > k: t (ms) (2.5 to 40)@@ -27,7 +24,7 @@ > y = mouseY KR 0 1 Linear 0.2 > n1 = range 2.5 40 (lfNoise2 'α' KR 0.2) > n2 = range 0.5 10 (lfNoise2 'β' KR 0.2)-> in ladspa 1 AR 1767 [n1,n2,0.5,0.5,x,y,s]+> in X.ladspa 1 AR 1767 [n1,n2,0.5,0.5,x,y,s] # 1769 C* Click - Metronome > k: model (0 to 3)@@ -39,7 +36,7 @@ > caps_1769_01 = > let x = roundE (mouseX KR 0 3 Linear 0.2) > y = mouseY KR 4 240 Linear 0.2-> in ladspa 1 AR 1769 [x,y,0.5,0.5]+> in X.ladspa 1 AR 1769 [x,y,0.5,0.5] # 1773 C* Eq10 - 10-band equaliser > k: 31 Hz (-48 to 24)@@ -60,7 +57,7 @@ > caps_1773_01 = > let s = soundIn 0 > n = map (\z -> range (-24) 48 (lfNoise2 z KR 0.2)) (enumN 10 'α')-> in ladspa 1 AR 1773 (n ++ [s]) * 0.5+> in X.ladspa 1 AR 1773 (n ++ [s]) * 0.5 # 1771 C* Saturate - Various static nonlinearities, 8x oversampled > k: mode (0 to 11)@@ -71,13 +68,13 @@ > caps_1771_01 = > let s = soundIn 0-> in ladspa 1 AR 1771 [1,0,0,s]+> in X.ladspa 1 AR 1771 [1,0,0,s] > caps_1771_02 = > let s = soundIn 0 > x = roundE (mouseX KR 0 11 Linear 0.2) > y = mouseY KR (-24) 72 Linear 0.2-> in ladspa 1 AR 1771 [x,y,0.0,s]+> in X.ladspa 1 AR 1771 [x,y,0.0,s] # 1772 C* Compress - Compressor and saturating limiter > k: measure (0 to 1)@@ -95,7 +92,7 @@ > let s = soundIn 0 > x = roundE (mouseX KR 0 2 Linear 0.2) > y = mouseY KR 0 1 Linear 0.2-> in ladspa 1 AR 1772 [0.5,x,y,0.5,0.5,0.1,0,s]+> in X.ladspa 1 AR 1772 [0.5,x,y,0.5,0.5,0.1,0,s] # 1779 C* Plate - Versatile plate reverb > k: bandwidth (0 to 1)@@ -110,7 +107,7 @@ > let s = soundIn 0 > x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> in ladspa 2 AR 1779 [x,y,0.5,0.5,s]+> in X.ladspa 2 AR 1779 [x,y,0.5,0.5,s] # 1788 C* Wider - Stereo image synthesis > k: pan (-1 to 1)@@ -123,7 +120,7 @@ > let s = soundIn 0 > x = mouseX KR (-1) 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> in ladspa 2 AR 1788 [x,y,s]+> in X.ladspa 2 AR 1788 [x,y,s] # 2586 C* PhaserII - Mono phaser > k: rate (0 to 1)@@ -138,7 +135,7 @@ > let s = soundIn 0 > x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> in ladspa 1 AR 2586 [0.3,x,0.5,y,0.8,s]+> in X.ladspa 1 AR 2586 [0.3,x,0.5,y,0.8,s] # 2588 C* Scape - Stereo delay with chromatic resonances > k: bpm (30 to 164)@@ -157,7 +154,7 @@ > y = roundE (mouseY KR 2 4 Linear 0.2) > n1 = lfNoise2 'α' KR 0.2 > n2 = lfNoise2 'β' KR 0.2-> in ladspa 2 AR 2588 [x,y,n1,n2,0.5,440,s]+> in X.ladspa 2 AR 2588 [x,y,n1,n2,0.5,440,s] # 2592 C* AmpVTS - Idealised guitar amplification > k: over (0 to 2)@@ -176,14 +173,14 @@ > caps_2592_def s = [1,0.25,0.75,0.5,1,0.25,1,0.75,0.75,0.25,0.5,s] -> caps_2592_01 = ladspa 1 AR 2592 (caps_2592_def (soundIn 0))+> caps_2592_01 = X.ladspa 1 AR 2592 (caps_2592_def (soundIn 0)) > caps_2592_02 = > let s = soundIn 0 > x = roundE (mouseX KR 0 8 Linear 0.2) > y = mouseY KR 0 1 Linear 0.2 > [n1,n2,n3,n4,n5,n6,n7,n8] = map (\z -> lfNoise2 z KR 0.2) (enumN 8 'α')-> in ladspa 1 AR 2592 [1,y,n1,n2,x,n3,n4,n5,n6,n7,n8,s]+> in X.ladspa 1 AR 2592 [1,y,n1,n2,x,n3,n4,n5,n6,n7,n8,s] # 2603 C* Spice - Not an exciter > k: lo.f (Hz) (50 to 400)@@ -198,7 +195,7 @@ > let s = soundIn 0 > x = mouseX KR 50 400 Exponential 0.2 > y = mouseY KR 400 5000 Exponential 0.2-> in ladspa 1 AR 2603 [x,0.5,0.5,y,0.5,s]+> in X.ladspa 1 AR 2603 [x,0.5,0.5,y,0.5,s] # 2609 C* EqFA4p - 4-band parametric eq > k: a.act (0 to 1)@@ -243,4 +240,4 @@ > ,f 'π' linLin (-24) 24 > ,0 > ,s]-> in ladspa 1 AR 2609 p * 0.5+> in X.ladspa 1 AR 2609 p * 0.5
Help/UGen/lag.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Lag"- Sound.SC3.UGen.DB.ugenSummary "Lag"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/lag2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Lag2"- Sound.SC3.UGen.DB.ugenSummary "Lag2"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/lag3.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Lag3"- Sound.SC3.UGen.DB.ugenSummary "Lag3"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/lagIn.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LagIn"- Sound.SC3.UGen.DB.ugenSummary "LagIn"- > import Sound.SC3 {- hsc3 -} Set frequency at control bus
Help/UGen/lagUD.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LagUD"- Sound.SC3.UGen.DB.ugenSummary "LagUD"- > import Sound.SC3 {- hsc3 -} lag pitch, slower down (5 seconds) than up (1 second)
Help/UGen/latch.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Latch"- Sound.SC3.UGen.DB.ugenSummary "Latch"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/latoocarfianC.help.lhs view
@@ -1,7 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "LatoocarfianC"- Sound.SC3.UGen.DB.ugenSummary "LatoocarfianC"--> import Sound.SC3+> import Sound.SC3 {- hsc3 -}+> import Sound.SC3.Common.Math.Noise {- hsc3 -} SC3 default initial parameters. @@ -19,3 +17,11 @@ > c = n2 * 0.5 + 1.5 > d = n3 * 0.5 + 1.5 > in latoocarfianC AR f a b c d 0.5 0.5 * 0.2++Haskell implementation of equation.++> latoocarfian_hs a b c d = map fst (iterate (latoocarfian_f a b c d) (0.5,0.5))++ import Sound.SC3.Plot {- hsc3-plot -}+ plotTable1 (take 600 (latoocarfian_hs 1.0 3.0 0.5 0.5))+ plot_ugen_nrt (600,1) 1.0 (latoocarfianC AR 600 1.0 3.0 0.5 0.5 0.5 0.5)
Help/UGen/leakDC.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "LeakDC"- > Sound.SC3.UGen.DB.ugenSummary "LeakDC"- > import Sound.SC3 > g_01 =
Help/UGen/lfBrownNoise0.help.lhs view
@@ -1,9 +1,7 @@- Sound.SC3.UGen.Help.viewSC3Help "LFBrownNoise2"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 =-> let n = lfBrownNoise0 'α' AR 10 0.05 0+> let n = X.lfBrownNoise0 'α' AR 10 0.05 0 > f = linExp n (-1) 1 64 9600 > in sinOsc AR f 0 * 0.1
Help/UGen/lfBrownNoise2.help.lhs view
@@ -1,13 +1,11 @@- Sound.SC3.UGen.Help.viewSC3Help "LFBrownNoise2"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let freq = 1000 > dev = mouseX KR 0 1 Linear 0.2 > dist = mouseY KR 0 5 Linear 0.2-> in lfBrownNoise2 'α' AR freq dev dist * 0.25+> in X.lfBrownNoise2 'α' AR freq dev dist * 0.25 Use as frequency control. @@ -15,17 +13,17 @@ > let freq = 8 > dev = mouseX KR 0 1 Linear 0.2 > dist = mouseY KR 0 5 Linear 0.2-> n1:n2:n3:_ = map (\z -> lfBrownNoise2 z KR freq dev dist) ['α'..]+> n1:n2:n3:_ = map (\z -> X.lfBrownNoise2 z KR freq dev dist) ['α'..] > o = impulse AR (range 6 24 n1) 0 > in lagUD o (range 0.0001 0.001 n2) (range 0.0001 0.001 n3) * 0.5 Use as pan & volume controls (external sound input) > f_01 s =-> let freq = range 0.5 2 (lfBrownNoise2 'α' KR 2 0.1 5)+> let freq = range 0.5 2 (X.lfBrownNoise2 'α' KR 2 0.1 5) > dev = mouseX KR 0.01 0.35 Linear 0.2 > dist = mouseY KR 0 5 Linear 0.2-> n1:n2:_ = map (\z -> lfBrownNoise2 z KR freq dev dist) ['β'..]+> n1:n2:_ = map (\z -> X.lfBrownNoise2 z KR freq dev dist) ['β'..] > in pan2 s (range (-0.75) 0.75 n1) 1 * range 0.01 0.5 n2 > g_03 = f_01 (soundIn 0)
Help/UGen/lfClipNoise.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFClipNoise"- Sound.SC3.UGen.DB.ugenSummary "LFClipNoise"- > import Sound.SC3 {- hsc3 -} > g_01 = lfClipNoise 'α' AR 1000 * 0.05
Help/UGen/lfCub.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "LFCub"- > Sound.SC3.UGen.DB.ugenSummary "LFCub"- > import Sound.SC3 > g_01 = lfCub AR (lfCub KR (lfCub KR 0.2 0 * 8 + 10) 0 * 400 + 800) 0 * 0.1
Help/UGen/lfGauss.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFGauss"- Sound.SC3.UGen.DB.ugenSummary "LFGauss"- > import Sound.SC3 {- hsc3 -} modulating duration
Help/UGen/lfNoise0.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFNoise0"- Sound.SC3.UGen.DB.ugenSummary "LFNoise0"- > import Sound.SC3 {- hsc3 -} > g_01 = lfNoise0 'α' AR 1000 * 0.05
Help/UGen/lfNoise1.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFNoise1"- Sound.SC3.UGen.DB.ugenSummary "LFNoise1"- > import Sound.SC3 {- hsc3 -} > g_01 = lfNoise1 'α' AR 1000 * 0.05
Help/UGen/lfNoise2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFNoise2"- Sound.SC3.UGen.DB.ugenSummary "LFNoise2"- > import Sound.SC3 {- hsc3 -} > g_01 = lfNoise2 'α' AR 1000 * 0.05
Help/UGen/lfPar.help.lhs view
@@ -1,4 +1,1 @@- Sound.SC3.UGen.Help.viewSC3Help "LFPar"- Sound.SC3.UGen.DB.ugenSummary "LFPar"- See lfCub
Help/UGen/lfPulse.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFPulse"- Sound.SC3.UGen.DB.ugenSummary "LFPulse"- Note: SC2 had no initial phase argument. > import Sound.SC3
Help/UGen/lfSaw.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFSaw"- Sound.SC3.UGen.DB.ugenSummary "LFSaw"- Note: SC2 did not have the initial phase argument. > import Sound.SC3
Help/UGen/lfTri.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFTri"- Sound.SC3.UGen.DB.ugenSummary "LFTri"- see <http://thread.gmane.org/gmane.comp.audio.supercollider.user/84719> > import Sound.SC3 {- hsc3 -}@@ -15,7 +12,7 @@ > g_03 = let f = lfTri KR 0.4 (mce [0..3]) * 200 + 400 > in mix (lfTri AR f 0 * 0.1)->+ > g_04 = let x = midiCPS (mouseX KR 20 72 Linear 0.2) > e = xLine KR 0.01 1 20 DoNothing > o1 = triAS 25 x * (1 - e)
Help/UGen/lfdClipNoise.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFDClipNoise"- Sound.SC3.UGen.DB.ugenSummary "LFDClipNoise"- > import Sound.SC3 {- hsc3 -} for fast x lfClipNoise frequently seems stuck, lfdClipNoise changes smoothly
Help/UGen/lfdNoise0.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LFDNoise0"- Sound.SC3.UGen.DB.ugenSummary "LFDNoise0"- > import Sound.SC3 {- hsc3 -} for fast x LFNoise frequently seems stuck, LFDNoise changes smoothly
Help/UGen/lfdNoise3.help.lhs view
@@ -1,13 +1,12 @@- Sound.SC3.UGen.Help.viewSC3Help "LFDNoise3"- Sound.SC3.UGen.DB.ugenSummary "LFDNoise3"- See lfdNoise0 Drawings - > import Sound.SC3 {- hsc3 -}- > import Sound.SC3.Plot {- hsc3-plot -}- > plot_ugen1 0.1 (lfdNoise3 'α' AR (xLine AR 1000 100 0.1 DoNothing))+> import Sound.SC3 {- hsc3 -}++> g_01 = lfdNoise3 'α' AR (xLine AR 1000 100 0.1 DoNothing)++ > Sound.SC3.Plot.plot_ugen1 0.1 g_01 
Help/UGen/linCongC.help.lhs view
@@ -1,7 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "LinCongC"- Sound.SC3.UGen.DB.ugenSummary "LinCongC"- > import Sound.SC3 {- hsc3 -}+> import Sound.SC3.Common.Math.Noise {- hsc3 -} Default SC3 initial parameters. @@ -20,3 +18,11 @@ > a = n1 * 0.5 + 1.4 > c = n2 * 0.1 + 0.1 > in linCongC AR f a c m 0 * 0.2++Haskell implementation of equation.++> linCong_hs a c m = iterate (linCong_f a c m) 0++ import Sound.SC3.Plot {- hsc3-plot -}+ plotTable1 (take 600 (linCong_hs 1.1 0.13 1.0))+ plot_ugen_nrt (600,1) 1.0 (linCongC AR 600 1.1 0.13 1.0 0.0)
Help/UGen/linExp.help.lhs view
@@ -1,16 +1,29 @@- > Sound.SC3.UGen.Help.viewSC3Help "LinExp"- > Sound.SC3.UGen.DB.ugenSummary "LinExp"- > import Sound.SC3 {- hsc3 -} +{var mod = SinOsc.kr(Line.kr(1, 10, 10)); SinOsc.ar(mod * 400 + 500) * 0.1}.play+ > g_01 =+> let mod = sinOsc KR (line KR 1 10 10 DoNothing) 0+> in sinOsc AR (mod * 400 + 500) 0 * 0.1++{var mod = SinOsc.kr(Line.kr(1, 10, 10)); SinOsc.ar(LinExp.kr(mod, -1,1, 100, 900)) * 0.1}.play++> g_02 =+> let mod = sinOsc KR (line KR 1 10 10 DoNothing) 0+> in sinOsc AR (linExp mod (-1) 1 100 900) 0 * 0.1++> g_03 = > let f = linExp (mouseX KR 0 1 Linear 0.2) 0 1 440 660 > in sinOsc AR f 0 * 0.1 The destination range may be k-rate. -> g_02 =+> g_04 = > let x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 220 440 Linear 0.2 > f = linExp x 0 1 y 660 > in sinOsc AR f 0 * 0.1++i-rate...++> g_05 = sinOsc AR (linExp (rand 'α' 0 1) 0 1 220 440) 0 * 0.1
Help/UGen/linLin.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LinLin"- Sound.SC3.UGen.DB.ugenSummary "LinLin"- > import Sound.SC3 {- hsc3 -} linLin is a function for writing a MulAdd UGen.
Help/UGen/linPan2.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "LinPan2"- > Sound.SC3.UGen.DB.ugenSummary "LinPan2"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/linRand.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LinRand"- Sound.SC3.UGen.DB.ugenSummary "LinRand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/linXFade2.help.lhs view
@@ -1,15 +1,13 @@- > Sound.SC3.UGen.Help.viewSC3Help "LinXFade2"- > Sound.SC3.UGen.DB.ugenSummary "LinXFade2"- > import Sound.SC3 {- hsc3 -} > g_01 = linXFade2 (saw AR 440) (sinOsc AR 440 0) (lfTri KR 0.1 0) 0.1->-> gen_cmp ty = ty (fSinOsc AR 800 0 * 0.2)-> (pinkNoise 'α' AR * 0.2)-> (fSinOsc KR 0.5 0)-> 1.0->-> g_03 = gen_cmp linXFade2->-> g_04 = gen_cmp xFade2++> f_01 ty = ty+> (fSinOsc AR 800 0 * 0.2)+> (pinkNoise 'α' AR * 0.2)+> (fSinOsc KR 0.5 0)+> 1.0++> g_02 = f_01 linXFade2++> g_03 = f_01 xFade2
Help/UGen/line.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Line"- Sound.SC3.UGen.DB.ugenSummary "Line"- Note: SC3 reorders the mul and add inputs to precede the doneAction input. > import Sound.SC3 {- hsc3 -}
Help/UGen/linen.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Linen"- Sound.SC3.UGen.DB.ugenSummary "Linen"- > import Sound.SC3 {- hsc3 -} > g_01 =@@ -9,6 +6,6 @@ > g_02 = > let x = mouseX KR (-1) 1 Linear 0.1-> y = mouseY KR 0.1 0.5 Linear 0.1+> y = mouseY KR 0.01 0.25 Linear 0.1 > e = linen x 1 y 1.0 DoNothing > in sinOsc AR 440 0 * e
Help/UGen/localBuf.help.lhs view
@@ -1,22 +1,21 @@- Sound.SC3.UGen.Help.viewSC3Help "LocalBuf"- Sound.SC3.UGen.DB.ugenSummary "LocalBuf"--> import Sound.SC3+> import Sound.SC3 {- hsc3 -} -Allocate a buffer local to the synthesis graph.+Allocate a buffer local to the synthesis graph, 1-channel, 2048 > g_01 =-> let n = whiteNoise 'α' AR-> b = localBuf 'β' 2048 1-> f = fft' b n+> let nc = 1+> nf = 2048+> buf = localBuf 'α' nc nf+> f = fft' buf (whiteNoise 'β' AR) > c = pv_BrickWall f (sinOsc KR 0.1 0 * 0.75) > in ifft' c * 0.1 Variant with two local buffers > g_02 =-> let n = uclone 'α' 2 (whiteNoise 'β' AR)-> b = uclone 'γ' 2 (localBuf 'δ' 2048 1)+> let dup (p,q) f = mce2 (f p) (f q)+> n = dup ('α','β') (\z -> whiteNoise z AR)+> b = dup ('γ','δ') (\z -> localBuf z 1 2048) > f = fft' b n > c = pv_BrickWall f (sinOsc KR (mce2 0.1 0.11) 0 * 0.75) > in ifft' c * 0.1@@ -24,24 +23,26 @@ Not clearing the buffer accesses old data, slowly overwrite data with noise > g_03 =-> let b = localBuf 'α' 2048 2+> let dup (p,q) f = mce2 (f p) (f q)+> b = localBuf 'α' 2 2048 > nf = bufFrames KR b > x = mouseX KR 1 2 Linear 0.2 > r = playBuf 2 AR b x 1 0 Loop DoNothing * 0.1 > wr p i = bufWr b (linLin p (-1) 1 0 nf) Loop i-> n = uclone 'β' 2 (whiteNoise 'γ' AR)+> n = dup ('β','γ') (\z -> whiteNoise z AR) > ph = lfNoise0 'δ' AR 530 > in mrg2 r (wr ph n) bufCombC needs no clearing, because the delay line is filled by the ugen > g_04 =-> let d = uclone 'α' 2 (dust 'β' AR 1)+> let dup (p,q) f = mce2 (f p) (f q)+> d = dup ('α','β') (\z -> dust z AR 1) > n = whiteNoise 'γ' AR > z = decay d 0.3 * n > l = xLine KR 0.0001 0.01 20 DoNothing > sr = sampleRate-> b = uclone 'δ' 2 (localBuf 'ε' sr 2)+> b = dup ('δ','ε') (\z -> localBuf z 2 sr) > in bufCombC b z l 0.2 asLocalBuf combines localBuf and setBuf
Help/UGen/localIn.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LocalIn"- Sound.SC3.UGen.DB.ugenSummary "LocalIn"- > import Sound.SC3 {- hsc3 -} > noise_signal =@@ -25,7 +22,7 @@ > tape_delay dt fb z = > let a = amplitude KR (mix z) 0.01 0.01-> z' = z * (a >* 0.02)+> z' = z * (a >** 0.02) > l0 = localIn 2 AR 0 > l1 = onePole l0 0.4 > l2 = onePole l1 (-0.08)
Help/UGen/localOut.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LocalOut"- Sound.SC3.UGen.DB.ugenSummary "LocalOut"- > import Sound.SC3 {- hsc3 -} Resonator, must subtract blockSize for correct tuning
Help/UGen/logistic.help.lhs view
@@ -1,11 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "Logistic"- Sound.SC3.UGen.DB.ugenSummary "Logistic"- > import Sound.SC3 {- hsc3 -} SC3 default parameters -> g_01 = logistic AR 3 1000 0.5+> g_00 = logistic AR 3 1000 0.5++> g_01 = logistic AR 3.95 sampleRate 0.5 Onset of chaos
Help/UGen/loopBuf.help.lhs view
@@ -1,15 +1,14 @@- Sound.SC3.UGen.Help.viewSC3Help "LoopBuf"- Sound.SC3.UGen.DB.ugenSummary "LoopBuf"+ mapM_ Sound.SC3.UGen.DB.ugenSummary ["LoopBuf","PlayBuf"] > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as E {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} Read audio file into memory -> ld b = do-> let fn = "/home/rohan/opt/src/supercollider/sounds/a11wlk01.wav"-> withSC3 (async (b_allocRead b fn 0 0))+> fn_01 = "/home/rohan/rd/j/2019-04-21/FAIRLIGHT/IIX/REEDS/clarmdhi.snd" +> ld fn b = withSC3 (async (b_allocRead b fn 0 0))+ Simple sampler instrument > lb0 =@@ -20,27 +19,30 @@ > gt = control KR "gate" 1 > lr = control KR "loopRel" 0 > sp = control KR "startPos" 0-> sl = control KR "startLoop" 0-> el = control KR "endLoop" 0+> sl = control KR "startLoop" 0 -- FRAME+> el = control KR "endLoop" 0 -- FRAME > ip = control KR "ipol" 2+> am = control KR "amp" 1 > rt' = lag rt gl * bufRateScale KR bf > e = let d = envADSR 0.1 0.2 1 2 1 (EnvNum (-4)) 0 > in envGen AR gt 1 0 1 RemoveSynth d-> s = E.loopBuf 1 AR bf rt' (gt + lr) sp sl el ip-> in out ou (s * e)+> s = X.loopBuf 1 AR bf rt' (gt + lr) sp sl el ip+> in out ou (s * e * am) > lb0s :: Synthdef > lb0s = synthdef "lb0" lb0 - ld 0+ ld fn_01 0 withSC3 (async (d_recv lb0s)) import Sound.OSC {- hosc -} let send = sendMessage let run = withSC3 . send - run (s_new "lb0" 3000 AddToTail 1 [("bufnum",0),("startLoop",5000),("endLoop",15000)])+ audition (sinOsc AR (midiCPS 69) 0 * 0.2)+ run (s_new "lb0" 3000 AddToTail 1 [("bufnum",0),("amp",0.1),("startLoop",5376),("endLoop",5504)]) + run (n_set1 3000 "amp" 0.25) -- louder run (n_set1 3000 "rate" (-1)) -- backwards run (n_set1 3000 "rate" 1) -- forwards run (n_set 3000 [("startLoop",11000),("endLoop",13000)]) -- change loop points
Help/UGen/lorenzL.help.lhs view
@@ -1,7 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "LorenzL"- Sound.SC3.UGen.DB.ugenSummary "LorenzL"- > import Sound.SC3 {- hsc3 -}++Default parameters++> g_00 = lorenzL AR (sampleRate / 2) 10 28 2.667 0.05 0.1 0 0 * 0.2 Vary frequency
Help/UGen/lorenzTrig.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "LorenzTrig"- Sound.SC3.UGen.DB.ugenSummary "LorenzTrig"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > f_01 minfreq maxfreq s b = > let r = 28@@ -10,7 +7,7 @@ > x0 = 0.090879182417163 > y0 = 2.97077458055 > z0 = 24.282041054363-> in lorenzTrig AR minfreq maxfreq s r b h x0 y0 z0+> in X.lorenzTrig AR minfreq maxfreq s r b h x0 y0 z0 > f_02 = f_01 11025 44100
Help/UGen/loudness.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Loudness"- Sound.SC3.UGen.DB.ugenSummary "Loudness"- > import Sound.SC3 {- hsc3 -} Assume hop of half fftsize
Help/UGen/lpcAnalyzer.help.lhs view
@@ -1,21 +1,18 @@- > Sound.SC3.UGen.Help.viewSC3Help "LPCAnalyzer"- > Sound.SC3.UGen.DB.ugenSummary "LPCAnalyzer"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 256 50 0 0.999 0+> g_01 = X.lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 256 50 0 0.999 0 -> g_02 = lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 256 50 0 0.999 1+> g_02 = X.lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 256 50 0 0.999 1 > g_03 = > let x = mouseX KR 1 128 Linear 0.2-> in lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 128 x 0 0.999 0+> in X.lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 128 x 0 0.999 0 > g_04 = > let x = mouseX KR 1 128 Linear 0.2-> in lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 1024 x 0 0.999 1+> in X.lpcAnalyzer (soundIn 0) (impulse AR 440 0 * 0.2) 1024 x 0 0.999 1 > g_05 = > let x = mouseX KR 1 256 Linear 0.2-> in lpcAnalyzer (soundIn 0) (whiteNoise 'α' AR * 0.1) 256 x 0 0.999 0+> in X.lpcAnalyzer (soundIn 0) (whiteNoise 'α' AR * 0.1) 256 x 0 0.999 0
Help/UGen/lpcSynth.help.lhs view
@@ -1,31 +1,29 @@- Sound.SC3.UGen.Help.viewSC3Help "LPCSynth"- Sound.SC3.UGen.DB.ugenSummary "LPCSynth"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > import qualified Sound.SC3.Data.LPC as LPC {- hsc3-data -} -> 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 (LPC.lpcAnalysisDuration (LPC.lpcHeader lpc))-> ptr = lfSaw AR f 1 * 0.5 + 0.5-> [cps, rms, err] = mceChannels (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+> lpc_instr buf noise lpc =+> let x = mouseX KR 0.01 1.5 Linear 0.2+> y = mouseY KR 0.25 2.0 Linear 0.2+> f = x / constant (LPC.lpcAnalysisDuration (LPC.lpcHeader lpc))+> ptr = lfSaw AR f 1 * 0.5 + 0.5+> [cps, rms, err] = mceChannels (X.lpcVals AR buf ptr)+> nh = floorE (22000 / cps)+> voc = blip AR (cps * y) nh * (1 - err)+> in X.lpcSynth buf (voc + (noise * err)) ptr * rms > fn_01 = "/home/rohan/sw/hsc3-data/data/lpc/fate.lpc"+> fn_02 = "/home/rohan/uc/invisible/clarity/lpc/z.01.lpc" -> au_01 lpc = do+> au_01 lpc noise = do > let d = map realToFrac (LPC.lpcSC3 lpc) > _ <- async (b_alloc 10 (length d) 1) > mapM_ sendMessage (b_setn1_segmented 512 10 0 d)-> let s = lpc_instr 10 (pinkNoise 'α' AR) lpc+> let s = lpc_instr 10 noise lpc > play (out 0 s) - lpc <- LPC.lpcRead fn_01- withSC3 (au_01 lpc)+ lpc <- LPC.lpc_read_binary LPC.BigEndian fn_01+ lpc <- LPC.lpc_read_text fn_02+ withSC3 (au_01 lpc (whiteNoise 'α' AR * 10))
Help/UGen/lpf.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "LPF"- > Sound.SC3.UGen.DB.ugenSummary "LPF"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/lpz2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "LPZ2"- Sound.SC3.UGen.DB.ugenSummary "LPZ2"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/lti.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "LTI"- Sound.SC3.UGen.DB.ugenSummary "LTI"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> gr_01 =+> g_01 = > let a = [0.02,-0.01] > b = [1,0.7,0,0,0,0,-0.8,0,0,0,0,0.9,0,0,0,-0.5,0,0,0,0,0,0,0.25,0.1,0.25] > z = pinkNoise 'α' AR * 0.1-> in lti AR z (asLocalBuf 'β' a) (asLocalBuf 'γ' b)+> in X.lti AR z (asLocalBuf 'β' a) (asLocalBuf 'γ' b)
Help/UGen/max.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.max"- > :t max- > import Sound.SC3 {- hsc3 -} q modulates and envelopes p
Help/UGen/membraneCircle.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MembraneCircle"- Sound.SC3.UGen.DB.ugenSummary "MembraneCircle"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/metro.help.lhs view
@@ -1,18 +1,15 @@- Sound.SC3.UGen.Help.viewSC3Help "Metro"- Sound.SC3.UGen.DB.ugenSummary "Metro"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = metro AR 60 1+> g_01 = X.metro AR 60 1 > g_02 = > let b = xLine KR 60 120 5 DoNothing-> m = metro KR b 1+> m = X.metro KR b 1 > o = sinOsc AR 440 0 * 0.1 > in decay m 0.2 * o > g_03 = > let b = range 30 240 (lfNoise2 'α' KR 0.2) > n = dseq 'β' dinf (mce [1,0.25,0.5,0.25])-> in decay (metro KR b n) 0.2 * sinOsc AR 440 0 * 0.1+> in decay (X.metro KR b n) 0.2 * sinOsc AR 440 0 * 0.1
Help/UGen/midEQ.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MidEQ"- Sound.SC3.UGen.DB.ugenSummary "MidEQ"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/mix.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Mix"- Sound.SC3.UGen.DB.ugenSummary "Mix"- > import Sound.SC3 {- hsc3 -} optimized summation (see sum_opt), ie. Sum3
Help/UGen/mod.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.%"- > :t modE- > import Sound.SC3 {- hsc3 -}->+ > g_01 = fSinOsc AR 100 4 `modE` 1 * 0.1
Help/UGen/moogFF.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MoogFF"- Sound.SC3.UGen.DB.ugenSummary "MoogFF"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/moogLadder.help.lhs view
@@ -1,15 +1,12 @@- Sound.SC3.UGen.Help.viewSC3Help "MoogLadder"- Sound.SC3.UGen.DB.ugenSummary "MoogLadder"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let o = mix (lfSaw AR (mce2 120 180) 0 * 0.33) > cf = linExp (lfCub KR 0.1 (0.5 * pi)) (-1) 1 180 8500-> in moogLadder o cf 0.75+> in X.moogLadder o cf 0.75 > g_02 = > let n = dust 'α' AR 3-> in moogLadder n 2000 (mouseY KR 0 1 Linear 0.2)+> in X.moogLadder n 2000 (mouseY KR 0 1 Linear 0.2)
Help/UGen/moogVCF.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MoogVCF"- Sound.SC3.UGen.DB.ugenSummary "MoogVCF"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/mostChange.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "MostChange"- > Sound.SC3.UGen.DB.ugenSummary "MostChange"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = lfNoise0 'α' KR 1 > x = mouseX KR 200 300 Linear 0.1
Help/UGen/mouseButton.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MouseButton"- Sound.SC3.UGen.DB.ugenSummary "MouseButton"- > import Sound.SC3 {- hsc3 -} As amplitude envelope
Help/UGen/mouseX.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MouseX"- Sound.SC3.UGen.DB.ugenSummary "MouseX"- > import Sound.SC3 > e_01 = map from_warp [Linear,Exponential]
Help/UGen/mouseY.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "MouseY"- > Sound.SC3.UGen.DB.ugenSummary "MouseY"- > import Sound.SC3 {- hsc3 -} Frequency at X axis and amplitude at Y axis.
Help/UGen/mrg2.help.lhs view
@@ -1,24 +1,30 @@-> :t mrg2--> import Sound.SC3+> import Sound.SC3 {- hsc3 -} 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) +> g_01 =+> let l = out 0 (sinOsc AR 300 0 * 0.1)+> r = out 1 (sinOsc AR 900 0 * 0.1)+> in 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)) +> g_02 =+> let l = sinOsc AR 300 0 * 0.1+> r = out 1 (sinOsc AR 900 0 * 0.1)+> in 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)) +> g_03 =+> let l = sinOsc AR (mce2 300 400) 0 * 0.1+> r = out 1 (sinOsc AR 900 0 * 0.1)+> in 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))++> g_04 =+> let l = sinOsc AR (mce2 300 400) 0 * 0.1+> r = out 1 (sinOsc AR 900 0 * 0.1)+> in out 0 (mrg2 l r + mrg2 l r)
Help/UGen/mul.help.lhs view
@@ -15,3 +15,9 @@ > let p = sinOsc AR (xLine KR 100 1001 10 DoNothing) 0 > q = syncSaw AR 100 200 > in p * q * 0.25++Optimises identity++> g_04 = sinOsc AR 440 0 * 1 / 10++> g_05 = 1 * sinOsc AR 440 0 / 10
Help/UGen/mulAdd.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "MulAdd"- Sound.SC3.UGen.DB.ugenSummary "MulAdd"- > import Sound.SC3 {- hsc3 -} > g_01 = mulAdd (sinOsc AR 440 0) 0.1 0.05@@ -10,3 +7,27 @@ > g_02 = sinOsc AR 440 0 * 0.1 + 0.05 > g_03 = 0.05 + sinOsc AR 440 0 * 0.1++ > putStrLn $ unlines (map synthstat [g_01,g_02,g_03])++The order of the multiplier inputs is significant regards multi-rate inputs?+sclang re-orders these if required.+g_04 CRASHES scsynth.++> g_04 = mulAdd 0.1 (sinOsc AR 440 0) 0.05++ {MulAdd(0.1,SinOsc.ar(440,0),0.05)}.draw++> g_05 = 0.05 + 0.1 * sinOsc AR 440 0++ {0.05 + (0.1 * SinOsc.ar(440,0))}.draw++NOTE: mulAdd with I-RATE at input 0 and K-RATE thereafter CRASHES++> g_06 = sinOsc AR (mulAdd (control IR "x" 110) (control KR "y" 2) (control IR "z" 110)) 0 * 0.1++all AR inputs optimise ordinarily++> g_07 = (sinOsc AR 440 0 * sinOsc AR 441 0 + sinOsc AR 442 0) * 0.1++> g_08 = (sinOsc AR 440 0 + sinOsc AR 441 0 * sinOsc AR 442 0) * 0.1
Help/UGen/mzPokey.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "MZPokey"- Sound.SC3.UGen.DB.ugenSummary "MZPokey"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.HW.External.F0 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.HW.External.F0 as F0 {- hsc3 -} > import qualified Sound.SC3.Lang.Math as M > bits_to_int :: String -> Int@@ -13,8 +10,8 @@ > b = bits_to_ugen > bln = line KR 0 255 5 RemoveSynth-> mz1 i j = mzPokey i j 0 0 0 0 0 0 0-> mz1c i j c = mzPokey i j 0 0 0 0 0 0 c+> mz1 i j = F0.mzPokey i j 0 0 0 0 0 0 0+> mz1c i j c = F0.mzPokey i j 0 0 0 0 0 0 c > g_01 = mz1 bln (b "00001111") > g_02 = mz1 bln (b "00101111")@@ -22,13 +19,13 @@ > g_04 = mz1c bln (b "10101111") (b "00000001") > g_05 = mz1c bln (b "10101111") (b "01000001") -> mz2c i j p q c = mzPokey i j p q 0 0 0 0 c+> mz2c i j p q c = F0.mzPokey i j p q 0 0 0 0 c > bX = mouseX KR 0 255 Linear 0.1 > bY = mouseY KR 0 255 Linear 0.1 > g_06 = mz2c bX (b "10101010") bY (b "10101010") (b "00000001") -> mz4pc (f1,c1) (f2,c2) (f3,c3) (f4,c4) c = mzPokey f1 c1 f2 c2 f3 c3 f4 c4 c+> mz4pc (f1,c1) (f2,c2) (f3,c3) (f4,c4) c = F0.mzPokey f1 c1 f2 c2 f3 c3 f4 c4 c > g_07 = > let v1 = (bX,b "11000111")
Help/UGen/nRand.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "NRand"- Sound.SC3.UGen.DB.ugenSummary "NRand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/nestedAllpassC.help.lhs view
@@ -1,19 +1,16 @@- Sound.SC3.UGen.Help.viewSC3Help "NestedAllpassL"- Sound.SC3.UGen.DB.ugenSummary "NestedAllpassL"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > nestedAllpassL_def s = > let d1 = 0.036 > d2 = 0.030-> in nestedAllpassL s d1 d1 0.08 d2 d2 0.3+> in X.nestedAllpassL s d1 d1 0.08 d2 d2 0.3 > doubleNestedAllpassL_def s = > let d1 = 0.0047 > d2 = 0.022 > d3 = 0.0084-> in doubleNestedAllpassL s d1 d1 0.15 d2 d2 0.25 d3 d3 0.3+> in X.doubleNestedAllpassL s d1 d1 0.15 d2 d2 0.25 d3 d3 0.3 > f_01 nc s = > let fb = localIn nc AR 0@@ -28,9 +25,9 @@ > f_02 nc s = > let fb = localIn nc AR 0 > lp = lpf s 6000-> ap1 = doubleNestedAllpassL (lp + (0.5 * fb)) 0.0047 0.0047 0.25 0.0083 0.0083 0.35 0.022 0.022 0.45-> ap2 = delayL (nestedAllpassL (delayL ap1 0.05 0.05) 0.03 0.03 0.25952 0.03 0.03 0.3) 0.067 0.067-> ap3 = nestedAllpassL (lp + (delayL ap2 0.015 0.015 * 0.4)) 0.0292 0.0292 0.25 0.0098 0.0098 0.35+> ap1 = X.doubleNestedAllpassL (lp + (0.5 * fb)) 0.0047 0.0047 0.25 0.0083 0.0083 0.35 0.022 0.022 0.45+> ap2 = delayL (X.nestedAllpassL (delayL ap1 0.05 0.05) 0.03 0.03 0.25952 0.03 0.03 0.3) 0.067 0.067+> ap3 = X.nestedAllpassL (lp + (delayL ap2 0.015 0.015 * 0.4)) 0.0292 0.0292 0.25 0.0098 0.0098 0.35 > revout = sum_opt [ap1,ap2,ap3] * 0.5 > locout = localOut (bpf (revout * 0.4) 1000 0.5) > in mrg2 revout locout@@ -40,8 +37,8 @@ > lp = lpf s 4000 > ap1 = allpassL (lp + (0.5 * fb)) 0.008 0.008 0.0459 > ap2 = delayL (allpassL ap1 0.012 0.012 0.06885) 0.004 0.004-> ap3 = delayL (nestedAllpassL (delayL ap2 0.017 0.017) 0.025 0.025 0.5 0.062 0.062 0.25) 0.031 0.031-> ap4 = doubleNestedAllpassL (delayL ap3 0.003 0.003) 0.120 0.120 0.5 0.076 0.076 0.25 0.030 0.030 0.25+> ap3 = delayL (X.nestedAllpassL (delayL ap2 0.017 0.017) 0.025 0.025 0.5 0.062 0.062 0.25) 0.031 0.031+> ap4 = X.doubleNestedAllpassL (delayL ap3 0.003 0.003) 0.120 0.120 0.5 0.076 0.076 0.25 0.030 0.030 0.25 > revout = sum_opt [ap4 * 0.8,ap3 * 0.8,ap2 * 1.5] > locout = localOut (bpf (revout * 0.4) 1000 0.5) > in mrg2 revout locout
Help/UGen/nhHall.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "NHHall"- Sound.SC3.UGen.DB.ugenSummary "NHHall"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let in1 = soundIn 0 > in2 = soundIn 1 > rt60 = mouseX KR 0.1 10.0 Linear 0.1-> in nhHall in1 in2 rt60 0.5 200 0.5 4000 0.5 0.5 0.5 0.2 0.3+> in X.nhHall in1 in2 rt60 0.5 200 0.5 4000 0.5 0.5 0.5 0.2 0.3
+ Help/UGen/nodeId.help.lhs view
@@ -0,0 +1,8 @@+> import Sound.SC3 {- hsc3 -}++NodeId, except that negative nodeId are not reported.++> g_01 = sinOsc AR (mce2 (-100) (nodeID IR * 100)) 0 * 0.1++ audition_at (-1,AddToHead,1,[]) g_01+ audition_at (8,AddToHead,1,[]) g_01
Help/UGen/numAudioBuses.help.lhs view
@@ -1,3 +0,0 @@- Sound.SC3.UGen.Help.viewSC3Help "NumAudioBuses"- Sound.SC3.UGen.DB.ugenSummary "NumAudioBuses"-
Help/UGen/numBuffers.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "NumBuffers"- Sound.SC3.UGen.DB.ugenSummary "NumBuffers"- > import Sound.SC3 {- hsc3 -} the number of audio buffers available at the server (by default 1024)
Help/UGen/numControlBuses.help.lhs view
@@ -1,2 +0,0 @@- Sound.SC3.UGen.Help.viewSC3Help "NumControlBuses"- Sound.SC3.UGen.DB.ugenSummary "NumControlBuses"
Help/UGen/numInputBuses.help.lhs view
@@ -1,2 +0,0 @@- Sound.SC3.UGen.Help.viewSC3Help "NumInputBuses"- Sound.SC3.UGen.DB.ugenSummary "NumInputBuses"
Help/UGen/numOutputBuses.help.lhs view
@@ -1,2 +0,0 @@- Sound.SC3.UGen.Help.viewSC3Help "NumOutputBuses"- Sound.SC3.UGen.DB.ugenSummary "NumOutputBuses"
Help/UGen/numRunningSynths.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "NumRunningSynths"- Sound.SC3.UGen.DB.ugenSummary "NumRunningSynths"- > import Sound.SC3 {- hsc3 -} each concurrent audition increases oscillator frequency
Help/UGen/offsetOut.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "OffsetOut"- Sound.SC3.UGen.DB.ugenSummary "OffsetOut"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/UGen/onsets.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Onsets"- > Sound.SC3.UGen.DB.ugenSummary "Onsets"- > import Sound.SC3 {- hsc3 -} > withSC3 (async (b_alloc 10 512 1))
Help/UGen/osc.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Osc"- > Sound.SC3.UGen.DB.ugenSummary "Osc"- > import Sound.SC3 {- hsc3 -} Allocate and generate wavetable buffer
Help/UGen/osc1.help.lhs view
@@ -1,9 +1,18 @@-> import Sound.SC3+> import Sound.OSC {- hosc -}+> import Sound.SC3 {- hsc3 -} -> withSC3 (let {z = [Normalise,Wavetable,Clear]-> ;a = [[13,8,55,34,5,21,3,1,2],[55,34,1,3,2,13,5,8,21]]-> ;f (b,l) = do {_ <- async (b_alloc b 512 1)-> ;send (b_gen_sine1 b z (map recip l))}}-> in mapM_ f (zip [10,11] a))+> f_01 (b,l) = do+> let z = [Normalise,Wavetable,Clear]+> _ <- async (b_alloc b 512 1)+> sendMessage (b_gen_sine1 b z (map recip l)) -> audition (out 0 (lfSaw AR (mce2 110 164) 0 * 0.1 * osc1 AR (mce2 10 11) 4 RemoveSynth))+> t_01 :: Transport m => m ()+> t_01 = do+> let a = [[13,8,55,34,5,21,3,1,2],[55,34,1,3,2,13,5,8,21]]+> mapM_ f_01 (zip [10,11] a)++ withSC3 t_01++> g_01 = lfSaw AR (mce2 110 164) 0 * 0.1 * osc1 AR (mce2 10 11) 4 RemoveSynth++ audition g_01
+ Help/UGen/oteyPianoStrings.help.lhs view
@@ -0,0 +1,13 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let k = control KR+> freq = k "freq" 440+> gate_ = k "gate" 1+> amp = k "amp" 0.5+> rho = k "rho" 1+> env = envGen AR gate_ 1 0 1 RemoveSynth (envASR 0 1 0.1 EnvLin)+> loc = linLin freq (midiCPS 36) (midiCPS 90) (-0.75) 0.75+> s = X.oteyPianoStrings AR freq amp 0 0.35 2 4 8 1 7e-2 1.4 (-4) 4 rho 1 1 0 1 0.2 1 1 0.142 1 3e-4 1+> in X.oteySoundBoard AR (pan2 (s * env) loc 0.1) 20 20 0.8
+ Help/UGen/oteySoundBoard.help.lhs view
@@ -0,0 +1,13 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let loc = mouseX KR (-1) 1 Linear 0.2+> in X.oteySoundBoard AR (pan2 (soundIn 0) loc 0.1) 20 20 0.8++> g_02 =+> let d = dust 'α' AR 1+> n = whiteNoise 'β' AR+> i = decay (d * 0.5) 0.2 * n+> loc = mouseX KR (-1) 1 Linear 0.2+> in X.oteySoundBoard AR (pan2 i loc 0.1) 20 20 0.8
Help/UGen/out.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Out"- Sound.SC3.UGen.DB.ugenSummary "Out"- > import Sound.SC3 {- hsc3 -} Oscillators at outputs zero (330) and one (331)
Help/UGen/packFFT.help.lhs view
@@ -1,22 +1,19 @@-> Sound.SC3.UGen.Help.viewSC3Help "PackFFT"-> Sound.SC3.UGen.DB.ugenSummary "PackFFT"--> import Sound.SC3+> import Sound.SC3 {- hsc3 -} -> withSC3 (async (b_alloc 10 512 1))+> g_01 =+> let b = localBuf 'α' 512 1+> n = 100+> square a = a * a+> r1 z = range 0 1 (fSinOsc KR (expRand (z,'β') 0.1 1) 0)+> m1 = map r1 (id_seq n 'γ')+> m2 = zipWith (*) m1 (map square [1.0, 0.99 ..])+> r2 z = lfPulse KR (2 ** iRand (z,'δ') (-3) 5) 0 0.3+> i = map r2 (id_seq n 'ε')+> m3 = zipWith (*) m2 i+> p = replicate n 0.0+> c1 = fft' b (fSinOsc AR 440 0)+> c2 = packFFT c1 512 0 (constant n - 1) 1 (packFFTSpec m3 p)+> s = ifft' c2+> in mce2 s s -> let {n = 100-> ;square a = a * a-> ;r1 = let f = expRand 'α' 0.1 1-> in linLin (fSinOsc KR f 0) (-1) 1 0 1-> ;m1 = uclone' 'β' n r1-> ;m2 = zipWith (*) m1 (map square [1.0, 0.99 ..])-> ;r2 = let r = iRand 'γ' (-3) 5-> in lfPulse KR (2 ** r) 0 0.3-> ;i = uclone' 'δ' n r2-> ;m3 = zipWith (*) m2 i-> ;p = replicate n 0.0-> ;c1 = fft' 10 (fSinOsc AR 440 0)-> ;c2 = packFFT c1 512 0 (constant n - 1) 1 (packFFTSpec m3 p)-> ;s = ifft' c2}-> in audition (out 0 (mce [s,s]))+ > putStrLn $ synthstat_concise g_01
Help/UGen/pan2.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Pan2"- > Sound.SC3.UGen.DB.ugenSummary "Pan2"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/panAz.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PanAz"- > Sound.SC3.UGen.DB.ugenSummary "PanAz"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/partConv.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "PartConv"- Sound.SC3.UGen.DB.ugenSummary "PartConv"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/UGen/pause.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Pause"- > Sound.SC3.UGen.DB.ugenSummary "Pause"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let f = control KR "f" 440 > g = control KR "g" 1
Help/UGen/pauseSelf.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PauseSelf"- > Sound.SC3.UGen.DB.ugenSummary "PauseSelf"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/pauseSelfWhenDone.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PauseSelfWhenDone"- > Sound.SC3.UGen.DB.ugenSummary "PauseSelfWhenDone"- > import Sound.SC3 {- hsc3 -} using PauseSynth done action@@ -12,12 +9,14 @@ Run paused node (assuming no intermediate node is created). - > withSC3 (send (n_run [(-1, True)]))+ > withSC3 (Sound.OSC.sendMessage (n_run [(-1, True)])) +using pauseSelfWhenDone UGen+ > g_02 = > let x = mouseX KR (-1) 1 Linear 0.1 > e = linen x 1 0.1 1 DoNothing > o = sinOsc AR 440 0 * e > in mrg [o,pauseSelfWhenDone e] - > withSC3 (send (n_run [(-1, True)]))+ > withSC3 (Sound.OSC.sendMessage (n_run [(-1, True)]))
Help/UGen/peak.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Peak"- > Sound.SC3.UGen.DB.ugenSummary "Peak"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let t = dust 'α' AR 20 > r = impulse AR 0.4 0
Help/UGen/perlin3.help.lhs view
@@ -1,10 +1,7 @@- Sound.SC3.UGen.Help.viewSC3Help "Perlin3"- Sound.SC3.UGen.DB.ugenSummary "Perlin3"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let x = integrator (k2a (mouseX KR 0 0.1 Linear 0.2)) 1.0 > y = integrator (k2a (mouseY KR 0 0.1 Linear 0.2)) 1.0-> in perlin3 AR x y 0+> in X.perlin3 AR x y 0
Help/UGen/phasor.help.lhs view
@@ -1,7 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Phasor"- Sound.SC3.UGen.DB.ugenSummary "Phasor"--> import Prelude hiding ((<*)) > import Sound.SC3 phasor controls sine frequency, end frequency matches second sine.@@ -25,8 +21,8 @@ Load sound file to buffer zero - let fn = "/home/rohan/data/audio/pf-c5.aif"- withSC3 (async (b_allocRead 0 fn 0 0))+ > let fn = "/home/rohan/data/audio/pf-c5.aif"+ > withSC3 (async (b_allocRead 0 fn 0 0)) Phasor as phase input to bufRd @@ -37,7 +33,7 @@ Allocate and generate (non-wavetable) buffer at index one (see osc for wavetable oscillator) - withSC3 (mapM_ maybe_async [b_alloc 1 256 1,b_gen_sine1 1 [Normalise,Clear] [1]])+ > withSC3 (mapM_ maybe_async [b_alloc 1 256 1,b_gen_sine1 1 [Normalise,Clear] [1]]) Audio rate phasor oscillator as phase input to bufRd @@ -54,8 +50,8 @@ > g_04 = > let impulse_reset freq reset = > let ph = phasor AR reset (freq / sampleRate) 0 1 0-> in hpz1 ph <* 0-> x = mouseX KR 0 1 Linear 0.2 >* 0.5+> in hpz1 ph <** 0+> x = mouseX KR 0 1 Linear 0.2 >** 0.5 > ck = impulse AR 3 0 > im = impulse_reset 3 x > x' = sinOsc AR 440 0 * x * 0.05
Help/UGen/pinkNoise.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PinkNoise"- > Sound.SC3.UGen.DB.ugenSummary "PinkNoise"- > import Sound.SC3 {- hsc3 -} audition . (out 0) . (* 0.05) =<< pinkNoiseM AR
Help/UGen/pitch.help.lhs view
@@ -1,5 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "Pitch"- Sound.SC3.UGen.DB.ugenSummary "Pitch"+ + > import Sound.SC3 {- hsc3 -} @@ -11,11 +11,14 @@ > f = pitch s 440 60 4000 100 16 7 0.02 0.5 1 0 > in mce [s, sinOsc AR (mceChannel 0 f / 2) 0 * a] +Live input tracking, carelessly+ > g_02 =-> let s = soundIn 0-> a = amplitude KR s 0.1 0.1-> f = pitch s 440 60 4000 100 16 7 0.02 0.5 1 0-> in mce [s * 0.1, sinOsc AR (mceChannel 0 f) 0 * a]+> let s = hpf (soundIn 0) 90+> a = lag (amplitude KR s 0.01 0.01) 0.2+> [f,_] = mceChannels (pitch s 440 60 4000 100 16 1 0.02 0.5 1 0)+> fq = midiCPS (roundE (lag (cpsMIDI f) 0.1))+> in mce [s * 0.1, lfTri AR f 0 * lag a 0.2 * lag (f >** 90 * f <** 500) 0.2] Comparison of input frequency (x) and tracked oscillator frequency (f). Output is printed to the console by scsynth.
Help/UGen/pitchShift.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PitchShift"- > Sound.SC3.UGen.DB.ugenSummary "PitchShift"- > import Sound.SC3 {- hsc3 -} > gr_01 =
Help/UGen/playBuf.help.lhs view
@@ -1,34 +1,33 @@- > Sound.SC3.UGen.Help.viewSC3Help "PlayBuf"- > Sound.SC3.UGen.DB.ugenSummary "PlayBuf"- > import Sound.SC3 {- hsc3 -} Load sound file to buffer zero (single channel file required for examples) -> f_01 = "/home/rohan/data/audio/pf-c5.aif"+> fn_01 = "/home/rohan/data/audio/pf-c5.aif" -> m_01 = (b_allocRead 0 f_01 0 0)+> m_01 = (b_allocRead 0 fn_01 0 0) withSC3 (async m_01) Play once only. -> gr_01 = playBuf 1 AR 0 (bufRateScale KR 0) 1 0 NoLoop RemoveSynth+> f_01 b = playBuf 1 AR b (bufRateScale KR b) 1 0 NoLoop RemoveSynth +> g_01 = f_01 28 -- 0 28+ Play in infinite loop. -> gr_02 = playBuf 1 AR 0 (bufRateScale KR 0) 1 0 Loop DoNothing+> g_02 = playBuf 1 AR 0 (bufRateScale KR 0) 1 0 Loop DoNothing Trigger playback at each pulse. -> gr_03 =+> g_03 = > let t = impulse KR 2 0 > s = bufRateScale KR 0 > in playBuf 1 AR 0 s t 0 NoLoop DoNothing Trigger playback at each pulse (diminishing intervals). -> gr_04 =+> g_04 = > let f = xLine KR 0.1 100 10 RemoveSynth > t = impulse KR f 0 > s = bufRateScale KR 0@@ -36,13 +35,13 @@ Loop playback, accelerating pitch. -> gr_05 =+> g_05 = > let r = xLine KR 0.1 100 60 RemoveSynth > in playBuf 1 AR 0 r 1 0 Loop DoNothing Sine wave control of playback rate, negative rate plays backwards. -> gr_06 =+> g_06 = > let f = xLine KR 0.2 8 30 RemoveSynth > r = fSinOsc KR f 0 * 3 + 0.6 > s = bufRateScale KR 0 * r@@ -51,7 +50,7 @@ Channel mismatch, single channel buffer, two channel playBuf, result is single channel playback and channel mismatch message in server log. -> gr_07 = playBuf 2 AR 0 (bufRateScale KR 0) 1 0 Loop DoNothing+> g_07 = playBuf 2 AR 0 (bufRateScale KR 0) 1 0 Loop DoNothing Graph will play both channels after loading a two channel signal to buffer.@@ -68,11 +67,13 @@ Scan sequence of buffers: -> gr_08 =-> let n = 29 * 6+> f_08 n =+> let t = impulse KR 2 0 > b = mouseX KR 0 n Linear 0.2 > r = bufRateScale KR b-> in playBuf 1 AR b r 1 0 Loop DoNothing+> in playBuf 1 AR b r t 0 Loop DoNothing++> g_08 = f_08 52 -- (29 * 6) In sclanguage:
Help/UGen/playBufCF.help.lhs view
@@ -1,5 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PlayBufCF"- wslib: external/composite > import Sound.SC3 {- hsc3 -}
Help/UGen/pluck.help.lhs view
@@ -1,7 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "Pluck"- Sound.SC3.UGen.DB.ugenSummary "Pluck"- > import Sound.SC3 {- hsc3 -}+> import Sound.SC3.UGen.Protect {- hsc3-rw -} Excitation signal is white noise, triggered twice a second with varying OnePole coef. @@ -15,7 +13,7 @@ > g_02 = > let n = 50-> udup = uclone 'α'+> udup = uclone (const False) 'α' > f = udup n (rand 'β' 0.05 0.2) > p = udup n (rand 'γ' 0 1) > w = udup n (whiteNoise 'δ' AR)
Help/UGen/pmOsc.help.lhs view
@@ -1,9 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "PMOsc" :t pmOsc pmOsc is a composite of sinOsc, ie. sinOsc r cf (sinOsc r mf mp * pm) -> import Sound.SC3+> import Sound.SC3 {- hsc3 -} Random parameters, linear modulation index motion over n seconds
Help/UGen/poll.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Poll"- > Sound.SC3.UGen.DB.ugenSummary "Poll"- > import Sound.SC3 {- hsc3 -} > g_01 =@@ -35,3 +32,11 @@ import Sound.OSC {- hosc -} withSC3 (sendMessage (n_set1 (-1) "t" 1))++print oscillator frequency++> g_05 =+> let x = mouseX KR 200 260 Exponential 0.2+> o = sinOsc AR x 0 * 0.25+> t = impulse KR 2 0+> in mrg2 o (poll t x 0 (label "polling..."))
Help/UGen/pow.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.**"- > :t (**)- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let a = fSinOsc AR 100 0 * 0.1 > in mce2 a (a ** 10)@@ -18,3 +15,7 @@ > d = latch s (impulse AR x 0) > b = roundUp d (0.5 ** y) > in mce2 d b++optimises identity++> g_03 = (sinOsc AR 440 0 ** 1) * 0.1
Help/UGen/pulse.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Pulse"- > Sound.SC3.UGen.DB.ugenSummary "Pulse"- > import Sound.SC3 {- hsc3 -} Modulate frequency
Help/UGen/pulseDPW.help.lhs view
@@ -1,8 +1,6 @@- Sound.SC3.UGen.Help.viewSC3Help "PulseDPW"- Sound.SC3.UGen.DB.ugenSummary "PulseDPW"- > import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.Composite.External as X {- hsc3 -} -> g_01 = pulseDPW AR (xLine KR 2000 20 10 DoNothing) 0.5 * 0.1+> g_01 = X.pulseDPW AR (xLine KR 2000 20 10 DoNothing) 0.5 * 0.1 -> g_02 = pulseDPW AR (mouseX KR 200 12000 Exponential 0.2) 0.5 * 0.2+> g_02 = X.pulseDPW AR (mouseX KR 200 12000 Exponential 0.2) 0.5 * 0.2
Help/UGen/pulseDivider.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PulseDivider"- > Sound.SC3.UGen.DB.ugenSummary "PulseDivider"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/pv_BinDelay.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PV_BinDelay"- > Sound.SC3.UGen.DB.ugenSummary "PV_BinDelay"- > import Sound.OSC {- hsc3 -} > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/pv_Compander.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Compander"- Sound.SC3.UGen.DB.ugenSummary "Compander"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/pv_Copy.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "PV_Copy"- > Sound.SC3.UGen.DB.ugenSummary "PV_Copy"- > import Sound.SC3 {- hsc3 -} Proof of concept, silence. This graph is disallowed. pv_Copy is
Help/UGen/pv_Diffuser.help.lhs view
@@ -3,14 +3,14 @@ > import Sound.SC3 {- hsc3 -} -> n_01 = "/home/rohan/data/audio/pf-c5.snd"+> n_01 = "/usr/share/SuperCollider/sounds/a11wlk01.wav"+> n_02 = "/home/rohan/data/audio/instr/bosendorfer/064/C5.aif" -> m_01 = b_allocRead 12 n_01 0 0+> m_01 = b_allocRead 12 n_02 0 0 withSC3 (async m_01) > g_01 = playBuf 1 AR 12 (bufRateScale KR 12) 0 0 Loop DoNothing- > g_02 = soundIn 0 Trigger revised phase shifts with MouseX crossing center of screen@@ -18,7 +18,8 @@ > f_01 z = > let f = fft' (localBuf 'α' 2048 1) z > x = mouseX KR 0 1 Linear 0.1-> h = pv_Diffuser f (x >* 0.5)+> h = pv_Diffuser f (x >** 0.5) > in ifft' h * 0.5 -> g_03 = f_01 g_02+> g_03 = f_01 g_01+> g_04 = f_01 g_02
Help/UGen/pv_Freeze.help.lhs view
@@ -2,10 +2,10 @@ Sound.SC3.UGen.DB.ugenSummary "PV_Freeze" > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let f = fft' (localBuf 'α' 2048 1) (soundIn 0) > x = mouseX KR 0 1 Linear 0.1-> h = pv_Freeze f (x >* 0.5)+> h = X.pv_Freeze f (x >** 0.5) > in ifft' h * 0.5
Help/UGen/pv_MagFreeze.help.lhs view
@@ -31,7 +31,7 @@ > f_01 z = > let f = fft' (localBuf 'α' 2048 1) z > x = mouseX KR 0 1 Linear 0.1-> h = pv_MagFreeze f (x >* 0.5)+> h = pv_MagFreeze f (x >** 0.5) > in ifft' h * 0.5 > g_04 = f_01 g_03
Help/UGen/pv_RandWipe.help.lhs view
@@ -21,5 +21,5 @@ > f2 = fft' (localBuf 'β' 2048 1) g_02 > x = mouseX KR 0 1 Linear 0.1 > y = mouseY KR 0 1 Linear 0.1-> h = pv_RandWipe 'γ' f1 f2 x (y >* 0.5)+> h = pv_RandWipe 'γ' f1 f2 x (y >** 0.5) > in pan2 (ifft' h) 0 0.5
Help/UGen/pv_SpectralMap.help.lhs view
@@ -2,9 +2,10 @@ Sound.SC3.UGen.DB.ugenSummary "PV_SpectralMap" > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> n_01 = "/home/rohan/opt/src/supercollider/sounds/a11wlk01.wav"+> n_01 = "/usr/share/SuperCollider/sounds/a11wlk01.wav"+> n_02 = "/home/rohan/data/audio/instr/bosendorfer/064/C5.aif" > m_01 = b_allocRead 10 n_01 0 0 @@ -16,5 +17,5 @@ > b = localBuf 'β' 2048 1 > c1 = fft' a (soundIn 0) > c2 = fft' b (playBuf 1 AR 10 1 1 0 Loop DoNothing)-> c3 = pv_SpectralMap c1 c2 0.0 freeze (mouseX KR (-1) 1 Linear 0.2) 1 0+> c3 = X.pv_SpectralMap c1 c2 0.0 freeze (mouseX KR (-1) 1 Linear 0.2) 1 0 > in ifft' c3
Help/UGen/pvcollect.help.lhs view
@@ -1,53 +1,55 @@-> Sound.SC3.UGen.Help.viewSC3Help "PV_ChainUGen.pvcollect"-> :t pvcollect--> import Prelude hiding ((<*)) > import Data.List {- base -}+> import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -} -> let fileName = "/home/rohan/data/audio/pf-c5.snd"-> in withSC3 (do {_ <- async (b_alloc 10 1024 1)-> ;async (b_allocRead 11 fileName 0 0)})+> file_name = "/home/rohan/data/audio/instr/bosendorfer/064/C5.aif" -> let spectral_delay m p _ =-> let {l = lfPar KR 0.5 0-> ;v = linLin l (-1) 1 0.1 1}-> in (m + delayN m 1 v,p)+> alloc_buf :: DuplexOSC m => m Message+> alloc_buf = do+> _ <- async (b_alloc 10 1024 1)+> async (b_allocRead 11 file_name 0 0) -> let bpf_sweep nf m p i =-> let {l = lfPar KR 0.1 0-> ;e = abs (i - (linLin l (-1) 1 2 (nf / 20)))}-> in ((e <* 10) * m,p)+ > withSC3 alloc_buf -> let pv_g nf cf =-> let {no_op m p _ = (m,p)-> ;combf m p i = ((modE i 7.0 ==* 0) * m,p)-> ;sf = playBuf 1 AR 11 (bufRateScale KR 11) 1 0 Loop DoNothing-> ;c1 = fft' 10 sf-> ;c2 = pvcollect c1 nf cf 0 250 0}-> in out 0 (0.1 * ifft' c2)+> spectral_delay m p _ =+> let l = lfPar KR 0.5 0+> v = linLin l (-1) 1 0.1 1+> in (m + delayN m 1 v,p) -> let pv_au nf cf =-> let {no_op m p _ = (m,p)-> ;combf m p i = ((modE i 7.0 ==* 0) * m,p)-> ;c1 = fft' 10 (soundIn 0)-> ;c2 = pvcollect c1 nf cf 0 250 0}-> in out 0 (0.1 * ifft' c2)+> bpf_sweep nf m p i =+> let l = lfPar KR 0.1 0+> e = abs (constant i - (linLin l (-1) 1 2 (constant nf / 20)))+> in ((e <** 10) * m,p) -> let r = unlines ["number of constants : 257"-> ,"number of controls : 0"-> ,"control rates : []"-> ,"number of unit generators : 1013"-> ,"unit generator rates : [(KR,5),(AR,4),(DR,1004)]"]-> in r `isPrefixOf` synthstat (pv_g 1024 spectral_delay)+> pv_g nf cf =+> let no_op m p _ = (m,p)+> combf m p i = ((modE i 7.0 ==** 0) * m,p)+> sf = playBuf 1 AR 11 (bufRateScale KR 11) 1 0 Loop DoNothing+> c1 = fft' 10 sf+> c2 = pvcollect c1 nf cf 0 250 0+> in 0.1 * ifft' c2 -> synthstat (pv_g 1024 (bpf_sweep 1024))-> audition (pv_g 1024 spectral_delay)-> audition (pv_g 1024 (bpf_sweep 1024))+> pv_au nf cf =+> let no_op m p _ = (m,p)+> combf m p i = ((modE i 7.0 ==** 0) * m,p)+> c1 = fft' 10 (soundIn 0)+> c2 = pvcollect c1 nf cf 0 250 0+> in 0.1 * ifft' c2 -> audition (pv_au 1024 spectral_delay)-> audition (pv_au 1024 (bpf_sweep 1024))+ > putStrLn $ synthstat_concise (pv_g 1024 spectral_delay) -> import Sound.SC3.UGen.Dot {- hsc3-dot -}+ > number of constants : 257+ > number of controls : 0+ > control rates : []+ > number of unit generators : 1013+ > unit generator rates : [(KR,5),(AR,4),(DR,1004)] -> draw_svg (pv_g 1024 (bpf_sweep 1024))+ > putStrLn $ synthstat_concise (pv_g 1024 (bpf_sweep 1024))++> g_01 = pv_g 1024 spectral_delay+> g_02 = pv_g 1024 (bpf_sweep 1024)+> g_03 = pv_au 1024 spectral_delay+> g_04 = pv_au 1024 (bpf_sweep 1024)++ > import Sound.SC3.UGen.Dot {- hsc3-dot -}+ > draw_svg (pv_g 1024 (bpf_sweep 1024))
Help/UGen/qitch.help.lhs view
@@ -1,23 +1,30 @@-> Sound.SC3.UGen.Help.viewSC3Help "Qitch"-> Sound.SC3.UGen.DB.ugenSummary "Qitch"--> import Sound.SC3-> import System.FilePath+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} Load required data file (edit path as required) -> let {d = "/home/rohan/opt/share/SuperCollider/Extensions/SC3plugins"-> ;qf = d </> "PitchDetection/extraqitchfiles/QspeckernN2048SR48000.wav"}-> in withSC3 (async (b_allocRead 10 qf 0 0))+ > import System.FilePath {- filepath -}+ > d = "/home/rohan/opt/share/SuperCollider/Extensions/SC3plugins"+ > d = "/usr/share/SuperCollider/Extensions/SC3plugins"+ > qf = d </> "PitchDetection/extraqitchfiles/QspeckernN2048SR48000.wav"+ > withSC3 (async (b_allocRead 10 qf 0 0)) Comparison of input frequency (x) and tracked oscillator frequency (f). Output is printed to the console by scsynth. -> let {x = mouseX KR 440 880 Exponential 0.1-> ;o = sinOsc AR x 0 * 0.1-> ;[f,e] = mceChannels (qitch KR o 10 1e-2 1 0 0 2500)-> ;r = sinOsc AR f 0 * 0.1-> ;t = impulse KR 4 0-> ;pf = poll t f (label "f") 0-> ;px = poll t x (label "x") 0}-> in audition (mrg [out 0 (mce2 o r),pf,px])+> g_01 =+> let x = mouseX KR 440 880 Exponential 0.1+> o = sinOsc AR x 0 * 0.1+> [f,_e] = mceChannels (X.qitch KR o 10 1e-2 1 0 0 2500)+> r = sinOsc AR f 0 * 0.1+> t = impulse KR 4 0+> pf = poll t f 0 (label "f")+> px = poll t x 0 (label "x")+> in mrg [out 0 (mce2 o r),pf,px]++> g_02 =+> let s = hpf (soundIn 0) 110+> [f,e] = mceChannels (X.qitch KR s 10 0.01 1 0 0 2500)+> a = amplitude KR s 0.15 0.25+> r = sinOsc AR f 0 * a * e+> in out 0 (mce2 (s * 0.1) r)
Help/UGen/quadN.help.lhs view
@@ -1,9 +1,6 @@- Sound.SC3.UGen.Help.viewSC3Help "QuadN"- Sound.SC3.UGen.DB.ugenSummary "QuadN"- > import Sound.SC3 {- hsc3 -} -> g_01 = quadC AR (sampleRate / 4) 1 (-1) (-0.75) 0 * 0.2+> g_01 = quadC AR (sampleRate / 2) 1 (-1) (-0.75) 0 * 0.2 > g_02 = > let x = mouseX KR 3.5441 4 Linear 0.1
+ Help/UGen/rMEQ.help.lhs view
@@ -0,0 +1,17 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++rm = regalia-mitra+freq = cut-off frequency (hz)+rq = reciprocal-of-Q+k = gain (db)++default parameters++> g_01 = X.rMEQ AR (pinkNoise 'α' AR * 0.1) 440 1 0++> g_02 =+> let freq = mouseX KR 55 3520 Exponential 0.2+> rq = mouseY KR 0.01 2.0 Linear 0.2+> k = 3+> in X.rMEQ AR (pinkNoise 'α' AR * 0.1) freq rq k
+ Help/UGen/rMShelf.help.lhs view
@@ -0,0 +1,23 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++rm = regalia-mitra+freq = cut-off frequency (hz)+k = gain (db)++default parameters++> g_01 = X.rMShelf2 AR (whiteNoise 'α' AR * 0.1) 440 0++freq = mouse-x++> g_02 =+> let freq = mouseX KR 55 3520 Exponential 0.2+> in X.rMShelf2 AR (whiteNoise 'α' AR * 0.1) freq 0++k = mouse-y++> g_03 =+> let freq = mouseX KR 55 3520 Exponential 0.2+> k = mouseY KR (-12) 12 Linear 0.2+> in X.rMShelf2 AR (whiteNoise 'α' AR * 0.1) freq k
Help/UGen/radiansPerSample.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "RadiansPerSample"- > Sound.SC3.UGen.DB.ugenSummary "RadiansPerSample"- > import Sound.SC3 {- hsc3 -} two pi divided by the nominal sample rate (ie. a very small number)
Help/UGen/ramp.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Ramp"- Sound.SC3.UGen.DB.ugenSummary "Ramp"- > import Sound.SC3 {- hsc3 -} Used to lag pitch
Help/UGen/rand.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Rand"- Sound.SC3.UGen.DB.ugenSummary "Rand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/randID.help.lhs view
@@ -1,2 +0,0 @@- > Sound.SC3.UGen.Help.viewSC3Help "RandID"- > Sound.SC3.UGen.DB.ugenSummary "RandID"
Help/UGen/randSeed.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "RandSeed"- Sound.SC3.UGen.DB.ugenSummary "RandSeed"- > import Sound.SC3 start a noise patch
Help/UGen/recordBuf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "RecordBuf"- Sound.SC3.UGen.DB.ugenSummary "RecordBuf"- > import Sound.SC3 {- hsc3 -} > b_01 :: Num n => n
Help/UGen/redPhasor.help.lhs view
@@ -1,25 +1,22 @@- Sound.SC3.UGen.Help.viewSC3Help "RedPhasor"- Sound.SC3.UGen.DB.ugenSummary "RedPhasor"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.HW.External.F0 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.HW.External.F0 as F0 {- hsc3 -} no looping & it will play through once. Mouse x acts as trigger > g_01 =-> let tr = mouseX KR 0 1 Linear 0.2 >* 0.5-> in sinOsc AR (redPhasor KR tr 0.3 400 800 0 500 600) 0 * 0.2+> let tr = mouseX KR 0 1 Linear 0.2 >** 0.5+> in sinOsc AR (F0.redPhasor KR tr 0.3 400 800 0 500 600) 0 * 0.2 mouse y controls looping on/off, mouse x trigger > g_02 =-> let tr = mouseX KR 0 1 Linear 0.2 >* 0.5-> lp = mouseY KR 0 1 Linear 0.2 >* 0.5-> in sinOsc AR (redPhasor KR tr 0.3 400 800 lp 500 600) 0 * 0.2+> let tr = mouseX KR 0 1 Linear 0.2 >** 0.5+> lp = mouseY KR 0 1 Linear 0.2 >** 0.5+> in sinOsc AR (F0.redPhasor KR tr 0.3 400 800 lp 500 600) 0 * 0.2 mouse x controls loop rate, mouse y scales the start looppoint > g_03 = > let x = mouseX KR 0 5 Linear 0.2 > y = mouseY KR 200 500 Linear 0.2-> in sinOsc AR (redPhasor KR 0 x 400 800 1 y 600) 0 * 0.2+> in sinOsc AR (F0.redPhasor KR 0 x 400 800 1 y 600) 0 * 0.2
Help/UGen/replaceOut.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "ReplaceOut"- Sound.SC3.UGen.DB.ugenSummary "ReplaceOut"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -} @@ -8,21 +5,21 @@ Send signal to a bus, overwrite existing signal. -> g_02 =-> let a = out 0 (sinOsc AR (mce [330, 331]) 0 * 0.1)-> b = replaceOut 0 (sinOsc AR (mce [880, 881]) 0 * 0.1)-> c = out 0 (sinOsc AR (mce [120, 121]) 0 * 0.1)+> f_02 a_out b_out c_out =+> let a = a_out 0 (sinOsc AR (mce [330, 331]) 0 * 0.1)+> b = b_out 0 (sinOsc AR (mce [880, 881]) 0 * 0.1)+> c = c_out 0 (sinOsc AR (mce [120, 121]) 0 * 0.1) > in mrg [a, b, c] -Compare to+The MRG nodes are ordered right to left, so below b replaces c and a is summed -> g_03 =-> let a = out 0 (sinOsc AR (mce [330, 331]) 0 * 0.1)-> b = out 0 (sinOsc AR (mce [880, 881]) 0 * 0.1)-> c = out 0 (sinOsc AR (mce [120, 121]) 0 * 0.1)-> in mrg [a,b,c]+> g_02 = f_02 out replaceOut out -- a writes noise to 24+Compare to, where c is also heard++> g_03 = f_02 out out out++- a writes noise to bus 24 - b reads 24 and replaces with filtered variant - c reads 24 and writes to 0
Help/UGen/resonz.help.lhs view
@@ -1,7 +1,26 @@- Sound.SC3.UGen.Help.viewSC3Help "Resonz"- Sound.SC3.UGen.DB.ugenSummary "Resonz"- > import Sound.SC3 {- hsc3 -}++The Q factor of a resonator is defined as the center-frequency (cf) divided by the bandwidth (bw).++ > let q cf bw = cf / bw++The higher the Q the narrower the filter.++ > let bw_set = [1,4,10,100,200,400]+ > map (q 400) bw_set == [400,100,40,4,2,1]++Q multipled by the band-width gives the center-frequency.++ > map (\bw -> q 400 bw * bw) bw_set == replicate (length bw_set) 400++The third argument to resonz is the reciprocal of Q (rq).++ > let rq cf = recip . q cf+ > map (rq 400) [1,4,10,100,200,400] == [1/400,1/100,1/40,1/4,1/2,1]++1/Q multiplied by the center-frequency gives the bandwidth.++ > map (\bw -> rq 400 bw * 400) bw_set == bw_set > g_01 = > let n = whiteNoise 'α' AR
Help/UGen/rhpf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "RHPF"- Sound.SC3.UGen.DB.ugenSummary "RHPF"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/ringz.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Ringz"- Sound.SC3.UGen.DB.ugenSummary "Ringz"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/rlpf.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "RLPF"- Sound.SC3.UGen.DB.ugenSummary "RLPF"- > import Sound.SC3 {- hsc3 -} > g_01 =
+ Help/UGen/rlpfD.help.lhs view
@@ -0,0 +1,7 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let s = mix (lfSaw AR (mce2 120 180) 0 * 0.33)+> f = linExp (lfCub KR 0.1 (0.5 * pi)) (-1) 1 280 1500+> in X.rlpfd s f 0.6 0.5 * 3
+ Help/UGen/rlpfd.help.lhs view
@@ -0,0 +1,7 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let s = mix (lfSaw AR (mce2 120 180) 0 * 0.33)+> f = linExp (lfCub KR 0.1 (0.5 * pi)) (-1) 1 280 1500+> in X.rlpfd s f 0.6 0.5 * 3
Help/UGen/rotate2.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Rotate2"- > Sound.SC3.UGen.DB.ugenSummary "Rotate2"- > import Sound.SC3 {- hsc3 -} Rotation of stereo sound, via LFO.
Help/UGen/roundUp.help.lhs view
@@ -1,13 +1,10 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.round"- > :t roundUp- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let x = mouseX KR 60 4000 Linear 0.1 > f = roundUp x 100 > in sinOsc AR f 0 * 0.1->+ > g_02 = > let n = line KR 24 108 6 RemoveSynth > in saw AR (midiCPS (roundUp n 1)) * 0.2
Help/UGen/runningMax.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "RunningMax"- > Sound.SC3.UGen.DB.ugenSummary "RunningMax"- > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let n = dust 'α' AR 20 > t = impulse AR 0.4 0
Help/UGen/runningMin.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "RunningMin"- > Sound.SC3.UGen.DB.ugenSummary "RunningMin"- > import Sound.SC3 {- hsc3 -} Follow a sine lfo, reset rate controlled by mouseX@@ -11,7 +8,7 @@ > t = impulse AR x 0 > f = runningMin o t * 500 + 200 > in t + sinOsc AR f 0 * 0.1->+ > g_02 = > let n = dust 'α' AR 20 > t = impulse AR 0.4 0
Help/UGen/runningSum.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "RunningSum"- > Sound.SC3.UGen.DB.ugenSummary "RunningSum"- > import Sound.SC3 {- hsc3 -} distorts of course - would need scaling
Help/UGen/sampleDur.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "SampleDur"- > Sound.SC3.UGen.DB.ugenSummary "SampleDur"- > import Sound.SC3 {- hsc3 -} `sampleDur` is the reciprocal of the nominal sample rate of the server
Help/UGen/sampleRate.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "SampleRate"- > Sound.SC3.UGen.DB.ugenSummary "SampleRate"- > import Sound.SC3 {- hsc3 -} the current nominal sample rate of the server
Help/UGen/saw.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Saw"- Sound.SC3.UGen.DB.ugenSummary "Saw"- > import Sound.SC3 {- hsc3 -} SC3 saw is descending
Help/UGen/sawDPW.help.lhs view
@@ -1,9 +1,6 @@- Sound.SC3.UGen.Help.viewSC3Help "SawDPW"- Sound.SC3.UGen.DB.ugenSummary "SawDPW"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> g_01 = sawDPW AR (xLine KR 2000 20 10 DoNothing) 0 * 0.1+> g_01 = X.sawDPW AR (xLine KR 2000 20 10 DoNothing) 0 * 0.1 -> g_02 = sawDPW AR (mouseX KR 200 12000 Exponential 0.2) 0 * 0.2+> g_02 = X.sawDPW AR (mouseX KR 200 12000 Exponential 0.2) 0 * 0.2
Help/UGen/scaleNeg.help.lhs view
@@ -1,9 +1,6 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.scaleneg"- > :t scaleNeg- > import Prelude hiding ((<*)) {- base -} > import Sound.SC3 {- hsc3 -}->+ > g_01 = > let o = fSinOsc AR 1000 0 > l = line AR 1 (-1) 4 RemoveSynth
Help/UGen/schmidt.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Schmidt"- > Sound.SC3.UGen.DB.ugenSummary "Schmidt"- > import Sound.SC3 {- hsc3 -} threshold octave jumps
Help/UGen/select.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Select"- > Sound.SC3.UGen.DB.ugenSummary "Select"- > import Sound.SC3 {- hsc3 -} > g_01 =@@ -17,3 +14,8 @@ > f = select (lfSaw KR 0.5 0 * c + c) a > in saw AR f * 0.2 +i-rate...++> g_03 =+> let a = mce [rand 'α' 110 220,rand 'β' 220 440,rand 'γ' 440 880]+> in sinOsc AR (select (rand 'δ' 0 3) a) 0 * 0.1
Help/UGen/selectX.help.lhs view
@@ -1,15 +1,14 @@- Sound.SC3.UGen.Help.viewSC3Help "SelectX" :t selectX selectX is a composite ugen graph -> import Sound.SC3+> import Sound.SC3 {- hsc3 -} > g_01 = > let n = 3/2 > f = mce2 440 441 > a = mce [sinOsc AR f 0, saw AR f, pulse AR f 0.1]-> in mceSum (selectX (lfSaw KR 1 0 * n + n) a * 0.2)+> in mix (selectX (lfSaw KR 1 0 * n + n) a * 0.2) Here used as a sequencer: @@ -17,5 +16,5 @@ > let n = 10 > a = mce [517, 403, 89, 562, 816, 107, 241, 145, 90, 224] > c = n / 2-> f = mceSum (selectX (lfSaw KR 0.5 0 * c + c) a)+> f = mix (selectX (lfSaw KR 0.5 0 * c + c) a) > in saw AR f * 0.2
Help/UGen/sendReply.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "SendReply"- > Sound.SC3.UGen.DB.ugenSummary "SendReply"- > import Sound.OSC {- hosc3 -} > import Sound.SC3 {- hsc3 -}
Help/UGen/sendTrig.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "SendTrig"- Sound.SC3.UGen.DB.ugenSummary "SendTrig"- > import Control.Monad {- base -} > import Data.Maybe {- base -}
Help/UGen/shaper.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Shaper"- > Sound.SC3.UGen.DB.ugenSummary "Shaper"- > import Sound.SC3 {- hsc3 -} > import qualified Sound.SC3.Common.Buffer.Gen as Gen {- hsc3 -}
Help/UGen/silent.help.lhs view
@@ -1,7 +1,3 @@-> Sound.SC3.UGen.Help.viewSC3Help "Silent"-> Sound.SC3.UGen.DB.ugenSummary "Silent"--> import Sound.SC3+> import Sound.SC3 {- hsc3 -} -> let g = out 0 (silent 2)-> in audition g+> g_01 = silent 2
Help/UGen/sinOsc.help.lhs view
@@ -1,11 +1,8 @@- Sound.SC3.UGen.Help.viewSC3Help "SinOsc"- Sound.SC3.UGen.DB.ugenSummary "SinOsc"- > import Sound.SC3 {- hsc3 -} Fixed frequency (hz) and initial-phase (radians) -> g_00 = sinOsc AR 440 0 * 0.25+> g_00 = sinOsc AR (midiCPS 69) 0 * 0.75 -- 415 440 Control input for frequency @@ -108,3 +105,15 @@ > direction = toggleFF (impulse AR sync_freq 0 + impulse AR freq 0) * (-2) + 1 > o = sinOsc AR 0 (wrap (sweep (k2a 0) (direction * freq)) 0 (2 * pi)) > in o * 0.5++15.5 khz++> f_13 x = pan2 (sinOsc AR x 0) 0++> g_13 = f_13 15500 0.75++12 khz - 15.5 khz sweep++> f_14 x = pan2 (sinOsc AR (range_hs x (sinOsc KR (1/6) 0)) 0) 0++> g_14 = f_14 (12000,15500) 0.75
Help/UGen/sinOscFB.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "SinOscFB"- Sound.SC3.UGen.DB.ugenSummary "SinOscFB"- > import Sound.SC3 {- hsc3 -} {SinOscFB.ar([400,301],MouseX.kr(0,4))*0.1}.play
Help/UGen/sineShaper.help.lhs view
@@ -1,13 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "SineShaper"- Sound.SC3.UGen.DB.ugenSummary "SineShaper"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} {SineShaper.ar(SinOsc.ar([400, 404], 0, 0.2), MouseX.kr(0, 1))}.play -> g_01 = sineShaper (sinOsc AR (mce2 400 404) 0 * 0.2) (mouseX KR 0 1 Linear 0.2)+> g_01 = X.sineShaper (sinOsc AR (mce2 400 404) 0 * 0.2) (mouseX KR 0 1 Linear 0.2) {SineShaper.ar(SoundIn.ar, MouseX.kr(0, 1))}.play -> g_02 = sineShaper (soundIn 0) (mouseX KR 0 1 Linear 0.2)+> g_02 = X.sineShaper (soundIn 0) (mouseX KR 0 1 Linear 0.2)
Help/UGen/slew.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Slew"- > Sound.SC3.UGen.DB.ugenSummary "Slew"- > import Sound.SC3 {- hsc3 -} > g_01 = let z = lfPulse AR 800 0 0.5 * 0.1 in mce2 z (slew z 4000 4000)
Help/UGen/slope.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Slope"- > Sound.SC3.UGen.DB.ugenSummary "Slope"- > import Sound.SC3 {- hsc3 -} > f_01 f0 =
Help/UGen/sms.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "SMS"- Sound.SC3.UGen.DB.ugenSummary "SMS"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} sine reconstruction left channel, noises on right @@ -10,10 +7,10 @@ > let z = soundIn 0 > y = mouseY KR 1 50 Linear 0.2 > x = mouseX KR 0.5 4 Linear 0.2-> in sms AR z 50 y 8 0.3 x 0 0 0 1 (-1)+> in X.sms {- AR -} z 50 y 8 0.3 x 0 0 0 1 (-1) default param > g_02 = > let z = soundIn 0-> in sms AR z 80 80 4 0.2 1 0 0 0 1 (-1)+> in X.sms {- AR -} z 80 80 4 0.2 1 0 0 0 1 (-1)
Help/UGen/softClip.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.softclip"- > :t softClip- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/softClipAmp.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "SoftClipAmp"- Sound.SC3.UGen.DB.ugenSummary "SoftClipAmp"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/sos.help.lhs view
@@ -1,13 +1,25 @@- Sound.SC3.UGen.Help.viewSC3Help "SOS"- Sound.SC3.UGen.DB.ugenSummary "SOS"- > import Sound.SC3 {- hsc3 -} Same as TwoPole > g_01 =-> let theta = line KR (0.2 * pi) pi 5 RemoveSynth-> rho = line KR 0.6 0.99 5 RemoveSynth-> b1 = 2 * rho * cos theta-> b2 = - (rho * rho) }-> in sos (lfSaw AR 200 0 * 0.1) 1 0 0 b1 b2)+> let theta = line KR (0.2 * pi) pi 5 RemoveSynth+> rho = line KR 0.6 0.99 5 RemoveSynth+> b1 = 2 * rho * cos theta+> b2 = - (rho * rho)+> in sos (lfSaw AR 200 0 * 0.1) 1 0 0 b1 b2++<http://www.earlevel.com/main/2011/01/02/biquad-formulas/>++> g_02 =+> let fc = 100+> sr = 48000+> k = tan (pi * fc / sr)+> q = 0.707+> norm = 1 / (1 + k / q + k * k)+> a0 = k * k * norm+> a1 = 2 * a0+> a2 = a0+> b1 = 2 * (k * k - 1) * norm+> b2 = (1 - k / q + k * k) * norm+> in sos (whiteNoise 'a' AR * 0.2) a0 a1 a2 (- b1) (- b2)
Help/UGen/soundIn.help.lhs view
@@ -1,5 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "SoundIn"- soundIn is a composite of the UGens in' and numOutputBuses > import Sound.SC3 {- hsc3 -}
Help/UGen/specCentroid.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "SpecCentroid"- Sound.SC3.UGen.DB.ugenSummary "SpecCentroid"- > import Sound.SC3 {- hsc3 -} as the number of harmonics increases, the centroid is pushed higher
Help/UGen/specFlatness.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "SpecFlatness"- Sound.SC3.UGen.DB.ugenSummary "SpecFlatness"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/splay.help.lhs view
@@ -1,5 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Splay"- splay is a composite UGen, arguments are: inArray spread=1 level=1 center=0 levelComp=true @@ -33,23 +31,24 @@ full stereo - > withSC3 (send (n_set (-1) [("spread",1),("center",0)]))+ > import Sound.OSC {- hosc -}+ > withSC3 (sendMessage (n_set (-1) [("spread",1),("center",0)])) less wide - > withSC3 (send (n_set (-1) [("spread",0.5),("center",0)]))+ > withSC3 (sendMessage (n_set (-1) [("spread",0.5),("center",0)])) mono center - > withSC3 (send (n_set (-1) [("spread",0),("center",0)]))+ > withSC3 (sendMessage (n_set (-1) [("spread",0),("center",0)])) from center to right - > withSC3 (send (n_set (-1) [("spread",0.5),("center",0.5)]))+ > withSC3 (sendMessage (n_set (-1) [("spread",0.5),("center",0.5)])) all left - > withSC3 (send (n_set (-1) [("spread",0),("center",-1)]))+ > withSC3 (sendMessage (n_set (-1) [("spread",0),("center",-1)])) single channel input
+ Help/UGen/spreader.help.lhs view
@@ -0,0 +1,18 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let theta = pi / 2+> filtsPerOctave = 8+> in X.spreader AR (pinkNoise 'α' AR * 0.1) theta filtsPerOctave++> g_02 =+> let theta = mouseX KR 0 (pi / 2) Linear 0.2+> filtsPerOctave = 8+> in X.spreader AR (pinkNoise 'α' AR * 0.1) theta filtsPerOctave++> g_03 =+> let in_ = sinOsc AR (mouseX KR 110 880 Exponential 0.2) 0 * 0.1+> theta = pi / 2+> filtsPerOctave = 8+> in X.spreader AR in_ theta filtsPerOctave
Help/UGen/squiz.help.lhs view
@@ -1,17 +1,15 @@- Sound.SC3.UGen.Help.viewSC3Help "Squiz"- Sound.SC3.UGen.DB.ugenSummary "Squiz"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > f_01 zmax s = > let x = mouseX KR 1 10 Exponential 0.2 > y = mouseY KR 1 zmax Linear 0.2-> in squiz s x y 0.1 * 0.1+> in X.squiz s x y 0.1 * 0.1 Squiz of sin oscillator > g_01 = f_01 10 (sinOsc AR 440 0)+ > g_02 = f_01 100 (soundIn 0)
Help/UGen/standard2DL.help.lhs view
@@ -1,5 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Standard2DL"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}
Help/UGen/standardL.help.lhs view
@@ -1,6 +1,6 @@- > Sound.SC3.UGen.Help.viewSC3Help "StandardL"- > import Sound.SC3 {- hsc3 -}++> g_00 = standardL AR (sampleRate / 2) 1.0 0.5 0 * 0.2 vary frequency
Help/UGen/stepper.help.lhs view
@@ -1,42 +1,52 @@-> Sound.SC3.UGen.Help.viewSC3Help "Stepper"-> Sound.SC3.UGen.DB.ugenSummary "Stepper"--> import Sound.SC3+> import Sound.OSC {- hosc -}+> import Sound.SC3 {- hsc3 -} -> let {i = impulse KR 10 0-> ;f = stepper i 0 4 16 (-3) 4 * 100}-> in audition (out 0 (sinOsc AR f 0 * 0.1))+> g_01 =+> let i = impulse KR 10 0+> f = stepper i 0 4 16 (-3) 4 * 100+> in sinOsc AR f 0 * 0.1 Using Stepper and BufRd for sequencing -> let {compose = foldl (flip (.)) id-> ;rvb z s =-> let f i = let dly = mce [rand (z `joinID` i `joinID` 'α') 0 0.5-> ,rand (z `joinID` i `joinID` 'β') 0 0.5]-> in allpassN i 0.05 dly (rand i 1.5 2)-> in compose (replicate 5 f) s-> ;stpr = let {rate = mouseX KR 1.75 2.25 Exponential 0.1-> ;clock = impulse KR rate 0-> ;envl = decay2 clock 0.002 2.5-> ;indx = stepper clock 0 0 15 1 0-> ;freq = bufRdN 1 KR 10 indx Loop-> ;ffreq = lag2 freq 0.1 + mce [0,0.3]-> ;lfo = sinOsc KR 0.2 (mce [0,pi/2]) * 0.0024 + 0.0025-> ;top = mix (lfPulse AR (freq * mce [1,1.5,2]) 0 0.3)-> ;chn = [\s -> rlpf s ffreq 0.3 * envl-> ,\s -> rlpf s ffreq 0.3 * envl-> ,\s -> s * 0.5-> ,\s -> combL s 1 (0.66 / rate) 2 * 0.8 + s-> ,\s -> s + (rvb 'γ' s * 0.3)-> ,\s -> leakDC s 0.1-> ,\s -> delayL s 0.1 lfo + s-> ,\s -> onePole s 0.9]}-> in compose chn top-> ;stprInit =-> let n = [97.999,195.998,523.251,466.164,195.998-> ,233.082,87.307,391.995,87.307,261.626-> ,195.998,77.782,233.082,195.998,97.999-> ,155.563]-> in do {_ <- async (b_alloc 10 128 1)-> ;send (b_setn 10 [(0,n)])}}-> in withSC3 (stprInit >> play (out 0 stpr))+> compose :: [t -> t] -> t -> t+> compose = foldl (flip (.)) id++> rvb :: ID z => z -> UGen -> UGen+> rvb z0 s =+> let f z1 i =+> let dly = mce [rand ((z0,z1),'α') 0 0.5+> ,rand ((z0,z1),'β') 0 0.5]+> in allpassN i 0.05 dly (rand z1 1.5 2)+> in compose (map f (id_seq 5 'γ')) s++> stpr :: UGen+> stpr =+> let rate = mouseX KR 1.75 2.25 Exponential 0.1+> clock = impulse KR rate 0+> envl = decay2 clock 0.002 2.5+> indx = stepper clock 0 0 15 1 0+> freq = bufRdN 1 KR 10 indx Loop+> ffreq = lag2 freq 0.1 + mce [0,0.3]+> lfo = sinOsc KR 0.2 (mce [0,pi/2]) * 0.0024 + 0.0025+> top = mix (lfPulse AR (freq * mce [1,1.5,2]) 0 0.3)+> chn = [\s -> rlpf s ffreq 0.3 * envl+> ,\s -> rlpf s ffreq 0.3 * envl+> ,\s -> s * 0.5+> ,\s -> combL s 1 (0.66 / rate) 2 * 0.8 + s+> ,\s -> s + (rvb 'γ' s * 0.3)+> ,\s -> leakDC s 0.1+> ,\s -> delayL s 0.1 lfo + s+> ,\s -> onePole s 0.9]+> in compose chn top++> stpr_init :: DuplexOSC m => m ()+> stpr_init = do+> let n = [97.999,195.998,523.251,466.164,195.998+> ,233.082,87.307,391.995,87.307,261.626+> ,195.998,77.782,233.082,195.998,97.999+> ,155.563]+> _ <- async (b_alloc 10 128 1)+> sendMessage (b_setn 10 [(0,n)])++ > withSC3 stpr_init+ > audition stpr
+ Help/UGen/stkBandedWG.help.lhs view
@@ -0,0 +1,32 @@+> import Sound.SC3 {- hsc3 -}+> import Sound.SC3.UGen.Record.Plain.StkBandedWG {- hsc3-rec -}++> g_01 = mkStkBandedWG stkBandedWGR++instr: Uniform Bar = 0, Tuned Bar = 1, Glass Harmonica = 2, Tibetan Bowl = 3++> g_02 = mkStkBandedWG stkBandedWGR {instr = 3}++> g_03 =+> let tr = impulse KR (mouseX KR 0.5 12 Linear 0.2) 0 - 0.5+> u = stkBandedWGR+> {freq = midiCPS (tExpRand 'α' 24 96 tr)+> ,modalresonance = tRand 'ζ' 0 127 tr+> ,instr = 3+> ,trig_ = tr}+> in mkStkBandedWG u++setstriking: 0 = Plucked, 127 = Bowed++> g_04 =+> let u = stkBandedWGR+> {freq = rand 'α' 110 440+> ,instr = iRand 'β' 1 3+> ,bowpressure = iRand 'γ' 32 96+> ,bowmotion = rand 'δ' 32 96+> ,integration = rand 'ε' 0 64+> ,modalresonance = rand 'ζ' 32 96+> ,bowvelocity = rand 'η' 64 96+> ,setstriking = 127+> ,trig_ = 1}+> in mkStkBandedWG u
Help/UGen/stkBowed.help.lhs view
@@ -1,22 +1,22 @@- Sound.SC3.UGen.Help.viewSC3Help "StkBowed"- Sound.SC3.UGen.DB.ugenSummary "StkBowed"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import Sound.SC3.UGen.Record.Plain.StkBowed {- hsc3-rec -} -...not working...+> g_01 = mkStkBowed stkBowedR -> g_01 =-> let g = toggleFF (impulse KR 1 0)-> freq = 220.0-> bowpressure = 64.0-> bowposition = 64.0-> vibfreq = 64.0-> vibgain = 64.0-> loudness_ = 64.0-> gate_ = 1.0-> attackrate = 1-> decayrate = 1-> in stkBowed AR freq bowpressure bowposition vibfreq vibgain loudness_ gate_ attackrate decayrate+...gate prints however...++> g_02 =+> let g = lfPulse KR 0.25 0 0.5+> u = stkBowedR+> {freq = midiCPS (rand 'α' 24 96)+> ,bowpressure = rand 'β' 0 127+> ,bowposition = rand 'γ' 0 127+> ,vibfreq = rand 'δ' 32 96+> ,vibgain = rand 'ε' 32 96+> ,loudness_ = rand 'ζ' 32 96+> ,gate_ = g+> ,attackrate = rand 'η' 1 64+> ,decayrate = rand 'θ' 1 64}+> in mkStkBowed u <https://ccrma.stanford.edu/software/stk/classstk_1_1Bowed.html>
Help/UGen/stkFlute.help.lhs view
@@ -1,24 +1,24 @@- Sound.SC3.UGen.Help.viewSC3Help "StkFlute"- Sound.SC3.UGen.DB.ugenSummary "StkFlute"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -}+> import Sound.SC3.UGen.Record.Plain.StkFlute {- hsc3-rec -} ...not working... -> g_01 =-> let freq = 440-> jetDelay = 49-> noisegain = 0.15-> jetRatio = 0.32-> in External.stkFlute AR freq jetDelay noisegain jetRatio+> g_01 = mkStkFlute stkFluteR > g_02 =-> let freq = 440-> jetDelay = 49-> noisegain = line KR 0.05 0.25 3 DoNothing -- def = 0.15-> jetRatio = line KR 0.10 0.60 3 RemoveSynth -- def = 0.32-> in External.stkFlute AR freq jetDelay noisegain jetRatio+> let u = stkFluteR+> {freq = 440+> ,jetDelay = 49+> ,noisegain = 0.15+> ,jetRatio = 0.32}+> in mkStkFlute u++> g_03 =+> let u = stkFluteR+> {freq = 440+> ,jetDelay = 49+> ,noisegain = line KR 0.05 0.25 3 DoNothing+> ,jetRatio = line KR 0.10 0.60 3 RemoveSynth}+> in mkStkFlute u <https://ccrma.stanford.edu/software/stk/classstk_1_1Flute.html>
Help/UGen/stkMandolin.help.lhs view
@@ -1,25 +1,29 @@- Sound.SC3.UGen.Help.viewSC3Help "StkMandolin"- Sound.SC3.UGen.DB.ugenSummary "StkMandolin"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -}+> import Sound.SC3.UGen.Record.Plain.StkMandolin {- hsc3-rec -} > g_01 =-> let x = mouseX KR 0.25 4 Linear 0.2+> let x = mouseX KR 0.25 16 Linear 0.2 > tr = impulse KR x 0 - 0.5-> freq = midiCPS (tRand 'α' 54 66 tr)-> [bs, pp, dm, dt, at] = mceChannels (RDU.tRandN 5 'β' 0 127 tr)-> in External.stkMandolin AR freq bs pp dm dt at tr+> u = stkMandolinR+> {freq = midiCPS (tiRand 'α' 32 96 tr)+> ,bodysize = tRand 'β' 0 127 tr+> ,pickposition = tRand 'γ' 0 127 tr+> ,stringdamping = tRand 'δ' 0 127 tr+> ,stringdetune = tRand 'ε' 0 127 tr+> ,aftertouch = tRand 'ζ' 0 127 tr+> ,trig_ = tr}+> in mkStkMandolin u > g_02 = > let x = mouseX KR 3 16 Linear 0.2 > tr = impulse KR x 0 - 0.5 -- trig > tr3 = pulseDivider tr 3 0-> freq = midiCPS (tiRand 'α' 54 66 tr)-> bs = tRand 'β' 72 94 tr3 -- bodysize-> pp = tRand 'γ' 32 42 tr3 -- pickposition-> dm = tRand 'δ' 64 72 tr3 -- stringdamping-> dt = tRand 'ε' 0 4 tr3 -- stringdetune-> at = tRand 'ζ' 2 8 tr3 -- aftertouch-> in External.stkMandolin AR freq bs pp dm dt at tr+> u = stkMandolinR+> {freq = midiCPS (tiRand 'α' 54 66 tr)+> ,bodysize = tRand 'β' 72 94 tr3+> ,pickposition = tRand 'γ' 32 42 tr3+> ,stringdamping = tRand 'δ' 64 72 tr3+> ,stringdetune = tRand 'ε' 0 4 tr3+> ,aftertouch = tRand 'ζ' 2 8 tr3+> ,trig_ = tr}+> in mkStkMandolin u
Help/UGen/stkModalBar.help.lhs view
@@ -1,31 +1,37 @@- Sound.SC3.UGen.Help.viewSC3Help "StkModalBar"- Sound.SC3.UGen.DB.ugenSummary "StkModalBar"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -}+> import Sound.SC3.UGen.Record.Plain.StkModalBar {- hsc3-rec -} +instrument: Marimba=0, Vibraphone=1, Agogo=2, Wood1=3, Reso=4, Wood2=5, Beats=6, Two Fixed=7, Clump=8+ > g_01 = > let x = mouseX KR 0.25 12 Linear 0.2 > tr = impulse KR x 0 - 0.5-> tR = tRand 'α' 0 127 tr-> i = tRand 'β' 0 9 tr-> mn = tiRand 'γ' 25 96 tr-> [sh,sp,vg,vf,mx,v] = mceChannels (RDU.tRandN 6 'δ' 0 127 tr)-> in External.stkModalBar AR (midiCPS mn) i sh sp vg vf mx v tr+> u = stkModalBarR+> {freq = midiCPS (tiRand 'α' 25 96 tr)+> ,instrument = tiRand 'β' 0 9 tr+> ,stickhardness = tRand 'γ' 0 127 tr+> ,stickposition = tRand 'δ' 0 127 tr+> ,vibratogain = tRand 'ε' 0 127 tr+> ,vibratofreq = tRand 'ζ' 0 127 tr+> ,directstickmix = tRand 'η' 0 127 tr+> ,volume = tRand 'θ' 0 127 tr+> ,trig_ = tr}+> in mkStkModalBar u > g_02 = > let x = mouseX KR 1 12 Linear 0.2 > tr = impulse KR x 0 - 0.5 > tr3 = pulseDivider tr 3 0-> freq = midiCPS (tiRand 'α' 52 64 tr)-> instr = 1 -- instrument (0 - 9)-> sh = tRand 'β' 10 50 tr3 -- stickhardness-> sp = tRand 'γ' 40 80 tr3 -- stickposition-> vg = tRand 'δ' 66 98 tr3 -- vibratogain-> vf = tRand 'ε' 4 12 tr3 -- vibratofreq-> mx = tRand 'ζ' 0 1 tr3 -- directstickmix-> v = tRand 'η' 16 48 tr3 -- volume-> in External.stkModalBar AR freq instr sh sp vg vf mx v tr+> u = stkModalBarR+> {freq = midiCPS (tiRand 'α' 52 64 tr)+> ,instrument = 1+> ,stickhardness = tRand 'β' 10 50 tr3+> ,stickposition = tRand 'γ' 40 80 tr3+> ,vibratogain = tRand 'δ' 66 98 tr3+> ,vibratofreq = tRand 'ε' 4 12 tr3+> ,directstickmix = tRand 'ζ' 0 1 tr3+> ,volume = tRand 'η' 16 48 tr3+> ,trig_ = tr}+> in mkStkModalBar u <https://ccrma.stanford.edu/software/stk/classstk_1_1ModalBar.html>
+ Help/UGen/stkMoog.help.lhs view
@@ -0,0 +1,40 @@+> import Sound.SC3 {- hsc3 -}+> import Sound.SC3.UGen.Record.Plain.StkMoog {- hsc3-rec -}++> g_01 =+> let tr = mouseButton KR 0 1 0 - 0.5+> u = stkMoogR+> {freq = midiCPS (tiRand 'α' 12 96 tr)+> ,filterQ = tRand 'β' 0 127 tr+> ,sweeprate = tRand 'γ' 0 127 tr+> ,vibfreq = tRand 'δ' 0 127 tr+> ,vibgain = tRand 'ε' 0 127 tr+> ,gain = tRand 'ζ' 0 127 tr+> ,trig_ = tr}+> in mkStkMoog u++> g_02 =+> let x = mouseX KR 0.25 16 Linear 0.2+> tr = impulse KR x 0 - 0.5+> u = stkMoogR+> {freq = midiCPS (tiRand 'α' 24 72 tr)+> ,filterQ = tRand 'β' 0 32 tr+> ,sweeprate = tRand 'γ' 0 32 tr+> ,vibfreq = tRand 'δ' 0 96 tr+> ,vibgain = tRand 'ε' 0 16 tr+> ,gain = tRand 'ζ' 32 127 tr+> ,trig_ = tr}+> in mkStkMoog u++> g_03 =+> let nsig z l r f = range l r (lfNoise2 z KR f)+> scl = asLocalBuf 'α' [0,2,3.2,5,7,9,10]+> mnn = 48 + degreeToKey scl (nsig 'β' 0 15 0.35) 12+> u = stkMoogR+> {freq = midiCPS mnn+> ,filterQ = nsig 'γ' 0 64 0.5+> ,sweeprate = nsig 'δ' 0 64 0.5+> ,vibfreq = nsig 'ε' 0 64 0.5+> ,vibgain = nsig 'ζ' 0 16 0.5+> ,gain = nsig 'η' 16 96 0.5}+> in mkStkMoog u
+ Help/UGen/stkPluck.help.lhs view
@@ -0,0 +1,11 @@+> import Sound.SC3 {- hsc3 -}+> import Sound.SC3.UGen.Record.Plain.StkPluck {- hsc3-rec -}++> g_01 = mkStkPluck stkPluckR++> g_02 =+> let u = stkPluckR+> {freq = midiCPS (iRand 'α' 32 96)+> ,decay_ = rand 'β' 0 127}+> s = leakDC (mkStkPluck u) 0.995+> in mrg2 s (detectSilence s 0.01 0.5 RemoveSynth)
Help/UGen/stkShakers.help.lhs view
@@ -1,17 +1,17 @@- > Sound.SC3.UGen.Help.viewSC3Help "StkShakers"- > Sound.SC3.UGen.DB.ugenSummary "StkShakers"- > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as Ext {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.RDU as RDU {- sc3-rdu -}+> import Sound.SC3.UGen.Record.Plain.StkShakers {- hsc3-rec -} -> gr_01 =+> gr_01 = mkStkShakers stkShakersR++> gr_02 = > let x = mouseX KR 0.25 4 Linear 0.2 > tr = impulse KR x 0 - 0.5-> instr = tRand 'α' 0 23 tr-> [energy,decay,objects,resfreq] = mceChannels (RDU.tRandN 4 'β' 0 127 tr)-> in Ext.stkShakers AR instr energy decay objects resfreq--> gr_02 = Ext.stkShakers AR 4 64 64 64 64+> u = stkShakersR+> {instr = tRand 'α' 0 23 tr+> ,energy = tRand 'β' 0 127 tr+> ,decay_ = tRand 'γ' 0 127 tr+> ,objects = tRand 'δ' 0 127 tr+> ,resfreq = tRand 'ε' 0 127 tr}+> in mkStkShakers u <https://ccrma.stanford.edu/software/stk/classstk_1_1Shakers.html>
Help/UGen/streson.help.lhs view
@@ -1,17 +1,14 @@- Sound.SC3.UGen.Help.viewSC3Help "Streson"- Sound.SC3.UGen.DB.ugenSummary "Streson"-- <http://www.csounds.com/manual/html/streson.html>+<http://www.csounds.com/manual/html/streson.html> > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.DB.External as External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > k_01 = recip (linExp (lfCub KR 0.1 (0.5 * pi)) (-1) 1 280 377) import Sound.SC3.Plot {- hsc3-plot -} plot_ugen_nrt (20,1) 16.0 k_01 -> f_01 z = External.streson z k_01 0.9 * 0.3+> f_01 z = X.streson z k_01 0.9 * 0.3 > g_01 = f_01 (lfSaw AR (mce2 220 180) 0 * 0.2)
+ Help/UGen/sub.help.lhs view
@@ -0,0 +1,14 @@+> import Sound.SC3 {- hsc3 -}++> g_01 =+> let o = fSinOsc AR 800 0+> n = pinkNoise 'α' AR+> in (o - n) * 0.1++DC offset.++> g_02 = fSinOsc AR 440 0 * 0.1 - 0.5++Optimises identity++> g_03 = (sinOsc AR 440 0 - 0) * 0.1
Help/UGen/subsampleOffset.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "SubsampleOffset"- > Sound.SC3.UGen.DB.ugenSummary "SubsampleOffset"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/UGen/sum3.help.lhs view
@@ -1,9 +1,8 @@- > Sound.SC3.UGen.Help.viewSC3Help "Sum3"- > Sound.SC3.UGen.DB.ugenSummary "Sum3"- > import Sound.SC3 {- hsc3 -} > g_01 = sum3 (sinOsc AR 440 0) (sinOsc AR 441 0) (sinOsc AR 442 0) * 0.1++there is an optimiser/re-writer, applicable at ADD > g_02 = (sinOsc AR 440 0 + sinOsc AR 441 0 + sinOsc AR 442 0) * 0.1
Help/UGen/sum4.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Sum4"- > Sound.SC3.UGen.DB.ugenSummary "Sum4"- > import Sound.SC3 {- hsc3 -} > g_01 = sum4 (sinOsc AR 440 0) (sinOsc AR 441 0) (sinOsc AR 442 0) (sinOsc AR 443 0) * 0.1
Help/UGen/sumSqr.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Operator.sumsqr"- :t sumSqr- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/svf.help.lhs view
@@ -1,21 +1,18 @@- Sound.SC3.UGen.Help.viewSC3Help "SVF"- Sound.SC3.UGen.DB.ugenSummary "SVF"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 =-> let o = lfSaw AR (range 110 35 (lfSaw KR 2 0)) 0-> x = mouseX KR 20 20000 Exponential 0.2-> y = mouseY KR 1 0 Linear 0.2+> let signal = lfSaw AR (range 110 35 (lfSaw KR 2 0)) 0+> cutoff = mouseX KR 20 20000 Exponential 0.2+> res = mouseY KR 1 0 Linear 0.2 > k = control KR > low = k "low" 0.1 > band = k "band" 0.0 > high = k "high" 0.0 > notch = k "notch" 0.0 > peak_ = k "peak" 0.0-> in svf o x y low band high notch peak_+> in X.svf signal cutoff res low band high notch peak_ > f_01 k v = withSC3 (sendMessage (n_set1 (-1) k v))
Help/UGen/sweep.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Sweep"- Sound.SC3.UGen.DB.ugenSummary "Sweep"- > import Sound.SC3 {- hsc3 -} Using sweep to modulate sine frequency@@ -51,7 +48,7 @@ > g_05 = > let lf = range 0.01 1.25 (lfNoise2 'α' KR 1) > du = duty AR lf 0 DoNothing lf-> tr = abs (hpz1 du) >* 0+> tr = abs (hpz1 du) >** 0 > ph = sweep tr (1/du) > fr = linExp ph 0 1 400 800 > in sinOsc AR fr 0 * 0.2@@ -68,6 +65,6 @@ > sw = sweep tr rt + st > in sinOsc AR sw 0 * 0.2 - > import Sound.OSC+ > import Sound.OSC {- hosc -} > withSC3 (sendMessage (n_set (-1) [("st",660),("en",550),("tm",4),("tr",1)])) > withSC3 (sendMessage (n_set (-1) [("st",110),("en",990),("tm",1),("tr",1)]))
Help/UGen/switchDelay.help.lhs view
@@ -1,18 +1,15 @@- Sound.SC3.UGen.Help.viewSC3Help "SwitchDelay"- Sound.SC3.UGen.DB.ugenSummary "SwitchDelay"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} simple feedback delay -> g_01 = switchDelay (soundIn 0) 1 1 1 0.99 20+> g_01 = X.switchDelay (soundIn 0) 1 1 1 0.99 20 -> g_02 = switchDelay (soundIn 0) 1 0.7 0.4 0.6 20+> g_02 = X.switchDelay (soundIn 0) 1 0.7 0.4 0.6 20 change the buffer read pointer periodically. > g_03 = > let ix = stepper (impulse KR 0.5 0) 0 0 3 1 0 > dt = select ix (mce [0.02,0.1,0.725,0.25])-> in switchDelay (soundIn 0) 1 0.6 dt 0.7 20+> in X.switchDelay (soundIn 0) 1 0.6 dt 0.7 20
Help/UGen/syncSaw.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "SyncSaw"- Sound.SC3.UGen.DB.ugenSummary "SyncSaw"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/t2a.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "T2A"- Sound.SC3.UGen.DB.ugenSummary "T2A"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/t2k.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "T2K"- Sound.SC3.UGen.DB.ugenSummary "T2K"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/tBetaRand.help.lhs view
@@ -1,21 +1,18 @@- Sound.SC3.UGen.Help.viewSC3Help "TBetaRand"- Sound.SC3.UGen.DB.ugenSummary "TBetaRand"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let t = dust 'α' KR 10-> f = tBetaRand 'β' 300 3000 0.1 0.1 t+> f = X.tBetaRand 'β' 300 3000 0.1 0.1 t > in sinOsc AR f 0 * 0.1 -mouse control of parameters+mouse control of parameters (...scsynth -> 100% CPU) > g_02 = > let t = dust 'α' AR 10 > p1 = mouseX KR 1 5 Linear 0.2 > p2 = mouseY KR 1 5 Linear 0.2-> f = tBetaRand 'β' 300 3000 p1 p2 t+> f = X.tBetaRand 'β' 300 3000 p1 p2 t > in sinOsc AR f 0 * 0.1 ...audio rate crashes server...@@ -24,4 +21,4 @@ > let t = dust 'α' AR 100 > p1 = mouseX KR 1 5 Linear 0.2 > p2 = mouseY KR 1 5 Linear 0.2-> in lag (tBetaRand 'β' (-1) 1 p1 p2 t) (10 / 48000)+> in lag (X.tBetaRand 'β' (-1) 1 p1 p2 t) (10 / 48000)
Help/UGen/tBrownRand.help.lhs view
@@ -1,21 +1,18 @@- Sound.SC3.UGen.Help.viewSC3Help "TBrownRand"- Sound.SC3.UGen.DB.ugenSummary "TBrownRand"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > g_01 = > let t = dust 'α' KR 10 > dist = mouseX KR 0 5 Linear 0.2-> f = tBrownRand 'β' 300 3000 1 dist t+> f = X.tBrownRand 'β' 300 3000 1 dist t > in sinOsc AR f 0 * 0.1 > g_02 = > let t = dust 'α' KR 10-> n = tBrownRand 'β' 0 1 0.2 0 t+> n = X.tBrownRand 'β' 0 1 0.2 0 t > f = linExp n 0 1 300 3000 > o = sinOsc AR f 0-> l = tBrownRand 'γ' (-1) 1 1 4 t+> l = X.tBrownRand 'γ' (-1) 1 1 4 t > in pan2 o l 0.1 audio rate noise@@ -24,4 +21,4 @@ > let x = mouseX KR 500 5000 Exponential 0.2 > y = mouseY KR 10 500 Exponential 0.2 > t = dust 'α' AR x-> in lag (tBrownRand 'β' (-1) 1 0.2 0 t) (y / 48000)+> in lag (X.tBrownRand 'β' (-1) 1 0.2 0 t) (y / 48000)
Help/UGen/tChoose.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "TChoose"- :t tChoose- tChoose is a composite of tIRand and select. > import Sound.SC3 {- hsc3 -}
Help/UGen/tDelay.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "TDelay"- Sound.SC3.UGen.DB.ugenSummary "TDelay"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/tDuty.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "TDuty"- > Sound.SC3.UGen.DB.ugenSummary "TDuty"- > import Data.List {- base -} > import Sound.SC3 {- hsc3 -}
Help/UGen/tExpRand.help.lhs view
@@ -1,7 +1,8 @@- > Sound.SC3.UGen.Help.viewSC3Help "TExpRand"- > Sound.SC3.UGen.DB.ugenSummary "TExpRand"- > import Sound.SC3 {- hsc3 -}++> g_00 =+> let f = tExpRand 'α' 300.0 3000.0 (dust 'β' KR 10)+> in sinOsc AR f 0 * 0.1 > g_01 :: UId m => m UGen > g_01 = do
Help/UGen/tGaussRand.help.lhs view
@@ -1,8 +1,5 @@- Sound.SC3.UGen.Help.viewSC3Help "TGaussRand"- Sound.SC3.UGen.DB.ugenSummary "TGaussRand"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > f_01 rand_f = > let t = dust 'α' KR 10@@ -11,7 +8,7 @@ > l = rand_f 'γ' (-1) 1 t > in pan2 o l 0.1 -> g_01 = f_01 tGaussRand+> g_01 = f_01 X.tGaussRand compare to tRand
Help/UGen/tGrains.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "TGrains"- > Sound.SC3.UGen.DB.ugenSummary "TGrains"- > import Sound.SC3 {- hsc3 -} Load audio (#10) data
Help/UGen/tRand.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "TRand"- > Sound.SC3.UGen.DB.ugenSummary "TRand"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/tWindex.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "TWindex"- Sound.SC3.UGen.DB.ugenSummary "TWindex"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/tanh.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.tanh"- > :t tanh- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/tartini.help.lhs view
@@ -1,21 +1,33 @@-> Sound.SC3.UGen.Help.viewSC3Help "Tartini"-> Sound.SC3.UGen.DB.ugenSummary "Tartini"--> import Sound.SC3+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} Comparison of input frequency (x) and tracked oscillator frequency (f). -> let {x = mouseX KR 440 880 Exponential 0.1-> ;o = lfSaw AR x 0 * 0.05 {- sinOsc AR x 0 * 0.1 -}-> ;[f,e] = mceChannels (tartini KR o 0.2 2048 0 1024 0.5)-> ;r = sinOsc AR f 0 * 0.1-> ;t = impulse KR 4 0-> ;pf = poll t f (label "f") 0-> ;px = poll t x (label "x") 0}-> in audition (mrg [out 0 (mce2 o r),pf,px])+> g_01 =+> let x = mouseX KR 440 880 Exponential 0.1+> o = lfSaw AR x 0 * 0.05 {- sinOsc AR x 0 * 0.1 -}+> [f,_e] = mceChannels (X.tartini KR o 0.2 2048 0 1024 0.5)+> r = sinOsc AR f 0 * 0.1+> t = impulse KR 4 0+> pf = poll t f 0 (label "f")+> px = poll t x 0 (label "x")+> in mrg [out 0 (mce2 o r),pf,px] Fast test of live pitch tracking, not careful with amplitude of input -> let {z = soundIn 4-> ;[f,e] = mceChannels (tartini KR z 0.2 2048 0 1024 0.5)}-> in audition (out 0 (saw AR f * 0.05 * e))+> g_02 =+> let z = hpf (soundIn 0) 90+> [f,e] = mceChannels (X.tartini KR z 0.2 2048 0 1024 0.5)+> in mce2 (z * 0.1) (lfTri AR f 0 * 0.2 * lag e 0.2 * lag (f >** 90 * f <** 500) 0.2)++Printer for pitch tracker++> g_03 =+> let i = soundIn 0+> [f,_e] = mceChannels (X.tartini KR i 0.2 2048 0 1024 0.5)+> r = sinOsc AR f 0 * 0.1+> t = impulse KR 4 0+> pf = poll t f 0 (label "f")+> in mrg [out 0 (mce2 i r),pf]++ZELL = C4 - C5 = 247 259 277 295 309 331 345 369 387 415 441 462 493 (hz)
Help/UGen/thresh.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "Operator.thresh"- > :t thresh- > import Sound.SC3 {- hsc3 -} low-rent gate
Help/UGen/tiRand.help.lhs view
@@ -1,7 +1,8 @@- > Sound.SC3.UGen.Help.viewSC3Help "TIRand"- > Sound.SC3.UGen.DB.ugenSummary "TIRand"- > import Sound.SC3 {- hsc3 -}++> g_00 =+> let l = tiRand 'α' (-1) 1 (dust 'β' KR 10)+> in pan2 (pinkNoise 'γ' AR * 0.1) l 1 > g_01 :: UId m => m UGen > g_01 = do
Help/UGen/timer.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Timer"- Sound.SC3.UGen.DB.ugenSummary "Timer"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/toggleFF.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "ToggleFF"- > Sound.SC3.UGen.DB.ugenSummary "ToggleFF"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/tpv.help.lhs view
@@ -1,14 +1,11 @@- Sound.SC3.UGen.Help.viewSC3Help "TPV"- Sound.SC3.UGen.DB.ugenSummary "TPV"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} > fft_sz = 2048::Int > hop_sz = fft_sz `div` 2 > fn_0 = "/home/rohan/data/audio/pf-c5.snd" > fn_1 = "/home/rohan/data/audio/material/tyndall/var/talking-fragments/0001.WAV"-> tpv' b i = tpv (fft b i 0.5 1 1 0) (constant fft_sz) (constant hop_sz)+> tpv' b i = X.tpv (fft b i 0.5 1 1 0) (constant fft_sz) (constant hop_sz) > msg = [b_alloc 0 fft_sz 1,b_allocRead 1 fn_1 0 0] > withSC3 (mapM_ async msg)
Help/UGen/trig.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Trig"- Sound.SC3.UGen.DB.ugenSummary "Trig"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/trig1.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Trig1"- Sound.SC3.UGen.DB.ugenSummary "Trig1"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/twChoose.help.lhs view
@@ -1,5 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "TWChoose"- tWChoose is a composite of tWindex and select > import Sound.SC3 {- hsc3 -}
Help/UGen/twoPole.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "TwoPole"- Sound.SC3.UGen.DB.ugenSummary "TwoPole"- > import Sound.SC3 {- hsc3 -} > g_01 =
+ Help/UGen/twoTube.help.lhs view
@@ -0,0 +1,11 @@+> import Sound.SC3 {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -}++> g_01 =+> let dly1 = 100+> dly2 = 40+> env = envelope [1,1,0] [(dly1 + dly2) / sampleRate,0.0] [EnvLin]+> x = mouseX KR (-1) 1 Linear 0.2+> y = mouseY KR 1 4 Linear 0.2+> src = whiteNoise 'α' AR * 0.5 * envGen AR (impulse KR y 0) 1 0 1 DoNothing env+> in X.twoTube AR src x 0.99 dly1 dly2
Help/UGen/twoZero.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "TwoZero"- Sound.SC3.UGen.DB.ugenSummary "TwoZero"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/vDiskIn.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "VDiskIn"- Sound.SC3.UGen.DB.ugenSummary "VDiskIn"- > import Sound.SC3 {- hsc3 -} > fn_01 = "/home/rohan/data/audio/pf-c5.snd"
Help/UGen/vOsc.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "VOsc"- Sound.SC3.UGen.DB.ugenSummary "VOsc"- > import Sound.OSC {- hosc -} > import Sound.SC3 {- hsc3 -}
Help/UGen/vOsc3.help.lhs view
@@ -1,6 +1,3 @@- > Sound.SC3.UGen.Help.viewSC3Help "VOsc3"- > Sound.SC3.UGen.DB.ugenSummary "VOsc3"- > import Sound.SC3 {- hsc3 -} see vOsc help for code to allocate and fill tables 0 to 7...
Help/UGen/varLag.help.lhs view
@@ -1,13 +1,10 @@- Sound.SC3.UGen.Help.viewSC3Help "VarLag"- Sound.SC3.UGen.DB.ugenSummary "VarLag"- > import Sound.SC3 {- hsc3 -} -The implemented varLag UGen has three inputs: (input, lagTime, start)+The implemented varLag UGen has five inputs: (input, lagTime, curvature, warp, start) -> g_00 = varLag (lfPulse AR 50 0 0.5) (mouseX KR 0.0 (1/50) Linear 0.2) 0 * 0.2+> g_00 = varLag (lfPulse AR 50 0 0.5) (mouseX KR 0.0 (1/50) Linear 0.2) 0 5 0 * 0.2 -> g_01 = varLag (impulse AR 50 0) (mouseX KR 0.0 (1/50) Linear 0.2) 0 * 0.2+> g_01 = varLag (impulse AR 50 0) (mouseX KR 0.0 (1/50) Linear 0.2) 0 5 0 * 0.2 The varLag_env composite UGen has various odd behaviours @@ -35,7 +32,7 @@ > f_03 s = > let x = mouseX KR 0.0001 0.01 Exponential 0.2-> in varLag s x s+> in varLag s x 0 5 s > g_07 = f_03 (0 - saw AR 440) * 0.15 > g_08 = f_03 (impulse AR (range 6 24 (lfNoise2 'γ' KR 4)) 0) * 0.5@@ -43,3 +40,10 @@ > g_09 = > let s = varSaw AR 220 0 (range 0 1 (sinOsc KR 0.25 0)) > in f_03 s * 0.1++used to lag pitch++> g_10 =+> let f1 = range 100 400 (lfPulse KR 1 0 0.5)+> f2 = varLag f1 0.2 (line KR (-8) 8 15 RemoveSynth) 5 0+> in sinOsc AR f2 0 * 0.3
Help/UGen/varSaw.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "VarSaw"- Sound.SC3.UGen.DB.ugenSummary "VarSaw"- > import Sound.SC3 {- hsc3 -} > g_00 =@@ -45,7 +42,7 @@ > import Sound.OSC {- hosc -} > set_factor n = withSC3 (sendMessage (n_set1 (-1) "factor" n))- > set_factor 0.125 {- 0.5 1.5 23.0 0.125 1.3 -}+ > set_factor 0.125 {- 0.125 0.5 1.3 1.5 23.0 -} slow indeterminate modulation of width, <http://sccode.org/1-5as>
Help/UGen/vibrato.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Vibrato"- Sound.SC3.UGen.DB.ugenSummary "Vibrato"- > import Sound.SC3 {- hsc3 -} vibrato at 1 Hz, note the use of DC.ar@@ -8,7 +5,7 @@ {SinOsc.ar(Vibrato.ar(DC.ar(400.0),1,0.02))*0.1}.play > g_01 =-> let v = vibrato 'α' AR (dc AR 400) 1 0.02 0 0 0.04 0.1 0+> let v = vibrato 'α' AR (dc AR 400) 1 0.02 0 0 0.04 0.1 0 0 > in sinOsc AR v 0 * 0.1 compare: k-rate freq input can be a constant@@ -16,7 +13,7 @@ {SinOsc.ar(Vibrato.kr(400.0,1,0.02))}.play > g_02 =-> let v = vibrato 'α' KR 400 1 0.02 0 0 0.04 0.1 0+> let v = vibrato 'α' KR 400 1 0.02 0 0 0.04 0.1 0 0 > in sinOsc AR v 0 * 0.1 control rate and rateVariation@@ -29,7 +26,7 @@ > g_03 = > let x = mouseX KR 2 100 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> v = vibrato 'α' AR (dc AR 400) x 0.1 1 1 y 0.1 0+> v = vibrato 'α' AR (dc AR 400) x 0.1 1 1 y 0.1 0 0 > in sinOsc AR v 0 * 0.1 control depth and depthVariation@@ -44,5 +41,5 @@ > let n = lfNoise1 'α' KR 1 * 3 + 7 > x = mouseX KR 0 1 Linear 0.2 > y = mouseY KR 0 1 Linear 0.2-> v = vibrato 'β' AR (dc AR 400) n x 1 1 y 0.1 0+> v = vibrato 'β' AR (dc AR 400) n x 1 1 y 0.1 0 0 > in sinOsc AR v 0 * 0.1
Help/UGen/vosim.help.lhs view
@@ -1,19 +1,16 @@- > Sound.SC3.UGen.Help.viewSC3Help "VOSIM"- > Sound.SC3.UGen.DB.ugenSummary "VOSIM"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} -> gr_00 =+> g_00 = > let trg = impulse AR 100 0 > frq = mouseX KR 440 880 Exponential 0.2 > n_cycles = 3 > dcy = 0.1-> in vosim AR trg frq n_cycles dcy * 0.25+> in X.vosim AR trg frq n_cycles dcy * 0.25 -> gr_01 =+> g_01 = > let p = tRand 'α' 0 1 (impulse AR 6 0)-> t = impulse AR (9 * ( 1 + ( p >* 0.95))) 0+> t = impulse AR (9 * ( 1 + ( p >** 0.95))) 0 > x = mouseX KR 0.25 2 Linear 0.2 > y = mouseY KR 0.25 0.75 Linear 0.2 > z = 9@@ -27,5 +24,5 @@ > l = tR 'ζ' [-1] [1] t > xn = mk_n 'η' > yn = mk_n 'θ'-> v = vosim AR t (f * x * xn) n (d * y * yn) * a+> v = X.vosim AR t (f * x * xn) n (d * y * yn) * a > in pan2 (mix v) l 1
Help/UGen/warp1.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "Warp1"- Sound.SC3.UGen.DB.ugenSummary "Warp1"- > import Sound.SC3 {- hsc3 -} > fn_01 = "/home/rohan/data/audio/pf-c5.aif"
Help/UGen/waveTerrain.help.lhs view
@@ -1,8 +1,5 @@- > Sound.SC3.UGen.Help.viewSC3Help "WaveTerrain"- > Sound.SC3.UGen.DB.ugenSummary "WaveTerrain"- > import Sound.SC3 {- hsc3 -}-> import Sound.SC3.UGen.Bindings.DB.External {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.DB.External as X {- hsc3 -} Terrain function, ie. (x,y) -> z @@ -48,7 +45,7 @@ > x = abs (sinOsc AR x' 0) + lfNoise2 'α' AR 2 > y = abs (sinOsc AR y' (pi / 2)) > b = 0-> in waveTerrain AR b x y 100 50+> in X.waveTerrain AR b x y 100 50 Alternate terrain function.
Help/UGen/whiteNoise.help.lhs view
@@ -1,10 +1,11 @@- Sound.SC3.UGen.Help.viewSC3Help "WhiteNoise"- Sound.SC3.UGen.DB.ugenSummary "WhiteNoise"- > import Sound.SC3 {- hsc3 -} -> g_01 = whiteNoise 'α' AR * 0.05+> g_00 = let n = whiteNoise 'α' AR * 0.05 in mce2 n n +> g_01_m = fmap (* 0.05) (whiteNoiseM AR)++> g_01 = uid_st_eval g_01_m+ Random filtered noise bursts. > g_02 =@@ -17,8 +18,7 @@ Monadic form of above graph. -> g_03 :: UId m => m UGen-> g_03 = do+> g_03_m = do > n <- whiteNoiseM AR > t <- dustM AR (mce [3, 7]) > f <- tExpRandM 20 1800 t@@ -26,10 +26,11 @@ > let e = decay2 t 0.01 0.2 > return (resonz (n * e) f bw) +> g_03 = uid_st_eval g_03_m+ The same graph again, without using do notation. -> g_04 :: UId m => m UGen-> g_04 =+> g_04_m = > whiteNoiseM AR >>= \n -> > dustM AR (mce [3, 7]) >>= \t -> > tExpRandM 20 1800 t >>= \f ->@@ -37,6 +38,8 @@ > let e = decay2 t 0.01 0.2 > in return (resonz (n * e) f bw) +> g_04 = uid_st_eval g_04_m+ Drawing import Sound.SC3.Plot {- hsc3-plot -}@@ -61,4 +64,3 @@ > in pan2 n l 0.1 > g_07 = hpz1 (whiteNoise 'α' AR * 0.01)-
Help/UGen/wrapIndex.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "WrapIndex"- Sound.SC3.UGen.DB.ugenSummary "WrapIndex"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/wt_FilterScale.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "WT_FilterScale"- Sound.SC3.UGen.DB.ugenSummary "WT_FilterScale"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.HW.External.Wavelets {- hsc3 -}
Help/UGen/wt_TimeWipe.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "WT_TimeWipe"- Sound.SC3.UGen.DB.ugenSummary "WT_TimeWipe"- > import Sound.SC3 {- hsc3 -} > import Sound.SC3.UGen.Bindings.HW.External.Wavelets {- hsc3 -}
Help/UGen/xFade2.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "XFade2"- Sound.SC3.UGen.DB.ugenSummary "XFade2"- > import Sound.SC3 {- hsc3 -} > g_01 = xFade2 (saw AR 440) (sinOsc AR 440 0) (lfTri KR 0.1 0) 0.1
Help/UGen/xLine.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "XLine"- Sound.SC3.UGen.DB.ugenSummary "XLine"- Note: SC3 reorders mul and add inputs to precede the doneAction input. > import Sound.SC3 {- hsc3 -}
Help/UGen/xOut.help.lhs view
@@ -1,15 +1,14 @@- Sound.SC3.UGen.Help.viewSC3Help "XOut"- Sound.SC3.UGen.DB.ugenSummary "XOut"- > import Sound.SC3 {- hsc3 -} Send signal to a bus, crossfading with existing contents. > g_01 =-> let p a b = sinOsc AR (mce [a, b]) 0 * 0.1+> let p a b = sinOsc AR (mce2 a b) 0 * 0.1 > x = mouseX KR 0 1 Linear 0.1 > y = mouseY KR 0 1 Linear 0.1 > in mrg [out 0 (p 220 221) > ,xOut 0 x (p 330 331) > ,xOut 0 y (p 440 441) > ,out 0 (p 120 121)]++out is a summing output, see replaceOut for over-writing output.
Help/UGen/zeroCrossing.help.lhs view
@@ -1,6 +1,3 @@- Sound.SC3.UGen.Help.viewSC3Help "ZeroCrossing"- Sound.SC3.UGen.DB.ugenSummary "ZeroCrossing"- > import Sound.SC3 {- hsc3 -} > g_01 =
Help/UGen/zitaRev.help.lhs view
@@ -1,9 +1,9 @@-http://kokkinizita.linuxaudio.org/linuxaudio/zita-rev1-doc/quickguide.html+<http://kokkinizita.linuxaudio.org/linuxaudio/zita-rev1-doc/quickguide.html> > import Sound.SC3 {- hsc3 -}-> import qualified Sound.SC3.UGen.Bindings.HW.External.Zita as Zita {- hsc3 -}+> import qualified Sound.SC3.UGen.Bindings.HW.External.X as X {- hsc3 -} - > Zita.zitaRev_param+ > X.zitaRev_param mostly default settings @@ -14,7 +14,7 @@ > eq2_freq = 1500 > dry_wet_mix = 0.5 > level = 0-> in Zita.zitaRev i i in_delay 200 3 2 6000 eq1_freq 0 eq2_freq 0 dry_wet_mix level+> in X.zitaRev i i in_delay 200 3 2 6000 eq1_freq 0 eq2_freq 0 dry_wet_mix level longer @@ -29,7 +29,7 @@ > eq2_level = 6 > dry_wet_mix = 0 > level = 0-> in Zita.zitaRev i i in_delay 200 low_rt60 mid_rt60 6000 eq1_freq eq1_level eq2_freq eq2_level dry_wet_mix level+> in X.zitaRev i i in_delay 200 low_rt60 mid_rt60 6000 eq1_freq eq1_level eq2_freq eq2_level dry_wet_mix level longer still @@ -44,6 +44,6 @@ > eq2_level = 6 > dry_wet_mix = 0.5 > level = 0.0-> in Zita.zitaRev i i in_delay 200 low_rt60 mid_rt60 6000 eq1_freq eq1_level eq2_freq eq2_level dry_wet_mix level+> in X.zitaRev i i in_delay 200 low_rt60 mid_rt60 6000 eq1_freq eq1_level eq2_freq eq2_level dry_wet_mix level
README view
@@ -1,12 +1,21 @@ hsc3 - haskell supercollider ---------------------------- -[hsc3][hsc3] provides `Sound.SC3`, a module for using [Haskell][hs] as-a client to the [SuperCollider][sc3] synthesis server. hsc3 requires-[hosc](?t=hosc).+[hsc3](http://rohandrape.net/?t=hsc3)+provides `Sound.SC3`, a module for using+[Haskell](http://haskell.org/)+as a client to the+[SuperCollider](http://audiosynth.com/)+synthesis server.+hsc3 requires+[hosc](http://rohandrape.net/?t=hosc). -For installation and configuration information see the-[tutorial][tutorial] at [hsc3-texts][hsc3-texts].+There is an+[introduction](http://rohandrape.net/?t=hsc3-texts&e=lhs/hsc3-introduction.lhs)+and a+[tutorial](http://rohandrape.net/?t=hsc3-texts&e=lhs/hsc3-tutorial.lhs)+at+[hsc3-texts](http://rohandrape.net/?t=hsc3-texts). There are a number of related projects: @@ -17,7 +26,7 @@ - [hsc3-unsafe](?t=hsc3-unsafe): Unsafe UGen variants (2006) - [hsc3-lang](?t=hsc3-lang): SC3 language (2007) - [hsc3-rec](?t=hsc3-rec): Record UGens (2008)-- [hsc3-sf-hsndfile](?t=hsc3-sf): Sound file IO (libsndfile) (2010)+- [hsc3-sf-hsndfile](?t=hsc3-sf-hsndfile): Sound file IO (libsndfile) (2010) - [hsc3-auditor](?t=hsc3-auditor): Simple-minded auditioner (2010) - [hsc3-cairo](?t=hsc3-cairo): Drawing (2012) - [hsc3-plot](?t=hsc3-plot): Plotting (2013)@@ -25,18 +34,35 @@ - [hsc3-rw](?t=hsc3-rw): UGen Graph Re-writing (2013) - [hsc3-forth](?t=hsc3-forth): FORTH SuperCollider (2014) - [hsc3-lisp](?t=hsc3-lisp): LISP SuperCollider (2014)+- [hsc3-m](?t=hsc3-m): UGen variants (2018) The hsc3 interaction environment ([hsc3.el](?t=hsc3&e=emacs/hsc3.el))-is written for [GNU][gnu] [Emacs][emacs].+is written for+[GNU](http://gnu.org/)+[Emacs](http://gnu.org/software/emacs/). +<!--+There is also, more obliquely related:++- [sc3-rdu](?t=sc3-rdu): SuperCollider UGens (1998)+- [rsc3](?t=rsc3): Scheme SuperCollider (2004)+- [smlsc3](?t=smlsc3): Standard ML SuperCollider (2008)+-->+ ## cli -[scsyndef-stat](?t=hsc3&e=md/scsyndef-stat.md),-[scsyndef-to-hs](?t=hsc3&e=md/scsyndef-to-hs.md), [scsynth](?t=hsc3&e=md/scsynth.md), [setup](?t=hsc3&e=md/setup.md) -© [rohan drape][rd] and others, 2005-2018, [gpl][gpl].+## help++[UGen Index](?t=hsc3&e=Help/UGen/ix.md)++©+[rohan drape](http://rohandrape.net/)+and others, 2005-2020,+[gpl](http://gnu.org/copyleft/)+ with contributions by: - henning thielemann@@ -45,18 +71,11 @@ - brent yorgey - shae erisson -see the [git](https://git-scm.com/) [history](?t=hsc3&q=history) for details+see the+[git](https://git-scm.com/)+[history](?t=hsc3&q=history)+for details initial announcement: [[2005-11-29/haskell-cafe](?t=hsc3&e=md/announce.text), [haskell.org](http://www.haskell.org/pipermail/haskell-cafe/2005-November/012483.html)]--[rd]: http://rohandrape.net/-[hsc3]: http://rohandrape.net/?t=hsc3-[hs]: http://haskell.org/-[sc3]: http://audiosynth.com/-[tutorial]: http://rohandrape.net/?t=hsc3-texts&e=lhs/hsc3-tutorial.lhs-[hsc3-texts]: http://rohandrape.net/?t=hsc3-texts-[gnu]: http://gnu.org/-[emacs]: http://gnu.org/software/emacs/-[gpl]: http://gnu.org/copyleft/
Sound/SC3/Common.hs view
@@ -2,7 +2,10 @@ module Sound.SC3.Common (module M) where import Sound.SC3.Common.Buffer as M+import Sound.SC3.Common.Enum as M import Sound.SC3.Common.Envelope as M import Sound.SC3.Common.Math as M+import Sound.SC3.Common.Math.Operator as M import Sound.SC3.Common.Monad as M+import Sound.SC3.Common.Rate as M import Sound.SC3.Common.UId as M
Sound/SC3/Common/Base.hs view
@@ -1,8 +1,14 @@ -- | Common core functions. module Sound.SC3.Common.Base where +import Control.Exception {- base -}+import Control.Monad {- base -} import Data.Char {- base -}+import Data.Function {- base -} import Data.List {- base -}+import Data.Maybe {- base -}+import System.IO.Error {- base -}+import System.Environment {- base -} -- * Function @@ -65,13 +71,13 @@ -- -- > compose_l [(* 2),(+ 1)] 3 == 7 compose_l :: [t -> t] -> t -> t-compose_l = flip (foldl (\x f -> f x))+compose_l = flip (foldl (&)) -- | Right to left composition of a list of functions. -- -- > compose_r [(* 2),(+ 1)] 3 == 8 compose_r :: [t -> t] -> t -> t-compose_r = flip (foldr (\f x -> f x))+compose_r = flip (foldr ($)) {- | SequenceableCollection.differentiate @@ -112,9 +118,13 @@ dx_d' = (0 :) . dx_d -- | 'lookup' with equality function.-lookup_by :: (a -> a -> Bool) -> a -> [(a,b)] -> Maybe b+lookup_by :: (a -> t -> Bool) -> a -> [(t,b)] -> Maybe b lookup_by f x = fmap snd . find (f x . fst) +-- | Erroring variant.+lookup_by_err :: (a -> t -> Bool) -> a -> [(t,b)] -> b+lookup_by_err f x = fromMaybe (error "lookup_by") . lookup_by f x+ -- | Reverse 'lookup' with equality function. rlookup_by :: (b -> b -> Bool) -> b -> [(a,b)] -> Maybe a rlookup_by f x = fmap fst . find (f x . snd)@@ -202,3 +212,19 @@ -- | [x,y] -> (x,y) t2_from_list :: [t] -> T2 t t2_from_list l = case l of {[p,q] -> (p,q);_ -> error "t2_from_list"}++-- * System++-- | Guarded variant of 'getEnv' with default value.+get_env_default :: String -> String -> IO String+get_env_default e k = do+ r <- tryJust (guard . isDoesNotExistError) (getEnv e)+ case r of+ Right v -> return v+ _ -> return k++-- | 'lookupEnv' with default value.+--+-- > lookup_env_default "PATH" "/usr/bin"+lookup_env_default :: String -> String -> IO String+lookup_env_default e k = fmap (fromMaybe k) (lookupEnv e)
Sound/SC3/Common/Buffer.hs view
@@ -18,11 +18,10 @@ -- | Variant of '(!!)' but values for index greater than the size of -- the collection will be clipped to the last index.+--+-- > map (\x -> clipAt x "abc") [-1,0,1,2,3] == "aabcc" clipAt :: Int -> [a] -> a-clipAt ix c =- if ix > length c - 1- then last c- else c !! ix+clipAt ix c = if ix > length c - 1 then last c else if ix < 0 then c !! 0 else c !! ix -- | 'abs' of '(-)'. absdif :: Num a => a -> a -> a@@ -76,9 +75,7 @@ -- > > [1,2,3].normalizeSum == [1/6,1/3,0.5] -- > normalizeSum [1,2,3] == [1/6,2/6,3/6] normalizeSum :: (Fractional a) => [a] -> [a]-normalizeSum l =- let n = sum l- in map (/ n) l+normalizeSum l = let n = sum l in map (/ n) l -- | Variant that specifies range of input sequence separately. normalise_rng :: Fractional n => (n,n) -> (n,n) -> [n] -> [n]
Sound/SC3/Common/Buffer/Gen.hs view
@@ -32,7 +32,6 @@ -- | 'sum_l' of 'sine1_l'. ----- > import Sound.SC3.Plot {- hsc3-plot -} -- > plotTable1 (sine1 256 [1,0.95 .. 0.5]) sine1 :: (Enum n,Floating n) => Int -> [n] -> [n] sine1 n = sum_l . sine1_l n@@ -82,7 +81,6 @@ {- | Generate Chebyshev waveshaping table, see b_gen_cheby. -> import Sound.SC3.Plot > plotTable1 (gen_cheby 256 [1,0,1,1,0,1]) -}
+ Sound/SC3/Common/Enum.hs view
@@ -0,0 +1,122 @@+-- | Data types for enumerated and non signal unit generator inputs.+module Sound.SC3.Common.Enum where++-- * Loop++-- | Loop indicator input.+data Loop t =+ NoLoop -- ^ 0+ | Loop -- ^ 1+ | WithLoop t+ deriving (Eq, Show)++-- | Apply /f/ at 'WithLoop'.+loop_coerce :: (t -> u) -> Loop t -> Loop u+loop_coerce f lp =+ case lp of+ NoLoop -> NoLoop+ Loop -> Loop+ WithLoop t -> WithLoop (f t)++-- | fmap is 'loop_coerce'+instance Functor Loop where+ fmap = loop_coerce++-- | Resolve 'Loop'.+from_loop :: Num t => Loop t -> t+from_loop e =+ case e of+ NoLoop -> 0+ Loop -> 1+ WithLoop u -> u++-- * Interpolation++-- | Interpolation indicator input.+data Interpolation t =+ NoInterpolation+ | LinearInterpolation+ | CubicInterpolation+ | WithInterpolation t+ deriving (Eq, Show)++-- | Resolve 'Interpolation'.+from_interpolation :: Num t => Interpolation t -> t+from_interpolation e =+ case e of+ NoInterpolation -> 1+ LinearInterpolation -> 2+ CubicInterpolation -> 4+ WithInterpolation u -> u++-- * DoneAction++-- | Completion mode indicator input.+data DoneAction t+ = DoNothing+ | PauseSynth+ | RemoveSynth+ | RemoveGroup+ | WithDoneAction t+ deriving (Eq, Show)++-- | Apply /f/ at 'WithDoneAction'.+done_action_coerce :: (t -> u) -> DoneAction t -> DoneAction u+done_action_coerce f e =+ case e of+ DoNothing -> DoNothing+ PauseSynth -> PauseSynth+ RemoveSynth -> RemoveSynth+ RemoveGroup -> RemoveGroup+ WithDoneAction x -> WithDoneAction (f x)++-- | fmap is 'done_action_coerce'+instance Functor DoneAction where+ fmap = done_action_coerce++-- | Resolve 'DoneAction'.+from_done_action :: Num t => DoneAction t -> t+from_done_action e =+ case e of+ DoNothing -> 0+ PauseSynth -> 1+ RemoveSynth -> 2+ RemoveGroup -> 14+ WithDoneAction x -> x++-- * Warp++-- | Warp interpolation indicator input.+data Warp t =+ Linear+ | Exponential+ | WithWarp t+ deriving (Eq, Show)++-- | Resolve 'Warp'.+from_warp :: Num t => Warp t -> t+from_warp e =+ case e of+ Linear -> 0+ Exponential -> 1+ WithWarp u -> u++-- | Apply /f/ at 'WithWarp'+warp_coerce :: (t -> u) -> Warp t -> Warp u+warp_coerce f e =+ case e of+ Linear -> Linear+ Exponential -> Exponential+ WithWarp u -> WithWarp (f u)++-- | fmap = 'warp_coerce'+instance Functor Warp where+ fmap = warp_coerce++-- * Buffer++-- | Unification of integer and 'UGen' buffer identifiers.+data Buffer t =+ Buffer_Id Int+ | Buffer t+ deriving (Eq, Show)
Sound/SC3/Common/Envelope.hs view
@@ -102,6 +102,10 @@ let Envelope l t c rn ln os = e in Envelope (map f l) (map f t) (map (env_curve_coerce f) c) rn ln (f os) +-- | fmap = 'envelope_coerce'+instance Functor Envelope where+ fmap = envelope_coerce+ -- | Variant without release and loop node inputs (defaulting to nil). envelope :: Num a => [a] -> [a] -> [Envelope_Curve a] -> Envelope a envelope l t c = Envelope l t c Nothing Nothing 0
Sound/SC3/Common/Math.hs view
@@ -1,12 +1,14 @@ -- | Common math functions. module Sound.SC3.Common.Math where -import Data.Fixed {- base -}+import qualified Data.Fixed {- base -} import Data.Maybe {- base -} import Data.Ratio {- base -}-import Numeric {- base -}-import Text.Read {- base -}+import qualified Numeric {- base -}+import qualified Text.Read {- base -} +import qualified Safe {- safe -}+ -- | Half pi. -- -- > half_pi == 1.5707963267948966@@ -19,13 +21,29 @@ two_pi :: Floating n => n two_pi = 2 * pi --- | Multiply and add, ordinary haskell argument order.--- See also 'mul_add' of the 'MulAdd' class.+-- | SC3 MulAdd type signature, arguments in SC3 order of input, multiply, add.+type SC3_MulAdd t = t -> t -> t -> t++-- | Ordinary (un-optimised) multiply-add, see also mulAdd UGen. ----- > map (mul_add_hs 2 3) [1,2] == [5,7] && map (mul_add_hs 3 4) [1,2] == [7,10]-mul_add_hs :: Num a => a -> a -> a -> a-mul_add_hs m a = (+ a) . (* m)+-- > sc3_mul_add 2 3 4 == 2 * 3 + 4+-- > map (\x -> sc3_mul_add x 2 3) [1,5] == [5,13] && map (\x -> sc3_mul_add x 3 2) [1,5] == [5,17]+sc3_mul_add :: Num t => SC3_MulAdd t+sc3_mul_add i m a = i * m + a +-- | Ordinary Haskell order (un-optimised) multiply-add.+--+-- > mul_add 3 4 2 == 2 * 3 + 4+-- > map (mul_add 2 3) [1,5] == [5,13] && map (mul_add 3 4) [1,5] == [7,19]+mul_add :: Num t => t -> t -> t -> t+mul_add m a = (+ a) . (* m)++-- | 'uncurry' 'mul_add'+--+-- > mul_add_hs (3,4) 2 == 2 * 3 + 4+mul_add_hs :: Num t => (t,t) -> t -> t+mul_add_hs = uncurry mul_add+ -- | 'fromInteger' of 'truncate'. sc3_truncate :: RealFrac a => a -> a sc3_truncate = fromInteger . truncate@@ -48,6 +66,7 @@ -- -- > let r = [0,0,0.25,0.25,0.5,0.5,0.5,0.75,0.75,1,1] -- > map (`sc3_round_to` 0.25) [0,0.1 .. 1] == r+-- > map (`sc3_round_to` 5.0) [100.0 .. 110.0] sc3_round_to :: RealFrac n => n -> n -> n sc3_round_to a b = if b == 0 then a else sc3_floor ((a / b) + 0.5) * b @@ -55,7 +74,7 @@ sc3_idiv :: RealFrac n => n -> n -> n sc3_idiv a b = fromInteger (floor a `div` floor b) -{- | The SC3 @%@ UGen operator is the 'Numeric.mod'' function.+{- | The SC3 @%@ UGen operator is the 'Data.Fixed.mod'' function. > > 1.5 % 1.2 // ~= 0.3 > > -1.5 % 1.2 // ~= 0.9@@ -81,7 +100,7 @@ > map (\n -> sc3_mod n 12.0) [-1.0,12.25,15.0] == [11.0,0.25,3.0] -} sc3_mod :: RealFrac n => n -> n -> n-sc3_mod = mod'+sc3_mod = Data.Fixed.mod' -- | Type specialised 'sc3_mod'. fmod_f32 :: Float -> Float -> Float@@ -169,10 +188,11 @@ bin_to_freq :: (Fractional n, Integral i) => n -> i -> i -> n bin_to_freq sr n i = fromIntegral i * sr / fromIntegral n --- | Midi note number to cycles per second.+-- | Fractional midi note number to cycles per second. -- -- > map (floor . midi_to_cps) [0,24,69,120,127] == [8,32,440,8372,12543] -- > map (floor . midi_to_cps) [-36,138] == [1,23679]+-- > map (floor . midi_to_cps) [69.0,69.25 .. 70.0] == [440,446,452,459,466] midi_to_cps :: Floating a => a -> a midi_to_cps i = 440.0 * (2.0 ** ((i - 69.0) * (1.0 / 12.0))) @@ -191,6 +211,7 @@ -- | Linear octave to cycles per second. --+-- > > [4.0,4.25,4.75].octcps.cpsmidi == [60,63,69] -- > map (cps_to_midi . oct_to_cps) [4.0,4.25,4.75] == [60,63,69] oct_to_cps :: Floating a => a -> a oct_to_cps a = 440.0 * (2.0 ** (a - 4.75))@@ -201,7 +222,7 @@ let l = length s d' = round d a = (d - fromIntegral d') * 10.0 * (n / 12.0)- in (n * fromIntegral (d' `div` l)) + (s !! (d' `mod` l)) + a+ in (n * fromIntegral (d' `div` l)) + (Safe.atNote "degree_to_key" s (d' `mod` l)) + a -- | Linear amplitude to decibels. --@@ -217,7 +238,7 @@ -- | Fractional midi note interval to frequency multiplier. ----- > map midi_to_ratio [0,7,12] == [1,1.4983070768766815,2]+-- > map midi_to_ratio [-12,0,7,12] == [0.5,1,1.4983070768766815,2] midi_to_ratio :: Floating a => a -> a midi_to_ratio a = 2.0 ** (a * (1.0 / 12.0)) @@ -374,31 +395,45 @@ -- * LinLin --- | Scale uni-polar (0,1) input to linear (l,r) range+-- | Scale uni-polar (0,1) input to linear (l,r) range.+urange_ma :: Fractional a => SC3_MulAdd a -> a -> a -> a -> a+urange_ma mul_add_f l r i = mul_add_f i (r - l) l++-- | Scale (0,1) input to linear (l,r) range. u = uni-polar. -- -- > map (urange 3 4) [0,0.5,1] == [3,3.5,4] urange :: Fractional a => a -> a -> a -> a-urange l r i = let m = r - l in i * m + l+urange = urange_ma sc3_mul_add --- | Calculate multiplier and add values for 'range' transform.+-- | Calculate multiplier and add values for (-1,1) 'range' transform. -- -- > range_muladd 3 4 == (0.5,3.5) range_muladd :: Fractional t => t -> t -> (t,t) range_muladd = linlin_muladd (-1) 1 -- | Scale bi-polar (-1,1) input to linear (l,r) range. Note that the--- argument order is not the same as 'linlin'.+-- argument order is not the same as 'linLin'.+range_ma :: Fractional a => SC3_MulAdd a -> a -> a -> a -> a+range_ma mul_add_f l r i =+ let (m,a) = range_muladd l r+ in mul_add_f i m a++-- | Scale (-1,1) input to linear (l,r) range. Note that the argument+-- order is not the same as 'linlin'. Note also that the various range+-- UGen methods at sclang select mul-add values given the output range+-- of the UGen, ie LFPulse.range selects a (0,1) input range. -- -- > map (range 3 4) [-1,0,1] == [3,3.5,4] -- > map (\x -> let (m,a) = linlin_muladd (-1) 1 3 4 in x * m + a) [-1,0,1] == [3,3.5,4] range :: Fractional a => a -> a -> a -> a-range l r i = let (m,a) = range_muladd l r in i * m + a+range = range_ma sc3_mul_add --- | Tuple variant of 'range'.+-- | 'uncurry' 'range' range_hs :: Fractional a => (a,a) -> a -> a-range_hs (l,r) = range l r+range_hs = uncurry range -- | Calculate multiplier and add values for 'linlin' transform.+-- Inputs are: input-min input-max output-min output-max -- -- > range_muladd 3 4 == (0.5,3.5) -- > linlin_muladd (-1) 1 3 4 == (0.5,3.5)@@ -411,11 +446,19 @@ a = dl - (m * sl) in (m,a) --- | 'sc3_linlin' with a more typical haskell argument structure, ranges as pairs and input last.+-- | Map from one linear range to another linear range. ----- > map (linlin_hs (0,127) (-0.5,0.5)) [0,63.5,127]+-- > linlin_ma hs_muladd 5 0 10 (-1) 1 == 0+linlin_ma :: Fractional a => SC3_MulAdd a -> a -> a -> a -> a -> a -> a+linlin_ma mul_add_f i sl sr dl dr =+ let (m,a) = linlin_muladd sl sr dl dr+ in mul_add_f i m a++-- | 'linLin' with a more typical haskell argument structure, ranges as pairs and input last.+--+-- > map (linlin_hs (0,127) (-0.5,0.5)) [0,63.5,127] == [-0.5,0.0,0.5] linlin_hs :: Fractional a => (a, a) -> (a, a) -> a -> a-linlin_hs (sl,sr) (dl,dr) i = let (m,a) = linlin_muladd sl sr dl dr in i * m + a+linlin_hs (sl,sr) (dl,dr) = let (m,a) = linlin_muladd sl sr dl dr in (+ a) . (* m) {- | Map from one linear range to another linear range. @@ -569,28 +612,44 @@ -- * PP --- | The default show is odd, 0.05 shows as 5.0e-2.------ > unwords (map (double_pp 4) [0.0001,0.001,0.01,0.1,1.0]) == "0.0001 0.001 0.01 0.1 1.0"-double_pp :: Int -> Double -> String-double_pp k n =+-- | Removes all but the last trailing zero from floating point string.+double_pp_rm0 :: String -> String+double_pp_rm0 = let rev_f f = reverse . f . reverse remv l = case l of '0':'.':_ -> l '0':l' -> remv l' _ -> l- in rev_f remv (showFFloat (Just k) n "")+ in rev_f remv +-- | The default show is odd, 0.05 shows as 5.0e-2.+--+-- > unwords (map (double_pp 4) [0.0001,0.001,0.01,0.1,1.0]) == "0.0001 0.001 0.01 0.1 1.0"+double_pp :: Int -> Double -> String+double_pp k n = double_pp_rm0 (Numeric.showFFloat (Just k) n "")+ -- | Print as integer if integral, else as real. ----- > unwords (map real_pp [0.0001,0.001,0.01,0.1,1.0]) == "0.0001 0.001 0.01 0.1 1"-real_pp :: Double -> String-real_pp n =+-- > unwords (map (real_pp 5) [0.0001,0.001,0.01,0.1,1.0]) == "0.0001 0.001 0.01 0.1 1"+real_pp :: Int -> Double -> String+real_pp k n = let r = toRational n- in if denominator r == 1 then show (numerator r) else double_pp 5 n+ in if denominator r == 1 then show (numerator r) else double_pp k n -- * Parser --- | Type-specialised 'R.readMaybe'.+-- | Type-specialised 'Text.Read.readMaybe'. parse_double :: String -> Maybe Double-parse_double = readMaybe+parse_double = Text.Read.readMaybe++-- * Optimiser++-- | Non-specialised optimised sum function (3 & 4 element adders).+sum_opt_f :: Num t => (t -> t -> t -> t) -> (t -> t -> t -> t -> t) -> [t] -> t+sum_opt_f f3 f4 =+ let recur l =+ case l of+ p:q:r:s:l' -> recur (f4 p q r s : l')+ p:q:r:l' -> recur (f3 p q r : l')+ _ -> sum l+ in recur
+ Sound/SC3/Common/Math/Noise.hs view
@@ -0,0 +1,47 @@+-- | Noise generating functions.+module Sound.SC3.Common.Math.Noise where++import Sound.SC3.Common.Math {- hsc3 -}++-- | x(n+1) = a - b * sqrt(|x(n)|)+cusp_f :: Floating t => t -> t -> t -> t+cusp_f a b x = a - (b * sqrt (abs x))++-- | x(n+1) = sin(im * y(n) + fb * x(n))+-- y(n+1) = (a * y(n) + c) % 2pi+fbSine_f :: (Floating t, RealFrac t) => t -> t -> t -> t -> (t, t) -> (t, t)+fbSine_f im fb a c (x,y) = (sin ((im * y) + (fb * x)),((a * y) + c) `sc3_mod` (2 * pi))++-- | x(n+2) = 1 - a * x(n+1)^2 + b * x(n)+henon_f :: Floating t => t -> t -> (t, t) -> (t, t)+henon_f a b (x1,x0) = (1 - (a * (x1 ** 2)) + (b * x0),x1)++-- | x(n+1) = sin(b * y(n)) + c * sin(b * x(n))+-- y(n+1) = sin(a * x(n)) + d * sin(a * y(n))+latoocarfian_f :: Floating t => t -> t -> t -> t -> (t, t) -> (t, t)+latoocarfian_f a b c d (x,y) = (sin(b * y) + (c * sin (b * x)),sin(a * x) + (d * sin (a * y)))++-- | x(n+1) = (a * x(n) + c) % m+linCong_f :: RealFrac t => t -> t -> t -> t -> t+linCong_f a c m x = (a * x + c) `sc3_mod` m++-- | x(n+1) = a * x * (1.0 - x)+logistic_f :: Num t => t -> t -> t+logistic_f a x = a * x * (1 - x)++-- | x' = s * (y - x)+-- y' = x * (r - z) - y+-- z' = x * y - b * z+lorenz_f :: Num t => t -> t -> t -> (t, t, t) -> (t, t, t)+lorenz_f s r b (x,y,z) = (s * (y - x),x * (r - z) - y,x * y - b * z)++-- | x(n+1) = a * x(n)^2 + b * x(n) + c+quad_f :: Floating t => t -> t -> t -> t -> t+quad_f a b c x = (a * (x ** 2)) + (b * x) + c++-- | x(n+1) = (x(n) + y(n+1)) % 2pi+-- y(n+1) = (y(n) + k * sin(x(n))) % 2pi+standard_f :: (RealFrac t, Floating t) => t -> (t, t) -> (t, t)+standard_f k (x,y) =+ let y' = (y + (k * sin x)) `sc3_mod` two_pi+ in ((x + y') `sc3_mod` two_pi,y')
+ Sound/SC3/Common/Math/Operator.hs view
@@ -0,0 +1,490 @@+{- | Non-standard mathematical enumerations, classes and base instances.++Enumerations of the unary and binary math unit generators.+Names that conflict with existing names have a @_@ suffix.++The Eq and Ord classes in the Prelude require Bool, hence EqE and OrdE.+True is 1.0, False is 0.0++The RealFrac class requires Integral results, hence RealFracE.++-}+module Sound.SC3.Common.Math.Operator where++import Control.Monad {- base -}+import qualified Data.Fixed as F {- base -}+import Data.Int {- base -}+import Data.Maybe {- base -}++import qualified Sound.SC3.Common.Base as Base {- hsc3 -}+import qualified Sound.SC3.Common.Math as Math {- hsc3 -}++-- * Unary++-- | Enumeration of @SC3@ unary operator UGens.+data SC3_Unary_Op+ = Neg -- -+ | Not -- !+ | IsNil+ | NotNil+ | BitNot+ | Abs+ | AsFloat+ | AsInt+ | Ceil+ | Floor+ | Frac+ | Sign+ | Squared+ | Cubed+ | Sqrt+ | Exp+ | Recip+ | MIDICPS+ | CPSMIDI+ | MIDIRatio+ | RatioMIDI+ | DbAmp+ | AmpDb+ | OctCPS+ | CPSOct+ | Log+ | Log2+ | Log10+ | Sin+ | Cos+ | Tan+ | ArcSin+ | ArcCos+ | ArcTan+ | SinH+ | CosH+ | TanH+ | Rand_ -- UGen+ | Rand2+ | LinRand_ -- UGen+ | BiLinRand+ | Sum3Rand+ | Distort+ | SoftClip+ | Coin+ | DigitValue+ | Silence+ | Thru+ | RectWindow+ | HanWindow+ | WelchWindow+ | TriWindow+ | Ramp_ -- UGen+ | SCurve+ deriving (Eq,Show,Enum,Bounded,Read)++-- | Type-specialised 'Base.parse_enum'.+--+-- > mapMaybe (parse_unary Base.CS) (words "Abs Rand_") == [Abs,Rand_]+parse_unary :: Base.Case_Rule -> String -> Maybe SC3_Unary_Op+parse_unary = Base.parse_enum++-- | Table of operator names (non-symbolic) and indices.+--+-- > map fst sc3_unary_op_tbl+sc3_unary_op_tbl :: [(String,Int)]+sc3_unary_op_tbl = zip (map show [Neg .. SCurve]) [0..]++-- | Table of symbolic names for standard unary operators.+unary_sym_tbl :: [(SC3_Unary_Op,String)]+unary_sym_tbl = [] -- (Neg,"-"),(Not,"!")++-- | Lookup possibly symbolic name for standard unary operators.+unaryName :: Int -> String+unaryName n =+ let e = toEnum n+ in fromMaybe (show e) (lookup e unary_sym_tbl)++-- | Given name of unary operator derive index.+--+-- > mapMaybe (unaryIndex CI) (words "NEG CUBED") == [0,13]+-- > unaryIndex CS "SinOsc" == Nothing+unaryIndex :: Base.Case_Rule -> String -> Maybe Int+unaryIndex cr nm =+ let ix = Base.rlookup_str cr nm unary_sym_tbl+ ix' = parse_unary cr nm+ in fmap fromEnum (mplus ix' ix)++-- | 'isJust' of 'unaryIndex'.+--+-- > map (is_unary CI) (words "ABS MIDICPS NEG")+-- > map (is_unary CI) (words "- RAND")+is_unary :: Base.Case_Rule -> String -> Bool+is_unary cr = isJust . unaryIndex cr++-- * Binary++-- | Enumeration of @SC3@ unary operator UGens.+--+-- > map show [minBound :: Binary .. maxBound]+data SC3_Binary_Op+ = Add -- 0+ | Sub -- 1+ | Mul -- 2+ | IDiv+ | FDiv -- 4+ | Mod -- 5+ | EQ_ -- 6+ | NE -- 7+ | LT_ -- 8+ | GT_ -- 9+ | LE -- 10+ | GE -- 11+ | Min -- 12+ | Max+ | BitAnd+ | BitOr+ | BitXor+ | LCM+ | GCD+ | Round+ | RoundUp+ | Trunc+ | Atan2+ | Hypot+ | Hypotx+ | Pow -- 25+ | ShiftLeft+ | ShiftRight+ | UnsignedShift+ | Fill+ | Ring1+ | Ring2+ | Ring3+ | Ring4+ | DifSqr+ | SumSqr+ | SqrSum+ | SqrDif+ | AbsDif+ | Thresh+ | AMClip+ | ScaleNeg+ | Clip2+ | Excess+ | Fold2+ | Wrap2+ | FirstArg+ | RandRange+ | ExpRandRange+ deriving (Eq,Show,Enum,Bounded,Read)++-- | Table of operator names (non-symbolic) and indices.+sc3_binary_op_tbl :: [(String,Int)]+sc3_binary_op_tbl = zip (map show [Add .. ExpRandRange]) [0..]++-- | Type-specialised 'parse_enum'.+parse_binary :: Base.Case_Rule -> String -> Maybe SC3_Binary_Op+parse_binary = Base.parse_enum++-- | Table of symbolic names for standard binary operators.+binary_sym_tbl :: [(SC3_Binary_Op,String)]+binary_sym_tbl =+ [(Add,"+")+ ,(Sub,"-")+ ,(Mul,"*")+ ,(FDiv,"/")+ ,(Mod,"%")+ ,(EQ_,"==")+ ,(NE,"/=") -- !=+ ,(LT_,"<")+ ,(GT_,">")+ ,(LE,"<=")+ ,(GE,">=")+ ,(BitAnd,".&.") -- &+ ,(BitOr,".|.") -- |+ ,(Pow,"**")]++-- | Table of operator names (non-symbolic) and indices.+--+-- > map fst sc3_binary_op_sym_tbl+sc3_binary_op_sym_tbl :: [(String,Int)]+sc3_binary_op_sym_tbl =+ let f x = maybe (show x) id (lookup x binary_sym_tbl)+ in zip (map f [Add .. ExpRandRange]) [0..]++-- | Lookup possibly symbolic name for standard binary operators.+--+-- > map binaryName [1,2,8,12] == ["-","*","<","Min"]+binaryName :: Int -> String+binaryName n =+ let e = toEnum n+ in fromMaybe (show e) (lookup e binary_sym_tbl)++-- | Given name of binary operator derive index.+--+-- > mapMaybe (binaryIndex CI) (words "* MUL RING1") == [2,2,30]+-- > binaryIndex CI "SINOSC" == Nothing+binaryIndex :: Base.Case_Rule -> String -> Maybe Int+binaryIndex cr nm =+ let ix = Base.rlookup_str cr nm binary_sym_tbl+ ix' = parse_binary cr nm+ in fmap fromEnum (mplus ix' ix)++-- | 'isJust' of 'binaryIndex'.+--+-- > map (is_binary CI) (words "== > % TRUNC MAX")+is_binary :: Base.Case_Rule -> String -> Bool+is_binary cr = isJust . binaryIndex cr++-- * Operator++-- | Order of lookup: binary then unary.+--+-- > map (resolve_operator Sound.SC3.Common.Base.CI) (words "+ - ADD SUB NEG")+resolve_operator :: Base.Case_Rule -> String -> (String,Maybe Int)+resolve_operator cr nm =+ case binaryIndex cr nm of+ Just sp -> ("SC3_Binary_OpOpUGen",Just sp)+ Nothing -> case unaryIndex cr nm of+ Just sp -> ("UnaryOpUGen",Just sp)+ _ -> (nm,Nothing)++-- * Classes++-- | Variant on 'Eq' class, result is of the same type as the values compared.+class (Eq a,Num a) => EqE a where+ equal_to :: a -> a -> a+ equal_to = Math.sc3_eq+ not_equal_to :: a -> a -> a+ not_equal_to = Math.sc3_neq++instance EqE Int where+instance EqE Integer where+instance EqE Int32 where+instance EqE Int64 where+instance EqE Float where+instance EqE Double where++-- | Variant on Ord class, result is of the same type as the values compared.+class (Ord a,Num a) => OrdE a where+ less_than :: a -> a -> a+ less_than = Math.sc3_lt+ less_than_or_equal_to :: a -> a -> a+ less_than_or_equal_to = Math.sc3_lte+ greater_than :: a -> a -> a+ greater_than = Math.sc3_gt+ greater_than_or_equal_to :: a -> a -> a+ greater_than_or_equal_to = Math.sc3_gte++instance OrdE Int+instance OrdE Integer+instance OrdE Int32+instance OrdE Int64+instance OrdE Float+instance OrdE Double++-- | Variant of 'RealFrac' with non 'Integral' results.+class RealFrac a => RealFracE a where+ properFractionE :: a -> (a,a)+ properFractionE = Math.sc3_properFraction+ truncateE :: a -> a+ truncateE = Math.sc3_truncate+ roundE :: a -> a+ roundE = Math.sc3_round+ ceilingE :: a -> a+ ceilingE = Math.sc3_ceiling+ floorE :: a -> a+ floorE = Math.sc3_floor++instance RealFracE Float+instance RealFracE Double++-- | Unary operator class.+--+-- > map (floor . (* 1e4) . dbAmp) [-90,-60,-30,0] == [0,10,316,10000]+class (Floating a, Ord a) => UnaryOp a where+ ampDb :: a -> a+ ampDb = Math.amp_to_db+ asFloat :: a -> a+ asFloat = error "asFloat"+ asInt :: a -> a+ asInt = error "asInt"+ cpsMIDI :: a -> a+ cpsMIDI = Math.cps_to_midi+ cpsOct :: a -> a+ cpsOct = Math.cps_to_oct+ cubed :: a -> a+ cubed n = n * n * n+ dbAmp :: a -> a+ dbAmp = Math.db_to_amp+ distort :: a -> a+ distort = Math.sc3_distort+ frac :: a -> a+ frac = error "frac"+ isNil :: a -> a+ isNil a = if a == 0.0 then 0.0 else 1.0+ log10 :: a -> a+ log10 = logBase 10+ log2 :: a -> a+ log2 = logBase 2+ midiCPS :: a -> a+ midiCPS = Math.midi_to_cps+ midiRatio :: a -> a+ midiRatio = Math.midi_to_ratio+ notE :: a -> a+ notE a = if a > 0.0 then 0.0 else 1.0+ notNil :: a -> a+ notNil a = if a /= 0.0 then 0.0 else 1.0+ octCPS :: a -> a+ octCPS = Math.oct_to_cps+ ramp_ :: a -> a+ ramp_ _ = error "ramp_"+ ratioMIDI :: a -> a+ ratioMIDI = Math.ratio_to_midi+ softClip :: a -> a+ softClip = Math.sc3_softclip+ squared :: a -> a+ squared = \z -> z * z++instance UnaryOp Float where+instance UnaryOp Double where++-- | SC3_Binary_Op operator class.+class (Floating a,RealFrac a, Ord a) => BinaryOp a where+ absDif :: a -> a -> a+ absDif a b = abs (a - b)+ amClip :: a -> a -> a+ amClip a b = if b <= 0 then 0 else a * b+ atan2E :: a -> a -> a+ atan2E a b = atan (b/a)+ clip2 :: a -> a -> a+ clip2 a b = Math.sc3_clip a (-b) b+ difSqr :: a -> a -> a+ difSqr = Math.sc3_dif_sqr+ excess :: a -> a -> a+ excess a b = a - Math.sc3_clip a (-b) b+ exprandRange :: a -> a -> a+ exprandRange = error "exprandRange"+ fill :: a -> a -> a+ fill = error "fill"+ firstArg :: a -> a -> a+ firstArg a _ = a+ fold2 :: a -> a -> a+ fold2 a b = Math.sc3_fold a (-b) b+ gcdE :: a -> a -> a+ gcdE = error "gcdE"+ hypot :: a -> a -> a+ hypot = Math.sc3_hypot+ hypotx :: a -> a -> a+ hypotx = Math.sc3_hypotx+ iDiv :: a -> a -> a+ iDiv = Math.sc3_idiv+ lcmE :: a -> a -> a+ lcmE = error "lcmE"+ modE :: a -> a -> a+ modE = error "modE"+ randRange :: a -> a -> a+ randRange = error "randRange"+ ring1 :: a -> a -> a+ ring1 a b = a * b + a+ ring2 :: a -> a -> a+ ring2 a b = a * b + a + b+ ring3 :: a -> a -> a+ ring3 a b = a * a * b+ ring4 :: a -> a -> a+ ring4 a b = a * a * b - a * b * b+ roundUp :: a -> a -> a+ roundUp = error "roundUp"+ scaleNeg :: a -> a -> a+ scaleNeg a b = (abs a - a) * b' + a where b' = 0.5 * b + 0.5+ sqrDif :: a -> a -> a+ sqrDif a b = (a-b) * (a-b)+ sqrSum :: a -> a -> a+ sqrSum a b = (a+b) * (a+b)+ sumSqr :: a -> a -> a+ sumSqr a b = (a*a) + (b*b)+ thresh :: a -> a -> a+ thresh a b = if a < b then 0 else a+ trunc :: a -> a -> a+ trunc = error "trunc"+ wrap2 :: a -> a -> a+ wrap2 = error "wrap2"++instance BinaryOp Float where+ fold2 a b = Math.sc3_fold a (-b) b+ modE = F.mod'+ roundUp a b = if b == 0 then a else ceilingE (a/b + 0.5) * b+ wrap2 a b = Math.sc3_wrap_ni a (-b) b++instance BinaryOp Double where+ fold2 a b = Math.sc3_fold a (-b) b+ modE = F.mod'+ roundUp a b = if b == 0 then a else ceilingE (a/b + 0.5) * b+ wrap2 a b = Math.sc3_wrap_ni a (-b) b++-- * Infix++(==**) :: EqE a => a -> a -> a+(==**) = equal_to++(/=**) :: EqE a => a -> a -> a+(/=**) = not_equal_to++(<**) :: OrdE a => a -> a -> a+(<**) = less_than++(<=**) :: OrdE a => a -> a -> a+(<=**) = less_than_or_equal_to++(>**) :: OrdE a => a -> a -> a+(>**) = greater_than++(>=**) :: OrdE a => a -> a -> a+(>=**) = greater_than_or_equal_to++-- * Tables++-- | Association table for 'SC3_Binary_Op' to haskell function implementing operator.+binop_hs_tbl :: (Real n,Floating n,RealFrac n) => [(SC3_Binary_Op,n -> n -> n)]+binop_hs_tbl =+ [(Add,(+))+ ,(Sub,(-))+ ,(FDiv,(/))+ ,(IDiv,Math.sc3_idiv)+ ,(Mod,Math.sc3_mod)+ ,(EQ_,Math.sc3_eq)+ ,(NE,Math.sc3_neq)+ ,(LT_,Math.sc3_lt)+ ,(LE,Math.sc3_lte)+ ,(GT_,Math.sc3_gt)+ ,(GE,Math.sc3_gte)+ ,(Min,min)+ ,(Max,max)+ ,(Mul,(*))+ ,(Pow,(**))+ ,(Min,min)+ ,(Max,max)+ ,(Round,Math.sc3_round_to)]++-- | 'lookup' 'binop_hs_tbl' via 'toEnum'.+binop_special_hs :: (RealFrac n,Floating n) => Int -> Maybe (n -> n -> n)+binop_special_hs z = lookup (toEnum z) binop_hs_tbl++-- | Association table for 'Unary' to haskell function implementing operator.+uop_hs_tbl :: (RealFrac n,Floating n) => [(SC3_Unary_Op,n -> n)]+uop_hs_tbl =+ [(Neg,negate)+ ,(Not,\z -> if z > 0 then 0 else 1)+ ,(Abs,abs)+ ,(Ceil,Math.sc3_ceiling)+ ,(Floor,Math.sc3_floor)+ ,(Squared,\z -> z * z)+ ,(Cubed,\z -> z * z * z)+ ,(Sqrt,sqrt)+ ,(Recip,recip)+ ,(MIDICPS,Math.midi_to_cps)+ ,(CPSMIDI,Math.cps_to_midi)+ ,(Sin,sin)+ ,(Cos,cos)+ ,(Tan,tan)]++-- | 'lookup' 'uop_hs_tbl' via 'toEnum'.+uop_special_hs :: (RealFrac n,Floating n) => Int -> Maybe (n -> n)+uop_special_hs z = lookup (toEnum z) uop_hs_tbl
+ Sound/SC3/Common/Rate.hs view
@@ -0,0 +1,60 @@+-- | Operating rate definitions and utilities.+module Sound.SC3.Common.Rate where++import Data.Char {- base -}++-- | Operating rate of unit generator.+-- I = initialisation, K = control, A = audio, D = demand.+--+-- > Data.List.sort [DR,AR,KR,IR] == [IR,KR,AR,DR]+data Rate = IR | KR | AR | DR+ deriving (Eq,Ord,Enum,Bounded,Show,Read)++-- | Integer rate identifier, as required for scsynth bytecode.+rateId :: Rate -> Int+rateId = fromEnum++-- | Color identifiers for each 'Rate'.+rate_color :: Rate -> String+rate_color r =+ case r of+ AR -> "black"+ KR -> "blue"+ IR -> "yellow"+ DR -> "red"++-- | Set of all 'Rate' values.+all_rates :: [Rate]+all_rates = [minBound .. maxBound]++-- | Case insensitive parser for rate.+--+-- > Data.Maybe.mapMaybe rate_parse (words "ar kR IR Dr") == [AR,KR,IR,DR]+rate_parse :: String -> Maybe Rate+rate_parse r =+ case map toUpper r of+ "AR" -> Just AR+ "KR" -> Just KR+ "IR" -> Just IR+ "DR" -> Just DR+ _ -> Nothing++-- * Control rates++-- | Enumeration of the four operating rates for controls.+-- I = initialisation, K = control, T = trigger, A = audio.+data K_Type = K_IR | K_KR | K_TR | K_AR+ deriving (Eq,Show,Ord)++-- | Determine class of control given 'Rate' and /trigger/ status.+ktype :: Rate -> Bool -> K_Type+ktype r tr =+ if tr+ then case r of+ KR -> K_TR+ _ -> error "ktype: non KR trigger control"+ else case r of+ IR -> K_IR+ KR -> K_KR+ AR -> K_AR+ DR -> error "ktype: DR control"
Sound/SC3/Common/UId.hs view
@@ -9,6 +9,7 @@ import Data.List {- base -} import qualified Data.Unique as Unique {- base -} +--import qualified Control.Monad.Trans.Identity as Identity {- transformers -} import qualified Control.Monad.Trans.Reader as Reader {- transformers -} import qualified Control.Monad.Trans.State as State {- transformers -} import qualified Data.Digest.Murmur32 as Murmur32 {- hashable -}@@ -40,6 +41,10 @@ -- | 'State.State' UId. type UId_ST = State.State Int +-- | Alias for 'runIdentity'.+uid_id_eval :: Identity t -> t+uid_id_eval = runIdentity+ -- | 'State.evalState' with initial state of zero. -- -- > uid_st_eval (replicateM 3 generateUId) == [0,1,2]@@ -103,6 +108,6 @@ -- | /n/ identifiers from /x/. ----- > id_seq 10 'α' == [945 .. 954]+-- > id_seq 10 'α' == [1439603815 .. 1439603824] id_seq :: ID a => Int -> a -> [Id] id_seq n x = take n [resolveID x ..]
Sound/SC3/Server.hs view
@@ -9,4 +9,5 @@ import Sound.SC3.Server.Status as S import Sound.SC3.Server.NRT as S import Sound.SC3.Server.NRT.Edit as S+import Sound.SC3.Server.Param as S import Sound.SC3.Server.Recorder as S
Sound/SC3/Server/Command/Generic.hs view
@@ -12,35 +12,54 @@ import qualified Sound.SC3.Server.Graphdef as G import qualified Sound.SC3.Server.Synthdef as S +cmd_check_arg :: String -> (t -> Bool) -> t -> t+cmd_check_arg e f x = if not (f x) then error e else x+ -- * Buffer commands (b_) +-- | BUF-NUM must be >= 0+b_bufnum :: Integral t => t -> Datum+b_bufnum = int32 . cmd_check_arg "buffer-number < 0?" (>= 0)++-- | BUF-FRAME-IX must be >= 0+b_ix :: Integral t => t -> Datum+b_ix = int32 . cmd_check_arg "buffer-ix < 0?" (>= 0)++-- | BUF-CHANNEL must be >= 0+b_ch :: Integral t => t -> Datum+b_ch = int32 . cmd_check_arg "buffer-channel < 0?" (>= 0)++-- | BUF-FRAME-CNT must be >= 0+b_size :: Integral t => t -> Datum+b_size = int32 . cmd_check_arg "buffer-size < 0?" (>= 0)+ -- | Allocates zero filled buffer to number of channels and samples. (Asynchronous) b_alloc :: Integral i => i -> i -> i -> Message-b_alloc nid frames channels = message "/b_alloc" [int32 nid,int32 frames,int32 channels]+b_alloc b frames channels = message "/b_alloc" [b_bufnum b,b_size frames,int32 channels] -- | Allocate buffer space and read a sound file. (Asynchronous) b_allocRead :: Integral i => i -> String -> i -> i -> Message-b_allocRead nid p f n = message "/b_allocRead" [int32 nid,string p,int32 f,int32 n]+b_allocRead b p f n = message "/b_allocRead" [b_bufnum b,string p,b_ix f,b_ix n] -- | Allocate buffer space and read a sound file, picking specific channels. (Asynchronous) b_allocReadChannel :: Integral i => i -> String -> i -> i -> [i] -> Message-b_allocReadChannel nid p f n cs = message "/b_allocReadChannel" ([int32 nid,string p,int32 f,int32 n] ++ map int32 cs)+b_allocReadChannel b p f n cs = message "/b_allocReadChannel" ([b_bufnum b,string p,b_ix f,b_ix n] ++ map b_ch cs) -- | Close attached soundfile and write header information. (Asynchronous) b_close :: Integral i => i -> Message-b_close nid = message "/b_close" [int32 nid]+b_close b = message "/b_close" [b_bufnum b] -- | Fill ranges of sample values. b_fill :: (Integral i,Real n) => i -> [(i,i,n)] -> Message-b_fill nid l = message "/b_fill" (int32 nid : B.mk_triples int32 int32 float l)+b_fill b l = message "/b_fill" (b_bufnum b : B.mk_triples int32 int32 float l) -- | Free buffer data. (Asynchronous) b_free :: Integral i => i -> Message-b_free nid = message "/b_free" [int32 nid]+b_free b = message "/b_free" [b_bufnum b] -- | Call a command to fill a buffer. (Asynchronous) b_gen :: Integral i => i -> String -> [Datum] -> Message-b_gen bid name arg = message "/b_gen" (int32 bid : string name : arg)+b_gen b name arg = message "/b_gen" (b_bufnum b : string name : arg) -- | Call @sine1@ 'b_gen' command. b_gen_sine1 :: (Integral i,Real n) => i -> [E.B_Gen] -> [n] -> Message@@ -66,11 +85,11 @@ -- | Get sample values. b_get :: Integral i => i -> [i] -> Message-b_get nid i = message "/b_get" (int32 nid : map int32 i)+b_get b i = message "/b_get" (b_bufnum b : map int32 i) -- | Get ranges of sample values. b_getn :: Integral i => i -> [(i,i)] -> Message-b_getn nid l = message "/b_getn" (int32 nid : B.mk_duples int32 int32 l)+b_getn b l = message "/b_getn" (b_bufnum b : B.mk_duples b_ix b_size l) -- | Request \/b_info messages. b_query :: Integral i => [i] -> Message@@ -78,32 +97,32 @@ -- | Read sound file data into an existing buffer. (Asynchronous) b_read :: Integral i => i -> String -> i -> i -> i -> Bool -> Message-b_read nid p f n f' z = message "/b_read" [int32 nid,string p,int32 f,int32 n,int32 f',int32 (fromEnum z)]+b_read b p f n f' z = message "/b_read" [b_bufnum b,string p,int32 f,int32 n,int32 f',int32 (fromEnum z)] -- | Read sound file data into an existing buffer, picking specific channels. (Asynchronous) b_readChannel :: Integral i => i -> String -> i -> i -> i -> Bool -> [i] -> Message-b_readChannel nid p f n f' z cs = message "/b_readChannel" ([int32 nid,string p,int32 f,int32 n,int32 f',int32 (fromEnum z)] ++ map int32 cs)+b_readChannel b p f n f' z cs = message "/b_readChannel" ([b_bufnum b,string p,int32 f,int32 n,int32 f',int32 (fromEnum z)] ++ map int32 cs) -- | Set sample values. b_set :: (Integral i,Real n) => i -> [(i,n)] -> Message-b_set nid l = message "/b_set" (int32 nid : B.mk_duples int32 float l)+b_set b l = message "/b_set" (b_bufnum b : B.mk_duples int32 float l) -- | Set ranges of sample values. b_setn :: (Integral i,Real n) => i -> [(i,[n])] -> Message-b_setn nid l =+b_setn b l = let f (i,d) = int32 i : int32 (length d) : map float d- in message "/b_setn" (int32 nid : concatMap f l)+ in message "/b_setn" (b_bufnum b : concatMap f l) -- | Write sound file data. (Asynchronous) b_write :: Integral i => i -> String -> E.SoundFileFormat -> E.SampleFormat -> i -> i -> Bool -> Message-b_write nid p h t f s z =+b_write b p h t f s z = let h' = string (E.soundFileFormatString h) t' = string (E.sampleFormatString t)- in message "/b_write" [int32 nid,string p,h',t',int32 f,int32 s,int32 (fromEnum z)]+ in message "/b_write" [b_bufnum b,string p,h',t',int32 f,int32 s,int32 (fromEnum z)] -- | Zero sample data. (Asynchronous) b_zero :: Integral i => i -> Message-b_zero nid = message "/b_zero" [int32 nid]+b_zero b = message "/b_zero" [b_bufnum b] -- * Control bus commands (c_) @@ -132,12 +151,16 @@ -- * Instrument definition commands (d_) -- | Install a bytecode instrument definition. (Asynchronous)-d_recv' :: G.Graphdef -> Message-d_recv' g = message "/d_recv" [Blob (G.encode_graphdef g)]+d_recv_bytes :: BLOB -> Message+d_recv_bytes b = message "/d_recv" [Blob b] --- | Install a bytecode instrument definition. (Asynchronous)+-- | 'G.Graphdef' encoding variant.+d_recv_gr :: G.Graphdef -> Message+d_recv_gr = d_recv_bytes . G.encode_graphdef++-- | 'S.Synthdef' encoding variant. d_recv :: S.Synthdef -> Message-d_recv d = message "/d_recv" [Blob (S.synthdefData d)]+d_recv = d_recv_bytes . S.synthdefData -- | Load an instrument definition from a named file. (Asynchronous) d_load :: String -> Message@@ -207,9 +230,13 @@ -- * Node commands (n_) +-- | NODE-ID must be >= -1+n_id :: Integral t => t -> Datum+n_id = int32 . cmd_check_arg "node-id < -1?" (>= (-1))+ -- | Place a node after another. n_after :: Integral i => [(i,i)] -> Message-n_after = message "/n_after" . B.mk_duples int32 int32+n_after = message "/n_after" . B.mk_duples n_id n_id -- | Place a node before another. n_before :: Integral i => [(i,i)] -> Message@@ -217,46 +244,46 @@ -- | Fill ranges of a node's control values. n_fill :: (Integral i,Real f) => i -> [(String,i,f)] -> Message-n_fill nid l = message "/n_fill" (int32 nid : B.mk_triples string int32 float l)+n_fill n l = message "/n_fill" (n_id n : B.mk_triples string int32 float l) -- | Delete a node. n_free :: Integral i => [i] -> Message-n_free = message "/n_free" . map int32+n_free = message "/n_free" . map n_id n_map :: Integral i => i -> [(String,i)] -> Message-n_map nid l = message "/n_map" (int32 nid : B.mk_duples string int32 l)+n_map n l = message "/n_map" (n_id n : B.mk_duples string int32 l) -- | Map a node's controls to read from buses. -- n_mapn only works if the control is given as an index and not as a name (3.8.0). n_mapn :: Integral i => i -> [(i,i,i)] -> Message-n_mapn nid l = message "/n_mapn" (int32 nid : B.mk_triples int32 int32 int32 l)+n_mapn n l = message "/n_mapn" (n_id n : B.mk_triples int32 int32 int32 l) -- | Map a node's controls to read from an audio bus. n_mapa :: Integral i => i -> [(String,i)] -> Message-n_mapa nid l = message "/n_mapa" (int32 nid : B.mk_duples string int32 l)+n_mapa n l = message "/n_mapa" (n_id n : B.mk_duples string int32 l) -- | Map a node's controls to read from audio buses. n_mapan :: Integral i => i -> [(String,i,i)] -> Message-n_mapan nid l = message "/n_mapan" (int32 nid : B.mk_triples string int32 int32 l)+n_mapan n l = message "/n_mapan" (n_id n : B.mk_triples string int32 int32 l) -- | Get info about a node. n_query :: Integral i => [i] -> Message-n_query = message "/n_query" . map int32+n_query = message "/n_query" . map n_id -- | Turn node on or off. n_run :: Integral i => [(i,Bool)] -> Message-n_run = message "/n_run" . B.mk_duples int32 (int32 . fromEnum)+n_run = message "/n_run" . B.mk_duples n_id (int32 . fromEnum) -- | Set a node's control values. n_set :: (Integral i,Real n) => i -> [(String,n)] -> Message-n_set nid c = message "/n_set" (int32 nid : B.mk_duples string float c)+n_set n c = message "/n_set" (n_id n : B.mk_duples string float c) -- | Set ranges of a node's control values. -- n_mapn and n_setn only work if the control is given as an index and not as a name. n_setn :: (Integral i,Real n) => i -> [(i,[n])] -> Message-n_setn nid l =+n_setn n l = let f (s,d) = int32 s : int32 (length d) : map float d- in message "/n_setn" (int32 nid : concatMap f l)+ in message "/n_setn" (n_id n : concatMap f l) -- | Trace a node. n_trace :: Integral i => [i] -> Message@@ -276,11 +303,11 @@ -- | Get control values. s_get :: Integral i => i -> [String] -> Message-s_get nid i = message "/s_get" (int32 nid : map string i)+s_get n i = message "/s_get" (n_id n : map string i) -- | Get ranges of control values. s_getn :: Integral i => i -> [(String,i)] -> Message-s_getn nid l = message "/s_getn" (int32 nid : B.mk_duples string int32 l)+s_getn n l = message "/s_getn" (n_id n : B.mk_duples string int32 l) -- | Create a new synth. s_new :: (Integral i,Real n) => String -> i -> E.AddAction -> i -> [(String,n)] -> Message@@ -294,7 +321,7 @@ -- | Send a command to a unit generator. u_cmd :: Integral i => i -> i -> String -> [Datum] -> Message-u_cmd nid uid name arg = message "/u_cmd" ([int32 nid,int32 uid,string name] ++ arg)+u_cmd n uid name arg = message "/u_cmd" ([n_id n,int32 uid,string name] ++ arg) -- * Server operation commands @@ -360,14 +387,14 @@ -- | Pre-allocate for b_setn1, values preceding offset are zeroed. b_alloc_setn1 :: (Integral i,Real n) => i -> i -> [n] -> Message-b_alloc_setn1 nid i xs =+b_alloc_setn1 b i xs = let k = i + genericLength xs xs' = genericReplicate i 0 ++ xs- in withCM (b_alloc nid k 1) (b_setn1 nid 0 xs')+ in withCM (b_alloc b k 1) (b_setn1 b 0 xs') -- | Get ranges of sample values. b_getn1 :: Integral i => i -> (i,i) -> Message-b_getn1 nid = b_getn nid . return+b_getn1 b = b_getn b . return -- | Variant on 'b_query'. b_query1 :: Integral i => i -> Message@@ -375,11 +402,11 @@ -- | Set single sample value. b_set1 :: (Integral i,Real n) => i -> i -> n -> Message-b_set1 nid i x = b_set nid [(i,x)]+b_set1 b i x = b_set b [(i,x)] -- | Set a range of sample values. b_setn1 :: (Integral i,Real n) => i -> i -> [n] -> Message-b_setn1 nid i xs = b_setn nid [(i,xs)]+b_setn1 b i xs = b_setn b [(i,xs)] -- | Segmented variant of 'b_setn1'. b_setn1_segmented :: (Integral i,Real n) => i -> i -> i -> [n] -> [Message]@@ -402,11 +429,11 @@ -- | Turn a single node on or off. n_run1 :: Integral i => i -> Bool -> Message-n_run1 nid k = n_run [(nid,k)]+n_run1 n k = n_run [(n,k)] -- | Set a single node control value. n_set1 :: (Integral i,Real n) => i -> String -> n -> Message-n_set1 nid k n = n_set nid [(k,n)]+n_set1 n k v = n_set n [(k,v)] -- | @s_new@ with no parameters. s_new0 :: Integral i => String -> i -> E.AddAction -> i -> Message
Sound/SC3/Server/Command/Plain.hs view
@@ -1,7 +1,7 @@ -- | Functions from "Sound.SC3.Server.Command.Generic" specialised to 'Int' and 'Double'. module Sound.SC3.Server.Command.Plain where -import Sound.OSC.Core (Datum,Message) {- hosc -}+import Sound.OSC.Core (BLOB,Datum,Message) {- hosc -} import qualified Sound.SC3.Server.Command.Generic as G import qualified Sound.SC3.Server.Enum as E@@ -122,10 +122,14 @@ -- * Instrument definition commands (d_) -- | Install a bytecode instrument definition. (Asynchronous)-d_recv' :: Graphdef -> Message-d_recv' = G.d_recv'+d_recv_bytes :: BLOB -> Message+d_recv_bytes = G.d_recv_bytes --- | Install a bytecode instrument definition. (Asynchronous)+-- | 'Graphdef' encoding variant.+d_recv_gr :: Graphdef -> Message+d_recv_gr = G.d_recv_gr++-- | 'Synthdef' encoding variant. d_recv :: Synthdef -> Message d_recv = G.d_recv
Sound/SC3/Server/Graphdef.hs view
@@ -5,6 +5,8 @@ import Control.Monad {- base -} import qualified Data.ByteString.Lazy as L {- bytestring -} import Data.List {- base -}+import qualified Safe {- safe -}+import System.FilePath {- filepath -} import System.IO {- base -} import qualified Sound.OSC.Coding.Byte as Byte {- hosc -}@@ -75,11 +77,11 @@ -- | Lookup UGen by index. graphdef_ugen :: Graphdef -> Int -> UGen-graphdef_ugen g = (graphdef_ugens g !!)+graphdef_ugen g = Safe.atNote "graphdef_ugen" (graphdef_ugens g) -- | Lookup Control and default value by index. graphdef_control :: Graphdef -> Int -> (Control,Sample)-graphdef_control g = (graphdef_controls g !!)+graphdef_control g = Safe.atNote "graphdef_controls" (graphdef_controls g) -- | nid of constant. graphdef_constant_nid :: Graphdef -> Int -> Int@@ -136,7 +138,7 @@ -- | Read a 'Graphdef'. Ignores variants. read_graphdef :: Handle -> IO Graphdef read_graphdef h = do- magic <- fmap Byte.decode_str (L.hGet h 4)+ magic <- fmap Byte.decode_ascii (L.hGet h 4) version <- Byte.read_i32 h let read_i = case version of@@ -162,7 +164,7 @@ (zip controls control_defaults) ugens) -{- | Read Graphdef from file.+{- | Read Graphdef from .scsyndef file. > dir = "/home/rohan/sw/rsc3-disassembler/scsyndef/" > pp nm = read_graphdef_file (dir ++ nm) >>= putStrLn . graphdef_stat@@ -179,6 +181,12 @@ hClose h return g +-- | Read scsyndef file and run 'graphdef_stat'.+scsyndef_stat :: FilePath -> IO String+scsyndef_stat fn = do+ g <- read_graphdef_file fn+ return (graphdef_stat g)+ -- * Encode (version zero) -- | Pascal (length prefixed) encoding of string.@@ -212,7 +220,7 @@ encode_graphdef :: Graphdef -> L.ByteString encode_graphdef (Graphdef nm cs ks us) = let (ks_ctl,ks_def) = unzip ks- in L.concat [Byte.encode_str (Datum.ascii "SCgf")+ in L.concat [Byte.encode_ascii (Datum.ascii "SCgf") ,Byte.encode_i32 0 -- version ,Byte.encode_i16 1 -- number of graphs ,encode_pstr nm@@ -224,6 +232,19 @@ ,L.concat (map encode_control ks_ctl) ,Byte.encode_i16 (length us) ,L.concat (map encode_ugen us)]++-- * IO++-- | Write 'Graphdef' to indicated file.+graphdefWrite :: FilePath -> Graphdef -> IO ()+graphdefWrite fn = L.writeFile fn . encode_graphdef++-- | Write 'Graphdef' to indicated directory. The filename is the+-- 'graphdef_name' with the appropriate extension (@scsyndef@).+graphdefWrite_dir :: FilePath -> Graphdef -> IO ()+graphdefWrite_dir dir s =+ let fn = dir </> Datum.ascii_to_string (graphdef_name s) <.> "scsyndef"+ in graphdefWrite fn s -- * Stat
Sound/SC3/Server/Graphdef/Graph.hs view
@@ -6,8 +6,8 @@ import qualified Sound.OSC.Datum as Datum {- hosc -} +import qualified Sound.SC3.Common.Rate as Rate import qualified Sound.SC3.UGen.Graph as Graph-import qualified Sound.SC3.UGen.Rate as Rate import qualified Sound.SC3.UGen.Type as Type import qualified Sound.SC3.Server.Graphdef as Graphdef
Sound/SC3/Server/Graphdef/Read.hs view
@@ -3,9 +3,9 @@ import Sound.OSC.Datum {- hosc -} -import Sound.SC3.Server.Graphdef+import qualified Sound.SC3.Common.Rate as Rate+import Sound.SC3.Server.Graphdef as Graphdef import qualified Sound.SC3.UGen.Graph as Graph-import qualified Sound.SC3.UGen.Rate as Rate import qualified Sound.SC3.UGen.Type as Type control_to_node :: Graphdef -> Type.UID_t -> (Control,Type.Sample) -> Graph.U_Node@@ -47,3 +47,16 @@ nm = ascii_to_string (graphdef_name g) gr = Graph.U_Graph (-1) constants_nd controls_nd ugens_nd in (nm,gr) -- S.Synthdef nm gr++-- | Read graphdef file and translate to graph.+read_graph :: FilePath -> IO Graph.U_Graph+read_graph sy_nm = do+ d <- Graphdef.read_graphdef_file sy_nm+ let (_,g) = graphdef_to_graph d+ return g++-- | Read graphdef file, translate to graph, and run 'ug_stat_ln'.+scsyndef_ug_stat :: FilePath -> IO String+scsyndef_ug_stat sy_nm = do+ g <- read_graph sy_nm+ return (unlines (Graph.ug_stat_ln g))
− Sound/SC3/Server/Help.hs
@@ -1,35 +0,0 @@--- | Functions to provide mediated access to the SC3 help system.-module Sound.SC3.Server.Help where--import Control.Monad {- base -}-import System.FilePath {- filepath -}-import System.Process {- process -}--import qualified Sound.SC3.UGen.Help as Help--{- | Generate path to indicated SC3 instance method help. Adds initial-forward slash if not present.--> let r = "./Reference/Server-Command-Reference.html#/b_alloc"-> sc3_server_command_ref "." "b_alloc" == r---}-sc3_server_command_ref :: FilePath -> String -> FilePath-sc3_server_command_ref d c =- let f = d </> "Reference/Server-Command-Reference.html"- c' = case c of- '/':_ -> c- _ -> '/':c- in f ++ '#':c'--{- | Lookup @SC3@ help file for server command `c'.--> Sound.SC3.Server.Help.viewServerHelp "/b_allocRead"-> viewServerHelp "done"--}-viewServerHelp :: String -> IO ()-viewServerHelp c = do- d <- Help.sc3HelpDirectory- let nm = sc3_server_command_ref d c- br <- Help.get_env_default "BROWSER" "x-www-browser"- void (rawSystem br ["file://" ++ nm])
Sound/SC3/Server/NRT.hs view
@@ -1,11 +1,13 @@ -- | Non-realtime score generation. module Sound.SC3.Server.NRT where -import qualified Data.ByteString.Lazy as B {- bytestring -}+import Data.Maybe {- base -} import System.FilePath {- filepath -} import System.IO {- base -} import System.Process {- process -} +import qualified Data.ByteString.Lazy as B {- bytestring -}+ import Sound.OSC.Core {- hosc -} import qualified Sound.OSC.Coding.Byte as Byte {- hosc -} @@ -145,6 +147,8 @@ nrt_exec_plain opt -- | Variant for no input case.+--+-- (osc-file-name,audio-file-name,number-of-channels,sample-rate,sample-format,param) type NRT_Render_Plain = (FilePath,FilePath,Int,Int,SampleFormat,[String]) {- | Add ("-",0) as input parameters and run 'nrt_proc_plain'.@@ -156,3 +160,12 @@ nrt_render_plain (osc_nm,sf_nm,nc,sr,sf,param) sc = let opt = (osc_nm,("_",0),(sf_nm,nc),sr,sf,param) in nrt_proc_plain opt sc++-- * QUERY++-- | Find any non-ascending sequences.+nrt_non_ascending :: NRT -> [(Bundle, Bundle)]+nrt_non_ascending (NRT b) =+ let p = zip b (tail b)+ f (i,j) = if bundleTime i > bundleTime j then Just (i,j) else Nothing+ in mapMaybe f p
+ Sound/SC3/Server/NRT/UGen.hs view
@@ -0,0 +1,33 @@+-- | NRT / UGen+module Sound.SC3.Server.NRT.UGen where++import Sound.OSC {- hosc -}++import Sound.SC3.Common.Rate+import Sound.SC3.Server.Command.Plain+import Sound.SC3.Server.Enum+import Sound.SC3.Server.NRT+import Sound.SC3.Server.Synthdef+import Sound.SC3.UGen.Bindings.DB+import Sound.SC3.UGen.Type++-- | Make NRT score that runs /u/ for /dur/ seconds to output bus zero.+-- If /u/ is at KR insert 'k2a' UGen.+nrt_ugen_rec :: Time -> UGen -> NRT+nrt_ugen_rec dur u =+ let sg = case rateOf u of+ AR -> u+ KR -> k2a u+ _ -> error "nrt_ugen_rec: rate?"+ sy = synthdef "anonymous" (out 0 sg)+ m0 = d_recv sy+ m1 = s_new0 "anonymous" 1 AddToHead 0+ in NRT [bundle 0 [m0,m1],bundle dur [nrt_end]]++-- | 'nrt_render_plain' of 'ugen_rec_nrt'.+-- The number of channels is equal to the degree of /u/.+nrt_ugen_render :: (FilePath, FilePath, Int, SampleFormat, [String]) -> Time -> UGen -> IO ()+nrt_ugen_render (osc_fn,sf_fn,sample_rate,fmt,opt) dur u = do+ let sc = nrt_ugen_rec dur u+ nc = length (mceChannels u)+ nrt_render_plain (osc_fn,sf_fn,nc,sample_rate,fmt,opt) sc
+ Sound/SC3/Server/Options.hs view
@@ -0,0 +1,94 @@+-- | scsynth server command-line options.+module Sound.SC3.Server.Options where++import Data.List {- base -}++-- | (SHORT-OPTION,LONG-OPTION,DEFAULT-VALUE)+type SC3_OPT i = (Char,String,i)++-- | Get value from option.+sc3_opt_value :: SC3_OPT i -> i+sc3_opt_value (_,_,v) = v++-- | Default port number, either a 'u' or a 't' option is required.+sc3_port_def :: Num i => i+sc3_port_def = 57110++-- | Protocol is either UDP or TCP.+data SC3_PROTOCOL = SC3_UDP | SC3_TCP++-- | Default port option.+sc3_opt_port_def :: Num i => SC3_PROTOCOL -> SC3_OPT i+sc3_opt_port_def p =+ case p of+ SC3_UDP -> ('u',"udp-port-number",sc3_port_def)+ SC3_TCP -> ('t',"tcp-port-number",sc3_port_def)++-- | SC3 default options.+sc3_opt_def :: Num i => SC3_PROTOCOL -> [SC3_OPT i]+sc3_opt_def p =+ sc3_opt_port_def p :+ [('a',"number-of-audio-bus-channels",1024)+ ,('b',"number-of-sample-buffers",1024)+ ,('c',"number-of-control-bus-channels",16384)+ ,('D',"load-synthdefs?",1)+ ,('d',"max-number-of-synth-defs",1024)+ ,('i',"number-of-input-bus-channels",8)+ ,('l',"max-logins",64)+ ,('m',"real-time-memory-size",8192)+ ,('n',"max-number-of-nodes",1024)+ ,('o',"number-of-output-bus-channels",8)+ ,('r',"number-of-random-seeds",64)+ ,('R',"publish-to-rendezvous?",1)+ ,('S',"hardware-sample-rate",0)+ ,('V',"verbosity",0)+ ,('w',"number-of-wire-buffers",64)+ ,('z',"block-size",64)+ ,('Z',"hardware-buffer-size",0)]++-- | SC3 default options for UDP.+sc3_opt_def_udp :: Num i => [SC3_OPT i]+sc3_opt_def_udp = sc3_opt_def SC3_UDP++-- | Is option boolean, ie. 0=FALSE and 1=TRUE.+--+-- > filter sc3_opt_bool sc3_opt_def_udp+sc3_opt_bool :: SC3_OPT i -> Bool+sc3_opt_bool (_,s,_) = last s == '?'++-- | Lookup option given either short or long name.+sc3_opt_get :: [SC3_OPT i] -> Either Char String -> Maybe i+sc3_opt_get opt k =+ case k of+ Left c -> fmap sc3_opt_value (find (\(o,_,_) -> o == c) opt)+ Right s -> fmap sc3_opt_value (find (\(_,o,_) -> o == s) opt)++-- | Set option given either short or long name.+--+-- > sc3_opt_set sc3_opt_def_udp (Left 'w',256)+sc3_opt_set :: [SC3_OPT i] -> (Either Char String,i) -> [SC3_OPT i]+sc3_opt_set opt (k,v) =+ case k of+ Left x -> map (\(c,s,y) -> if c == x then (c,s,v) else (c,s,y)) opt+ Right x -> map (\(c,s,y) -> if s == x then (c,s,v) else (c,s,y)) opt++-- | Apply set of edits to options.+--+-- > sc3_opt_edit sc3_opt_def_udp [(Left 'w',256),(Left 'm',2 ^ 16)]+sc3_opt_edit :: [SC3_OPT i] -> [(Either Char String,i)] -> [SC3_OPT i]+sc3_opt_edit opt edt =+ case edt of+ [] -> opt+ x:rst -> sc3_opt_edit (sc3_opt_set opt x) rst++-- | Generate scsynth argument list.+--+-- > unwords (sc3_opt_arg sc3_opt_def_udp)+sc3_opt_arg :: Show i => [SC3_OPT i] -> [String]+sc3_opt_arg = concatMap (\(c,_,v) -> [['-',c],show v])++-- | Generate arguments for 'System.Process.callProcess' or related functions.+--+-- > sc3_opt_cmd sc3_opt_def_udp+sc3_opt_cmd :: Show i => [SC3_OPT i] -> (FilePath,[String])+sc3_opt_cmd opt = ("scsynth",sc3_opt_arg opt)
+ Sound/SC3/Server/Param.hs view
@@ -0,0 +1,67 @@+-- * Synthesis parameters+module Sound.SC3.Server.Param where++import Data.Function {- base -}+import Data.List {- base -}+import Data.Maybe {- base -}++import Data.List.Split {- split -}++import Sound.SC3.Common.Math {- hsc3 -}++-- | An SC3 synthesis parameters, ie. (control-name,control-value).+type Param1 = (String,Double)++-- | Set of SC3 synthesiser parameters.+type Param = [Param1]++-- | Add new, or overwrite existing, parameter.+param_insert :: Param -> Param1 -> Param+param_insert p z = z : deleteBy ((==) `on` fst) z p++-- | Merge, require keys be unique.+--+-- > param_merge_uniq [("a",1),("b",2)] [("c",3),("d",4)] == [("a",1),("b",2),("c",3),("d",4)]+-- > param_merge_uniq [("a",1)] [("a",2)] -- error+param_merge_uniq :: Param -> Param -> Param+param_merge_uniq p1 p2 =+ case map fst p1 `intersect` map fst p2 of+ [] -> p1 ++ p2+ _ -> error "param_merge_uniq?"++-- | Merge, right biased.+--+-- > param_merge_r [("a",1),("b",2)] [("c",3),("a",4)] == [("b",2),("c",3),("a",4)]+param_merge_r :: Param -> Param -> Param+param_merge_r p1 p2 =+ let p3 = let k2 = map fst p2 in filter (\(x,_) -> x `notElem` k2) p1+ in p3 ++ p2++-- | Right-fold (right-biased) of 'param_merge'+--+-- > param_merge_r_seq [[("a",1),("b",2)],[("c",3),("a",4)],[("b",5)]] == [("c",3),("a",4),("b",5)]+param_merge_r_seq :: [Param] -> Param+param_merge_r_seq = foldr1 param_merge_r++-- | Lookup parameter value, with default.+param_get :: Param -> String -> Double -> Double+param_get p k v = fromMaybe v (lookup k p)++-- | Given (param-separator,key-value-separator) parse paramter string.+--+-- > param_parse (';','=') "a=1;b=2" == [("a",1),("b",2)]+param_parse :: (Char,Char) -> String -> Param+param_parse (c1,c2) str =+ let f x = case splitOn [c2] x of+ [lhs,rhs] -> (lhs,read rhs)+ _ -> error ("param_parse: " ++ x)+ in if null str then [] else map f (splitOn [c1] str)++-- | Inverse of 'param_parse', /k/ is the precision to print values to.+--+-- > param_pp (';','=') 4 [("a",1),("b",2)] == "a=1.0;b=2.0"+param_pp :: (Char,Char) -> Int -> Param -> String+param_pp (c1,c2) k =+ let f (lhs,rhs) = concat [lhs,[c2],double_pp k rhs]+ in intercalate [c1] . map f+
Sound/SC3/Server/Recorder.hs view
@@ -3,12 +3,13 @@ import Sound.OSC {- hosc -} +import Sound.SC3.Common.Rate import Sound.SC3.Server.Command import Sound.SC3.Server.Enum import Sound.SC3.Server.NRT import Sound.SC3.Server.Synthdef-import Sound.SC3.UGen import Sound.SC3.UGen.Bindings+import Sound.SC3.UGen.UGen -- | Parameters for recording @scsynth@. data SC3_Recorder =
Sound/SC3/Server/Status.hs view
@@ -7,10 +7,13 @@ -} module Sound.SC3.Server.Status where -import qualified Data.ByteString.Char8 as C {- bytestring -} import Data.List {- base -} import Data.Maybe {- base -}+import Text.Printf {- base -}++import qualified Data.ByteString.Char8 as C {- bytestring -} import qualified Data.Tree as T {- containers -}+import qualified Safe {- safe -} import Sound.OSC.Datum {- hosc -} @@ -18,21 +21,21 @@ -- * Status --- | Get /n/th field of status as 'Floating'.+-- | Get /n/th field of /status.reply message as 'Floating'. extractStatusField :: Floating n => Int -> [Datum] -> n extractStatusField n = fromMaybe (error "extractStatusField") . datum_floating- . (!! n)+ . flip (Safe.atNote "extractStatusField") n --- | Names of status fields.+-- | Names of /status.reply fields sent in reply to /status request. statusFields :: [String] statusFields = ["Unused " ,"# UGens " ,"# Synths " ,"# Groups "- ,"# Instruments "+ ,"# Synthdefs " ,"% CPU (Average) " ,"% CPU (Peak) " ,"Sample Rate (Nominal) "@@ -43,6 +46,16 @@ statusFormat d = let s = "***** SuperCollider Server Status *****" in s : zipWith (++) (tail statusFields) (map (datum_pp_typed (Just 5)) (tail d))++-- | Concise pretty printer, one line, omits PEAK-CPU and NOMINAL-SR.+status_format_concise :: [Datum] -> String+status_format_concise d =+ case d of+ [Int32 _,Int32 ugn,Int32 grp,Int32 syn,Int32 ins,Float cpu1,Float _cpu2,Double _sr1,Double sr2] ->+ printf+ "UGN=%-5d GRP=%-5d SYN=%-5d INS=%-5d CPU=%-5.1f SR=%-7.1f"+ ugn grp syn ins cpu1 sr2+ _ -> error "status_format_concise?" -- * Query Group
Sound/SC3/Server/Synthdef.hs view
@@ -2,7 +2,6 @@ module Sound.SC3.Server.Synthdef where import qualified Data.ByteString.Lazy as L {- bytestring -}-import System.FilePath {- filepath -} import Sound.SC3.UGen.Graph import Sound.SC3.UGen.Help.Graph@@ -10,6 +9,7 @@ import qualified Sound.SC3.Server.Graphdef as Graphdef import qualified Sound.SC3.Server.Graphdef.Graph as Graph+import qualified Sound.SC3.Server.Param as Param -- | A named unit generator graph. data Synthdef = Synthdef {synthdefName :: String@@ -47,9 +47,9 @@ -- | Parameter names at 'Synthdef'. ----- > synthdefParam defaultSynthdef == ["amp","pan","gate","freq","out"]-synthdefParam :: Synthdef -> [String]-synthdefParam = map u_node_k_name . ug_controls . synthdefGraph+-- > synthdefParam defaultSynthdef == [("amp",0.1),("pan",0),("gate",1),("freq",440),("out",0)]+synthdefParam :: Synthdef -> Param.Param+synthdefParam = map (\n -> (u_node_k_name n,u_node_k_default n)) . ug_controls . synthdefGraph -- | 'graph_to_graphdef' at 'Synthdef'. synthdef_to_graphdef :: Synthdef -> Graphdef.Graphdef@@ -59,22 +59,28 @@ synthdefData :: Synthdef -> L.ByteString synthdefData = Graphdef.encode_graphdef . synthdef_to_graphdef +-- | Write 'Synthdef' to indicated file.+synthdefWrite :: FilePath -> Synthdef -> IO ()+synthdefWrite fn = Graphdef.graphdefWrite fn . synthdef_to_graphdef+ -- | Write 'Synthdef' to indicated directory. The filename is the -- 'synthdefName' with the appropriate extension (@scsyndef@).-synthdefWrite :: Synthdef -> FilePath -> IO ()-synthdefWrite s dir =- let nm = dir </> synthdefName s <.> "scsyndef"- in L.writeFile nm (synthdefData s)+synthdefWrite_dir :: FilePath -> Synthdef -> IO ()+synthdefWrite_dir dir = Graphdef.graphdefWrite_dir dir . synthdef_to_graphdef -- | 'graph_stat_ln' of 'synth'. synthstat_ln :: UGen -> [String] synthstat_ln = ug_stat_ln . ugen_to_graph -- | 'unlines' of 'synthstat_ln'.------ > putStrLn $ synthstat Sound.SC3.UGen.Help.Graph.default_ugen_graph synthstat :: UGen -> String synthstat = unlines . synthstat_ln++-- | 'putStrLn' of 'synthstat'.+--+-- > synthstat_wr Sound.SC3.UGen.Help.Graph.default_ugen_graph+synthstat_wr :: UGen -> IO ()+synthstat_wr = putStrLn . synthstat -- | Variant without UGen sequence. --
Sound/SC3/Server/Transport/FD.hs view
@@ -5,8 +5,10 @@ module Sound.SC3.Server.Transport.FD where import Control.Monad {- base -}+import qualified Data.ByteString.Lazy as L {- bytestring -} import Data.List {- base -} import qualified Data.List.Split as Split {- split -}+import System.FilePath {- filepath -} import Sound.OSC.FD {- hosc -} @@ -14,6 +16,7 @@ import Sound.SC3.Server.Enum import qualified Sound.SC3.Server.Graphdef as G import Sound.SC3.Server.NRT+import Sound.SC3.Server.Options import Sound.SC3.Server.Status import Sound.SC3.Server.Synthdef import Sound.SC3.UGen.Type@@ -37,7 +40,7 @@ -- | Bracket @SC3@ communication. withSC3 :: (UDP -> IO a) -> IO a-withSC3 = withTransport (openUDP "127.0.0.1" 57110)+withSC3 = withTransport (openUDP "127.0.0.1" sc3_port_def) -- * Server control @@ -54,8 +57,13 @@ -- | Send 'd_recv' and 's_new' messages to scsynth. playGraphdef :: Transport t => Int -> t -> G.Graphdef -> IO () playGraphdef k fd g = do- _ <- async fd (d_recv' g)- sendMessage fd (s_new0 (ascii_to_string (G.graphdef_name g)) k AddToTail 1)+ let nm = ascii_to_string (G.graphdef_name g)+ fn = "/tmp" </> nm <.> "scsyndef"+ by = G.encode_graphdef g+ sz = L.length by+ if sz < 65507+ then void (async fd (d_recv_bytes by))+ else G.graphdefWrite fn g >> async fd (d_load fn) >> sendMessage fd (s_new0 nm k AddToTail 1) -- | 'playGraphdef' of 'synthdef_to_graphdef'. playSynthdef :: Transport t => Int -> t -> Synthdef -> IO ()
Sound/SC3/Server/Transport/Monad.hs view
@@ -2,11 +2,14 @@ module Sound.SC3.Server.Transport.Monad where import Control.Monad {- base -}+import qualified Data.ByteString.Lazy as L {- bytestring -} import Data.List {- base -} import qualified Data.List.Split as Split {- split -} import Data.Maybe {- base -} import qualified Data.Tree as Tree {- containers -} import qualified Safe {- safe -}+import System.Directory {- directory -}+import System.FilePath {- filepath -} import Sound.OSC {- hosc -} @@ -15,12 +18,19 @@ import qualified Sound.SC3.Server.Enum as Enum import qualified Sound.SC3.Server.Graphdef as Graphdef import qualified Sound.SC3.Server.NRT as NRT+import qualified Sound.SC3.Server.Options as Options import qualified Sound.SC3.Server.Status as Status import qualified Sound.SC3.Server.Synthdef as Synthdef import Sound.SC3.UGen.Bindings.Composite (wrapOut) import Sound.SC3.UGen.Type (UGen) +{-+import qualified Control.Monad.IO.Class as M {- transformers -}+import qualified Control.Monad.Trans.Reader as R {- transformers -}+import qualified Sound.SC3.Server.Transport.FD as FD+-}+ -- * hosc variants -- | 'sendMessage' and 'waitReply' for a @\/done@ reply.@@ -42,10 +52,14 @@ then async_ m else sendBundle (bundle t [m]) --- | Local host (ie. @127.0.0.1@) at port @57110@.+-- | Local host (ie. @127.0.0.1@) at port 'sc3_port_def' sc3_default_udp :: IO UDP-sc3_default_udp = openUDP "127.0.0.1" 57110+sc3_default_udp = openUDP "127.0.0.1" Options.sc3_port_def +-- | Maximum packet size, in bytes, that can be sent over UDP.+sc3_udp_limit :: Num n => n+sc3_udp_limit = 65507+ -- | Bracket @SC3@ communication, ie. 'withTransport' 'sc3_default_udp'. -- -- > import Sound.SC3.Server.Command@@ -87,20 +101,30 @@ let nm = ascii_to_string (Graphdef.graphdef_name g) in s_new nm nid act gid param --- | Send 'd_recv' and 's_new' messages to scsynth.-playGraphdef :: DuplexOSC m => Play_Opt -> Graphdef.Graphdef -> m ()-playGraphdef opt g = async_ (d_recv' g) >> sendMessage (play_graphdef_msg opt g)+-- | If the graph size is less than 'sc3_udp_limit' encode and send+-- using 'd_recv_bytes', else write to temporary directory and read+-- using 'd_load'.+recv_or_load_graphdef :: Transport m => Graphdef.Graphdef -> m Message+recv_or_load_graphdef g = do+ tmp <- liftIO getTemporaryDirectory+ let nm = ascii_to_string (Graphdef.graphdef_name g)+ fn = tmp </> nm <.> "scsyndef"+ by = Graphdef.encode_graphdef g+ sz = L.length by+ if sz < sc3_udp_limit+ then async (d_recv_bytes by)+ else liftIO (Graphdef.graphdefWrite fn g) >> async (d_load fn) --- | Make 's_new' message to play 'Synthdef.Synthdef'.-play_synthdef_msg :: Play_Opt -> Synthdef.Synthdef -> Message-play_synthdef_msg (nid,act,gid,param) syn = s_new (Synthdef.synthdefName syn) nid act gid param+-- | Send 'd_recv' and 's_new' messages to scsynth.+playGraphdef :: Transport m => Play_Opt -> Graphdef.Graphdef -> m ()+playGraphdef opt g = recv_or_load_graphdef g >> sendMessage (play_graphdef_msg opt g) -- | Send 'd_recv' and 's_new' messages to scsynth.-playSynthdef :: DuplexOSC m => Play_Opt -> Synthdef.Synthdef -> m ()-playSynthdef opt syn = async_ (d_recv syn) >> sendMessage (play_synthdef_msg opt syn)+playSynthdef :: Transport m => Play_Opt -> Synthdef.Synthdef -> m ()+playSynthdef opt = playGraphdef opt . Synthdef.synthdef_to_graphdef -- | Send an /anonymous/ instrument definition using 'playSynthdef'.-playUGen :: DuplexOSC m => Play_Opt -> UGen -> m ()+playUGen :: Transport m => Play_Opt -> UGen -> m () playUGen loc = playSynthdef loc . Synthdef.synthdef "Anonymous" .@@ -250,22 +274,22 @@ liftM f (waitDatum "/c_setn") -- | Apply /f/ to result of 'n_query'.-n_query1_unpack_f :: Transport m => (Message -> t) -> Node_Id -> m t+n_query1_unpack_f :: DuplexOSC m => (Message -> t) -> Node_Id -> m t n_query1_unpack_f f n = do sendMessage (n_query [n]) r <- waitReply "/n_info" return (f r) -- | Variant of 'n_query' that waits for and unpacks the reply.-n_query1_unpack :: Transport m => Node_Id -> m (Maybe (Int,Int,Int,Int,Int,Maybe (Int,Int)))+n_query1_unpack :: DuplexOSC m => Node_Id -> m (Maybe (Int,Int,Int,Int,Int,Maybe (Int,Int))) n_query1_unpack = n_query1_unpack_f unpack_n_info -- | Variant of 'n_query1_unpack' that returns plain (un-lifted) result.-n_query1_unpack_plain :: Transport m => Node_Id -> m [Int]+n_query1_unpack_plain :: DuplexOSC m => Node_Id -> m [Int] n_query1_unpack_plain = n_query1_unpack_f unpack_n_info_plain -- | Variant of 'g_queryTree' that waits for and unpacks the reply.-g_queryTree1_unpack :: Transport m => Group_Id -> m Status.Query_Node+g_queryTree1_unpack :: DuplexOSC m => Group_Id -> m Status.Query_Node g_queryTree1_unpack n = do sendMessage (g_queryTree [(n,True)]) r <- waitReply "/g_queryTree.reply"@@ -279,6 +303,12 @@ serverStatus :: DuplexOSC m => m [String] serverStatus = liftM Status.statusFormat serverStatusData +-- | Collect server status information.+--+-- > withSC3 server_status_concise >>= putStrLn+server_status_concise :: DuplexOSC m => m String+server_status_concise = liftM Status.status_format_concise serverStatusData+ -- | Read nominal sample rate of server. -- -- > withSC3 serverSampleRateNominal@@ -302,7 +332,7 @@ -- | Collect server node tree information. -- -- > withSC3 serverTree >>= mapM_ putStrLn-serverTree :: Transport m => m [String]+serverTree :: DuplexOSC m => m [String] serverTree = do qt <- g_queryTree1_unpack 0 let tr = Status.queryTree_rt qt
Sound/SC3/UGen.hs view
@@ -4,12 +4,10 @@ import Sound.SC3.UGen.Analysis as U import Sound.SC3.UGen.Envelope as U import Sound.SC3.UGen.Enum as U-import Sound.SC3.UGen.Help as U import Sound.SC3.UGen.Help.Graph as U import Sound.SC3.UGen.Math as U+import Sound.SC3.UGen.Math.Composite as U import Sound.SC3.UGen.Name as U-import Sound.SC3.UGen.Operator as U import Sound.SC3.UGen.Optimise as U-import Sound.SC3.UGen.Rate as U import Sound.SC3.UGen.Type as U import Sound.SC3.UGen.UGen as U
Sound/SC3/UGen/Bindings/Composite.hs view
@@ -6,18 +6,17 @@ import qualified Data.List.Split as Split {- split -} import Data.Maybe {- base -} +import Sound.SC3.Common.Enum import Sound.SC3.Common.Envelope import Sound.SC3.Common.Math import Sound.SC3.Common.Math.Filter.BEQ-+import Sound.SC3.Common.Math.Operator+import Sound.SC3.Common.Rate import Sound.SC3.Common.UId+ import Sound.SC3.UGen.Bindings.DB-import qualified Sound.SC3.UGen.Bindings.DB.External as External import Sound.SC3.UGen.Bindings.HW import Sound.SC3.UGen.Bindings.Monad-import Sound.SC3.UGen.Enum-import Sound.SC3.UGen.Math-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen @@ -43,20 +42,20 @@ in flt (flt i) -- | Buffer reader (no interpolation).-bufRdN :: Int -> Rate -> UGen -> UGen -> Loop -> UGen+bufRdN :: Int -> Rate -> UGen -> UGen -> Loop UGen -> UGen bufRdN n r b p l = bufRd n r b p l NoInterpolation -- | Buffer reader (linear interpolation).-bufRdL :: Int -> Rate -> UGen -> UGen -> Loop -> UGen+bufRdL :: Int -> Rate -> UGen -> UGen -> Loop UGen -> UGen bufRdL n r b p l = bufRd n r b p l LinearInterpolation -- | Buffer reader (cubic interpolation).-bufRdC :: Int -> Rate -> UGen -> UGen -> Loop -> UGen+bufRdC :: Int -> Rate -> UGen -> UGen -> Loop UGen -> UGen bufRdC n r b p l = bufRd n r b p l CubicInterpolation -- | Triggers when a value changes changed :: UGen -> UGen -> UGen-changed input threshold = abs (hpz1 input) >* threshold+changed input threshold = abs (hpz1 input) `greater_than` threshold -- | 'mce' variant of 'lchoose'. choose :: ID m => m -> UGen -> UGen@@ -200,7 +199,7 @@ -- | Map from one linear range to another linear range. linLin :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen-linLin = linlin_ma+linLin = linlin_ma mulAdd -- | 'linLin' where source is (0,1). linLin_u :: UGen -> UGen -> UGen -> UGen@@ -223,10 +222,18 @@ makeFadeEnv fadeTime = let dt = control KR "fadeTime" (realToFrac fadeTime) gate_ = control KR "gate" 1- startVal = dt <=* 0+ startVal = dt `less_than_or_equal_to` 0 env = Envelope [startVal,1,0] [1,1] [EnvLin,EnvLin] (Just 1) Nothing 0 in envGen KR gate_ 1 0 dt RemoveSynth env +-- | 'mce' of 'map' /f/ of 'id_seq' /n/.+mce_gen :: ID z => (Id -> UGen) -> Int -> z -> UGen+mce_gen f n = mce . map f . id_seq n++-- | Monad/applicative variant of mce_gen.+mce_genM :: Applicative f => f UGen -> Int -> f UGen+mce_genM f n = fmap mce (replicateM n f)+ -- | Count 'mce' channels. mceN :: UGen -> UGen mceN = constant . length . mceChannels@@ -239,7 +246,7 @@ mixN :: Int -> UGen -> UGen mixN n u = let xs = transpose (Split.chunksOf n (mceChannels u))- in mce (map sum xs)+ in mce (map sum_opt xs) -- | Construct and sum a set of UGens. mixFill :: Integral n => Int -> (n -> UGen) -> UGen@@ -247,7 +254,7 @@ -- | Monad variant on mixFill. mixFillM :: (Integral n,Monad m) => Int -> (n -> m UGen) -> m UGen-mixFillM n f = liftM sum (mapM f [0 .. fromIntegral n - 1])+mixFillM n f = liftM sum_opt (mapM f [0 .. fromIntegral n - 1]) -- | Variant that is randomly pressed. mouseButton' :: Rate -> UGen -> UGen -> UGen -> UGen@@ -256,7 +263,7 @@ in lag (linLin o (-1) 1 l r) tm -- | Randomised mouse UGen (see also 'mouseX'' and 'mouseY'').-mouseR :: ID a => a -> Rate -> UGen -> UGen -> Warp -> UGen -> UGen+mouseR :: ID a => a -> Rate -> UGen -> UGen -> Warp UGen -> UGen -> UGen mouseR z rt l r ty tm = let f = case ty of Linear -> linLin@@ -265,11 +272,11 @@ in lag (f (lfNoise1 z rt 1) (-1) 1 l r) tm -- | Variant that randomly traverses the mouseX space.-mouseX' :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen+mouseX' :: Rate -> UGen -> UGen -> Warp UGen -> UGen -> UGen mouseX' = mouseR 'x' -- | Variant that randomly traverses the mouseY space.-mouseY' :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen+mouseY' :: Rate -> UGen -> UGen -> Warp UGen -> UGen -> UGen mouseY' = mouseR 'y' -- | Translate onset type string to constant UGen value.@@ -296,6 +303,7 @@ in fft_size * num_partitions -- | PM oscillator.+-- cf = carrier frequency, mf = modulation frequency, pm = pm-index = 0.0, mp = mod-phase = 0.0 pmOsc :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen pmOsc r cf mf pm mp = sinOsc r cf (sinOsc r mf mp * pm) @@ -317,7 +325,7 @@ -- | Apply function /f/ to each bin of an @FFT@ chain, /f/ receives -- magnitude, phase and index and returns a (magnitude,phase).-pvcollect :: UGen -> UGen -> (UGen -> UGen -> UGen -> (UGen, UGen)) -> UGen -> UGen -> UGen -> UGen+pvcollect :: UGen -> Int -> (UGen -> UGen -> Int -> (UGen, UGen)) -> Int -> Int -> UGen -> UGen pvcollect c nf f from to z = let m = unpackFFT c nf from to 0 p = unpackFFT c nf from to 1@@ -400,13 +408,9 @@ a = if lc then sqrt (1 / n) else 1 in mix (pan2 i (mce p * s + c) 1) * l * a --- | Optimised sum function.+-- | Optimised UGen sum function. sum_opt :: [UGen] -> UGen-sum_opt l =- case l of- p:q:r:s:l' -> sum_opt (sum4 p q r s : l')- p:q:r:l' -> sum_opt (sum3 p q r : l')- _ -> sum l+sum_opt = sum_opt_f sum3 sum4 -- | Single tap into a delayline tap :: Int -> UGen -> UGen -> UGen@@ -416,12 +420,12 @@ -- | Randomly select one of several inputs on trigger. tChoose :: ID m => m -> UGen -> UGen -> UGen-tChoose z t a = select (tiRand z 0 (mceN a) t) a+tChoose z t a = select (tiRand z 0 (mceN a - 1) t) a -- | Randomly select one of several inputs. tChooseM :: (UId m) => UGen -> UGen -> m UGen tChooseM t a = do- r <- tiRandM 0 (constant (length (mceChannels a))) t+ r <- tiRandM 0 (constant (length (mceChannels a) - 1)) t return (select r a) -- | Triangle wave as sum of /n/ sines.@@ -433,7 +437,7 @@ mk_ph i = if i + 1 `mod` 4 == 0 then pi else 0 m = [1,3 .. n] param = zip3 (map mk_freq m) (map mk_ph m) (map mk_amp m)- in sum (map (\(fr,ph,am) -> sinOsc AR fr ph * am) param)+ in sum_opt (map (\(fr,ph,am) -> sinOsc AR fr ph * am) param) -- | Randomly select one of several inputs on trigger (weighted). tWChoose :: ID m => m -> UGen -> UGen -> UGen -> UGen -> UGen@@ -448,8 +452,8 @@ return (select i a) -- | Unpack an FFT chain into separate demand-rate FFT bin streams.-unpackFFT :: UGen -> UGen -> UGen -> UGen -> UGen -> [UGen]-unpackFFT c nf from to w = map (\i -> unpack1FFT c nf i w) [from .. to]+unpackFFT :: UGen -> Int -> Int -> Int -> UGen -> [UGen]+unpackFFT c nf from to w = map (\i -> unpack1FFT c (constant nf) (constant i) w) [from .. to] -- | VarLag in terms of envGen varLag_env :: UGen -> UGen -> Envelope_Curve UGen -> UGen -> UGen@@ -460,12 +464,14 @@ tr = changed in_ 0 + time_ch + impulse rt 0 0 in envGen rt tr 1 0 1 DoNothing e --- | If @z@ isn't a sink node route to an @out@ node writing to @bus@.--- If @fadeTime@ is given multiply by 'makeFadeEnv'.------ > import Sound.SC3--- > audition (wrapOut (sinOsc AR 440 0 * 0.1) 1)--- > withSC3 (send (n_set1 (-1) "gate" 0))+{- | If @z@ isn't a sink node route to an @out@ node writing to @bus@.+ If @fadeTime@ is given multiply by 'makeFadeEnv'.++> import Sound.SC3 {- hsc3 -}+> audition (wrapOut (Just 1) (sinOsc AR 440 0 * 0.1))+> import Sound.OSC {- hosc -}+> withSC3 (sendMessage (n_set1 (-1) "gate" 0))+-} wrapOut :: Maybe Double -> UGen -> UGen wrapOut fadeTime z = let bus = control KR "out" 0@@ -476,7 +482,7 @@ -- * wslib -- | Cross-fading version of 'playBuf'.-playBufCF :: Int -> UGen -> UGen -> UGen -> UGen -> Loop -> UGen -> Int -> UGen+playBufCF :: Int -> UGen -> UGen -> UGen -> UGen -> Loop UGen -> UGen -> Int -> UGen playBufCF nc bufnum rate trigger startPos loop lag' n = let trigger' = if rateOf trigger == DR then tDuty AR trigger 0 DoNothing 1 0@@ -498,25 +504,12 @@ (\(on',r) -> let p = playBuf nc AR bufnum r on' startPos' loop DoNothing in p * sqrt (slew on' lag'' lag'')) (zip on rate')- in sum s+ in sum_opt s -- * adc -- | An oscillator that reads through a table once.-osc1 :: Rate -> UGen -> UGen -> DoneAction -> UGen+osc1 :: Rate -> UGen -> UGen -> DoneAction UGen -> UGen osc1 rt buf dur doneAction = let ph = line rt 0 (bufFrames IR buf - 1) dur doneAction in bufRd 1 rt buf ph NoLoop LinearInterpolation---- * External---- | FM7 variant where input matrices are not in MCE form.-fm7_mx :: [[UGen]] -> [[UGen]] -> UGen-fm7_mx ctlMatrix modMatrix = External.fm7 AR (mce (concat ctlMatrix)) (mce (concat modMatrix))---- | pulse signal as difference of two 'sawDPW' signals.-pulseDPW :: Rate -> UGen -> UGen -> UGen-pulseDPW rt freq width =- let o1 = External.sawDPW rt freq 0- o2 = External.sawDPW rt freq (wrap_hs (-1,1) (width+width))- in o1 - o2
+ Sound/SC3/UGen/Bindings/Composite/External.hs view
@@ -0,0 +1,19 @@+-- | Common unit generator graphs.+module Sound.SC3.UGen.Bindings.Composite.External where++import Sound.SC3.Common.Math+import Sound.SC3.Common.Rate+import Sound.SC3.UGen.Type++import qualified Sound.SC3.UGen.Bindings.DB.External as External++-- | FM7 variant where input matrices are not in MCE form.+fm7_mx :: [[UGen]] -> [[UGen]] -> UGen+fm7_mx ctlMatrix modMatrix = External.fm7 AR (mce (concat ctlMatrix)) (mce (concat modMatrix))++-- | pulse signal as difference of two 'sawDPW' signals.+pulseDPW :: Rate -> UGen -> UGen -> UGen+pulseDPW rt freq width =+ let o1 = External.sawDPW rt freq 0+ o2 = External.sawDPW rt freq (wrap_hs (-1,1) (width+width))+ in o1 - o2
Sound/SC3/UGen/Bindings/DB.hs view
@@ -1,10 +1,10 @@ -- | SC3 UGen bindings (auto-generated). module Sound.SC3.UGen.Bindings.DB where +import Sound.SC3.Common.Enum import Sound.SC3.Common.Envelope+import Sound.SC3.Common.Rate import Sound.SC3.Common.UId-import Sound.SC3.UGen.Enum-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen @@ -20,19 +20,19 @@ apf :: UGen -> UGen -> UGen -> UGen apf in_ freq radius = mkUGen Nothing [KR,AR] (Right [0]) "APF" [in_,freq,radius] Nothing 1 (Special 0) NoId --- | All pass delay line with cubic interpolation.+-- | Schroeder allpass delay line with cubic interpolation. -- -- AllpassC [KR,AR] in=0.0 maxdelaytime=0.2 delaytime=0.2 decaytime=1.0; FILTER: TRUE allpassC :: UGen -> UGen -> UGen -> UGen -> UGen allpassC in_ maxdelaytime delaytime decaytime = mkUGen Nothing [KR,AR] (Right [0]) "AllpassC" [in_,maxdelaytime,delaytime,decaytime] Nothing 1 (Special 0) NoId --- | All pass delay line with linear interpolation.+-- | Schroeder allpass delay line with linear interpolation. -- -- AllpassL [KR,AR] in=0.0 maxdelaytime=0.2 delaytime=0.2 decaytime=1.0; FILTER: TRUE allpassL :: UGen -> UGen -> UGen -> UGen -> UGen allpassL in_ maxdelaytime delaytime decaytime = mkUGen Nothing [KR,AR] (Right [0]) "AllpassL" [in_,maxdelaytime,delaytime,decaytime] Nothing 1 (Special 0) NoId --- | All pass delay line with no interpolation.+-- | Schroeder allpass delay line with no interpolation. -- -- AllpassN [KR,AR] in=0.0 maxdelaytime=0.2 delaytime=0.2 decaytime=1.0; FILTER: TRUE allpassN :: UGen -> UGen -> UGen -> UGen -> UGen@@ -56,12 +56,6 @@ amplitude :: Rate -> UGen -> UGen -> UGen -> UGen amplitude rate in_ attackTime releaseTime = mkUGen Nothing [KR,AR] (Left rate) "Amplitude" [in_,attackTime,releaseTime] Nothing 1 (Special 0) NoId --- | (Undocumented class)------ AudioControl [AR] values=0.0-audioControl :: Rate -> UGen -> UGen-audioControl rate values = mkUGen Nothing [AR] (Left rate) "AudioControl" [values] Nothing 0 (Special 0) NoId- -- | All Pass Filter -- -- BAllPass [AR] in=0.0 freq=1200.0 rq=1.0; FILTER: TRUE@@ -144,7 +138,7 @@ -- -- Ball [KR,AR] in=0.0 g=1.0 damp=0.0 friction=1.0e-2 ball :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen-ball rate in_ g damp friction = mkUGen Nothing [KR,AR] (Left rate) "Ball" [in_,g,damp,friction] Nothing 1 (Special 0) NoId+ball rate in_ g damp friction_ = mkUGen Nothing [KR,AR] (Left rate) "Ball" [in_,g,damp,friction_] Nothing 1 (Special 0) NoId -- | Autocorrelation beat tracker --@@ -269,7 +263,7 @@ -- | Buffer reading oscillator. -- -- BufRd [KR,AR] bufnum=0.0 phase=0.0 loop=1.0 interpolation=2.0; NC INPUT: True, ENUMERATION INPUTS: 2=Loop, 3=Interpolation-bufRd :: Int -> Rate -> UGen -> UGen -> Loop -> Interpolation -> UGen+bufRd :: Int -> Rate -> UGen -> UGen -> Loop UGen -> Interpolation UGen -> UGen bufRd numChannels rate bufnum phase loop interpolation = mkUGen Nothing [KR,AR] (Left rate) "BufRd" [bufnum,phase,(from_loop loop),(from_interpolation interpolation)] Nothing numChannels (Special 0) NoId -- | Buffer sample rate.@@ -286,8 +280,8 @@ -- | Buffer writing oscillator. ----- BufWr [KR,AR] bufnum=0.0 phase=0.0 loop=1.0 *inputArray=0.0; MCE, FILTER: TRUE, REORDERS INPUTS: [3,0,1,2], ENUMERATION INPUTS: 2=Loop-bufWr :: UGen -> UGen -> Loop -> UGen -> UGen+-- BufWr [KR,AR] bufnum=0.0 phase=0.0 loop=1.0 *inputArray=0.0; MCE=1, FILTER: TRUE, REORDERS INPUTS: [3,0,1,2], ENUMERATION INPUTS: 2=Loop+bufWr :: UGen -> UGen -> Loop UGen -> UGen -> UGen bufWr bufnum phase loop inputArray = mkUGen Nothing [KR,AR] (Right [3]) "BufWr" [bufnum,phase,(from_loop loop)] (Just [inputArray]) 1 (Special 0) NoId -- | Chorusing wavetable oscillator.@@ -419,15 +413,21 @@ -- | Buffer read demand ugen -- -- Dbufrd [DR] bufnum=0.0 phase=0.0 loop=1.0; ENUMERATION INPUTS: 2=Loop, DEMAND/NONDET-dbufrd :: ID a => a -> UGen -> UGen -> Loop -> UGen+dbufrd :: ID a => a -> UGen -> UGen -> Loop UGen -> UGen dbufrd z bufnum phase loop = mkUGen Nothing [DR] (Left DR) "Dbufrd" [bufnum,phase,(from_loop loop)] Nothing 1 (Special 0) (toUId z) -- | Buffer write demand ugen -- -- Dbufwr [DR] bufnum=0.0 phase=0.0 loop=1.0 input=0.0; REORDERS INPUTS: [3,0,1,2], ENUMERATION INPUTS: 3=Loop, DEMAND/NONDET-dbufwr :: ID a => a -> UGen -> UGen -> UGen -> Loop -> UGen+dbufwr :: ID a => a -> UGen -> UGen -> UGen -> Loop UGen -> UGen dbufwr z bufnum phase loop input = mkUGen Nothing [DR] (Left DR) "Dbufwr" [bufnum,phase,loop,(from_loop input)] Nothing 1 (Special 0) (toUId z) +-- | Constrain a demand-rate stream to a given sum+--+-- Dconst [DR] sum=0.0 in=0.0 tolerance=1.0e-3; DEMAND/NONDET+dconst :: ID a => a -> UGen -> UGen -> UGen -> UGen+dconst z sum_ in_ tolerance = mkUGen Nothing [DR] (Left DR) "Dconst" [sum_,in_,tolerance] Nothing 1 (Special 0) (toUId z)+ -- | Exponential decay -- -- Decay [KR,AR] in=0.0 decayTime=1.0; FILTER: TRUE@@ -496,14 +496,14 @@ -- | Demand results from demand rate UGens. ----- Demand [KR,AR] trig=0.0 reset=0.0 *demandUGens=0.0; MCE, FILTER: TRUE+-- Demand [KR,AR] trig=0.0 reset=0.0 *demandUGens=0.0; MCE=1, FILTER: TRUE demand :: UGen -> UGen -> UGen -> UGen demand trig_ reset demandUGens = mkUGen Nothing [KR,AR] (Right [0]) "Demand" [trig_,reset] (Just [demandUGens]) (length (mceChannels demandUGens) + 0) (Special 0) NoId -- | Demand rate envelope generator -- -- DemandEnvGen [KR,AR] level=0.0 dur=0.0 shape=1.0 curve=0.0 gate=1.0 reset=1.0 levelScale=1.0 levelBias=0.0 timeScale=1.0 doneAction=0.0; ENUMERATION INPUTS: 9=DoneAction-demandEnvGen :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> DoneAction -> UGen+demandEnvGen :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> DoneAction UGen -> UGen demandEnvGen rate level dur shape curve gate_ reset levelScale levelBias timeScale doneAction = mkUGen Nothing [KR,AR] (Left rate) "DemandEnvGen" [level,dur,shape,curve,gate_,reset,levelScale,levelBias,timeScale,(from_done_action doneAction)] Nothing 1 (Special 0) NoId -- | Search a buffer for a value@@ -512,10 +512,10 @@ detectIndex :: UGen -> UGen -> UGen detectIndex bufnum in_ = mkUGen Nothing [KR,AR] (Right [1]) "DetectIndex" [bufnum,in_] Nothing 1 (Special 0) NoId --- | When input falls below a threshhold, evaluate doneAction.+-- | Detect when input falls below an amplitude threshold -- -- DetectSilence [KR,AR] in=0.0 amp=1.0e-4 time=0.1 doneAction=0.0; FILTER: TRUE, ENUMERATION INPUTS: 3=DoneAction-detectSilence :: UGen -> UGen -> UGen -> DoneAction -> UGen+detectSilence :: UGen -> UGen -> UGen -> DoneAction UGen -> UGen detectSilence in_ amp time doneAction = mkUGen Nothing [KR,AR] (Right [0]) "DetectSilence" [in_,amp,time,(from_done_action doneAction)] Nothing 1 (Special 0) NoId -- | Demand rate geometric series UGen.@@ -533,12 +533,12 @@ -- | Stream in audio from a file. -- -- DiskIn [AR] bufnum=0.0 loop=0.0; NC INPUT: True, ENUMERATION INPUTS: 1=Loop-diskIn :: Int -> UGen -> Loop -> UGen+diskIn :: Int -> UGen -> Loop UGen -> UGen diskIn numChannels bufnum loop = mkUGen Nothing [AR] (Left AR) "DiskIn" [bufnum,(from_loop loop)] Nothing numChannels (Special 0) NoId -- | Record to a soundfile to disk. ----- DiskOut [AR] bufnum=0.0 *channelsArray=0.0; MCE+-- DiskOut [AR] bufnum=0.0 *channelsArray=0.0; MCE=1 diskOut :: UGen -> UGen -> UGen diskOut bufnum input = mkUGen Nothing [AR] (Left AR) "DiskOut" [bufnum] (Just [input]) 1 (Special 0) NoId @@ -548,12 +548,6 @@ diwhite :: ID a => a -> UGen -> UGen -> UGen -> UGen diwhite z length_ lo hi = mkUGen Nothing [DR] (Left DR) "Diwhite" [length_,lo,hi] Nothing 1 (Special 0) (toUId z) --- | (Undocumented class)------ Donce [DR] in=0.0; DEMAND/NONDET-donce :: ID a => a -> UGen -> UGen-donce z in_ = mkUGen Nothing [DR] (Left DR) "Donce" [in_] Nothing 1 (Special 0) (toUId z)- -- | Monitors another UGen to see when it is finished -- -- Done [KR] src=0.0@@ -568,7 +562,7 @@ -- | Demand rate random sequence generator. ----- Drand [DR] repeats=1.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Drand [DR] repeats=1.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET drand :: ID a => a -> UGen -> UGen -> UGen drand z repeats list_ = mkUGen Nothing [DR] (Left DR) "Drand" [repeats] (Just [list_]) 1 (Special 0) (toUId z) @@ -580,13 +574,13 @@ -- | Demand rate sequence generator. ----- Dseq [DR] repeats=1.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Dseq [DR] repeats=1.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET dseq :: ID a => a -> UGen -> UGen -> UGen dseq z repeats list_ = mkUGen Nothing [DR] (Left DR) "Dseq" [repeats] (Just [list_]) 1 (Special 0) (toUId z) -- | Demand rate sequence generator. ----- Dser [DR] repeats=1.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Dser [DR] repeats=1.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET dser :: ID a => a -> UGen -> UGen -> UGen dser z repeats list_ = mkUGen Nothing [DR] (Left DR) "Dser" [repeats] (Just [list_]) 1 (Special 0) (toUId z) @@ -598,7 +592,7 @@ -- | Demand rate random sequence generator ----- Dshuf [DR] repeats=1.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Dshuf [DR] repeats=1.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET dshuf :: ID a => a -> UGen -> UGen -> UGen dshuf z repeats list_ = mkUGen Nothing [DR] (Left DR) "Dshuf" [repeats] (Just [list_]) 1 (Special 0) (toUId z) @@ -610,13 +604,13 @@ -- | Demand rate generator for embedding different inputs ----- Dswitch [DR] index=0.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Dswitch [DR] index=0.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET dswitch :: ID a => a -> UGen -> UGen -> UGen dswitch z index_ list_ = mkUGen Nothing [DR] (Left DR) "Dswitch" [index_] (Just [list_]) 1 (Special 0) (toUId z) -- | Demand rate generator for switching between inputs. ----- Dswitch1 [DR] index=0.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Dswitch1 [DR] index=0.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET dswitch1 :: ID a => a -> UGen -> UGen -> UGen dswitch1 z index_ list_ = mkUGen Nothing [DR] (Left DR) "Dswitch1" [index_] (Just [list_]) 1 (Special 0) (toUId z) @@ -641,7 +635,7 @@ -- | Demand results from demand rate UGens. -- -- Duty [KR,AR] dur=1.0 reset=0.0 doneAction=0.0 level=1.0; REORDERS INPUTS: [0,1,3,2], ENUMERATION INPUTS: 2=DoneAction-duty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen+duty :: Rate -> UGen -> UGen -> DoneAction UGen -> UGen -> UGen duty rate dur reset doneAction level = mkUGen Nothing [KR,AR] (Left rate) "Duty" [dur,reset,(from_done_action doneAction),level] Nothing 1 (Special 0) NoId -- | Demand rate white noise random generator.@@ -653,22 +647,22 @@ {- -- | Demand rate weighted random sequence generator ----- Dwrand [DR] repeats=1.0 weights=0.0 *list=0.0; MCE, REORDERS INPUTS: [2,1,0], DEMAND/NONDET+-- Dwrand [DR] repeats=1.0 weights=0.0 *list=0.0; MCE=1, REORDERS INPUTS: [2,1,0], DEMAND/NONDET dwrand :: ID a => a -> UGen -> UGen -> UGen -> UGen dwrand z repeats weights list_ = mkUGen Nothing [DR] (Left DR) "Dwrand" [repeats,weights] (Just [list_]) 1 (Special 0) (toUId z) -} -- | Demand rate random sequence generator. ----- Dxrand [DR] repeats=1.0 *list=0.0; MCE, REORDERS INPUTS: [1,0], DEMAND/NONDET+-- Dxrand [DR] repeats=1.0 *list=0.0; MCE=1, REORDERS INPUTS: [1,0], DEMAND/NONDET dxrand :: ID a => a -> UGen -> UGen -> UGen dxrand z repeats list_ = mkUGen Nothing [DR] (Left DR) "Dxrand" [repeats] (Just [list_]) 1 (Special 0) (toUId z) -- | Envelope generator ----- EnvGen [KR,AR] gate=1.0 levelScale=1.0 levelBias=0.0 timeScale=1.0 doneAction=0.0 *envelope=0.0; MCE, REORDERS INPUTS: [5,0,1,2,3,4,5], ENUMERATION INPUTS: 4=DoneAction, 5=Envelope UGen-envGen :: Rate -> UGen -> UGen -> UGen -> UGen -> DoneAction -> Envelope UGen -> UGen-envGen rate gate_ levelScale levelBias timeScale doneAction envelope_ = mkUGen Nothing [KR,AR] (Left rate) "EnvGen" [gate_,levelScale,levelBias,timeScale,(from_done_action doneAction)] (Just [envelope_to_ugen envelope_]) 1 (Special 0) NoId+-- EnvGen [KR,AR] gate=1.0 levelScale=1.0 levelBias=0.0 timeScale=1.0 doneAction=0.0 *envelope=0.0; MCE=1, REORDERS INPUTS: [5,0,1,2,3,4,5], ENUMERATION INPUTS: 4=DoneAction, 5=Envelope+envGen :: Rate -> UGen -> UGen -> UGen -> UGen -> DoneAction UGen -> Envelope UGen -> UGen+envGen rate gate_ levelScale levelBias timeScale doneAction envelope_ = mkUGen Nothing [KR,AR] (Left rate) "EnvGen" [gate_,levelScale,levelBias,timeScale,(from_done_action doneAction)] (Just [(envelope_to_ugen envelope_)]) 1 (Special 0) NoId -- | Exponential single random number generator. --@@ -856,7 +850,7 @@ hpz2 :: UGen -> UGen hpz2 in_ = mkUGen Nothing [KR,AR] (Right [0]) "HPZ2" [in_] Nothing 1 (Special 0) NoId --- | Randomized value.+-- | Scrambled value with a hash function. -- -- Hasher [KR,AR] in=0.0; FILTER: TRUE hasher :: UGen -> UGen@@ -888,9 +882,9 @@ -- | Envelope generator for polling values from an Env ----- IEnvGen [KR,AR] index=0.0 *envelope=0.0; MCE, REORDERS INPUTS: [1,0], ENUMERATION INPUTS: 1=Envelope UGen+-- IEnvGen [KR,AR] index=0.0 *envelope=0.0; MCE=1, REORDERS INPUTS: [1,0], ENUMERATION INPUTS: 1=Envelope iEnvGen :: Rate -> UGen -> Envelope UGen -> UGen-iEnvGen rate index_ envelope_ = mkUGen Nothing [KR,AR] (Left rate) "IEnvGen" [index_] (Just [envelope_to_ienvgen_ugen envelope_]) 1 (Special 0) NoId+iEnvGen rate index_ envelope_ = mkUGen Nothing [KR,AR] (Left rate) "IEnvGen" [index_] (Just [(envelope_to_ugen envelope_)]) 1 (Special 0) NoId -- | Inverse Fast Fourier Transform --@@ -954,7 +948,7 @@ -- | Index into a table with a signal, linear interpolated ----- IndexL [KR,AR] bufnum=0.0 in=0.0+-- IndexL [KR,AR] bufnum=0.0 in=0.0; FILTER: TRUE indexL :: UGen -> UGen -> UGen indexL bufnum in_ = mkUGen Nothing [KR,AR] (Right [1]) "IndexL" [bufnum,in_] Nothing 1 (Special 0) NoId @@ -990,13 +984,13 @@ -- | Sine oscillator bank ----- Klang [AR] freqscale=1.0 freqoffset=0.0 *specificationsArrayRef=0.0; MCE, REORDERS INPUTS: [2,0,1]+-- Klang [AR] freqscale=1.0 freqoffset=0.0 *specificationsArrayRef=0.0; MCE=1, REORDERS INPUTS: [2,0,1] klang :: Rate -> UGen -> UGen -> UGen -> UGen klang rate freqscale freqoffset specificationsArrayRef = mkUGen Nothing [AR] (Left rate) "Klang" [freqscale,freqoffset] (Just [specificationsArrayRef]) 1 (Special 0) NoId -- | Bank of resonators ----- Klank [AR] input=0.0 freqscale=1.0 freqoffset=0.0 decayscale=1.0 *specificationsArrayRef=0.0; MCE, FILTER: TRUE, REORDERS INPUTS: [4,0,1,2,3]+-- Klank [AR] input=0.0 freqscale=1.0 freqoffset=0.0 decayscale=1.0 *specificationsArrayRef=0.0; MCE=1, FILTER: TRUE, REORDERS INPUTS: [4,0,1,2,3] klank :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen klank input freqscale freqoffset decayscale specificationsArrayRef = mkUGen Nothing [AR] (Right [0]) "Klank" [input,freqscale,freqoffset,decayscale] (Just [specificationsArrayRef]) 1 (Special 0) NoId @@ -1039,7 +1033,7 @@ -- | Gaussian function oscillator -- -- LFGauss [KR,AR] duration=1.0 width=0.1 iphase=0.0 loop=1.0 doneAction=0.0; ENUMERATION INPUTS: 3=Loop, 4=DoneAction-lfGauss :: Rate -> UGen -> UGen -> UGen -> Loop -> DoneAction -> UGen+lfGauss :: Rate -> UGen -> UGen -> UGen -> Loop UGen -> DoneAction UGen -> UGen lfGauss rate duration width iphase loop doneAction = mkUGen Nothing [KR,AR] (Left rate) "LFGauss" [duration,width,iphase,(from_loop loop),(from_done_action doneAction)] Nothing 1 (Special 0) NoId -- | Step noise@@ -1237,13 +1231,13 @@ -- | Line generator. -- -- Line [KR,AR] start=0.0 end=1.0 dur=1.0 doneAction=0.0; ENUMERATION INPUTS: 3=DoneAction-line :: Rate -> UGen -> UGen -> UGen -> DoneAction -> UGen+line :: Rate -> UGen -> UGen -> UGen -> DoneAction UGen -> UGen line rate start end dur doneAction = mkUGen Nothing [KR,AR] (Left rate) "Line" [start,end,dur,(from_done_action doneAction)] Nothing 1 (Special 0) NoId -- | Simple linear envelope generator. -- -- Linen [KR] gate=1.0 attackTime=1.0e-2 susLevel=1.0 releaseTime=1.0 doneAction=0.0; ENUMERATION INPUTS: 4=DoneAction-linen :: UGen -> UGen -> UGen -> UGen -> DoneAction -> UGen+linen :: UGen -> UGen -> UGen -> UGen -> DoneAction UGen -> UGen linen gate_ attackTime susLevel releaseTime doneAction = mkUGen Nothing [KR] (Left KR) "Linen" [gate_,attackTime,susLevel,releaseTime,(from_done_action doneAction)] Nothing 1 (Special 0) NoId -- | Allocate a buffer local to the synth@@ -1254,13 +1248,13 @@ -- | Define and read from buses local to a synth. ----- LocalIn [KR,AR] *default=0.0; MCE, NC INPUT: True+-- LocalIn [KR,AR] *default=0.0; MCE=1, NC INPUT: True localIn :: Int -> Rate -> UGen -> UGen localIn numChannels rate default_ = mkUGen Nothing [KR,AR] (Left rate) "LocalIn" [] (Just [default_]) numChannels (Special 0) NoId -- | Write to buses local to a synth. ----- LocalOut [KR,AR] *channelsArray=0.0; MCE, FILTER: TRUE+-- LocalOut [KR,AR] *channelsArray=0.0; MCE=1, FILTER: TRUE localOut :: UGen -> UGen localOut input = mkUGen Nothing [KR,AR] (Right [0]) "LocalOut" [] (Just [input]) 0 (Special 0) NoId @@ -1333,13 +1327,13 @@ -- | Cursor tracking UGen. -- -- MouseX [KR] minval=0.0 maxval=1.0 warp=0.0 lag=0.2; ENUMERATION INPUTS: 2=Warp-mouseX :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen+mouseX :: Rate -> UGen -> UGen -> Warp UGen -> UGen -> UGen mouseX rate minval maxval warp lag_ = mkUGen Nothing [KR] (Left rate) "MouseX" [minval,maxval,(from_warp warp),lag_] Nothing 1 (Special 0) NoId -- | Cursor tracking UGen. -- -- MouseY [KR] minval=0.0 maxval=1.0 warp=0.0 lag=0.2; ENUMERATION INPUTS: 2=Warp-mouseY :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen+mouseY :: Rate -> UGen -> UGen -> Warp UGen -> UGen -> UGen mouseY rate minval maxval warp lag_ = mkUGen Nothing [KR] (Left rate) "MouseY" [minval,maxval,(from_warp warp),lag_] Nothing 1 (Special 0) NoId -- | Sum of uniform distributions.@@ -1348,6 +1342,12 @@ nRand :: ID a => a -> UGen -> UGen -> UGen -> UGen nRand z lo hi n = mkUGen Nothing [IR] (Left IR) "NRand" [lo,hi,n] Nothing 1 (Special 0) (toUId z) +-- | (Undocumented class)+--+-- NodeID [IR]+nodeID :: Rate -> UGen+nodeID rate = mkUGen Nothing [IR] (Left rate) "NodeID" [] Nothing 1 (Special 0) NoId+ -- | Flattens dynamics. -- -- Normalizer [AR] in=0.0 level=1.0 dur=1.0e-2; FILTER: TRUE@@ -1392,7 +1392,7 @@ -- | Write a signal to a bus with sample accurate timing. ----- OffsetOut [KR,AR] bus=0.0 *channelsArray=0.0; MCE, FILTER: TRUE+-- OffsetOut [KR,AR] bus=0.0 *channelsArray=0.0; MCE=1, FILTER: TRUE offsetOut :: UGen -> UGen -> UGen offsetOut bus input = mkUGen Nothing [KR,AR] (Right [1]) "OffsetOut" [bus] (Just [input]) 0 (Special 0) NoId @@ -1428,13 +1428,13 @@ -- | Write a signal to a bus. ----- Out [KR,AR] bus=0.0 *channelsArray=0.0; MCE, FILTER: TRUE+-- Out [KR,AR] bus=0.0 *channelsArray=0.0; MCE=1, FILTER: TRUE out :: UGen -> UGen -> UGen out bus input = mkUGen Nothing [KR,AR] (Right [1]) "Out" [bus] (Just [input]) 0 (Special 0) NoId -- | Very fast sine grain with a parabolic envelope ----- PSinGrain [AR] freq=440.0 dur=0.2 amp=1.0+-- PSinGrain [AR] freq=440.0 dur=0.2 amp=0.1 pSinGrain :: Rate -> UGen -> UGen -> UGen -> UGen pSinGrain rate freq dur amp = mkUGen Nothing [AR] (Left rate) "PSinGrain" [freq,dur,amp] Nothing 1 (Special 0) NoId @@ -1468,12 +1468,6 @@ pv_BrickWall :: UGen -> UGen -> UGen pv_BrickWall buffer wipe = mkUGen Nothing [KR] (Left KR) "PV_BrickWall" [buffer,wipe] Nothing 1 (Special 0) NoId --- | Base class for UGens that alter FFT chains------ PV_ChainUGen [KR] maxSize=0.0-pv_ChainUGen :: UGen -> UGen-pv_ChainUGen maxSize = mkUGen Nothing [KR] (Left KR) "PV_ChainUGen" [maxSize] Nothing 1 (Special 0) NoId- -- | Complex plane attack. -- -- PV_ConformalMap [KR] buffer=0.0 areal=0.0 aimag=0.0@@ -1743,7 +1737,7 @@ -- | Sample playback oscillator. -- -- PlayBuf [KR,AR] bufnum=0.0 rate=1.0 trigger=1.0 startPos=0.0 loop=0.0 doneAction=0.0; NC INPUT: True, ENUMERATION INPUTS: 4=Loop, 5=DoneAction-playBuf :: Int -> Rate -> UGen -> UGen -> UGen -> UGen -> Loop -> DoneAction -> UGen+playBuf :: Int -> Rate -> UGen -> UGen -> UGen -> UGen -> Loop UGen -> DoneAction UGen -> UGen playBuf numChannels rate bufnum rate_ trigger startPos loop doneAction = mkUGen Nothing [KR,AR] (Left rate) "PlayBuf" [bufnum,rate_,trigger,startPos,(from_loop loop),(from_done_action doneAction)] Nothing numChannels (Special 0) NoId -- | A Karplus-Strong UGen@@ -1755,9 +1749,9 @@ {- -- | Print the current output value of a UGen ----- Poll [KR,AR] trig=0.0 in=0.0 label=0.0 trigid=-1.0; FILTER: TRUE+-- Poll [KR,AR] trig=0.0 in=0.0 trigid=-1.0 label=0.0; FILTER: TRUE, REORDERS INPUTS: [0,1,3,2] poll :: UGen -> UGen -> UGen -> UGen -> UGen-poll trig_ in_ label_ trigid = mkUGen Nothing [KR,AR] (Right [1]) "Poll" [trig_,in_,label_,trigid] Nothing 1 (Special 0) NoId+poll trig_ in_ trigid label_ = mkUGen Nothing [KR,AR] (Right [1]) "Poll" [trig_,in_,trigid,label_] Nothing 1 (Special 0) NoId -} -- | Band limited pulse wave.@@ -1840,13 +1834,13 @@ -- | Record or overdub into a Buffer. ----- RecordBuf [KR,AR] bufnum=0.0 offset=0.0 recLevel=1.0 preLevel=0.0 run=1.0 loop=1.0 trigger=1.0 doneAction=0.0 *inputArray=0.0; MCE, REORDERS INPUTS: [8,0,1,2,3,4,5,6,7], ENUMERATION INPUTS: 5=Loop, 7=DoneAction-recordBuf :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> Loop -> UGen -> DoneAction -> UGen -> UGen+-- RecordBuf [KR,AR] bufnum=0.0 offset=0.0 recLevel=1.0 preLevel=0.0 run=1.0 loop=1.0 trigger=1.0 doneAction=0.0 *inputArray=0.0; MCE=1, REORDERS INPUTS: [8,0,1,2,3,4,5,6,7], ENUMERATION INPUTS: 5=Loop, 7=DoneAction+recordBuf :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> Loop UGen -> UGen -> DoneAction UGen -> UGen -> UGen recordBuf rate bufnum offset recLevel preLevel run loop trigger doneAction inputArray = mkUGen Nothing [KR,AR] (Left rate) "RecordBuf" [bufnum,offset,recLevel,preLevel,run,(from_loop loop),trigger,(from_done_action doneAction)] (Just [inputArray]) 1 (Special 0) NoId -- | Send signal to a bus, overwriting previous contents. ----- ReplaceOut [KR,AR] bus=0.0 *channelsArray=0.0; MCE, FILTER: TRUE+-- ReplaceOut [KR,AR] bus=0.0 *channelsArray=0.0; MCE=1, FILTER: TRUE replaceOut :: UGen -> UGen -> UGen replaceOut bus input = mkUGen Nothing [KR,AR] (Right [1]) "ReplaceOut" [bus] (Just [input]) 0 (Special 0) NoId @@ -1904,6 +1898,12 @@ sampleRate :: UGen sampleRate = mkUGen Nothing [IR] (Left IR) "SampleRate" [] Nothing 1 (Special 0) NoId +-- | Remove infinity, NaN, and denormals+--+-- Sanitize [KR,AR] in=0.0 replace=0.0+sanitize :: UGen -> UGen -> UGen+sanitize in_ replace = mkUGen Nothing [KR,AR] (Right [0]) "Sanitize" [in_,replace] Nothing 1 (Special 0) NoId+ -- | Band limited sawtooth. -- -- Saw [KR,AR] freq=440.0@@ -1916,21 +1916,9 @@ schmidt :: UGen -> UGen -> UGen -> UGen schmidt in_ lo hi = mkUGen Nothing [IR,KR,AR] (Right [0]) "Schmidt" [in_,lo,hi] Nothing 1 (Special 0) NoId --- | FIXME: ScopeOut purpose.------ ScopeOut [KR,AR] inputArray=0.0 bufnum=0.0-scopeOut :: Rate -> UGen -> UGen -> UGen-scopeOut rate inputArray bufnum = mkUGen Nothing [KR,AR] (Left rate) "ScopeOut" [inputArray,bufnum] Nothing 0 (Special 0) NoId---- | (Undocumented class)------ ScopeOut2 [KR,AR] inputArray=0.0 scopeNum=0.0 maxFrames=4096.0 scopeFrames=0.0-scopeOut2 :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen-scopeOut2 rate inputArray scopeNum maxFrames scopeFrames = mkUGen Nothing [KR,AR] (Left rate) "ScopeOut2" [inputArray,scopeNum,maxFrames,scopeFrames] Nothing 0 (Special 0) NoId- -- | Select output from an array of inputs. ----- Select [IR,KR,AR] which=0.0 *array=0.0; MCE, FILTER: TRUE+-- Select [IR,KR,AR] which=0.0 *array=0.0; MCE=1, FILTER: TRUE select :: UGen -> UGen -> UGen select which array = mkUGen Nothing [IR,KR,AR] (Right [0,1]) "Select" [which] (Just [array]) 1 (Special 0) NoId @@ -2070,7 +2058,7 @@ -- -- TBall [KR,AR] in=0.0 g=10.0 damp=0.0 friction=1.0e-2 tBall :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen-tBall rate in_ g damp friction = mkUGen Nothing [KR,AR] (Left rate) "TBall" [in_,g,damp,friction] Nothing 1 (Special 0) NoId+tBall rate in_ g damp friction_ = mkUGen Nothing [KR,AR] (Left rate) "TBall" [in_,g,damp,friction_] Nothing 1 (Special 0) NoId -- | Trigger delay. --@@ -2081,7 +2069,7 @@ -- | Demand results as trigger from demand rate UGens. -- -- TDuty [KR,AR] dur=1.0 reset=0.0 doneAction=0.0 level=1.0 gapFirst=0.0; REORDERS INPUTS: [0,1,3,2,4], ENUMERATION INPUTS: 2=DoneAction-tDuty :: Rate -> UGen -> UGen -> DoneAction -> UGen -> UGen -> UGen+tDuty :: Rate -> UGen -> UGen -> DoneAction UGen -> UGen -> UGen -> UGen tDuty rate dur reset doneAction level gapFirst = mkUGen Nothing [KR,AR] (Left rate) "TDuty" [dur,reset,(from_done_action doneAction),level,gapFirst] Nothing 1 (Special 0) NoId -- | Triggered exponential random number generator.@@ -2110,7 +2098,7 @@ -- | Triggered windex. ----- TWindex [KR,AR] in=0.0 normalize=0.0 *array=0.0; MCE, FILTER: TRUE, REORDERS INPUTS: [0,2,1], NONDET+-- TWindex [KR,AR] in=0.0 normalize=0.0 *array=0.0; MCE=1, FILTER: TRUE, REORDERS INPUTS: [0,2,1], NONDET tWindex :: ID a => a -> UGen -> UGen -> UGen -> UGen tWindex z in_ normalize array = mkUGen Nothing [KR,AR] (Right [0]) "TWindex" [in_,normalize] (Just [array]) 1 (Special 0) (toUId z) @@ -2138,12 +2126,6 @@ trig1 :: UGen -> UGen -> UGen trig1 in_ dur = mkUGen Nothing [KR,AR] (Right [0]) "Trig1" [in_,dur] Nothing 1 (Special 0) NoId --- | FIXME: TrigControl purpose.------ TrigControl [IR,KR] values=0.0-trigControl :: Rate -> UGen -> UGen-trigControl rate values = mkUGen Nothing [IR,KR] (Left rate) "TrigControl" [values] Nothing 0 (Special 0) NoId- -- | Two pole filter. -- -- TwoPole [KR,AR] in=0.0 freq=440.0 radius=0.8; FILTER: TRUE@@ -2165,7 +2147,7 @@ -- | Stream in audio from a file, with variable rate -- -- VDiskIn [AR] bufnum=0.0 rate=1.0 loop=0.0 sendID=0.0; NC INPUT: True, ENUMERATION INPUTS: 2=Loop-vDiskIn :: Int -> UGen -> UGen -> Loop -> UGen -> UGen+vDiskIn :: Int -> UGen -> UGen -> Loop UGen -> UGen -> UGen vDiskIn numChannels bufnum rate_ loop sendID = mkUGen Nothing [AR] (Left AR) "VDiskIn" [bufnum,rate_,(from_loop loop),sendID] Nothing numChannels (Special 0) NoId -- | Variable wavetable oscillator.@@ -2182,9 +2164,9 @@ -- | Variable shaped lag ----- VarLag [KR,AR] in=0.0 time=0.1 level=0.0; FILTER: TRUE-varLag :: UGen -> UGen -> UGen -> UGen-varLag in_ time level = mkUGen Nothing [KR,AR] (Right [0]) "VarLag" [in_,time,level] Nothing 1 (Special 0) NoId+-- VarLag [KR,AR] in=0.0 time=0.1 curvature=0.0 warp=5.0 start=0.0; FILTER: TRUE+varLag :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen+varLag in_ time curvature warp start = mkUGen Nothing [KR,AR] (Right [0]) "VarLag" [in_,time,curvature,warp,start] Nothing 1 (Special 0) NoId -- | Variable duty saw --@@ -2194,9 +2176,9 @@ -- | The Vibrato oscillator models a slow frequency modulation. ----- Vibrato [KR,AR] freq=440.0 rate=6.0 depth=2.0e-2 delay=0.0 onset=0.0 rateVariation=4.0e-2 depthVariation=0.1 iphase=0.0; NONDET-vibrato :: ID a => a -> Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-vibrato z rate freq rate_ depth delay onset rateVariation depthVariation iphase = mkUGen Nothing [KR,AR] (Left rate) "Vibrato" [freq,rate_,depth,delay,onset,rateVariation,depthVariation,iphase] Nothing 1 (Special 0) (toUId z)+-- Vibrato [KR,AR] freq=440.0 rate=6.0 depth=2.0e-2 delay=0.0 onset=0.0 rateVariation=4.0e-2 depthVariation=0.1 iphase=0.0 trig=0.0; NONDET+vibrato :: ID a => a -> Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+vibrato z rate freq rate_ depth delay onset rateVariation depthVariation iphase trig_ = mkUGen Nothing [KR,AR] (Left rate) "Vibrato" [freq,rate_,depth,delay,onset,rateVariation,depthVariation,iphase,trig_] Nothing 1 (Special 0) (toUId z) -- | Warp a buffer with a time pointer --@@ -2210,12 +2192,6 @@ whiteNoise :: ID a => a -> Rate -> UGen whiteNoise z rate = mkUGen Nothing [KR,AR] (Left rate) "WhiteNoise" [] Nothing 1 (Special 0) (toUId z) --- | (Undocumented class)------ WidthFirstUGen [] maxSize=0.0-widthFirstUGen :: Rate -> UGen -> UGen-widthFirstUGen rate maxSize = mkUGen Nothing [IR,KR,AR,DR] (Left rate) "WidthFirstUGen" [maxSize] Nothing 1 (Special 0) NoId- -- | Wrap a signal outside given thresholds. -- -- Wrap [IR,KR,AR] in=0.0 lo=0.0 hi=1.0; FILTER: TRUE@@ -2237,12 +2213,12 @@ -- | Exponential line generator. -- -- XLine [KR,AR] start=1.0 end=2.0 dur=1.0 doneAction=0.0; ENUMERATION INPUTS: 3=DoneAction-xLine :: Rate -> UGen -> UGen -> UGen -> DoneAction -> UGen+xLine :: Rate -> UGen -> UGen -> UGen -> DoneAction UGen -> UGen xLine rate start end dur doneAction = mkUGen Nothing [KR,AR] (Left rate) "XLine" [start,end,dur,(from_done_action doneAction)] Nothing 1 (Special 0) NoId -- | Send signal to a bus, crossfading with previous contents. ----- XOut [KR,AR] bus=0.0 xfade=0.0 *channelsArray=0.0; MCE, FILTER: TRUE+-- XOut [KR,AR] bus=0.0 xfade=0.0 *channelsArray=0.0; MCE=1, FILTER: TRUE xOut :: UGen -> UGen -> UGen -> UGen xOut bus xfade input = mkUGen Nothing [KR,AR] (Right [2]) "XOut" [bus,xfade] (Just [input]) 0 (Special 0) NoId @@ -2254,18 +2230,18 @@ -- | LocalBuf count ----- MaxLocalBufs [IR] count=0.0+-- MaxLocalBufs [IR,KR] count=0.0 maxLocalBufs :: UGen -> UGen-maxLocalBufs count = mkUGen Nothing [IR] (Left IR) "MaxLocalBufs" [count] Nothing 1 (Special 0) NoId+maxLocalBufs count = mkUGen Nothing [IR,KR] (Left KR) "MaxLocalBufs" [count] Nothing 1 (Special 0) NoId -- | Multiply add -- -- MulAdd [IR,KR,AR] in=0.0 mul=0.0 add=0.0; FILTER: TRUE mulAdd :: UGen -> UGen -> UGen -> UGen-mulAdd in_ mul add = mkUGen Nothing [IR,KR,AR] (Right [0]) "MulAdd" [in_,mul,add] Nothing 1 (Special 0) NoId+mulAdd in_ mul add = mkUGen Nothing [IR,KR,AR] (Right [0,1,2]) "MulAdd" [in_,mul,add] Nothing 1 (Special 0) NoId -- | Set local buffer ----- SetBuf [IR] buf=0.0 offset=0.0 length=0.0 *array=0.0; MCE, REORDERS INPUTS: [0,1,2,3]+-- SetBuf [IR] buf=0.0 offset=0.0 length=0.0 *array=0.0; MCE=1, REORDERS INPUTS: [0,1,2,3] setBuf :: UGen -> UGen -> UGen -> UGen -> UGen setBuf buf offset length_ array = mkUGen Nothing [IR] (Left IR) "SetBuf" [buf,offset,length_] (Just [array]) 1 (Special 0) NoId
Sound/SC3/UGen/Bindings/DB/External.hs view
@@ -1,8 +1,8 @@ -- | SC3 external (sce3-plugins) UGen bindings (auto-generated). module Sound.SC3.UGen.Bindings.DB.External where +import Sound.SC3.Common.Rate import Sound.SC3.Common.UId-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen @@ -42,6 +42,12 @@ analyseEvents2 :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen analyseEvents2 rate in_ bufnum threshold triggerid circular pitch_ = mkUGen Nothing [AR] (Left rate) "AnalyseEvents2" [in_,bufnum,threshold,triggerid,circular,pitch_] Nothing 1 (Special 0) NoId +-- | 2-species Predator-Prey model+--+-- ArneodoCoulletTresser [AR] freq=22050.0 alpha=1.5 h=5.0e-2 xi=0.5 yi=0.5 zi=0.5+arneodoCoulletTresser :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+arneodoCoulletTresser rate freq alpha h xi yi zi = mkUGen Nothing [AR] (Left rate) "ArneodoCoulletTresser" [freq,alpha,h,xi,yi,zi] Nothing 3 (Special 0) NoId+ -- | detect the largest value (and its position) in an array of UGens -- -- ArrayMax [KR,AR] array=0.0@@ -1942,8 +1948,8 @@ -- | TB303 Filter Emulation -- -- RLPFD [KR,AR] in=0.0 ffreq=440.0 res=0.0 dist=0.0-rLPFD :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen-rLPFD rate in_ ffreq res dist = mkUGen Nothing [KR,AR] (Left rate) "RLPFD" [in_,ffreq,res,dist] Nothing 1 (Special 0) NoId+rlpfd :: UGen -> UGen -> UGen -> UGen -> UGen+rlpfd in_ ffreq res dist = mkUGen Nothing [KR,AR] (Right [0]) "RLPFD" [in_,ffreq,res,dist] Nothing 1 (Special 0) NoId -- | (Undocumented class) --
Sound/SC3/UGen/Bindings/HW.hs view
@@ -1,9 +1,9 @@ -- | Hand-written bindings. module Sound.SC3.UGen.Bindings.HW where +import Sound.SC3.Common.Rate import qualified Sound.SC3.Common.UId as I import qualified Sound.SC3.UGen.Bindings.HW.Construct as C-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import qualified Sound.SC3.UGen.UGen as U @@ -21,19 +21,19 @@ inp = repeats : constant n : weights' in mkUGen Nothing [DR] (Left DR) "Dwrand" inp (Just [list_]) 1 (Special 0) (U.toUId z) +-- | Variant on 'envGen' without enumeration types.+envGen_ll :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+envGen_ll rate gate_ levelScale levelBias timeScale doneAction envelope_ = mkUGen Nothing [KR,AR] (Left rate) "EnvGen" [gate_,levelScale,levelBias,timeScale,doneAction] (Just [envelope_]) 1 (Special 0) NoId+ -- | Outputs signal for @FFT@ chains, without performing FFT. fftTrigger :: UGen -> UGen -> UGen -> UGen fftTrigger b h p = C.mkOsc KR "FFTTrigger" [b,h,p] 1 --- | LADSPA plugins inside SuperCollider.-ladspa :: Int -> Rate -> UGen -> [UGen] -> UGen-ladspa nc rt k z = C.mkOsc rt "LADSPA" (constant nc : k : z) nc- -- | Pack demand-rate FFT bin streams into an FFT chain.-packFFT :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen+packFFT :: UGen -> Int -> Int -> Int -> UGen -> UGen -> UGen packFFT b sz from to z mp = let n = constant (mceDegree_err mp)- in C.mkOscMCE KR "PackFFT" [b, sz, from, to, z, n] mp 1+ in C.mkOscMCE KR "PackFFT" [b, constant sz, constant from, constant to, z, n] mp 1 -- | Poll value of input UGen when triggered. poll :: UGen -> UGen -> UGen -> UGen -> UGen@@ -58,5 +58,5 @@ -- | Unpack a single value (magnitude or phase) from an FFT chain unpack1FFT :: UGen -> UGen -> UGen -> UGen -> UGen-unpack1FFT buf size index' which = C.mkOsc DR "Unpack1FFT" [buf, size, index', which] 1+unpack1FFT buf size index_ which = C.mkOsc DR "Unpack1FFT" [buf, size, index_, which] 1
Sound/SC3/UGen/Bindings/HW/Construct.hs view
@@ -1,7 +1,7 @@ -- | For hand-writing UGens. module Sound.SC3.UGen.Bindings.HW.Construct where -import Sound.SC3.UGen.Rate+import Sound.SC3.Common.Rate import Sound.SC3.UGen.Type -- | Oscillator constructor with constrained set of operating 'Rate's.
Sound/SC3/UGen/Bindings/HW/External/F0.hs view
@@ -1,21 +1,21 @@ -- | F0 UGens (f0plugins) module Sound.SC3.UGen.Bindings.HW.External.F0 where -import Sound.SC3.UGen.Bindings.HW.Construct-import Sound.SC3.UGen.Rate+import Sound.SC3.Common.Rate+import qualified Sound.SC3.UGen.Bindings.HW.Construct as C import Sound.SC3.UGen.Type -- | Emulation of the sound generation hardware of the Atari TIA chip. atari2600 :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-atari2600 audc0 audc1 audf0 audf1 audv0 audv1 rate = mkOsc AR "Atari2600" [audc0,audc1,audf0,audf1,audv0,audv1,rate] 1+atari2600 audc0 audc1 audf0 audf1 audv0 audv1 rate = C.mkOsc AR "Atari2600" [audc0,audc1,audf0,audf1,audv0,audv1,rate] 1 -- | POKEY Chip Sound Simulator mzPokey :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-mzPokey f1 c1 f2 c2 f3 c3 f4 c4 ctl = mkOsc AR "MZPokey" [f1,c1,f2,c2,f3,c3,f4,c4,ctl] 1+mzPokey f1 c1 f2 c2 f3 c3 f4 c4 ctl = C.mkOsc AR "MZPokey" [f1,c1,f2,c2,f3,c3,f4,c4,ctl] 1 -- | A phasor that can loop. redPhasor :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen-redPhasor rate trig rate_ start end loop loopstart loopend = mkOsc rate "RedPhasor" [trig,rate_,start,end,loop,loopstart,loopend] 1+redPhasor rate trig rate_ start end loop loopstart loopend = C.mkOsc rate "RedPhasor" [trig,rate_,start,end,loop,loopstart,loopend] 1 -- Local Variables: -- truncate-lines:t
Sound/SC3/UGen/Bindings/HW/External/SC3_Plugins.hs view
@@ -1,12 +1,14 @@ -- | Bindings to unit generators in sc3-plugins. module Sound.SC3.UGen.Bindings.HW.External.SC3_Plugins where --- * AY+import Sound.SC3.Common.Rate+import qualified Sound.SC3.UGen.Bindings.HW.Construct as C+import Sound.SC3.UGen.Type -- | Convert frequency value to value appropriate for AY tone inputs. ayFreqToTone :: Fractional a => a -> a ayFreqToTone f = 110300 / (f - 0.5) --- Local Variables:--- truncate-lines:t--- End:+-- | LADSPA plugins inside SuperCollider.+ladspa :: Int -> Rate -> UGen -> [UGen] -> UGen+ladspa nc rt k z = C.mkOsc rt "LADSPA" (constant nc : k : z) nc
Sound/SC3/UGen/Bindings/HW/External/Wavelets.hs view
@@ -1,8 +1,8 @@ -- | Wavelet unit generators (Nick Collins). module Sound.SC3.UGen.Bindings.HW.External.Wavelets where +import Sound.SC3.Common.Rate import Sound.SC3.UGen.Bindings.HW.Construct-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type -- | Forward wavelet transform.
Sound/SC3/UGen/Bindings/HW/External/Zita.hs view
@@ -3,8 +3,8 @@ -- See hsc3/ext/faust to build the SC3 plugin. module Sound.SC3.UGen.Bindings.HW.External.Zita where +import Sound.SC3.Common.Rate import Sound.SC3.UGen.Bindings.HW.Construct-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type -- | Parameter (name,value) pairs.
Sound/SC3/UGen/Bindings/Monad.hs view
@@ -3,199 +3,219 @@ import Control.Monad {- base -} +import Sound.SC3.Common.Enum+import Sound.SC3.Common.Rate import Sound.SC3.Common.UId import Sound.SC3.UGen.Bindings.DB import Sound.SC3.UGen.Bindings.HW-import Sound.SC3.UGen.Enum-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type -- | Clone a unit generator (mce . replicateM).-clone :: (UId m) => Int -> m UGen -> m UGen+clone :: UId m => Int -> m UGen -> m UGen clone n = liftM mce . replicateM n -- * Demand --- | Buffer demand ugen.-dbufrdM :: (UId m) => UGen -> UGen -> Loop -> m UGen+-- | 'dbufrd'+dbufrdM :: UId m => UGen -> UGen -> Loop UGen -> m UGen dbufrdM = liftUId3 dbufrd --- | Buffer write on demand unit generator.-dbufwrM :: (UId m) => UGen -> UGen -> UGen -> Loop -> m UGen+-- | 'dbufwr'+dbufwrM :: UId m => UGen -> UGen -> UGen -> Loop UGen -> m UGen dbufwrM = liftUId4 dbufwr --- | Demand rate white noise.-dwhiteM :: (UId m) => UGen -> UGen -> UGen -> m UGen+-- | 'dconst'+dconstM :: UId m => UGen -> UGen -> UGen -> m UGen+dconstM = liftUId3 dconst++-- | 'dwhite'+dwhiteM :: UId m => UGen -> UGen -> UGen -> m UGen dwhiteM = liftUId3 dwhite --- | Demand rate integer white noise.-diwhiteM :: (UId m) => UGen -> UGen -> UGen -> m UGen+-- | 'diwhite'+diwhiteM :: UId m => UGen -> UGen -> UGen -> m UGen diwhiteM = liftUId3 diwhite --- | Demand rate brown noise.-dbrownM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen+-- | 'dbrown'+dbrownM :: UId m => UGen -> UGen -> UGen -> UGen -> m UGen dbrownM = liftUId4 dbrown --- | Demand rate integer brown noise.-dibrownM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen+-- | 'dibrown'+dibrownM :: UId m => UGen -> UGen -> UGen -> UGen -> m UGen dibrownM = liftUId4 dibrown --- | Demand rate random selection.-drandM :: (UId m) => UGen -> UGen -> m UGen+-- | 'dpoll'+dpollM :: UId m => UGen -> UGen -> UGen -> UGen -> m UGen+dpollM = liftUId4 dpoll++-- | 'drand'+drandM :: UId m => UGen -> UGen -> m UGen drandM = liftUId2 drand --- | Demand rate weighted random sequence generator.-dwrandM :: (UId m) => UGen -> UGen -> UGen -> m UGen+-- | 'dreset'+dresetM :: UId m => UGen -> UGen -> m UGen+dresetM = liftUId2 dreset++-- | 'dunique'+duniqueM :: UId m => UGen -> UGen -> UGen -> m UGen+duniqueM = liftUId3 dunique++-- | 'dwrand'+dwrandM :: UId m => UGen -> UGen -> UGen -> m UGen dwrandM = liftUId3 dwrand --- | Demand rate random selection with no immediate repetition.-dxrandM :: (UId m) => UGen -> UGen -> m UGen+-- | 'dxrand'+dxrandM :: UId m => UGen -> UGen -> m UGen dxrandM = liftUId2 dxrand -- | Demand rate arithmetic series.-dseriesM :: (UId m) => UGen -> UGen -> UGen -> m UGen+dseriesM :: UId m => UGen -> UGen -> UGen -> m UGen dseriesM = liftUId3 dseries -- | Demand rate geometric series.-dgeomM :: (UId m) => UGen -> UGen -> UGen -> m UGen+dgeomM :: UId m => UGen -> UGen -> UGen -> m UGen dgeomM = liftUId3 dgeom -- | Demand rate sequence generator.-dseqM :: (UId m) => UGen -> UGen -> m UGen+dseqM :: UId m => UGen -> UGen -> m UGen dseqM = liftUId2 dseq -- | Demand rate series generator.-dserM :: (UId m) => UGen -> UGen -> m UGen+dserM :: UId m => UGen -> UGen -> m UGen dserM = liftUId2 dser -- | Demand rate sequence shuffler.-dshufM :: (UId m) => UGen -> UGen -> m UGen+dshufM :: UId m => UGen -> UGen -> m UGen dshufM = liftUId2 dshuf -- | Demand input replication-dstutterM :: (UId m) => UGen -> UGen -> m UGen+dstutterM :: UId m => UGen -> UGen -> m UGen dstutterM = liftUId2 dstutter -- | Demand rate input switching.-dswitch1M :: (UId m) => UGen -> UGen -> m UGen+dswitch1M :: UId m => UGen -> UGen -> m UGen dswitch1M = liftUId2 dswitch1 -- | Demand rate input switching.-dswitchM :: (UId m) => UGen -> UGen -> m UGen+dswitchM :: UId m => UGen -> UGen -> m UGen dswitchM = liftUId2 dswitch -- * FFT -- | Randomize order of bins.-pv_BinScrambleM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen+pv_BinScrambleM :: UId m => UGen -> UGen -> UGen -> UGen -> m UGen pv_BinScrambleM = liftUId4 pv_BinScramble -- | Randomly clear bins.-pv_RandCombM :: (UId m) => UGen -> UGen -> UGen -> m UGen+pv_RandCombM :: UId m => UGen -> UGen -> UGen -> m UGen pv_RandCombM = liftUId3 pv_RandComb -- | Cross fade, copying bins in random order.-pv_RandWipeM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen+pv_RandWipeM :: UId m => UGen -> UGen -> UGen -> UGen -> m UGen pv_RandWipeM = liftUId4 pv_RandWipe -- * Noise -- | Brown noise.-brownNoiseM :: (UId m) => Rate -> m UGen+brownNoiseM :: UId m => Rate -> m UGen brownNoiseM = liftUId1 brownNoise -- | Clip noise.-clipNoiseM :: (UId m) => Rate -> m UGen+clipNoiseM :: UId m => Rate -> m UGen clipNoiseM = liftUId1 clipNoise -- | Randomly pass or block triggers.-coinGateM :: (UId m) => UGen -> UGen -> m UGen+coinGateM :: UId m => UGen -> UGen -> m UGen coinGateM = liftUId2 coinGate -- | Random impulses in (-1, 1).-dust2M :: (UId m) => Rate -> UGen -> m UGen+dust2M :: UId m => Rate -> UGen -> m UGen dust2M = liftUId2 dust2 -- | Random impulse in (0,1).-dustM :: (UId m) => Rate -> UGen -> m UGen+dustM :: UId m => Rate -> UGen -> m UGen dustM = liftUId2 dust -- | Random value in exponential distribution.-expRandM :: (UId m) => UGen -> UGen -> m UGen+expRandM :: UId m => UGen -> UGen -> m UGen expRandM = liftUId2 expRand -- | Gray noise.-grayNoiseM :: (UId m) => Rate -> m UGen+grayNoiseM :: UId m => Rate -> m UGen grayNoiseM = liftUId1 grayNoise -- | Random integer in uniform distribution.-iRandM :: (UId m) => UGen -> UGen -> m UGen+iRandM :: UId m => UGen -> UGen -> m UGen iRandM = liftUId2 iRand -- | Clip noise.-lfClipNoiseM :: (UId m) => Rate -> UGen -> m UGen+lfClipNoiseM :: UId m => Rate -> UGen -> m UGen lfClipNoiseM = liftUId2 lfClipNoise -- | Dynamic clip noise.-lfdClipNoiseM :: (UId m) => Rate -> UGen -> m UGen+lfdClipNoiseM :: UId m => Rate -> UGen -> m UGen lfdClipNoiseM = liftUId2 lfdClipNoise -- | Dynamic step noise.-lfdNoise0M :: (UId m) => Rate -> UGen -> m UGen+lfdNoise0M :: UId m => Rate -> UGen -> m UGen lfdNoise0M = liftUId2 lfdNoise0 -- | Dynamic ramp noise.-lfdNoise1M :: (UId m) => Rate -> UGen -> m UGen+lfdNoise1M :: UId m => Rate -> UGen -> m UGen lfdNoise1M = liftUId2 lfdNoise1 -- | Dynamic cubic noise-lfdNoise3M :: (UId m) => Rate -> UGen -> m UGen+lfdNoise3M :: UId m => Rate -> UGen -> m UGen lfdNoise3M = liftUId2 lfdNoise3 -- | Step noise.-lfNoise0M :: (UId m) => Rate -> UGen -> m UGen+lfNoise0M :: UId m => Rate -> UGen -> m UGen lfNoise0M = liftUId2 lfNoise0 -- | Ramp noise.-lfNoise1M :: (UId m) => Rate -> UGen -> m UGen+lfNoise1M :: UId m => Rate -> UGen -> m UGen lfNoise1M = liftUId2 lfNoise1 -- | Quadratic noise.-lfNoise2M :: (UId m) => Rate -> UGen -> m UGen+lfNoise2M :: UId m => Rate -> UGen -> m UGen lfNoise2M = liftUId2 lfNoise2 -- | Random value in skewed linear distribution.-linRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen+linRandM :: UId m => UGen -> UGen -> UGen -> m UGen linRandM = liftUId3 linRand +-- | 'localBuf'+localBufM :: UId m => UGen -> UGen -> m UGen+localBufM = liftUId2 localBuf+ -- | Random value in sum of n linear distribution.-nRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen+nRandM :: UId m => UGen -> UGen -> UGen -> m UGen nRandM = liftUId3 nRand -- | Pink noise.-pinkNoiseM :: (UId m) => Rate -> m UGen+pinkNoiseM :: UId m => Rate -> m UGen pinkNoiseM = liftUId1 pinkNoise -- | Random value in uniform distribution.-randM :: (UId m) => UGen -> UGen -> m UGen+randM :: UId m => UGen -> UGen -> m UGen randM = liftUId2 rand -- | Random value in exponential distribution on trigger.-tExpRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen+tExpRandM :: UId m => UGen -> UGen -> UGen -> m UGen tExpRandM = liftUId3 tExpRand -- | Random integer in uniform distribution on trigger.-tiRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen+tiRandM :: UId m => UGen -> UGen -> UGen -> m UGen tiRandM = liftUId3 tiRand -- | Random value in uniform distribution on trigger.-tRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen+tRandM :: UId m => UGen -> UGen -> UGen -> m UGen tRandM = liftUId3 tRand -- | Triggered windex.-tWindexM :: (UId m) => UGen -> UGen -> UGen -> m UGen+tWindexM :: UId m => UGen -> UGen -> UGen -> m UGen tWindexM = liftUId3 tWindex -- | White noise.-whiteNoiseM :: (UId m) => Rate -> m UGen+whiteNoiseM :: UId m => Rate -> m UGen whiteNoiseM = liftUId1 whiteNoise
Sound/SC3/UGen/Enum.hs view
@@ -1,84 +1,15 @@ -- | Data types for enumerated and non signal unit generator inputs. module Sound.SC3.UGen.Enum where -import qualified Sound.SC3.Common.Envelope as E+import Sound.SC3.Common.Envelope+import Sound.SC3.Common.Enum import Sound.SC3.UGen.Type --- | Loop indicator input.-data Loop' t = Loop- | NoLoop- | WithLoop t- deriving (Eq, Show)---- | Type-specialised 'Loop''.-type Loop = Loop' UGen---- | Resolve 'Loop''.-from_loop :: Num t => Loop' t -> t-from_loop e =- case e of- NoLoop -> 0- Loop -> 1- WithLoop u -> u---- | Interpolation indicator input.-data Interpolation = NoInterpolation- | LinearInterpolation- | CubicInterpolation- | Interpolation UGen- deriving (Eq, Show)---- | Resolve 'Interpolation'.-from_interpolation :: Interpolation -> UGen-from_interpolation e =- case e of- NoInterpolation -> 1- LinearInterpolation -> 2- CubicInterpolation -> 4- Interpolation u -> u---- | Completion mode indicator input.-data DoneAction = DoNothing- | PauseSynth- | RemoveSynth- | RemoveGroup- | DoneAction UGen- deriving (Eq, Show)---- | Resolve 'DoneAction'.-from_done_action :: DoneAction -> UGen-from_done_action e =- case e of- DoNothing -> 0- PauseSynth -> 1- RemoveSynth -> 2- RemoveGroup -> 14- DoneAction u -> u---- | Warp interpolation indicator input.-data Warp = Linear- | Exponential- | Warp UGen- deriving (Eq, Show)---- | Resolve 'Warp'.-from_warp :: Warp -> UGen-from_warp e =- case e of- Linear -> 0- Exponential -> 1- Warp u -> u- -- | Type specialised ('UGen') envelope curve.-type EnvCurve = E.Envelope_Curve UGen---- | Unification of integer and 'UGen' buffer identifiers.-data Buffer = Buffer_Id Int- | Buffer UGen- deriving (Eq, Show)+type EnvCurve = Envelope_Curve UGen -- | Lift to 'UGen'.-from_buffer :: Buffer -> UGen+from_buffer :: Buffer UGen -> UGen from_buffer b = case b of Buffer_Id i -> constant i
Sound/SC3/UGen/Envelope.hs view
@@ -1,12 +1,12 @@ -- | Envelope / UGen. module Sound.SC3.UGen.Envelope where +import Sound.SC3.Common.Enum import Sound.SC3.Common.Envelope+import Sound.SC3.Common.Math.Operator+import Sound.SC3.Common.Rate import Sound.SC3.UGen.Bindings-import Sound.SC3.UGen.Math-import Sound.SC3.UGen.Enum-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen @@ -17,16 +17,20 @@ -} envTrapezoid :: OrdE t => t -> t -> t -> t -> Envelope t-envTrapezoid = envTrapezoid_f ((<=*),(>=*))+envTrapezoid = envTrapezoid_f (less_than_or_equal_to,greater_than_or_equal_to) --- | 'env_circle_z' of 'latch' of 'impulse'.+-- | 'latch' 1 of 'impulse' 0.+first_zero_then_one :: Rate -> UGen+first_zero_then_one rt = latch 1 (impulse rt 0 0)++-- | 'env_circle_z' of k-rate 'first_zero_thereafter_one'. env_circle_u :: UGen -> Envelope_Curve UGen -> Envelope UGen -> Envelope UGen-env_circle_u = env_circle_z (latch 1 (impulse KR 0 0))+env_circle_u = env_circle_z (first_zero_then_one KR) -- | Singleton fade envelope.-envGate :: UGen -> UGen -> UGen -> DoneAction -> Envelope_Curve UGen -> UGen+envGate :: UGen -> UGen -> UGen -> DoneAction UGen -> Envelope_Curve UGen -> UGen envGate level gate_ fadeTime doneAction curve =- let startVal = fadeTime <=* 0+ let startVal = fadeTime `less_than_or_equal_to` 0 e = Envelope [startVal,1,0] [1,1] [curve] (Just 1) Nothing 0 in envGen KR gate_ level 0 fadeTime doneAction e
Sound/SC3/UGen/Graph.hs view
@@ -19,8 +19,8 @@ import Data.List {- base -} import Data.Maybe {- base -} +import Sound.SC3.Common.Rate import qualified Sound.SC3.UGen.Analysis as Analysis-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen
Sound/SC3/UGen/Graph/Reconstruct.hs view
@@ -5,9 +5,9 @@ import Data.List {- base -} import Text.Printf {- base -} +import qualified Sound.SC3.Common.Math.Operator as Operator+import Sound.SC3.Common.Rate import qualified Sound.SC3.UGen.Graph as Graph-import qualified Sound.SC3.UGen.Operator as Operator-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen @@ -42,7 +42,7 @@ reconstruct_graph_module :: String -> Graph.U_Graph -> [String] reconstruct_graph_module nm gr = let imp = ["import Sound.SC3"- ,"import Sound.SC3.Common"+ ,"import Sound.SC3.Common.Base" ,"import Sound.SC3.UGen.Plain"] (b0:bnd,res) = reconstruct_graph gr hs = (" let " ++ b0) : map (" " ++ ) bnd ++ [" in " ++ res]
Sound/SC3/UGen/Graph/Transform.hs view
@@ -4,8 +4,8 @@ import Data.Either {- base -} import Data.List {- base -} +import Sound.SC3.Common.Rate import Sound.SC3.UGen.Graph-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type -- * Lift constants
− Sound/SC3/UGen/Help.hs
@@ -1,109 +0,0 @@--- | Functions to provide mediated access to the SC3 help system.------ Requires the HTML files generated by SCDoc.renderAll (sclang).-module Sound.SC3.UGen.Help where--import Control.Exception-import Control.Monad-import Data.List.Split {- split -}-import Data.Maybe-import System.IO.Error-import System.Process {- process -}-import System.Directory {- directory -}-import System.Environment-import System.FilePath {- filepath -}---- | Guarded variant of 'getEnv' with default value.-get_env_default :: String -> String -> IO String-get_env_default e k = do- r <- tryJust (guard . isDoesNotExistError) (getEnv e)- case r of- Right v -> return v- _ -> return k---- | 'lookupEnv' with default value.------ > lookup_env_default "PATH" "/usr/bin"-lookup_env_default :: String -> String -> IO String-lookup_env_default e k = fmap (fromMaybe k) (lookupEnv e)---- | Read the environment variable @SC3_HELP@, the default value is--- @~\/.local\/share\/SuperCollider/Help@.-sc3HelpDirectory :: IO String-sc3HelpDirectory = do- h <- getEnv "HOME"- let d = h </> ".local/share/SuperCollider/Help"- get_env_default "SC3_HELP" d---- | Locate path to indicated SC3 class help file.------ > import System.FilePath--- >--- > d <- sc3HelpDirectory--- > h <- sc3HelpClassFile d "SinOsc"--- > h == Just (d </> "Classes/SinOsc.html")-sc3HelpClassFile :: FilePath -> String -> IO (Maybe FilePath)-sc3HelpClassFile d c = do- let f = d </> "Classes" </> c <.> "html"- e <- doesFileExist f- return (if e then Just f else Nothing)---- | Generate path to indicated SC3 operator help file.------ > sc3HelpOperatorEntry "." "+" == "./Overviews/Operators.html#.+"-sc3HelpOperatorEntry :: FilePath -> String -> FilePath-sc3HelpOperatorEntry d o = d </> "Overviews/Operators.html#." ++ o---- | Generate path to indicated SC3 method help.------ > sc3HelpMethod "." '*' ("C","m") == "./Classes/C.html#*m"-sc3HelpMethod :: FilePath -> Char -> (String,String) -> FilePath-sc3HelpMethod d z (c,m) = d </> "Classes" </> c <.> "html#" ++ [z] ++ m---- | Generate path to indicated SC3 class method help.------ > sc3HelpClassMethod "." ("C","m") == "./Classes/C.html#*m"-sc3HelpClassMethod :: FilePath -> (String,String) -> FilePath-sc3HelpClassMethod d = sc3HelpMethod d '*'---- | Generate path to indicated SC3 instance method help.------ > sc3HelpInstanceMethod "." ("C","m") == "./Classes/C.html#-m"-sc3HelpInstanceMethod :: FilePath -> (String,String) -> FilePath-sc3HelpInstanceMethod d = sc3HelpMethod d '-'---- | The name of the local SC3 Help file documenting `u'. Deletes--- @\@@ to allow use on haddock quoted comments.------ > import Sound.SC3.UGen.Name--- >--- > ugenSC3HelpFile "Collection.*fill"--- > ugenSC3HelpFile "Collection.inject"--- > ugenSC3HelpFile (toSC3Name "sinOsc")-ugenSC3HelpFile :: String -> IO FilePath-ugenSC3HelpFile x = do- let s = filter (`notElem` "@") x- d <- sc3HelpDirectory- cf <- sc3HelpClassFile d s- case splitOn "." s of- ["Operator",m] -> return (sc3HelpOperatorEntry d m)- [c,'*':m] -> return (sc3HelpClassMethod d (c,m))- [c,m] -> return (sc3HelpInstanceMethod d (c,m))- _ -> case cf of- Just cf' -> return cf'- Nothing -> error (show ("ugenSC3HelpFile",d,cf,x,s))---- | Use @BROWSER@ or @x-www-browser@ to view SC3 help file for `u'.------ > get_env_default "BROWSER" "x-www-browser"------ > import Sound.SC3.UGen.Name--- >--- > viewSC3Help (toSC3Name "Collection.*fill")--- > viewSC3Help (toSC3Name "Collection.inject")--- > viewSC3Help (toSC3Name "sinOsc")-viewSC3Help :: String -> IO ()-viewSC3Help u = do- nm <- ugenSC3HelpFile u- br <- get_env_default "BROWSER" "x-www-browser"- void (rawSystem br ["file://" ++ nm])
Sound/SC3/UGen/Help/Graph.hs view
@@ -1,11 +1,11 @@ -- | Standard SC3 graphs, referenced in documentation. module Sound.SC3.UGen.Help.Graph where +import Sound.SC3.Common.Enum import Sound.SC3.Common.Envelope+import Sound.SC3.Common.Rate import Sound.SC3.UGen.Bindings-import Sound.SC3.UGen.Enum-import Sound.SC3.UGen.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen
Sound/SC3/UGen/Math.hs view
@@ -1,337 +1,13 @@ -- | Non-standard mathematical classes and class instances. module Sound.SC3.UGen.Math where -import qualified Data.Fixed as F {- base -}-import Data.Int {- base -}--import qualified Sound.SC3.Common.Math as Math-import Sound.SC3.UGen.Bindings.DB (mulAdd)-import Sound.SC3.UGen.Operator-import Sound.SC3.UGen.Type+import qualified Sound.SC3.Common.Math.Operator as Operator+import qualified Sound.SC3.UGen.Type as Type -- | Pseudo-infinite constant UGen.-dinf :: UGen-dinf = constant (9e8::Float)---- | Association table for 'Binary' to haskell function implementing operator.-binop_hs_tbl :: (Real n,Floating n,RealFrac n) => [(Binary,n -> n -> n)]-binop_hs_tbl =- [(Add,(+))- ,(Sub,(-))- ,(FDiv,(/))- ,(IDiv,Math.sc3_idiv)- ,(Mod,Math.sc3_mod)- ,(EQ_,Math.sc3_eq)- ,(NE,Math.sc3_neq)- ,(LT_,Math.sc3_lt)- ,(LE,Math.sc3_lte)- ,(GT_,Math.sc3_gt)- ,(GE,Math.sc3_gte)- ,(Min,min)- ,(Max,max)- ,(Mul,(*))- ,(Pow,(**))- ,(Min,min)- ,(Max,max)- ,(Round,Math.sc3_round_to)]---- | 'lookup' 'binop_hs_tbl' via 'toEnum'.-binop_special_hs :: (RealFrac n,Floating n) => Int -> Maybe (n -> n -> n)-binop_special_hs z = lookup (toEnum z) binop_hs_tbl---- | Association table for 'Unary' to haskell function implementing operator.-uop_hs_tbl :: (RealFrac n,Floating n) => [(Unary,n -> n)]-uop_hs_tbl =- [(Neg,negate)- ,(Not,\z -> if z > 0 then 0 else 1)- ,(Abs,abs)- ,(Ceil,Math.sc3_ceiling)- ,(Floor,Math.sc3_floor)- ,(Squared,\z -> z * z)- ,(Cubed,\z -> z * z * z)- ,(Sqrt,sqrt)- ,(Recip,recip)- ,(MIDICPS,Math.midi_to_cps)- ,(CPSMIDI,Math.cps_to_midi)- ,(Sin,sin)- ,(Cos,cos)- ,(Tan,tan)]---- | 'lookup' 'uop_hs_tbl' via 'toEnum'.-uop_special_hs :: (RealFrac n,Floating n) => Int -> Maybe (n -> n)-uop_special_hs z = lookup (toEnum z) uop_hs_tbl---- The Eq and Ord classes in the Prelude require Bool, hence the name--- mangling. True is 1.0, False is 0.0---- | Variant on Eq class, result is of the same type as the values compared.-class (Eq a,Num a) => EqE a where- (==*) :: a -> a -> a- (==*) = Math.sc3_eq- (/=*) :: a -> a -> a- (/=*) = Math.sc3_neq--instance EqE Int where-instance EqE Integer where-instance EqE Int32 where-instance EqE Int64 where-instance EqE Float where-instance EqE Double where--instance EqE UGen where- (==*) = mkBinaryOperator EQ_ (==*)- (/=*) = mkBinaryOperator NE (/=*)---- | Variant on Ord class, result is of the same type as the values compared.-class (Ord a,Num a) => OrdE a where- (<*) :: a -> a -> a- (<*) = Math.sc3_lt- (<=*) :: a -> a -> a- (<=*) = Math.sc3_lte- (>*) :: a -> a -> a- (>*) = Math.sc3_gt- (>=*) :: a -> a -> a- (>=*) = Math.sc3_gte--instance OrdE Int-instance OrdE Integer-instance OrdE Int32-instance OrdE Int64-instance OrdE Float-instance OrdE Double--instance OrdE UGen where- (<*) = mkBinaryOperator LT_ Math.sc3_lt- (<=*) = mkBinaryOperator LE Math.sc3_lte- (>*) = mkBinaryOperator GT_ Math.sc3_gt- (>=*) = mkBinaryOperator GE Math.sc3_gte---- | Variant of 'RealFrac' with non 'Integral' results.-class RealFrac a => RealFracE a where- properFractionE :: a -> (a,a)- properFractionE = Math.sc3_properFraction- truncateE :: a -> a- truncateE = Math.sc3_truncate- roundE :: a -> a- roundE = Math.sc3_round- ceilingE :: a -> a- ceilingE = Math.sc3_ceiling- floorE :: a -> a- floorE = Math.sc3_floor--instance RealFracE Float-instance RealFracE Double---- | 'UGen' form or 'Math.sc3_round_to'.-roundTo :: UGen -> UGen -> UGen-roundTo = mkBinaryOperator Round Math.sc3_round_to--instance RealFracE UGen where- properFractionE = error "UGen.properFractionE"- truncateE = error "UGen.truncateE"- roundE i = roundTo i 1- ceilingE = mkUnaryOperator Ceil ceilingE- floorE = mkUnaryOperator Floor floorE+dinf :: Type.UGen+dinf = Type.constant (9e8 :: Type.Sample) -- | 'UGen' form of 'ceilingE'.-ceil :: UGen -> UGen-ceil = ceilingE---- | Unary operator class.------ > map (floor . (* 1e4) . dbAmp) [-90,-60,-30,0] == [0,10,316,10000]-class (Floating a, Ord a) => UnaryOp a where- ampDb :: a -> a- ampDb = Math.amp_to_db- asFloat :: a -> a- asFloat = error "asFloat"- asInt :: a -> a- asInt = error "asInt"- cpsMIDI :: a -> a- cpsMIDI = Math.cps_to_midi- cpsOct :: a -> a- cpsOct = Math.cps_to_oct- cubed :: a -> a- cubed n = n * n * n- dbAmp :: a -> a- dbAmp = Math.db_to_amp- distort :: a -> a- distort = Math.sc3_distort- frac :: a -> a- frac = error "frac"- isNil :: a -> a- isNil a = if a == 0.0 then 0.0 else 1.0- log10 :: a -> a- log10 = logBase 10- log2 :: a -> a- log2 = logBase 2- midiCPS :: a -> a- midiCPS = Math.midi_to_cps- midiRatio :: a -> a- midiRatio = Math.midi_to_ratio- notE :: a -> a- notE a = if a > 0.0 then 0.0 else 1.0- notNil :: a -> a- notNil a = if a /= 0.0 then 0.0 else 1.0- octCPS :: a -> a- octCPS = Math.oct_to_cps- ramp_ :: a -> a- ramp_ _ = error "ramp_"- ratioMIDI :: a -> a- ratioMIDI = Math.ratio_to_midi- softClip :: a -> a- softClip = Math.sc3_softclip- squared :: a -> a- squared = \z -> z * z--instance UnaryOp Float where-instance UnaryOp Double where--instance UnaryOp UGen where- ampDb = mkUnaryOperator AmpDb ampDb- asFloat = mkUnaryOperator AsFloat asFloat- asInt = mkUnaryOperator AsInt asInt- cpsMIDI = mkUnaryOperator CPSMIDI cpsMIDI- cpsOct = mkUnaryOperator CPSOct cpsOct- cubed = mkUnaryOperator Cubed cubed- dbAmp = mkUnaryOperator DbAmp dbAmp- distort = mkUnaryOperator Distort distort- frac = mkUnaryOperator Frac frac- isNil = mkUnaryOperator IsNil isNil- log10 = mkUnaryOperator Log10 log10- log2 = mkUnaryOperator Log2 log2- midiCPS = mkUnaryOperator MIDICPS midiCPS- midiRatio = mkUnaryOperator MIDIRatio midiRatio- notE = mkUnaryOperator Not notE- notNil = mkUnaryOperator NotNil notNil- octCPS = mkUnaryOperator OctCPS octCPS- ramp_ = mkUnaryOperator Ramp_ ramp_- ratioMIDI = mkUnaryOperator RatioMIDI ratioMIDI- softClip = mkUnaryOperator SoftClip softClip- squared = mkUnaryOperator Squared squared---- | Binary operator class.-class (Floating a,RealFrac a, Ord a) => BinaryOp a where- absDif :: a -> a -> a- absDif a b = abs (a - b)- amClip :: a -> a -> a- amClip a b = if b <= 0 then 0 else a * b- atan2E :: a -> a -> a- atan2E a b = atan (b/a)- clip2 :: a -> a -> a- clip2 a b = Math.sc3_clip a (-b) b- difSqr :: a -> a -> a- difSqr = Math.sc3_dif_sqr- excess :: a -> a -> a- excess a b = a - Math.sc3_clip a (-b) b- exprandRange :: a -> a -> a- exprandRange = error "exprandRange"- fill :: a -> a -> a- fill = error "fill"- firstArg :: a -> a -> a- firstArg a _ = a- fold2 :: a -> a -> a- fold2 a b = Math.sc3_fold a (-b) b- gcdE :: a -> a -> a- gcdE = error "gcdE"- hypot :: a -> a -> a- hypot = Math.sc3_hypot- hypotx :: a -> a -> a- hypotx = Math.sc3_hypotx- iDiv :: a -> a -> a- iDiv = Math.sc3_idiv- lcmE :: a -> a -> a- lcmE = error "lcmE"- modE :: a -> a -> a- modE = error "modE"- randRange :: a -> a -> a- randRange = error "randRange"- ring1 :: a -> a -> a- ring1 a b = a * b + a- ring2 :: a -> a -> a- ring2 a b = a * b + a + b- ring3 :: a -> a -> a- ring3 a b = a * a * b- ring4 :: a -> a -> a- ring4 a b = a * a * b - a * b * b- roundUp :: a -> a -> a- roundUp = error "roundUp"- scaleNeg :: a -> a -> a- scaleNeg a b = (abs a - a) * b' + a where b' = 0.5 * b + 0.5- sqrDif :: a -> a -> a- sqrDif a b = (a-b) * (a-b)- sqrSum :: a -> a -> a- sqrSum a b = (a+b) * (a+b)- sumSqr :: a -> a -> a- sumSqr a b = (a*a) + (b*b)- thresh :: a -> a -> a- thresh a b = if a < b then 0 else a- trunc :: a -> a -> a- trunc = error "trunc"- wrap2 :: a -> a -> a- wrap2 = error "wrap2"--instance BinaryOp Float where- fold2 a b = Math.sc3_fold a (-b) b- modE = F.mod'- roundUp a b = if b == 0 then a else ceilingE (a/b + 0.5) * b- wrap2 a b = Math.sc3_wrap_ni a (-b) b--instance BinaryOp Double where- fold2 a b = Math.sc3_fold a (-b) b- modE = F.mod'- roundUp a b = if b == 0 then a else ceilingE (a/b + 0.5) * b- wrap2 a b = Math.sc3_wrap_ni a (-b) b--instance BinaryOp UGen where- iDiv = mkBinaryOperator IDiv iDiv- modE = mkBinaryOperator Mod F.mod'- lcmE = mkBinaryOperator LCM lcmE- gcdE = mkBinaryOperator GCD gcdE- roundUp = mkBinaryOperator RoundUp roundUp- trunc = mkBinaryOperator Trunc trunc- atan2E = mkBinaryOperator Atan2 atan2E- hypot = mkBinaryOperator Hypot hypot- hypotx = mkBinaryOperator Hypotx hypotx- fill = mkBinaryOperator Fill fill- ring1 = mkBinaryOperator Ring1 ring1- ring2 = mkBinaryOperator Ring2 ring2- ring3 = mkBinaryOperator Ring3 ring3- ring4 = mkBinaryOperator Ring4 ring4- difSqr = mkBinaryOperator DifSqr difSqr- sumSqr = mkBinaryOperator SumSqr sumSqr- sqrSum = mkBinaryOperator SqrSum sqrSum- sqrDif = mkBinaryOperator SqrDif sqrDif- absDif = mkBinaryOperator AbsDif absDif- thresh = mkBinaryOperator Thresh thresh- amClip = mkBinaryOperator AMClip amClip- scaleNeg = mkBinaryOperator ScaleNeg scaleNeg- clip2 = mkBinaryOperator Clip2 clip2- excess = mkBinaryOperator Excess excess- fold2 = mkBinaryOperator Fold2 fold2- wrap2 = mkBinaryOperator Wrap2 wrap2- firstArg = mkBinaryOperator FirstArg firstArg- randRange = mkBinaryOperator RandRange randRange- exprandRange = mkBinaryOperator ExpRandRange exprandRange---- | MulAdd operator class.-class Num a => MulAdd a where- mul_add :: a -> a -> a -> a- mul_add i m a = i * m + a--instance MulAdd UGen where mul_add = mulAdd-instance MulAdd Float where-instance MulAdd Double where---- | Map from one linear range to another linear range.-linlin_ma :: (Fractional a,MulAdd a) => a -> a -> a -> a -> a -> a-linlin_ma i sl sr dl dr = let (m,a) = Math.linlin_muladd sl sr dl dr in mul_add i m a---- | Scale uni-polar (0,1) input to linear (l,r) range-urange_ma :: (Fractional a,MulAdd a) => a -> a -> a -> a-urange_ma l r i = let m = r - l in mul_add i m l---- | Scale bi-polar (-1,1) input to linear (l,r) range. Note that the--- argument order is not the same as 'linLin'.-range_ma :: (Fractional a,MulAdd a) => a -> a -> a -> a-range_ma l r i = let (m,a) = Math.range_muladd l r in mul_add i m a+ceil :: Type.UGen -> Type.UGen+ceil = Operator.ceilingE
Sound/SC3/UGen/Math/Composite.hs view
@@ -1,7 +1,7 @@ -- | Non-primitve math UGens. module Sound.SC3.UGen.Math.Composite where -import Sound.SC3.UGen.Math+import Sound.SC3.Common.Math.Operator import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen @@ -16,7 +16,7 @@ ugen_integral_and_fractional_parts n = let gt_eq_0 = let n' = floorE n in mce2 n' (n - n') lt_0 = let n' = ceilingE n in mce2 n' (n - n')- in ugen_if (n >=* 0) gt_eq_0 lt_0+ in ugen_if (n `greater_than_or_equal_to` 0) gt_eq_0 lt_0 -- | Fractional midi into integral midi and cents detune. --
Sound/SC3/UGen/Name.hs view
@@ -1,13 +1,16 @@--- | Functions to normalise UGen names. @SC3@ UGen names are--- capitalised, @hsc3@ cannot use the same names for UGen constructor--- functions. The functions here are heuristics, and are likely only--- partial.+{- | Functions to normalise UGen names.++@SC3@ UGen names are capitalised.+@hsc3@ cannot use these names for UGen constructor functions.+Haskell names are given by lower-casing until the first word edge.+Lisp names are given by lower-casing everything and adding hyphens before edges.+-} module Sound.SC3.UGen.Name where import Data.Char {- base -} import Data.List.Split {- split -} -import Sound.SC3.UGen.Rate {- hsc3 -}+import Sound.SC3.Common.Rate {- hsc3 -} {- import qualified Sound.SC3.Common.Base {- hsc3 -}@@ -23,14 +26,15 @@ sc3_name_edges_plain :: String -> [Bool] sc3_name_edges_plain = map (not . isLower) --- | Find non-initial SC3 name edges.------ > sc3_name_edges "SinOsc" == [False,False,False,True,False,False]--- > sc3_name_edges "FFT" == [False,False,False]--- > sc3_name_edges "DFM1" == [False,False,False,False]--- > sc3_name_edges "PV_Add" == [False,False,False,True,False,False]--- > sc3_name_edges "A2K" == [False,False,False]--- > sc3_name_edges "Lag2UD" == [False,False,False,True,True,True]+{- | Find non-initial SC3 name edges.++> sc3_name_edges "SinOsc" == [False,False,False,True,False,False]+> sc3_name_edges "FFT" == [False,False,False]+> sc3_name_edges "DFM1" == [False,False,False,False]+> sc3_name_edges "PV_Add" == [False,False,False,True,False,False]+> sc3_name_edges "A2K" == [False,False,False]+> sc3_name_edges "Lag2UD" == [False,False,False,True,True,True]+-} sc3_name_edges :: String -> [Bool] sc3_name_edges s = let (p,q) = span (== True) (sc3_name_edges_plain s)@@ -39,22 +43,24 @@ then replicate n False ++ q else replicate (n - 1) False ++ [True] ++ q --- | Convert from SC3 name to HS style name.------ > s = words "SinOsc LFSaw FFT PV_Add AllpassN BHiPass BinaryOpUGen HPZ1 RLPF TGrains DFM1 FBSineC A2K Lag2UD IIRFilter FMGrainB"--- > l = words "sinOsc lfSaw fft pv_Add allpassN bHiPass binaryOpUGen hpz1 rlpf tGrains dfm1 fbSineC a2k lag2UD iirFilter fmGrainB"--- > map sc3_name_to_hs_name s == l+{- | Convert from SC3 name to HS style name.++> s = words "SinOsc LFSaw FFT PV_Add AllpassN BHiPass BinaryOpUGen HPZ1 RLPF TGrains DFM1 FBSineC A2K Lag2UD IIRFilter FMGrainB"+> l = words "sinOsc lfSaw fft pv_Add allpassN bHiPass binaryOpUGen hpz1 rlpf tGrains dfm1 fbSineC a2k lag2UD iirFilter fmGrainB"+> map sc3_name_to_hs_name s == l+-} sc3_name_to_hs_name :: String -> String sc3_name_to_hs_name s = let f (c,e) = if e then toUpper c else c s_lc = map toLower s in map f (zip s_lc (sc3_name_edges s)) --- | Convert from SC3 name to Lisp style name.------ > s = words "SinOsc LFSaw FFT PV_Add AllpassN BHiPass BinaryOpUGen HPZ1 RLPF TGrains DFM1"--- > l = words "sin-osc lf-saw fft pv-add allpass-n b-hi-pass binary-op-u-gen hpz1 rlpf t-grains dfm1"--- > map sc3_name_to_lisp_name s == l+{- | Convert from SC3 name to Lisp style name.++> s = words "SinOsc LFSaw FFT PV_Add AllpassN BHiPass BinaryOpUGen HPZ1 RLPF TGrains DFM1"+> l = words "sin-osc lf-saw fft pv-add allpass-n b-hi-pass binary-op-u-gen hpz1 rlpf t-grains dfm1"+> map sc3_name_to_lisp_name s == l+-} sc3_name_to_lisp_name :: String -> String sc3_name_to_lisp_name s = let f (c,e) = if e then ['-',c] else if c == '_' then [] else [c]
− Sound/SC3/UGen/Operator.hs
@@ -1,211 +0,0 @@--- | Enumerations of the unary and binary math unit generators. Names--- that conflict with existing names have a @_@ suffix.-module Sound.SC3.UGen.Operator where--import Control.Monad {- base -}-import Data.Maybe {- base -}--import Sound.SC3.Common.Base {- hsc3 -}---- * Unary---- | Enumeration of @SC3@ unary operator UGens.-data Unary = Neg- | Not- | IsNil- | NotNil- | BitNot- | Abs- | AsFloat- | AsInt- | Ceil- | Floor- | Frac- | Sign- | Squared- | Cubed- | Sqrt- | Exp- | Recip- | MIDICPS- | CPSMIDI- | MIDIRatio- | RatioMIDI- | DbAmp- | AmpDb- | OctCPS- | CPSOct- | Log- | Log2- | Log10- | Sin- | Cos- | Tan- | ArcSin- | ArcCos- | ArcTan- | SinH- | CosH- | TanH- | Rand_ -- UGen- | Rand2- | LinRand_ -- UGen- | BiLinRand- | Sum3Rand- | Distort- | SoftClip- | Coin- | DigitValue- | Silence- | Thru- | RectWindow- | HanWindow- | WelchWindow- | TriWindow- | Ramp_ -- UGen- | SCurve- deriving (Eq,Show,Enum,Bounded,Read)---- | Type-specialised 'parse_enum'.-parse_unary :: Case_Rule -> String -> Maybe Unary-parse_unary = parse_enum---- | Table of symbolic names for standard unary operators.-unaryTable :: [(Unary,String)]-unaryTable = [] -- (Neg,"-")---- | Lookup possibly symbolic name for standard unary operators.-unaryName :: Int -> String-unaryName n =- let e = toEnum n- in fromMaybe (show e) (lookup e unaryTable)---- | Given name of unary operator derive index.------ > mapMaybe (unaryIndex CI) (words "NEG CUBED") == [0,13]--- > unaryIndex CS "SinOsc" == Nothing-unaryIndex :: Case_Rule -> String -> Maybe Int-unaryIndex cr nm =- let ix = rlookup_str cr nm unaryTable- ix' = parse_unary cr nm- in fmap fromEnum (mplus ix' ix)---- | 'isJust' of 'unaryIndex'.------ > map (is_unary CI) (words "ABS MIDICPS NEG")--- > map (is_unary CI) (words "- RAND")-is_unary :: Case_Rule -> String -> Bool-is_unary cr = isJust . unaryIndex cr---- * Binary---- | Enumeration of @SC3@ unary operator UGens.------ > map show [minBound :: Binary .. maxBound]-data Binary = Add -- 0- | Sub -- 1- | Mul -- 2- | IDiv- | FDiv -- 4- | Mod -- 5- | EQ_ -- 6- | NE -- 7- | LT_ -- 8- | GT_ -- 9- | LE -- 10- | GE -- 11- | Min -- 12- | Max- | BitAnd- | BitOr- | BitXor- | LCM- | GCD- | Round- | RoundUp- | Trunc- | Atan2- | Hypot- | Hypotx- | Pow -- 25- | ShiftLeft- | ShiftRight- | UnsignedShift- | Fill- | Ring1- | Ring2- | Ring3- | Ring4- | DifSqr- | SumSqr- | SqrSum- | SqrDif- | AbsDif- | Thresh- | AMClip- | ScaleNeg- | Clip2- | Excess- | Fold2- | Wrap2- | FirstArg- | RandRange- | ExpRandRange- deriving (Eq,Show,Enum,Bounded,Read)---- | Type-specialised 'parse_enum'.-parse_binary :: Case_Rule -> String -> Maybe Binary-parse_binary = parse_enum---- | Table of symbolic names for standard binary operators.-binaryTable :: [(Binary,String)]-binaryTable =- [(Add,"+")- ,(Sub,"-")- ,(Mul,"*")- ,(FDiv,"/")- ,(Mod,"%")- ,(EQ_,"==")- ,(NE,"/=")- ,(LT_,"<")- ,(GT_,">")- ,(LE,"<=")- ,(GE,">=")- ,(Pow,"**")]---- | Lookup possibly symbolic name for standard binary operators.------ > map binaryName [1,2,8,12] == ["-","*","<","Min"]-binaryName :: Int -> String-binaryName n =- let e = toEnum n- in fromMaybe (show e) (lookup e binaryTable)---- | Given name of binary operator derive index.------ > mapMaybe (binaryIndex CI) (words "* MUL RING1") == [2,2,30]--- > binaryIndex CI "SINOSC" == Nothing-binaryIndex :: Case_Rule -> String -> Maybe Int-binaryIndex cr nm =- let ix = rlookup_str cr nm binaryTable- ix' = parse_binary cr nm- in fmap fromEnum (mplus ix' ix)---- | 'isJust' of 'binaryIndex'.------ > map (is_binary CI) (words "== > % TRUNC MAX")-is_binary :: Case_Rule -> String -> Bool-is_binary cr = isJust . binaryIndex cr---- * Operator---- | Order of lookup: binary then unary.------ > map (resolve_operator Sound.SC3.Common.Base.CI) (words "+ - ADD SUB NEG")-resolve_operator :: Case_Rule -> String -> (String,Maybe Int)-resolve_operator cr nm =- case binaryIndex cr nm of- Just sp -> ("BinaryOpUGen",Just sp)- Nothing -> case unaryIndex cr nm of- Just sp -> ("UnaryOpUGen",Just sp)- _ -> (nm,Nothing)
Sound/SC3/UGen/Optimise.hs view
@@ -3,22 +3,11 @@ import System.Random {- random -} -import Sound.SC3.UGen.Math-import Sound.SC3.UGen.Rate+import Sound.SC3.Common.Math.Operator+import Sound.SC3.Common.Rate import Sound.SC3.UGen.Type import Sound.SC3.UGen.UGen --- | MulAdd optimiser, applicable at any UGen.------ > import Sound.SC3--- > g1 = mul_add_optimise (sinOsc AR 440 0 * 0.1 + 0.05)--- > g2 = mul_add_optimise (0.05 + sinOsc AR 440 0 * 0.1)-mul_add_optimise :: UGen -> UGen-mul_add_optimise u =- case u of- Primitive_U (Primitive _ "BinaryOpUGen" _ [_] (Special 0) NoId) -> mul_add_optimise_direct u- _ -> u- -- | Constant form of 'rand' UGen. c_rand :: Random a => Int -> a -> a -> a c_rand z l r = fst (randomR (l,r) (mkStdGen z))@@ -49,7 +38,7 @@ Constant_U (Constant (c_irand z l r)) _ -> u _ -> u- in ugenTraverse f+ in ugenTraverse (const False) f -- | Optimise 'UGen' graph by re-writing binary operators with -- 'Constant' inputs. The standard graph constructors already do@@ -85,7 +74,7 @@ _ -> u _ -> u _ -> u- in ugenTraverse f+ in ugenTraverse (const False) f -- | 'u_constant' of 'ugen_optimise_ir_rand'. constant_opt :: UGen -> Maybe Sample
Sound/SC3/UGen/PP.hs view
@@ -18,9 +18,10 @@ ugen_concise_pp :: UGen -> String ugen_concise_pp u = let prim_pp (Primitive _ nm _ _ sp _) = ugen_user_name nm sp+ k = 5 in case u of- Constant_U (Constant n) -> real_pp n- Control_U (Control _ _ nm def _ _) -> nm ++ "=" ++ real_pp def+ Constant_U (Constant n) -> real_pp k n+ Control_U (Control _ _ nm def _ _) -> nm ++ "=" ++ real_pp k def Label_U (Label s) -> bracketed ('"','"') s Primitive_U p -> prim_pp p Proxy_U (Proxy p n) -> prim_pp p ++ "@" ++ show n
Sound/SC3/UGen/Plain.hs view
@@ -9,8 +9,8 @@ module Sound.SC3.UGen.Plain where import Sound.SC3.Common.Base-import Sound.SC3.UGen.Operator-import Sound.SC3.UGen.Rate+import Sound.SC3.Common.Math.Operator+import Sound.SC3.Common.Rate import Sound.SC3.UGen.Type -- | Variant of 'mkUGen'.
− Sound/SC3/UGen/Protect.hs
@@ -1,58 +0,0 @@--- | Functions to re-write assigned node identifiers at UGen graphs.--- Used carefully it allows for composition of sub-graphs with psuedo-random nodes.-module Sound.SC3.UGen.Protect where--import Sound.SC3.Common.UId-import Sound.SC3.UGen.Type-import Sound.SC3.UGen.UGen--{---- | Collect Ids at UGen graph-ugenIds :: UGen -> [UGenId]-ugenIds =- let f u = case u of- Primitive_U p -> [ugenId p]- _ -> []- in ugenFoldr ((++) . f) []--}---- | Replace UId /i/ at /z/ with /(e,i)/.-edit_ugenid :: ID a => a -> UGenId -> UGenId-edit_ugenid e z =- case z of- NoId -> NoId- UId i -> UId (resolveID (e,i))---- | 'edit_ugenid' of /e/ at all 'Primitive_U' of /u/.-uprotect :: ID a => a -> UGen -> UGen-uprotect e =- let f u = case u of- Primitive_U p -> Primitive_U (p {ugenId = edit_ugenid e (ugenId p)})- _ -> u- in ugenTraverse f---- | Variant of 'uprotect' with subsequent identifiers derived by--- incrementing initial identifier.-uprotect_seq :: ID a => a -> [UGen] -> [UGen]-uprotect_seq e =- let n = map (+ resolveID e) [1..]- in zipWith uprotect n---- | Make /n/ instances of 'UGen' with protected identifiers.-uclone_seq :: ID a => a -> Int -> UGen -> [UGen]-uclone_seq e n = uprotect_seq e . replicate n---- | 'mce' of 'uclone_seq'.-uclone :: ID a => a -> Int -> UGen -> UGen-uclone e n = mce . uclone_seq e n---- | Left to right UGen function composition with 'UGenId' protection.-ucompose :: ID a => a -> [UGen -> UGen] -> UGen -> UGen-ucompose e xs =- let go [] u = u- go ((f,k):f') u = go f' (uprotect k (f u))- in go (zip xs [resolveID e ..])---- | Make /n/ sequential instances of `f' with protected Ids.-useq :: ID a => a -> Int -> (UGen -> UGen) -> UGen -> UGen-useq e n f = ucompose e (replicate n f)
− Sound/SC3/UGen/Rate.hs
@@ -1,70 +0,0 @@--- | Operating rate definitions and utilities.-module Sound.SC3.UGen.Rate where--import Data.Char {- base -}-import Data.Function {- base -}---- | Operating rate of unit generator.-data Rate = IR | KR | AR | DR- deriving (Eq,Enum,Bounded,Show,Read)--instance Ord Rate where- compare = compare `on` rate_ord---- | 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 r =- case r of- IR -> 0- KR -> 1- AR -> 2- DR -> 3 -- ?---- | Color identifiers for each 'Rate'.-rate_color :: Rate -> String-rate_color r =- case r of- AR -> "black"- KR -> "blue"- IR -> "yellow"- DR -> "red"---- | Set of all 'Rate' values.-all_rates :: [Rate]-all_rates = [minBound .. maxBound]---- | Case insensitive parser for rate.------ > Data.Maybe.mapMaybe rate_parse (words "ar kR IR Dr") == [AR,KR,IR,DR]-rate_parse :: String -> Maybe Rate-rate_parse r =- case map toUpper r of- "AR" -> Just AR- "KR" -> Just KR- "IR" -> Just IR- "DR" -> Just DR- _ -> Nothing---- * Control rates---- | Enumeration of the four operating rates for controls.--- IR = initialisation rate, KR = control rate, TR = trigger rate, AR = audio rate.-data K_Type = K_IR | K_KR | K_TR | K_AR- deriving (Eq,Show,Ord)---- | Determine class of control given 'Rate' and /trigger/ status.-ktype :: Rate -> Bool -> K_Type-ktype r tr =- if tr- then case r of- KR -> K_TR- _ -> error "ktype: non KR trigger control"- else case r of- IR -> K_IR- KR -> K_KR- AR -> K_AR- DR -> error "ktype: DR control"
Sound/SC3/UGen/Type.hs view
@@ -2,15 +2,17 @@ module Sound.SC3.UGen.Type where import Data.Bits {- base -}+import Data.Either {- base -}+import qualified Data.Fixed as F {- base -} import Data.List {- base -} import Data.Maybe {- base -}-import Safe {- safe -}+import qualified Safe {- safe -} import System.Random {- random -} -import Sound.SC3.Common.Math+import qualified Sound.SC3.Common.Math as Math+import Sound.SC3.Common.Math.Operator+import Sound.SC3.Common.Rate import Sound.SC3.UGen.MCE-import Sound.SC3.UGen.Operator-import Sound.SC3.UGen.Rate -- * Basic types @@ -105,11 +107,89 @@ | MRG_U MRG deriving (Eq,Read,Show) +instance EqE UGen where+ equal_to = mkBinaryOperator EQ_ Math.sc3_eq+ not_equal_to = mkBinaryOperator NE Math.sc3_neq++instance OrdE UGen where+ less_than = mkBinaryOperator LT_ Math.sc3_lt+ less_than_or_equal_to = mkBinaryOperator LE Math.sc3_lte+ greater_than = mkBinaryOperator GT_ Math.sc3_gt+ greater_than_or_equal_to = mkBinaryOperator GE Math.sc3_gte++-- | 'UGen' form or 'Math.sc3_round_to'.+roundTo :: UGen -> UGen -> UGen+roundTo = mkBinaryOperator Round Math.sc3_round_to++instance RealFracE UGen where+ properFractionE = error "UGen.properFractionE"+ truncateE = error "UGen.truncateE"+ roundE i = roundTo i 1+ ceilingE = mkUnaryOperator Ceil ceilingE+ floorE = mkUnaryOperator Floor floorE+++instance UnaryOp UGen where+ ampDb = mkUnaryOperator AmpDb ampDb+ asFloat = mkUnaryOperator AsFloat asFloat+ asInt = mkUnaryOperator AsInt asInt+ cpsMIDI = mkUnaryOperator CPSMIDI cpsMIDI+ cpsOct = mkUnaryOperator CPSOct cpsOct+ cubed = mkUnaryOperator Cubed cubed+ dbAmp = mkUnaryOperator DbAmp dbAmp+ distort = mkUnaryOperator Distort distort+ frac = mkUnaryOperator Frac frac+ isNil = mkUnaryOperator IsNil isNil+ log10 = mkUnaryOperator Log10 log10+ log2 = mkUnaryOperator Log2 log2+ midiCPS = mkUnaryOperator MIDICPS midiCPS+ midiRatio = mkUnaryOperator MIDIRatio midiRatio+ notE = mkUnaryOperator Not notE+ notNil = mkUnaryOperator NotNil notNil+ octCPS = mkUnaryOperator OctCPS octCPS+ ramp_ = mkUnaryOperator Ramp_ ramp_+ ratioMIDI = mkUnaryOperator RatioMIDI ratioMIDI+ softClip = mkUnaryOperator SoftClip softClip+ squared = mkUnaryOperator Squared squared++instance BinaryOp UGen where+ iDiv = mkBinaryOperator IDiv iDiv+ modE = mkBinaryOperator Mod F.mod'+ lcmE = mkBinaryOperator LCM lcmE+ gcdE = mkBinaryOperator GCD gcdE+ roundUp = mkBinaryOperator RoundUp roundUp+ trunc = mkBinaryOperator Trunc trunc+ atan2E = mkBinaryOperator Atan2 atan2E+ hypot = mkBinaryOperator Hypot hypot+ hypotx = mkBinaryOperator Hypotx hypotx+ fill = mkBinaryOperator Fill fill+ ring1 = mkBinaryOperator Ring1 ring1+ ring2 = mkBinaryOperator Ring2 ring2+ ring3 = mkBinaryOperator Ring3 ring3+ ring4 = mkBinaryOperator Ring4 ring4+ difSqr = mkBinaryOperator DifSqr difSqr+ sumSqr = mkBinaryOperator SumSqr sumSqr+ sqrSum = mkBinaryOperator SqrSum sqrSum+ sqrDif = mkBinaryOperator SqrDif sqrDif+ absDif = mkBinaryOperator AbsDif absDif+ thresh = mkBinaryOperator Thresh thresh+ amClip = mkBinaryOperator AMClip amClip+ scaleNeg = mkBinaryOperator ScaleNeg scaleNeg+ clip2 = mkBinaryOperator Clip2 clip2+ excess = mkBinaryOperator Excess excess+ fold2 = mkBinaryOperator Fold2 fold2+ wrap2 = mkBinaryOperator Wrap2 wrap2+ firstArg = mkBinaryOperator FirstArg firstArg+ randRange = mkBinaryOperator RandRange randRange+ exprandRange = mkBinaryOperator ExpRandRange exprandRange++--instance MulAdd UGen where mul_add = mulAdd+ -- * Parser -- | 'constant' of 'parse_double'. parse_constant :: String -> Maybe UGen-parse_constant = fmap constant . parse_double+parse_constant = fmap constant . Math.parse_double -- * Accessors @@ -309,25 +389,34 @@ Constant_U _ -> u _ -> error "proxify: illegal ugen" +-- | Filters with DR inputs run at KR. This is a little unfortunate,+-- it'd be nicer if the rate in this circumstance could be given.+mk_ugen_select_rate :: String -> [UGen] -> [Rate] -> Either Rate [Int] -> Rate+mk_ugen_select_rate nm h rs r =+ let r' = either id (maximum . map (rateOf . Safe.atNote ("mkUGen: " ++ nm) h)) r+ in if isRight r && r' == DR && DR `notElem` rs+ then if KR `elem` rs then KR else error "mkUGen: DR input to non-KR filter"+ else if r' `elem` rs || r' == DR+ then r'+ else error ("mkUGen: rate restricted: " ++ show (r,r',rs,nm))+ -- | Construct proxied and multiple channel expanded UGen. -- -- cf = constant function, rs = rate set, r = rate, nm = name, i =--- inputs, o = outputs.+-- inputs, i_mce = list of MCE inputs, o = outputs. mkUGen :: Maybe ([Sample] -> Sample) -> [Rate] -> Either Rate [Int] -> String -> [UGen] -> Maybe [UGen] -> Int -> Special -> UGenId -> UGen mkUGen cf rs r nm i i_mce o s z = let i' = maybe i ((i ++) . concatMap mceChannels) i_mce- f h = let r' = either id (maximum . map (rateOf . atNote ("mkUGen: " ++ nm) h)) r+ f h = let r' = mk_ugen_select_rate nm h rs r o' = replicate o r' u = Primitive_U (Primitive r' nm h o' s z)- in if r' `elem` rs- then case cf of- Just cf' ->- if all isConstant h- then constant (cf' (mapMaybe u_constant h))- else u- Nothing -> u- else error ("mkUGen: rate restricted: " ++ show (r,rs,nm))+ in case cf of+ Just cf' ->+ if all isConstant h+ then constant (cf' (mapMaybe u_constant h))+ else u+ Nothing -> u in proxify (mceBuild f (map checkInput i')) -- * Operators@@ -339,13 +428,13 @@ in mkUGen (Just f) all_rates (Right ix) c i Nothing 1 (Special s) NoId -- | Unary math constructor.-mkUnaryOperator :: Unary -> (Sample -> Sample) -> UGen -> UGen+mkUnaryOperator :: SC3_Unary_Op -> (Sample -> Sample) -> UGen -> UGen mkUnaryOperator i f a = let g [x] = f x g _ = error "mkUnaryOperator: non unary input" in mkOperator g "UnaryOpUGen" [a] (fromEnum i) --- | Binary math constructor with constant optimization.+-- | Binary math constructor with constant optimisation. -- -- > let o = sinOsc AR 440 0 --@@ -354,10 +443,10 @@ -- > o - 0 == o && 0 - o /= o -- > o / 1 == o && 1 / o /= o -- > o ** 1 == o && o ** 2 /= o-mkBinaryOperator_optimize_constants :: Binary -> (Sample -> Sample -> Sample) ->+mkBinaryOperator_optimise_constants :: SC3_Binary_Op -> (Sample -> Sample -> Sample) -> (Either Sample Sample -> Bool) -> UGen -> UGen -> UGen-mkBinaryOperator_optimize_constants i f o a b =+mkBinaryOperator_optimise_constants i f o a b = let g [x,y] = f x y g _ = error "mkBinaryOperator: non binary input" r = case (a,b) of@@ -369,7 +458,7 @@ in fromMaybe (mkOperator g "BinaryOpUGen" [a, b] (fromEnum i)) r -- | Plain (non-optimised) binary math constructor.-mkBinaryOperator :: Binary -> (Sample -> Sample -> Sample) -> UGen -> UGen -> UGen+mkBinaryOperator :: SC3_Binary_Op -> (Sample -> Sample -> Sample) -> UGen -> UGen -> UGen mkBinaryOperator i f a b = let g [x,y] = f x y g _ = error "mkBinaryOperator: non binary input"@@ -377,22 +466,62 @@ -- * Numeric instances +-- | Is /u/ a binary math operator with SPECIAL of /k/.+is_math_binop :: Int -> UGen -> Bool+is_math_binop k u =+ case u of+ Primitive_U (Primitive _ "BinaryOpUGen" [_,_] [_] (Special s) NoId) -> s == k+ _ -> False++-- | Is /u/ an ADD operator?+is_add_operator :: UGen -> Bool+is_add_operator = is_math_binop 0++assert_is_add_operator :: String -> UGen -> UGen+assert_is_add_operator msg u = if is_add_operator u then u else error ("assert_is_add_operator: " ++ msg)++-- | Is /u/ an MUL operator?+is_mul_operator :: UGen -> Bool+is_mul_operator = is_math_binop 2+ -- | MulAdd re-writer, applicable only directly at add operator UGen.+-- The MulAdd UGen is very sensitive to input rates.+-- ADD=AR with IN|MUL=IR|CONST will CRASH scsynth. mul_add_optimise_direct :: UGen -> UGen mul_add_optimise_direct u =- case u of- Primitive_U- (Primitive r _ [Primitive_U (Primitive _ "BinaryOpUGen" [i,j] [_] (Special 2) NoId),k] [_] _ NoId) ->- Primitive_U (Primitive r "MulAdd" [i,j,k] [r] (Special 0) NoId)- Primitive_U- (Primitive r _ [k,Primitive_U (Primitive _ "BinaryOpUGen" [i,j] [_] (Special 2) NoId)] [_] _ NoId) ->- Primitive_U (Primitive r "MulAdd" [i,j,k] [r] (Special 0) NoId)- _ -> u+ let reorder (i,j,k) =+ let (ri,rj,rk) = (rateOf i,rateOf j,rateOf k)+ in if rk > max ri rj+ then Nothing+ else Just (max (max ri rj) rk,if rj > ri then (j,i,k) else (i,j,k))+ in case assert_is_add_operator "MUL-ADD" u of+ Primitive_U+ (Primitive _ _ [Primitive_U (Primitive _ "BinaryOpUGen" [i,j] [_] (Special 2) NoId),k] [_] _ NoId) ->+ case reorder (i,j,k) of+ Just (rt,(p,q,r)) -> Primitive_U (Primitive rt "MulAdd" [p,q,r] [rt] (Special 0) NoId)+ Nothing -> u+ Primitive_U+ (Primitive _ _ [k,Primitive_U (Primitive _ "BinaryOpUGen" [i,j] [_] (Special 2) NoId)] [_] _ NoId) ->+ case reorder (i,j,k) of+ Just (rt,(p,q,r)) -> Primitive_U (Primitive rt "MulAdd" [p,q,r] [rt] (Special 0) NoId)+ Nothing -> u+ _ -> u +{- | MulAdd optimiser, applicable at any UGen (ie. checks /u/ is an ADD ugen)++> import Sound.SC3+> g1 = sinOsc AR 440 0 * 0.1 + control IR "x" 0.05+> g2 = sinOsc AR 440 0 * control IR "x" 0.1 + 0.05+> g3 = control IR "x" 0.1 * sinOsc AR 440 0 + 0.05+> g4 = 0.05 + sinOsc AR 440 0 * 0.1+-}+mul_add_optimise :: UGen -> UGen+mul_add_optimise u = if is_add_operator u then mul_add_optimise_direct u else u+ -- | Sum3 re-writer, applicable only directly at add operator UGen. sum3_optimise_direct :: UGen -> UGen sum3_optimise_direct u =- case u of+ case assert_is_add_operator "SUM3" u of Primitive_U (Primitive r _ [Primitive_U (Primitive _ "BinaryOpUGen" [i,j] [_] (Special 0) NoId),k] [_] _ NoId) -> Primitive_U (Primitive r "Sum3" [i,j,k] [r] (Special 0) NoId)@@ -401,17 +530,21 @@ Primitive_U (Primitive r "Sum3" [i,j,k] [r] (Special 0) NoId) _ -> u --- | 'sum3_optimise_direct' of 'mul_add_optimise_direct'.-add_optimise_direct :: UGen -> UGen-add_optimise_direct = sum3_optimise_direct . mul_add_optimise_direct+-- | /Sum3/ optimiser, applicable at any /u/ (ie. checks if /u/ is an ADD operator).+sum3_optimise :: UGen -> UGen+sum3_optimise u = if is_add_operator u then sum3_optimise_direct u else u +-- | 'sum3_optimise' of 'mul_add_optimise'.+add_optimise :: UGen -> UGen+add_optimise = sum3_optimise . mul_add_optimise+ -- | Unit generators are numbers. instance Num UGen where negate = mkUnaryOperator Neg negate- (+) = fmap add_optimise_direct .- mkBinaryOperator_optimize_constants Add (+) (`elem` [Left 0,Right 0])- (-) = mkBinaryOperator_optimize_constants Sub (-) (Right 0 ==)- (*) = mkBinaryOperator_optimize_constants Mul (*) (`elem` [Left 1,Right 1])+ (+) = fmap add_optimise .+ mkBinaryOperator_optimise_constants Add (+) (`elem` [Left 0,Right 0])+ (-) = mkBinaryOperator_optimise_constants Sub (-) (Right 0 ==)+ (*) = mkBinaryOperator_optimise_constants Mul (*) (`elem` [Left 1,Right 1]) abs = mkUnaryOperator Abs abs signum = mkUnaryOperator Sign signum fromInteger = Constant_U . Constant . fromInteger@@ -419,7 +552,7 @@ -- | Unit generators are fractional. instance Fractional UGen where recip = mkUnaryOperator Recip recip- (/) = mkBinaryOperator_optimize_constants FDiv (/) (Right 1 ==)+ (/) = mkBinaryOperator_optimise_constants FDiv (/) (Right 1 ==) fromRational = Constant_U . Constant . fromRational -- | Unit generators are floating point.@@ -428,7 +561,7 @@ exp = mkUnaryOperator Exp exp log = mkUnaryOperator Log log sqrt = mkUnaryOperator Sqrt sqrt- (**) = mkBinaryOperator_optimize_constants Pow (**) (Right 1 ==)+ (**) = mkBinaryOperator_optimise_constants Pow (**) (Right 1 ==) logBase a b = log b / log a sin = mkUnaryOperator Sin sin cos = mkUnaryOperator Cos cos
Sound/SC3/UGen/UGen.hs view
@@ -7,9 +7,9 @@ import qualified Sound.SC3.Common.Envelope as E import qualified Sound.SC3.Common.Base as B+import qualified Sound.SC3.Common.Math.Operator as O+import qualified Sound.SC3.Common.Rate as R import qualified Sound.SC3.Common.UId as UId-import qualified Sound.SC3.UGen.Operator as O-import qualified Sound.SC3.UGen.Rate as R import Sound.SC3.UGen.Type -- | 'UId' of 'resolveID'.@@ -26,22 +26,25 @@ -- * UGen graph functions --- | Depth first traversal of graph at `u' applying `f' to each node.-ugenTraverse :: (UGen -> UGen) -> UGen -> UGen-ugenTraverse f u =- let recur = ugenTraverse f+-- | Depth first traversal of graph at `u', stopping at `halt_f', else applying `map_f' to each node.+ugenTraverse :: (UGen -> Bool) -> (UGen -> UGen) -> UGen -> UGen+ugenTraverse halt_f map_f u =+ if halt_f u+ then u+ else+ let recur = ugenTraverse halt_f map_f in case u of Primitive_U p -> let i = ugenInputs p- in f (Primitive_U (p {ugenInputs = map recur i}))+ in map_f (Primitive_U (p {ugenInputs = map recur i})) Proxy_U p -> let s = Primitive_U (proxySource p) in case recur s of- Primitive_U p' -> f (Proxy_U (p {proxySource = p'}))+ Primitive_U p' -> map_f (Proxy_U (p {proxySource = p'})) _ -> error "ugenTraverse"- MCE_U m -> f (mce (map recur (mceProxies m)))- MRG_U (MRG l r) -> f (MRG_U (MRG (recur l) (recur r)))- _ -> f u+ MCE_U m -> map_f (mce (map recur (mceProxies m)))+ MRG_U (MRG l r) -> map_f (MRG_U (MRG (recur l) (recur r)))+ _ -> map_f u -- | Right fold of UGen graph. ugenFoldr :: (UGen -> a -> a) -> a -> UGen -> a@@ -153,10 +156,6 @@ -- | Transpose rows and columns, ie. {{a,b},{c,d}} to {{a,c},{b,d}}. mceTranspose :: UGen -> UGen mceTranspose = mce . map mce . transpose . map mceChannels . mceChannels---- | Collapse mce by summing (see also mix and mixN).-mceSum :: UGen -> UGen-mceSum = sum . mceChannels -- * Transform
emacs/hsc3.el view
@@ -13,6 +13,10 @@ nil "*The directory containing the help files (default=nil).") +(defvar sc3-help-directory+ nil+ "*The directory containing the SC3 RTF help files (default=nil).")+ (defvar hsc3-literate-p t "*Flag to indicate if we are in literate mode (default=t).")@@ -49,30 +53,22 @@ "Remove initial comment and Bird-literate markers if present." (replace-regexp-in-string "^[- ]*[> ]*" "" s)) -(defun hsc3-help ()- "Lookup up the name at point in the hsc3 help files."- (interactive)+(defun hsc3-find-files (dir rgx) (mapc (lambda (filename)- (find-file-other-window filename))- (find-lisp-find-files hsc3-help-directory- (concat "^"- (thing-at-point 'symbol)- "\\.help\\.l?hs$"))))+ (find-file-other-window filename))+ (find-lisp-find-files dir rgx))) -(defun hsc3-sc3-ugen-help ()- "Lookup up the UGen name at point in the SC3 help files."+(defun hsc3-help ()+ "Lookup up the name at point in the hsc3 help files." (interactive)- (hsc3-send-string- (format- "Sound.SC3.viewSC3Help (Sound.SC3.UGen.DB.ugenSC3Name \"%s\")"- (thing-at-point 'symbol))))+ (let ((rgx (concat "^" (thing-at-point 'symbol) "\\.help\\.l?hs$")))+ (hsc3-find-files hsc3-help-directory rgx))) -(defun hsc3-sc3-server-help ()- "Lookup up the Server Command name at point in the SC3 help files."+(defun hsc3-sc3-help ()+ "Lookup up the name at point in the SC3 (RTF) help files." (interactive)- (hsc3-send-string- (format "Sound.SC3.Server.Help.viewServerHelp \"%s\""- (thing-at-point 'symbol))))+ (let ((rgx (concat "^" (thing-at-point 'symbol) "\\\(.help\\\)?.rtf$")))+ (hsc3-find-files sc3-help-directory rgx))) (defun hsc3-ugen-summary () "Lookup up the UGen at point in hsc3-db"@@ -237,8 +233,8 @@ (define-key map (kbd "C-c C-g") 'hsc3-draw-graph) (define-key map (kbd "C-c C-S-g") 'hsc3-draw-graph-plain) (define-key map [?\C-c ?\M-g] 'hsc3-draw-graph-m)- (define-key map [?\C-c ?\C-j] 'hsc3-sc3-ugen-help)- (define-key map [?\C-c ?\C-/] 'hsc3-sc3-server-help)+ (define-key map [?\C-c ?\C-j] 'hsc3-sc3-help)+ ;(define-key map [?\C-c ?\C-/] 'hsc3-sc3-html-help) (define-key map [?\C-c ?i] 'hsc3-interrupt-haskell) (define-key map [?\C-c ?\C-k] 'hsc3-reset-scsynth) (define-key map [?\C-c ?\C-m] 'hsc3-run-main)@@ -246,6 +242,7 @@ (define-key map [?\C-c ?\C-q] 'hsc3-quit-haskell) (define-key map [?\C-c ?\C-0] 'hsc3-quit-scsynth) (define-key map [?\C-c ?\C-.] 'hsc3-stop)+ (define-key map [?\C-c ?\C-s] 'hsc3-stop) ; ie. sclang-mode key (define-key map [?\C-c ?\C-u] 'hsc3-ugen-summary)) (defun hsc3-mode-menu (map)@@ -255,13 +252,13 @@ (define-key map [menu-bar hsc3 help] (cons "Help" (make-sparse-keymap "Help"))) (define-key map [menu-bar hsc3 help hsc3]- '("Haskell SuperCollider help" . hsc3-help))+ '("HSC3 Help" . hsc3-help)) (define-key map [menu-bar hsc3 help ugen]- '("UGen parameter summary" . hsc3-ugen-summary))- (define-key map [menu-bar hsc3 help sc3-server]- '("SuperCollider Server Command help" . hsc3-sc3-server-help))+ '("UGen Summary" . hsc3-ugen-summary))+ ;(define-key map [menu-bar hsc3 help sc3-server]+ ; '("SuperCollider Server Command help" . hsc3-sc3-server-help)) (define-key map [menu-bar hsc3 help sc3-ugen]- '("SuperCollider UGen help" . hsc3-sc3-ugen-help))+ '("SC3 Help" . hsc3-sc3-ugen-help)) (define-key map [menu-bar hsc3 expression] (cons "Expression" (make-sparse-keymap "Expression"))) (define-key map [menu-bar hsc3 expression stop]@@ -320,125 +317,3 @@ (add-to-list 'auto-mode-alist '("\\.hs$" . hsc3-mode)) (provide 'hsc3)--;; (require 'haskell-interactive-mode)-;; (require 'haskell-process)--;; (defun hsc3-send-string (s)-;; (haskell-process-send-string (haskell-interactive-process) s))--;; (defun hsc3-send-string-and-print (s)-;; (haskell-process-show-repl-response s))--;; (defun hsc3-interrupt-haskell ()-;; (haskell-process-interrupt))--;; (defun hsc3-see-haskell ()-;; "Show haskell output."-;; (interactive)-;; (haskell-interactive-bring))--;; (require 'sclang)--;; (define-key map [?\C-c ?\C-e] 'hsc3-run-multiple-lines)-;; (define-key map [?\C-c ?\M-e] 'hsc3-run-multiple-lines-sclang)-;; (define-key map [?\C-c ?\C-r] 'hsc3-run-consecutive-lines)-;; (define-key map [?\C-c ?\C-f] 'hsc3-run-layout-block)-;; (define-key map [?\C-c ?\M-f] 'hsc3-sc3-forth-pp)-;; (define-key map [?\C-c ?\M-m] 'hsc3-load-main)-;; (define-key map [?\C-c ?\C-,] 'hsc3-ugen-default-param)--;; (define-key map [menu-bar hsc3 expression gen-default-param]-;; '("Insert default parameters" . hsc3-ugen-default-param))-;; (define-key map [menu-bar hsc3 expression run-layout-block]-;; '("Run layout block" . hsc3-run-layout-block))-;; (define-key map [menu-bar hsc3 expression run-consecutive-lines]-;; '("Run consecutive lines" . hsc3-run-consecutive-lines))-;; (define-key map [menu-bar hsc3 expression run-multiple-lines]-;; '("Run multiple lines" . hsc3-run-multiple-lines))--;; (defun hsc3-wait ()-;; "Wait for prompt after sending command."-;; (interactive)-;; (inferior-haskell-wait-for-prompt (inferior-haskell-process)))--;; (defun hsc3-request-type ()-;; "Ask ghci for the type of the name at point."-;; (interactive)-;; (hsc3-send-string (concat ":t " (thing-at-point 'symbol))))--;; (defun hsc3-load-main ()-;; "Load current buffer and run main."-;; (interactive)-;; (hsc3-load-buffer)-;; (hsc3-run-main))--;; (defun hsc3-ugen-default-param ()-;; "Insert the default UGen parameters for the UGen before <point>."-;; (interactive)-;; (let ((p (format "hsc3-default-param %s" (thing-at-point 'symbol))))-;; (insert " ")-;; (insert (hsc3-remove-trailing-newline (shell-command-to-string p)))))--;; (defun hsc3-sc3-forth-pp () "Forth PP" (interactive)-;; (hsc3-send-string-;; (format "Sound.SC3.UGen.DB.PP.ugen_graph_forth_pp False %s" (thing-at-point 'symbol))))--;; (defun hsc3-region-string ()-;; "Get region as string (no properties)"-;; (buffer-substring-no-properties-;; (region-beginning)-;; (region-end)))--;; (defun hsc3-gen-param ()-;; "Rewrite an SC3 argument list as control definitions."-;; (interactive)-;; (hsc3-send-string-;; (concat "putStrLn $ Sound.SC3.RW.PSynth.rewrite_param_list \"" (hsc3-region-string) "\"")))--;; (defun hsc3-local-dot ()-;; "Copy '/tmp/hsc3.dot' to 'buffer-name' .dot."-;; (interactive)-;; (let ((nm (concat (file-name-sans-extension (buffer-name)) ".dot")))-;; (copy-file "/tmp/hsc3.dot" nm t)))--;; (defun hsc3-concat (l)-;; (apply #'concat l))--;; (defun hsc3-remove-non-literates (s)-;; "Remove non-bird literate lines"-;; (replace-regexp-in-string "^[^>]*$" "" s))--;; (defun hsc3-region-string-unlit ()-;; "The current region (unlit, uncomment)."-;; (let* ((s (hsc3-region-string)))-;; (if hsc3-literate-p-;; (hsc3-unlit (hsc3-remove-non-literates s))-;; (hsc3-concat (mapcar 'hsc3-uncomment (split-string s "\n"))))))--;; (defun hsc3-region-string-one-line ()-;; "Replace newlines with spaces in `hsc3-region-string'."-;; (replace-regexp-in-string "\n" " " (hsc3-region-string-unlit)))--;; (defun hsc3-run-multiple-lines ()-;; "Send the current region to the haskell interpreter as a single line."-;; (interactive)-;; (hsc3-send-string (hsc3-region-string-one-line)))--;; (defun hsc3-run-multiple-lines-sclang ()-;; "Send the current region to the sclang interpreter as a single line."-;; (interactive)-;; (sclang-eval-string (hsc3-region-string-one-line) t))--;; (defun hsc3-run-consecutive-lines ()-;; "Send the current region to the interpreter one line at a time."-;; (interactive)-;; (mapcar 'hsc3-send-string-;; (split-string (hsc3-region-string) "\n")))--;; (defun hsc3-run-layout-block ()-;; "Variant of `hsc3-run-consecutive-lines' with ghci layout quoting."-;; (interactive)-;; (hsc3-send-string ":{")-;; (hsc3-send-string (hsc3-region-string))-;; (hsc3-send-string ":}"))
hsc3.cabal view
@@ -1,5 +1,5 @@ Name: hsc3-Version: 0.17+Version: 0.18 Synopsis: Haskell SuperCollider Description: Haskell client for the SuperCollider synthesis server, <http://audiosynth.com/>.@@ -8,14 +8,14 @@ <http://rohandrape.net/t/hsc3-texts>. License: GPL-3 Category: Sound-Copyright: (c) Rohan Drape and others, 2005-2018+Copyright: (c) Rohan Drape and others, 2005-2020 Author: Rohan Drape Maintainer: rd@rohandrape.net Stability: Experimental Homepage: http://rohandrape.net/t/hsc3-Tested-With: GHC == 8.4.3+Tested-With: GHC == 8.6.5 Build-Type: Simple-Cabal-Version: >= 1.8+Cabal-Version: >= 1.10 Data-files: README emacs/hsc3.el@@ -32,7 +32,7 @@ data-ordlist, directory, filepath,- hosc == 0.17.*,+ hosc == 0.18.*, murmur-hash, network, process,@@ -41,6 +41,7 @@ split >= 0.2, transformers, vector+ Default-Language:Haskell2010 GHC-Options: -Wall -fwarn-tabs Exposed-modules: Sound.SC3 Sound.SC3.Common@@ -49,14 +50,18 @@ Sound.SC3.Common.Buffer.Array Sound.SC3.Common.Buffer.Gen Sound.SC3.Common.Buffer.Vector+ Sound.SC3.Common.Enum Sound.SC3.Common.Envelope Sound.SC3.Common.Math Sound.SC3.Common.Math.Filter Sound.SC3.Common.Math.Filter.BEQ Sound.SC3.Common.Math.Interpolate+ Sound.SC3.Common.Math.Noise+ Sound.SC3.Common.Math.Operator Sound.SC3.Common.Math.Window Sound.SC3.Common.Monad Sound.SC3.Common.Monad.Operators+ Sound.SC3.Common.Rate Sound.SC3.Common.UId Sound.SC3.FD Sound.SC3.Server@@ -70,10 +75,12 @@ Sound.SC3.Server.Graphdef.Graph Sound.SC3.Server.Graphdef.Read Sound.SC3.Server.FD- Sound.SC3.Server.Help Sound.SC3.Server.Monad Sound.SC3.Server.NRT Sound.SC3.Server.NRT.Edit+ Sound.SC3.Server.NRT.UGen+ Sound.SC3.Server.Options+ Sound.SC3.Server.Param Sound.SC3.Server.Recorder Sound.SC3.Server.Status Sound.SC3.Server.Synthdef@@ -83,6 +90,7 @@ Sound.SC3.UGen.Analysis Sound.SC3.UGen.Bindings Sound.SC3.UGen.Bindings.Composite+ Sound.SC3.UGen.Bindings.Composite.External Sound.SC3.UGen.Bindings.DB Sound.SC3.UGen.Bindings.DB.External Sound.SC3.UGen.Bindings.HW@@ -98,19 +106,15 @@ Sound.SC3.UGen.Graph Sound.SC3.UGen.Graph.Reconstruct Sound.SC3.UGen.Graph.Transform- Sound.SC3.UGen.Help Sound.SC3.UGen.Help.Graph Sound.SC3.UGen.HS Sound.SC3.UGen.Math Sound.SC3.UGen.Math.Composite Sound.SC3.UGen.MCE Sound.SC3.UGen.Name- Sound.SC3.UGen.Operator Sound.SC3.UGen.Optimise Sound.SC3.UGen.Plain Sound.SC3.UGen.PP- Sound.SC3.UGen.Protect- Sound.SC3.UGen.Rate Sound.SC3.UGen.Type Sound.SC3.UGen.UGen