csound-expression-typed 0.0.9.3 → 0.1.0.0
raw patch · 34 files changed
+3278/−221 lines, 34 filesdep ~csound-expression-dynamicPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: csound-expression-dynamic
API changes (from Hackage documentation)
+ Csound.Typed.Control: RawSync :: SyncSmooth
+ Csound.Typed.Control: SawSync :: SyncSmooth
+ Csound.Typed.Control: TrapSync :: SyncSmooth
+ Csound.Typed.Control: TriSync :: SyncSmooth
+ Csound.Typed.Control: UserSync :: Tab -> SyncSmooth
+ Csound.Typed.Control: bloscSync :: Tab -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSync' :: Tab -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSyncAbs :: Tab -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSyncAbs' :: Tab -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSyncAbsBy :: SyncSmooth -> Tab -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSyncAbsBy' :: SyncSmooth -> Tab -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSyncBy :: SyncSmooth -> Tab -> Sig -> Sig -> Sig
+ Csound.Typed.Control: bloscSyncBy' :: SyncSmooth -> Tab -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: data SyncSmooth
+ Csound.Typed.Control: isawSync :: Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSync' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSyncAbs :: Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSyncAbs' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: isawSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSync :: Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSync' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSyncAbs :: Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSyncAbs' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: pulseSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSync :: Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSync' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSyncAbs :: Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSyncAbs' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sawSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSync :: Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSync' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSyncAbs :: Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSyncAbs' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: sqrSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: triSync :: Sig -> Sig -> Sig
+ Csound.Typed.Control: triSync' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: triSyncAbs :: Sig -> Sig -> Sig
+ Csound.Typed.Control: triSyncAbs' :: D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: triSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: triSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Control: triSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
+ Csound.Typed.Control: triSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig
+ Csound.Typed.Gui.Cab: Hash :: String -> Col
+ Csound.Typed.Gui.Cab: Rgb :: Int -> Int -> Int -> Col
+ Csound.Typed.Gui.Cab: active :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: align :: String -> CabProp
+ Csound.Typed.Gui.Cab: alpha :: Float -> CabProp
+ Csound.Typed.Gui.Cab: backgroundcolour :: Col -> CabProp
+ Csound.Typed.Gui.Cab: bounds :: Int -> Int -> Int -> Int -> CabProp
+ Csound.Typed.Gui.Cab: button :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: cabbage :: Cab -> SE ()
+ Csound.Typed.Gui.Cab: caption :: String -> CabProp
+ Csound.Typed.Gui.Cab: channel :: String -> CabProp
+ Csound.Typed.Gui.Cab: channeltype :: String -> CabProp
+ Csound.Typed.Gui.Cab: checkbox :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: child :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: colour :: Col -> CabProp
+ Csound.Typed.Gui.Cab: colour0 :: Col -> CabProp
+ Csound.Typed.Gui.Cab: colour1 :: Col -> CabProp
+ Csound.Typed.Gui.Cab: combobox :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: corners :: Float -> CabProp
+ Csound.Typed.Gui.Cab: csoundoutput :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: data Col
+ Csound.Typed.Gui.Cab: displaytype :: String -> CabProp
+ Csound.Typed.Gui.Cab: encoder :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: file :: String -> CabProp
+ Csound.Typed.Gui.Cab: filebutton :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: fontcolour :: Col -> CabProp
+ Csound.Typed.Gui.Cab: fontcolour0 :: Col -> CabProp
+ Csound.Typed.Gui.Cab: fontcolour1 :: Col -> CabProp
+ Csound.Typed.Gui.Cab: fontstyle :: String -> CabProp
+ Csound.Typed.Gui.Cab: form :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: gentable :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: groupbox :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: guirefresh :: Int -> CabProp
+ Csound.Typed.Gui.Cab: hrange :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: hslider :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: identchannel :: String -> CabProp
+ Csound.Typed.Gui.Cab: image :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: infobutton :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: keyboard :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: keywidth :: Int -> CabProp
+ Csound.Typed.Gui.Cab: label :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: latched :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: linethickness :: Float -> CabProp
+ Csound.Typed.Gui.Cab: max :: Float -> CabProp
+ Csound.Typed.Gui.Cab: middlec :: Int -> CabProp
+ Csound.Typed.Gui.Cab: min :: Float -> CabProp
+ Csound.Typed.Gui.Cab: mode :: String -> CabProp
+ Csound.Typed.Gui.Cab: outlinecolour :: Col -> CabProp
+ Csound.Typed.Gui.Cab: plant :: String -> CabProp
+ Csound.Typed.Gui.Cab: pluginid :: String -> CabProp
+ Csound.Typed.Gui.Cab: populate :: String -> String -> CabProp
+ Csound.Typed.Gui.Cab: popuptext :: String -> CabProp
+ Csound.Typed.Gui.Cab: range :: Float -> Float -> (Float, Float) -> CabProp
+ Csound.Typed.Gui.Cab: range2 :: Float -> Float -> (Float, Float) -> Maybe Float -> Maybe Float -> CabProp
+ Csound.Typed.Gui.Cab: rotate :: Float -> Float -> Float -> CabProp
+ Csound.Typed.Gui.Cab: rslider :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: scrollbars :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: scrubberpos :: Int -> CabProp
+ Csound.Typed.Gui.Cab: shape :: String -> CabProp
+ Csound.Typed.Gui.Cab: show :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: signaldisplay :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: size :: Int -> Int -> CabProp
+ Csound.Typed.Gui.Cab: sliderincr :: Float -> CabProp
+ Csound.Typed.Gui.Cab: soundfiler :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: svgfile :: String -> String -> CabProp
+ Csound.Typed.Gui.Cab: text1 :: String -> CabProp
+ Csound.Typed.Gui.Cab: text2 :: String -> String -> CabProp
+ Csound.Typed.Gui.Cab: textbox :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: textbox' :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: textcolour :: Col -> CabProp
+ Csound.Typed.Gui.Cab: texteditor :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: trackercolour :: Col -> CabProp
+ Csound.Typed.Gui.Cab: trackerthickness :: Float -> CabProp
+ Csound.Typed.Gui.Cab: type Cab = Cab' ()
+ Csound.Typed.Gui.Cab: type CabProp = CabProp' ()
+ Csound.Typed.Gui.Cab: updaterate :: Int -> CabProp
+ Csound.Typed.Gui.Cab: value :: Float -> CabProp
+ Csound.Typed.Gui.Cab: visible :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: vrange :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: vslider :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: widgetarray :: String -> Int -> CabProp
+ Csound.Typed.Gui.Cab: wrap :: Bool -> CabProp
+ Csound.Typed.Gui.Cab: xypad :: CabProp -> Cab
+ Csound.Typed.Gui.Cab: zoom :: Float -> CabProp
+ Csound.Typed.Plugins: ZConvSpec :: D -> D -> D -> ZConvSpec
+ Csound.Typed.Plugins: [zconvNp] :: ZConvSpec -> D
+ Csound.Typed.Plugins: [zconvPartSize] :: ZConvSpec -> D
+ Csound.Typed.Plugins: [zconvRatio] :: ZConvSpec -> D
+ Csound.Typed.Plugins: adsr140 :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: audaciousEq :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: data ZConvSpec
+ Csound.Typed.Plugins: diode :: Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: highShelf :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: korg_hp :: Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: korg_lp :: Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: linDiode :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: linKorg_hp :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: linKorg_lp :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: lowShelf :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: noNormDiode :: Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: peakEq :: Sig -> Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: solinaChorus :: (Sig, Sig) -> (Sig, Sig) -> Sig -> Sig
+ Csound.Typed.Plugins: testSolinaChorus :: Sig -> Sig
+ Csound.Typed.Plugins: zap1 :: Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zbp :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zbp4 :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zbr :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zconv :: Tab -> Sig -> Sig
+ Csound.Typed.Plugins: zconv' :: ZConvSpec -> Tab -> Sig -> Sig
+ Csound.Typed.Plugins: zdf1 :: Sig -> Sig -> (Sig, Sig)
+ Csound.Typed.Plugins: zdf2 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig)
+ Csound.Typed.Plugins: zdf2_notch :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
+ Csound.Typed.Plugins: zdf4 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig, Sig, Sig)
+ Csound.Typed.Plugins: zhp :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zhp1 :: Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zhp4 :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zladder :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zlp :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zlp1 :: Sig -> Sig -> Sig
+ Csound.Typed.Plugins: zlp4 :: Sig -> Sig -> Sig -> Sig
+ Csound.Typed.Types.Prim: infix 4 `greaterThanEquals`
+ Csound.Typed.Types.Tuple: instance Csound.Typed.Types.Tuple.Sigs (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance Csound.Typed.Types.Tuple.Sigs (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance Csound.Typed.Types.Tuple.Sigs (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance Csound.Typed.Types.Tuple.Sigs (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance Csound.Typed.Types.Tuple.Sigs (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance GHC.Num.Num (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance GHC.Num.Num (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance GHC.Num.Num (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance GHC.Num.Num (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
+ Csound.Typed.Types.Tuple: instance GHC.Num.Num (Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2, Csound.Typed.Types.Tuple.Sig2)
- Csound.Typed.Control: listenOsc :: Tuple a => OscRef -> OscAddress -> OscType -> Evt a
+ Csound.Typed.Control: listenOsc :: forall a. Tuple a => OscRef -> OscAddress -> OscType -> Evt a
- Csound.Typed.Control: sendOsc :: Tuple a => OscHost -> OscPort -> OscAddress -> OscType -> Evt a -> SE ()
+ Csound.Typed.Control: sendOsc :: forall a. Tuple a => OscHost -> OscPort -> OscAddress -> OscType -> Evt a -> SE ()
- Csound.Typed.Control: trigByNameMidi_ :: Arg a => String -> ((D, D, a) -> SE ()) -> SE ()
+ Csound.Typed.Control: trigByNameMidi_ :: forall a. Arg a => String -> ((D, D, a) -> SE ()) -> SE ()
Files
- csound-expression-typed.cabal +23/−5
- data/opcodes/adsr140.udo +111/−0
- data/opcodes/audaciouseq.udo +81/−0
- data/opcodes/diode.udo +342/−0
- data/opcodes/korg35.udo +385/−0
- data/opcodes/solina_chorus.udo +56/−0
- data/opcodes/tdf2.udo +166/−0
- data/opcodes/zdf.udo +540/−0
- data/opcodes/zero-delay-convolution.udo +31/−0
- src/Csound/Typed/Control/Api.hs +2/−2
- src/Csound/Typed/Control/Vco.hs +429/−1
- src/Csound/Typed/GlobalState.hs +1/−1
- src/Csound/Typed/GlobalState/Elements.hs +105/−27
- src/Csound/Typed/GlobalState/GE.hs +18/−7
- src/Csound/Typed/GlobalState/Opcodes.hs +13/−4
- src/Csound/Typed/GlobalState/Options.hs +1/−2
- src/Csound/Typed/Gui.hs +0/−1
- src/Csound/Typed/Gui/Cab.hs +25/−0
- src/Csound/Typed/Gui/Cabbage/Cabbage.hs +256/−0
- src/Csound/Typed/Gui/Cabbage/CabbageLang.hs +38/−0
- src/Csound/Typed/Gui/Widget.hs +1/−1
- src/Csound/Typed/Lib/StableMaps/Dynamic.hs +0/−77
- src/Csound/Typed/Lib/StableMaps/Dynamic/Map.hs +0/−88
- src/Csound/Typed/Plugins.hs +39/−0
- src/Csound/Typed/Plugins/Adsr140.hs +25/−0
- src/Csound/Typed/Plugins/Audaciouseq.hs +33/−0
- src/Csound/Typed/Plugins/Diode.hs +75/−0
- src/Csound/Typed/Plugins/Korg35.hs +99/−0
- src/Csound/Typed/Plugins/SolinaChorus.hs +60/−0
- src/Csound/Typed/Plugins/Zdf.hs +209/−0
- src/Csound/Typed/Plugins/ZeroDelayConvolution.hs +52/−0
- src/Csound/Typed/Render.hs +11/−3
- src/Csound/Typed/Types/Prim.hs +2/−2
- src/Csound/Typed/Types/Tuple.hs +49/−0
csound-expression-typed.cabal view
@@ -1,5 +1,5 @@ Name: csound-expression-typed-Version: 0.0.9.3+Version: 0.1.0.0 Cabal-Version: >= 1.22 License: BSD3 License-file: LICENSE@@ -26,7 +26,16 @@ data/opcodes/tabQueue.udo data/opcodes/tabQueue2.udo + data/opcodes/zdf.udo+ data/opcodes/solina_chorus.udo+ data/opcodes/adsr140.udo+ data/opcodes/audaciouseq.udo+ data/opcodes/tdf2.udo+ data/opcodes/diode.udo+ data/opcodes/korg35.udo+ data/opcodes/zero-delay-convolution.udo + Homepage: https://github.com/anton-k/csound-expression-typed Bug-Reports: https://github.com/anton-k/csound-expression-typed/issues @@ -39,7 +48,7 @@ Ghc-Options: -Wall Build-Depends: base >= 4, base < 5, ghc-prim, containers, transformers >= 0.3, Boolean >= 0.1.0, colour >= 2.0, data-default, deepseq,- wl-pprint, csound-expression-dynamic >= 0.1.6, temporal-media >= 0.6.0, hashable+ wl-pprint, csound-expression-dynamic >= 0.2.0, temporal-media >= 0.6.0, hashable Hs-Source-Dirs: src/ Exposed-Modules: Csound.Typed@@ -49,12 +58,15 @@ Csound.Typed.Render Csound.Typed.Gui+ Csound.Typed.Gui.Cab Csound.Typed.Types.Prim Csound.Typed.Types.Evt Csound.Typed.Types.Tuple Csound.Typed.Types.Lift + Csound.Typed.Plugins + Other-Modules: Csound.Typed.GlobalState Csound.Typed.GlobalState.Options@@ -82,14 +94,20 @@ Csound.Typed.Gui.Gui Csound.Typed.Gui.Widget Csound.Typed.Gui.BoxModel+ Csound.Typed.Gui.Cabbage.CabbageLang+ Csound.Typed.Gui.Cabbage.Cabbage Csound.Typed.Constants Csound.Typed.Misc - Csound.Typed.Lib.StableMaps.Dynamic- Csound.Typed.Lib.StableMaps.Dynamic.Map- Csound.Typed.Plugins.TabQueue+ Csound.Typed.Plugins.Zdf+ Csound.Typed.Plugins.Diode+ Csound.Typed.Plugins.Korg35+ Csound.Typed.Plugins.Adsr140+ Csound.Typed.Plugins.Audaciouseq+ Csound.Typed.Plugins.SolinaChorus+ Csound.Typed.Plugins.ZeroDelayConvolution Paths_csound_expression_typed
+ data/opcodes/adsr140.udo view
@@ -0,0 +1,111 @@+; Gated, Retriggerable Envelope Generator UDO (adsr140)+; Based on design of Doepfer A-140 Envelope Generator Module+; Code based on ADSR code by Nigel Redmon +; (http://www.earlevel.com/main/2013/06/03/envelope-generators-adsr-code/)+; Example by Steven Yi (2015.02.08)++opcode adsr140_calc_coef, k, kk+ + knum_samps, kratio xin+ xout exp( -log((1.0 + kratio) / kratio) / knum_samps)+ +endop++/* Gated, Re-triggerable ADSR modeled after the Doepfer A-140 */+opcode adsr140, a, aakkkk++agate, aretrig, kattack, kdecay, ksustain, krelease xin++kstate init 0 ; 0 = attack, 1 = decay, 2 = sustain+klasttrig init -1+kval init 0.0+asig init 0+kindx = 0++kattack_base init 0+kdecay_base init 0+krelease_base init 0++kattack_samps init 0+kdecay_samps init 0+krelease_samps init 0++kattack_coef init 0+kdecay_coef init 0+ksustain_coef init 0++klast_attack init -1+klast_decay init -1+klast_release init -1++if (klast_attack != kattack) then+ klast_attack = kattack+ kattack_samps = kattack * sr+ kattack_coef = adsr140_calc_coef(kattack_samps, 0.3)+ kattack_base = (1.0 + 0.3) * (1 - kattack_coef)+endif++if (klast_decay != kdecay) then+ klast_decay = kdecay+ kdecay_samps = kdecay * sr+ kdecay_coef = adsr140_calc_coef(kdecay_samps, 0.0001)+ kdecay_base = (ksustain - 0.0001) * (1.0 - kdecay_coef)+endif++if (klast_release != krelease) then+ klast_release = krelease+ krelease_samps = krelease * sr+ krelease_coef = adsr140_calc_coef(krelease_samps, 0.0001)+ krelease_base = -0.0001 * (1.0 - krelease_coef)+endif+++while (kindx < ksmps) do+ if (agate[kindx] > 0) then+ kretrig = aretrig[kindx]+ if (kretrig > 0 && klasttrig <= 0) then+ kstate = 0+ endif+ klasttrig = kretrig++ if (kstate == 0) then+ kval = kattack_base + (kval * kattack_coef)+ if(kval >= 1.0) then+ kval = 1.0+ kstate = 1+ endif+ asig[kindx] = kval++ elseif (kstate == 1) then+ kval = kdecay_base + (kval * kdecay_coef)+ if(kval <= ksustain) then+ kval = ksustain+ kstate = 2+ endif+ asig[kindx] = kval ++ else+ asig[kindx] = ksustain+ endif++ else ; in a release state+ kstate = 0+ if (kval == 0.0) then+ asig[kindx] = 0+ else + ; releasing+ kval = krelease_base + (kval * krelease_coef)+ if(kval <= 0.0) then+ kval = 0.0+ endif+ asig[kindx] = kval + endif++ endif++ kindx += 1+od++xout asig++endop
+ data/opcodes/audaciouseq.udo view
@@ -0,0 +1,81 @@+/* audaciouseq - multi-band equalizer + + A Csound UDO implementation of Audacious' EQ:++ https://github.com/audacious-media-player/audacious/blob/master/src/libaudcore/equalizer.cc++*/+++/* Q value for band-pass filters 1.2247 = (3/2)^(1/2)+ * Gives 4 dB suppression at Fc*2 and Fc/2 */++#define Q # 1.2247449 #++/* single-sample, 2nd order IIR filter */+opcode audacious_bp2, k, kik+kin, ifC, kgain xin++;; Calc Coefficients+ith = 2 * $M_PI * (ifC / sr)+iC = (1 - tan(ith * $Q / 2)) / (1 + tan(ith * $Q / 2))++ia0 = (1 + iC) * cos(ith)+ia1 = -iC +ib0 = (1 - iC) / 2 +ib1 = -1.005++kout init 0+kwq0 init 0+kwq1 init 0++kG = pow(10, kgain / 20) - 1++;; Filter Code+kyt = kin +kw = kyt * ib0 + kwq0 * ia0 + kwq1 * ia1+kyt += (kw + kwq1 * ib1) * kG ++;; Memory+kwq1 = kwq0+kwq0 = kw++xout kyt +endop++/* 10-band EQ + Input: asig, kgain1, kgain2, ...+ Output: aout++ 10 kgain arguments maps to each band+ Bands are: 31.25, 52.6, 125, 500, 1000, + 2000, 4000, 8000, 16000 +*/+opcode audaciouseq, a, akkkkkkkkkk++ain, kgain1, kgain2, kgain3, kgain4, kgain5, + kgain6, kgain7, kgain8, kgain9, kgain10 xin++aout = 0+kndx = 0++while (kndx < ksmps) do+ ksamp audacious_bp2 ain[kndx], 31.25, kgain1+ ksamp audacious_bp2 ksamp, 62.5, kgain2+ ksamp audacious_bp2 ksamp, 125, kgain3+ ksamp audacious_bp2 ksamp, 250, kgain4+ ksamp audacious_bp2 ksamp, 500, kgain5+ ksamp audacious_bp2 ksamp, 1000, kgain6+ ksamp audacious_bp2 ksamp, 2000, kgain7+ ksamp audacious_bp2 ksamp, 4000, kgain8+ ksamp audacious_bp2 ksamp, 8000, kgain9+ aout[kndx] audacious_bp2 ksamp, 16000, kgain10++ kndx += 1+od++xout aout++endop++
+ data/opcodes/diode.udo view
@@ -0,0 +1,342 @@+;; Diode Ladder Filter+;; +;; Based on code by Will Pirkle, presented in:+;;+;; http://www.willpirkle.com/Downloads/AN-6DiodeLadderFilter.pdf+;; +;; and in his book "Designing software synthesizer plug-ins in C++ : for +;; RackAFX, VST3, and Audio Units"+;;+;; UDO version by Steven Yi (2016.xx.xx)++;; ARGS+;; ain - signal to filter+;; acf/kcf - cutoff frequency +;; ak/kk - k-value that controls resonance, self-resonance occurs at k=17;+;; knlp - use non-linear processing: +;; 0 - none +;; 1 - normalized (outputs to range +-1.0)+;; 2 - non-normalized (less expensive than normalized, range +-0.8)+;; ksaturation - saturation amount for non-linear processing +;; (default: 1.0, greater values lead to higher saturation)+++opcode diode_ladder, a, aKKKK++ ain, kcf, kk, knlp, ksaturation xin++ ;; initialization+ aout init 0++ ka1 init 1.0+ ka2 init 0.5 + ka3 init 0.5 + ka4 init 0.5 ++ ;; state for each 1-pole's integrator + kz1 init 0+ kz2 init 0+ kz3 init 0+ kz4 init 0++ ;; coefficients+ kG1 init 0+ kG2 init 0+ kG3 init 0+ kG4 init 0++ kbeta1 init 0+ kbeta2 init 0+ kbeta3 init 0+ kbeta4 init 0++ kdelta1 init 0+ kdelta2 init 0+ kdelta3 init 0++ kepsilon1 init 0+ kepsilon2 init 0+ kepsilon3 init 0++ kSG1 init 0+ kSG2 init 0+ kSG3 init 0+ kSG4 init 0++ kSIGMA init 0+ kGAMMA init 0++ klastcut init -1 ++ if (klastcut != kcf) then+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 ++ kG4 = 0.5 * kg / (1.0 + kg)+ kG3 = 0.5 * kg / (1.0 + kg - 0.5 * kg * kG4)+ kG2 = 0.5 * kg / (1.0 + kg - 0.5 * kg * kG3)+ kG1 = kg / (1.0 + kg - kg * kG2)++ kGAMMA = kG4 * kG3 * kG2 * kG1++ kSG1 = kG4 * kG3 * kG2 + kSG2 = kG4 * kG3 + kSG3 = kG4 + kSG4 = 1.0 ++ kalpha = kg / (1.0 + kg)++ kbeta1 = 1.0 / (1.0 + kg - kg * kG2)+ kbeta2 = 1.0 / (1.0 + kg - 0.5 * kg * kG3)+ kbeta3 = 1.0 / (1.0 + kg - 0.5 * kg * kG4)+ kbeta4 = 1.0 / (1.0 + kg) ++ kgamma1 = 1.0 + kG1 * kG2+ kgamma2 = 1.0 + kG2 * kG3+ kgamma3 = 1.0 + kG3 * kG4++ kdelta1 = kg+ kdelta2 = 0.5 * kg+ kdelta3 = 0.5 * kg++ kepsilon1 = kG2+ kepsilon2 = kG3+ kepsilon3 = kG4++ endif++ klastcut = kcf++ kindx = 0++ while kindx < ksmps do++ kin = ain[kindx]++ ;; feedback inputs + kfb4 = kbeta4 * kz4 + kfb3 = kbeta3 * (kz3 + kfb4 * kdelta3)+ kfb2 = kbeta2 * (kz2 + kfb3 * kdelta2)++ ;; feedback process++ kfbo1 = (kbeta1 * (kz1 + kfb2 * kdelta1))+ kfbo2 = (kbeta2 * (kz2 + kfb3 * kdelta2)) + kfbo3 = (kbeta3 * (kz3 + kfb4 * kdelta3))+ kfbo4 = kfb4 ++ kSIGMA = kSG1 * kfbo1 ++ kSG2 * kfbo2 ++ kSG3 * kfbo3 ++ kSG4 * kfbo4 ++ ;; non-linear processing+ if (knlp == 1) then+ kin = (1.0 / tanh(ksaturation)) * tanh(ksaturation * kin)+ elseif (knlp == 2) then+ kin = tanh(ksaturation * kin) + endif++ ;; form input to loop+ kun = (kin - kk * kSIGMA) / (1.0 + kk * kGAMMA)++ ;; 1st stage+ kxin = (kun * kgamma1 + kfb2 + kepsilon1 * kfbo1)+ kv = (ka1 * kxin - kz1) * kalpha + klp = kv + kz1+ kz1 = klp + kv++ ;; 2nd stage+ kxin = (klp * kgamma2 + kfb3 + kepsilon2 * kfbo2)+ kv = (ka2 * kxin - kz2) * kalpha + klp = kv + kz2+ kz2 = klp + kv++ ;; 3rd stage+ kxin = (klp * kgamma3 + kfb4 + kepsilon3 * kfbo3)+ kv = (ka3 * kxin - kz3) * kalpha + klp = kv + kz3+ kz3 = klp + kv++ ;; 4th stage+ kv = (ka4 * klp - kz4) * kalpha + klp = kv + kz4+ kz4 = klp + kv++ aout[kindx] = klp++ kindx += 1+ od++ xout aout++endop+++opcode diode_ladder, a, aaaKK++ ain, acf, ak, knlp, ksaturation xin++ ;; initialization+ aout init 0++ ka1 init 1.0+ ka2 init 0.5 + ka3 init 0.5 + ka4 init 0.5 ++ ;; state for each 1-pole's integrator + kz1 init 0+ kz2 init 0+ kz3 init 0+ kz4 init 0++ ;; coefficients+ kG1 init 0+ kG2 init 0+ kG3 init 0+ kG4 init 0++ kbeta1 init 0+ kbeta2 init 0+ kbeta3 init 0+ kbeta4 init 0++ kdelta1 init 0+ kdelta2 init 0+ kdelta3 init 0++ kepsilon1 init 0+ kepsilon2 init 0+ kepsilon3 init 0++ kSG1 init 0+ kSG2 init 0+ kSG3 init 0+ kSG4 init 0++ kSIGMA init 0+ kGAMMA init 0++ klastcut init 0++ kindx = 0++ while kindx < ksmps do++ kin = ain[kindx]+ kcf = acf[kindx]+ kk = ak[kindx]++ if (klastcut != kcf) then+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 ++ kG4 = 0.5 * kg / (1.0 + kg)+ kG3 = 0.5 * kg / (1.0 + kg - 0.5 * kg * kG4)+ kG2 = 0.5 * kg / (1.0 + kg - 0.5 * kg * kG3)+ kG1 = kg / (1.0 + kg - kg * kG2)++ kGAMMA = kG4 * kG3 * kG2 * kG1++ kSG1 = kG4 * kG3 * kG2 + kSG2 = kG4 * kG3 + kSG3 = kG4 + kSG4 = 1.0 ++ kalpha = kg / (1.0 + kg)++ kbeta1 = 1.0 / (1.0 + kg - kg * kG2)+ kbeta2 = 1.0 / (1.0 + kg - 0.5 * kg * kG3)+ kbeta3 = 1.0 / (1.0 + kg - 0.5 * kg * kG4)+ kbeta4 = 1.0 / (1.0 + kg) ++ kgamma1 = 1.0 + kG1 * kG2+ kgamma2 = 1.0 + kG2 * kG3+ kgamma3 = 1.0 + kG3 * kG4++ kdelta1 = kg+ kdelta2 = 0.5 * kg+ kdelta3 = 0.5 * kg++ kepsilon1 = kG2+ kepsilon2 = kG3+ kepsilon3 = kG4++ endif++ klastcut = kcf++ ;; feedback inputs + kfb4 = kbeta4 * kz4 + kfb3 = kbeta3 * (kz3 + kfb4 * kdelta3)+ kfb2 = kbeta2 * (kz2 + kfb3 * kdelta2)++ ;; feedback process++ kfbo1 = (kbeta1 * (kz1 + kfb2 * kdelta1))+ kfbo2 = (kbeta2 * (kz2 + kfb3 * kdelta2)) + kfbo3 = (kbeta3 * (kz3 + kfb4 * kdelta3))+ kfbo4 = kfb4 ++ kSIGMA = kSG1 * kfbo1 ++ kSG2 * kfbo2 ++ kSG3 * kfbo3 ++ kSG4 * kfb4 ++ ;; non-linear processing+ if (knlp == 1) then+ kin = (1.0 / tanh(ksaturation)) * tanh(ksaturation * kin)+ elseif (knlp == 2) then+ kin = tanh(ksaturation * kin) + endif++ ;; form input to loop+ kun = (kin - kk * kSIGMA) / (1.0 + kk * kGAMMA)++ ;; 1st stage+ kxin = (kun * kgamma1 + kfb2 + kepsilon1 * kfbo1)+ kv = (ka1 * kxin - kz1) * kalpha + klp = kv + kz1+ kz1 = klp + kv++ ;; 2nd stage+ kxin = (klp * kgamma2 + kfb3 + kepsilon2 * kfbo2)+ kv = (ka2 * kxin - kz2) * kalpha + klp = kv + kz2+ kz2 = klp + kv++ ;; 3rd stage+ kxin = (klp * kgamma3 + kfb4 + kepsilon3 * kfbo3)+ kv = (ka3 * kxin - kz3) * kalpha + klp = kv + kz3+ kz3 = klp + kv++ ;; 4th stage+ kv = (ka4 * klp - kz4) * kalpha + klp = kv + kz4+ kz4 = klp + kv++ aout[kindx] = klp++ kindx += 1+ od++ xout aout++endop++opcode diode_ladder, a, aaKKK++ ain, acf, kk, knlp, ksaturation xin+ ares diode_ladder ain, acf, a(kk), knlp, ksaturation++ xout ares+endop+
+ data/opcodes/korg35.udo view
@@ -0,0 +1,385 @@+;; 12db/oct low-pass filter based on Korg 35 module+;; (found in MS-10 and MS-20).+;; +;; Based on code by Will Pirkle, presented in:+;; +;; http://www.willpirkle.com/Downloads/AN-5Korg35_V3.pdf+;; +;; [ARGS]+;; +;; ain - audio input+;; acutoff - frequency of cutoff+;; kQ - filter Q [1, 10.0] (k35-lpf will clamp to boundaries)+;; knonlinear - use non-linear processing+;; ksaturation - saturation for tanh distortion+opcode k35_lpf, a, aKKKK++ ain, kcutoff, kQ, knonlinear, ksaturation xin++ kz1 init 0+ kz2 init 0+ kz3 init 0+ kv1 init 0+ kv2 init 0+ kv3 init 0+ aout init 0++ kg init 0+ kG init 0+ kK init 0+ klastcut init -1+ klastQ init -1+ kS35 init 0 + kalpha init -1 + klpf2_beta init -1 + khpf1_beta init -1 ++ kindx = 0+ kQ = limit(kQ, 1.0, 10.0)+ kcf = kcutoff ++ if (klastcut != kcf) then+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 + kG = kg / (1 + kg)++ endif++ if (klastQ != kQ) then+ kK = 0.01 + ((2.0 - 0.01) * (kQ / 10.0))+ endif++ if ((klastcut != kcf) || (klastQ != kQ)) then+ klpf2_beta = (kK - (kK * kG)) / (1.0 + kg)+ khpf1_beta = -1.0 / (1.0 + kg)+ kalpha = 1.0 / (1.0 - (kK * kG) + (kK * kG * kG))+ endif++ klastcut = kcf+ klastQ = kQ+ + while (kindx < ksmps) do+ ksig = ain[kindx]++ ;; lpf1+ kv1 = (ksig - kz1) * kG+ klp1 = kv1 + kz1 + kz1 = klp1 + kv1+ + ku = kalpha * (klp1 + kS35)++ if (knonlinear == 1) then+ ku = tanh(ku * ksaturation)+ endif++ ;; lpf2+ kv2 = (ku - kz2) * kG+ klp2 = kv2 + kz2 + kz2 = klp2 + kv2+ ky = kK * klp2++ ;; hpf1+ kv3 = (ky - kz3) * kG+ klp3 = kv3 + kz3 + kz3 = klp3 + kv3+ khp1 = ky - klp3++ kS35 = (klpf2_beta * kz2) + (khpf1_beta * kz3)++ kout = (kK > 0) ? (ky / kK) : ky ++ aout[kindx] = kout++ kindx += 1+ od++ xout aout++endop++++opcode k35_lpf, a, aaKKK++ ain, acutoff, kQ, knonlinear, ksaturation xin++ kz1 init 0+ kz2 init 0+ kz3 init 0+ kv1 init 0+ kv2 init 0+ kv3 init 0+ aout init 0++ kg init 0+ kG init 0+ kK init 0+ klastcut init -1+ klastQ init -1+ kS35 init 0 + kalpha init -1 + klpf2_beta init -1 + khpf1_beta init -1 ++ kindx = 0+ kQ = limit(kQ, 1.0, 10.0)++ if (klastQ != kQ) then+ kK = 0.01 + ((2.0 - 0.01) * (kQ / 10.0))+ endif++ klastQ = kQ+ + while (kindx < ksmps) do+ kcf = acutoff[kindx]+ ksig = ain[kindx]++ if (klastcut != kcf) then+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 + kG = kg / (1 + kg)++ endif++ if ((klastcut != kcf) || (klastQ != kQ)) then+ klpf2_beta = (kK - (kK * kG)) / (1.0 + kg)+ khpf1_beta = -1.0 / (1.0 + kg)+ kalpha = 1.0 / (1.0 - (kK * kG) + (kK * kG * kG))+ endif++ ;; lpf1+ kv1 = (ksig - kz1) * kG+ klp1 = kv1 + kz1 + kz1 = klp1 + kv1+ + ku = kalpha * (klp1 + kS35)++ if (knonlinear == 1) then+ ku = tanh(ku * ksaturation)+ endif++ ;; lpf2+ kv2 = (ku - kz2) * kG+ klp2 = kv2 + kz2 + kz2 = klp2 + kv2+ ky = kK * klp2++ ;; hpf1+ kv3 = (ky - kz3) * kG+ klp3 = kv3 + kz3 + kz3 = klp3 + kv3+ khp1 = ky - klp3++ kS35 = (klpf2_beta * kz2) + (khpf1_beta * kz3)++ kout = (kK > 0) ? (ky / kK) : ky ++ aout[kindx] = kout++ klastcut = kcf+ kindx += 1+ od++ xout aout++endop++;; 6db/oct high-pass filter based on Korg 35 module+;; (found in MS-10 and MS-20).+;; +;; Based on code by Will Pirkle, presented in:+;; +;; http://www.willpirkle.com/Downloads/AN-7Korg35HPF_V2.pdf +;; +;; [ARGS]+;; +;; ain - audio input+;; acutoff - frequency of cutoff+;; kQ - filter Q [1, 10.0] (k35_hpf will clamp to boundaries)+;; knonlinear - use non-linear processing+;; ksaturation - saturation for tanh distortion++opcode k35_hpf, a, aKKKK++ ain, kcutoff, kQ, knonlinear, ksaturation xin++ kz1 init 0+ kz2 init 0+ kz3 init 0+ kv1 init 0+ kv2 init 0+ kv3 init 0+ aout init 0++ kg init 0+ kG init 0+ kK init 0+ klastcut init -1+ klastQ init -1+ kS35 init 0 + kalpha init -1 + khpf2_beta init -1 + klpf1_beta init -1 ++ kindx = 0+ kQ = limit(kQ, 1.0, 10.0)+ kcf = kcutoff ++ if (klastcut != kcf) then+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 + kG = kg / (1 + kg)++ endif++ if (klastQ != kQ) then+ kK = 0.01 + ((2.0 - 0.01) * (kQ / 10.0))+ endif++ if ((klastcut != kcf) || (klastQ != kQ)) then+ khpf2_beta = -kG / (1.0 + kg)+ klpf1_beta = 1.0 / (1.0 + kg)+ kalpha = 1.0 / (1.0 - (kK * kG) + (kK * kG * kG))+ endif++ klastcut = kcf+ klastQ = kQ+ + while (kindx < ksmps) do+ ksig = ain[kindx]++ ;; hpf1+ kv1 = (ksig - kz1) * kG+ klp1 = kv1 + kz1 + kz1 = klp1 + kv1+ ky1 = ksig - klp1+ + ku = kalpha * (ky1 + kS35)+ ky = kK * ku++ if (knonlinear == 1) then+ ky = tanh(ky * ksaturation)+ endif++ ;; hpf2+ kv2 = (ky - kz2) * kG+ klp2 = kv2 + kz2 + kz2 = klp2 + kv2+ khp2 = ky - klp2 ++ ;; lpf1+ kv3 = (khp2 - kz3) * kG+ klp3 = kv3 + kz3 + kz3 = klp3 + kv3++ kS35 = (khpf2_beta * kz2) + (klpf1_beta * kz3)++ kout = (kK > 0) ? (ky / kK) : ky ++ aout[kindx] = kout++ kindx += 1+ od++ xout aout++endop+++opcode k35_hpf, a, aaKKK++ ain, acutoff, kQ, knonlinear, ksaturation xin++ kz1 init 0+ kz2 init 0+ kz3 init 0+ kv1 init 0+ kv2 init 0+ kv3 init 0+ aout init 0++ kg init 0+ kG init 0+ kK init 0+ klastcut init -1+ klastQ init -1+ kS35 init 0 + kalpha init -1 + khpf2_beta init -1 + klpf1_beta init -1 ++ kindx = 0+ kQ = limit(kQ, 1.0, 10.0)++ if (klastQ != kQ) then+ kK = 0.01 + ((2.0 - 0.01) * (kQ / 10.0))+ endif++ klastQ = kQ+ + while (kindx < ksmps) do+ kcf = acutoff[kindx]+ ksig = ain[kindx]++ if (klastcut != kcf) then+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 + kG = kg / (1 + kg)++ endif++ if ((klastcut != kcf) || (klastQ != kQ)) then+ khpf2_beta = -kG / (1.0 + kg)+ klpf1_beta = 1.0 / (1.0 + kg)+ kalpha = 1.0 / (1.0 - (kK * kG) + (kK * kG * kG))+ endif++ ;; hpf1+ kv1 = (ksig - kz1) * kG+ klp1 = kv1 + kz1 + kz1 = klp1 + kv1+ ky1 = ksig - klp1+ + ku = kalpha * (ky1 + kS35)+ ky = kK * ku++ if (knonlinear == 1) then+ ky = tanh(ky * ksaturation)+ endif++ ;; hpf2+ kv2 = (ky - kz2) * kG+ klp2 = kv2 + kz2 + kz2 = klp2 + kv2+ khp2 = ky - klp2 ++ ;; lpf1+ kv3 = (khp2 - kz3) * kG+ klp3 = kv3 + kz3 + kz3 = klp3 + kv3++ kS35 = (khpf2_beta * kz2) + (klpf1_beta * kz3)++ kout = (kK > 0) ? (ky / kK) : ky ++ aout[kindx] = kout++ klastcut = kcf+ kindx += 1+ od++ xout aout++endop
+ data/opcodes/solina_chorus.udo view
@@ -0,0 +1,56 @@+/* Solina Chorus, based on Solina String Ensemble Chorus Module+ + based on:++ J. Haible: Triple Chorus+ http://jhaible.com/legacy/triple_chorus/triple_chorus.html++ Hugo Portillo: Solina-V String Ensemble+ http://www.native-instruments.com/en/reaktor-community/reaktor-user-library/entry/show/4525/ ++ Parabola tabled shape borrowed from Iain McCurdy delayStereoChorus.csd:+ http://iainmccurdy.org/CsoundRealtimeExamples/Delays/delayStereoChorus.csd++ Author: Steven Yi+ Date: 2016.05.22++ */+++gi_solina_parabola ftgen 0, 0, 65537, 19, 0.5, 1, 180, 1 ++;; 3 sine wave LFOs, 120 degrees out of phase+opcode sol_lfo_3, aaa, KK+ kfreq, kamp xin++ aphs phasor kfreq++ a0 = tablei(aphs, gi_solina_parabola, 1, 0, 1)+ a120 = tablei(aphs, gi_solina_parabola, 1, 0.333, 1)+ a240 = tablei(aphs, gi_solina_parabola, 1, -0.333, 1)++ xout (a0 * kamp), (a120 * kamp), (a240 * kamp)+endop++opcode solina_chorus, a, aKKKK++ aLeft, klfo_freq1, klfo_amp1, klfo_freq2, klfo_amp2 xin++ imax = 100++ ;; slow lfo+ as1, as2, as3 sol_lfo_3 klfo_freq1, klfo_amp1++ ;; fast lfo+ af1, af2, af3 sol_lfo_3 klfo_freq2, klfo_amp2++ at1 = limit(as1 + af1 + 5, 0.0, imax)+ at2 = limit(as2 + af2 + 5, 0.0, imax)+ at3 = limit(as3 + af3 + 5, 0.0, imax)+ + a1 vdelay3 aLeft, at1, imax + a2 vdelay3 aLeft, at2, imax + a3 vdelay3 aLeft, at3, imax ++xout (a1 + a2 + a3) / 3+endop
+ data/opcodes/tdf2.udo view
@@ -0,0 +1,166 @@+++/* + Transposed Direct Form II Biquad ++ Based on C++ code by Nigel Redmon: + http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/+++ OUTPUT+ aout - filtered signal++ INPUT+ asig - input signal+ ifilter_type - filter type: + 0 - Low Pass+ 1 - High Pass+ 2 - Band Pass+ 3 - Notch+ 4 - Peaking+ 5 - Low Shelf+ 6 - High Shelf+ acutoff - cutoff frequency+ aQ - Q value+ again - gain (used by peaking, low shelf, and high shelf)++*/+opcode tdf2, a, aiaaa++asig, ifilter_type, acutoff, aQ, again xin++/* Memory */+kz1 init 0+kz2 init 0++klast_Fc init 0+klast_Q init 0+klast_gain init 0++ka0 init 0+ka1 init 0+ka2 init 0+kb1 init 0+kb2 init 0++aout init 0+++kndx = 0+while (kndx < ksmps) do+ kcut = acutoff[kndx]+ kQ = aQ[kndx]+ kgain = again[kndx]++ if(kcut != klast_Fc || kQ != klast_Q || kgain != klast_gain) then++ kK = tan($M_PI * (kcut / sr))+ kV = pow(10, abs(kgain) / 20.0)+ kK2 = kK * kK++ if (ifilter_type == 0) then ;; LPF+ knorm = 1 / (1 + kK / kQ + kK2)+ ka0 = kK2 * knorm+ ka1 = 2 * ka0+ ka2 = ka0+ kb1 = 2 * (kK2 - 1) * knorm+ kb2 = (1 - kK / kQ + kK2) * knorm++ elseif (ifilter_type == 1) then ;; HPF+ knorm = 1 / (1 + kK / kQ + kK2)+ ka0 = 1 * knorm+ ka1 = -2 * ka0+ ka2 = ka0+ kb1 = 2 * (kK2 - 1) * knorm+ kb2 = (1 - kK / kQ + kK2) * knorm++ elseif (ifilter_type == 2) then ;; BPF+ knorm = 1 / (1 + kK / kQ + kK2)+ ka0 = kK / kQ * knorm+ ka1 = 0+ ka2 = -ka0+ kb1 = 2 * (kK2 - 1) * knorm+ kb2 = (1 - kK / kQ + kK2) * knorm++ elseif (ifilter_type == 3) then ;; Notch + knorm = 1 / (1 + kK / kQ + kK2)+ ka0 = (1 + kK2) * knorm+ ka1 = 2 * (kK2 - 1) * knorm+ ka2 = ka0+ kb1 = ka1+ kb2 = (1 - kK / kQ + kK2) * knorm++ elseif (ifilter_type == 4) then ;; Peaking + if (kgain >= 0) then ;; boost+ knorm = 1 / (1 + kK/kQ + kK2);+ ka0 = (1 + kV/kQ * kK + kK2) * knorm;+ ka1 = 2 * (kK2 - 1) * knorm;+ ka2 = (1 - kV/kQ * kK + kK2) * knorm;+ kb1 = ka1;+ kb2 = (1 - 1/kQ * kK + kK2) * knorm;+ else ;; cut+ knorm = 1 / (1 + kV/kQ * kK + kK2)+ ka0 = (1 + kK/kQ + kK2) * knorm+ ka1 = 2 * (kK2 - 1) * knorm+ ka2 = (1 - kK/kQ + kK2) * knorm+ kb1 = ka1+ kb2 = (1 - kV/kQ * kK + kK2) * knorm+ endif++ elseif (ifilter_type == 5) then ;; Low Shelf + if (kgain >= 0) then ;; boost+ knorm = 1 / (1 + sqrt(2) * kK + kK2)+ ka0 = (1 + sqrt(2*kV) * kK + kV * kK2) * knorm+ ka1 = 2 * (kV * kK2 - 1) * knorm+ ka2 = (1 - sqrt(2*kV) * kK + kV * kK2) * knorm+ kb1 = 2 * (kK2 - 1) * knorm+ kb2 = (1 - sqrt(2) * kK + kK2) * knorm+ else ;; cut+ knorm = 1 / (1 + sqrt(2*kV) * kK + kV * kK2)+ ka0 = (1 + sqrt(2) * kK + kK2) * knorm+ ka1 = 2 * (kK2 - 1) * knorm+ ka2 = (1 - sqrt(2) * kK + kK2) * knorm+ kb1 = 2 * (kV * kK2 - 1) * knorm+ kb2 = (1 - sqrt(2*kV) * kK + kV * kK2) * knorm+ endif++ elseif (ifilter_type == 6) then ;; High Shelf + if (kgain >= 0) then ;; boost+ knorm = 1 / (1 + sqrt(2) * kK + kK2)+ ka0 = (kV + sqrt(2*kV) * kK + kK2) * knorm+ ka1 = 2 * (kK2 - kV) * knorm+ ka2 = (kV - sqrt(2*kV) * kK + kK2) * knorm+ kb1 = 2 * (kK2 - 1) * knorm+ kb2 = (1 - sqrt(2) * kK + kK2) * knorm+ else ;; cut+ knorm = 1 / (kV + sqrt(2*kV) * kK + kK2)+ ka0 = (1 + sqrt(2) * kK + kK2) * knorm+ ka1 = 2 * (kK2 - 1) * knorm+ ka2 = (1 - sqrt(2) * kK + kK2) * knorm+ kb1 = 2 * (kK2 - kV) * knorm+ kb2 = (kV - sqrt(2*kV) * kK + kK2) * knorm+ endif++ endif+ endif++ kin = asig[kndx]++ /* TDF2 Biquad Calculation */+ kout = kin * ka0 + kz1+ kz1 = kin * ka1 + kz2 - kb1 * kout+ kz2 = kin * ka2 - kb2 * kout++ /* Output, state saving for next pass */+ aout[kndx] = kout++ klast_Fc = kcut+ klast_Q = kQ++ kndx += 1+od++xout aout++endop+
+ data/opcodes/zdf.udo view
@@ -0,0 +1,540 @@++; Zero Delay Feedback Filters+; +; Based on code by Will Pirkle, presented in:+;+; http://www.willpirkle.com/Downloads/AN-4VirtualAnalogFilters.2.0.pdf+; +; and in his book "Designing software synthesizer plug-ins in C++ : for +; RackAFX, VST3, and Audio Units"+;+; ZDF using Trapezoidal integrator by Vadim Zavalishin, presented in "The Art +; of VA Filter Design" (https://www.native-instruments.com/fileadmin/ni_media/+; downloads/pdf/VAFilterDesign_1.1.1.pdf)+;+; UDO versions by Steven Yi (2016.xx.xx)+++;; 1-pole (6dB) lowpass/highpass filter+;; takes in a a-rate signal and cutoff value in frequency+opcode zdf_1pole, aa, ak+ ain, kcf xin++ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 ++ ; big combined value+ kG = kg / (1.0 + kg)++ ahp init 0+ alp init 0++ ;; state for integrators+ kz1 init 0++ kindx = 0+ while kindx < ksmps do+ ; do the filter, see VA book p. 46 + ; form sub-node value v(n) + kin = ain[kindx]+ kv = (kin - kz1) * kG ++ ; form output of node + register + klp = kv + kz1 + khp = kin - klp ++ ; z1 register update+ kz1 = klp + kv ++ alp[kindx] = klp+ ahp[kindx] = khp+ kindx += 1+ od++ xout alp, ahp+endop+++;; 1-pole (6dB) lowpass/highpass filter+;; takes in a a-rate signal and cutoff value in frequency+opcode zdf_1pole, aa, aa+ ain, acf xin++ ; pre-warp the cutoff- these are bilinear-transform filters+ iT = 1/sr ++ ahp init 0+ alp init 0++ ;; state for integrators+ kz1 init 0++ kindx = 0+ while kindx < ksmps do+ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * acf[kindx]+ kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 ++ ; big combined value+ kG = kg / (1.0 + kg)++ ; do the filter, see VA book p. 46 + ; form sub-node value v(n) + kin = ain[kindx]+ kv = (kin - kz1) * kG ++ ; form output of node + register + klp = kv + kz1 + khp = kin - klp ++ ; z1 register update+ kz1 = klp + kv ++ alp[kindx] = klp+ ahp[kindx] = khp+ kindx += 1+ od++ xout alp, ahp+endop++;; 1-pole allpass filter+;; takes in an a-rate signal and corner frequency where input+;; phase is shifted -90 degrees+opcode zdf_allpass_1pole, a, ak+ ain, kcf xin+ alp, ahp zdf_1pole ain, kcf+ aout = alp - ahp+ xout aout+endop+++;; 1-pole allpass filter+;; takes in an a-rate signal and corner frequency where input+;; phase is shifted -90 degrees+opcode zdf_allpass_1pole, a, aa+ ain, acf xin+ alp, ahp zdf_1pole ain, acf+ aout = alp - ahp+ xout aout+endop+++;; 2-pole (12dB) lowpass/highpass/bandpass filter+;; takes in a a-rate signal, cutoff value in frequency, and+;; Q factor for resonance+opcode zdf_2pole,aaa,aKK++ ain, kcf, kQ xin++ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kG = kwa * iT/2 + kR = 1 / (2 * kQ)++ ;; output signals+ alp init 0+ ahp init 0+ abp init 0++ ;; state for integrators+ kz1 init 0+ kz2 init 0++ ;;+ kindx = 0+ while kindx < ksmps do+ khp = (ain[kindx] - (2 * kR + kG) * kz1 - kz2) / (1 + (2 * kR * kG) + (kG * kG))+ kbp = kG * khp + kz1+ klp = kG * kbp + kz2++ ; z1 register update+ kz1 = kG * khp + kbp + kz2 = kG * kbp + klp ++ alp[kindx] = klp+ ahp[kindx] = khp+ abp[kindx] = kbp+ kindx += 1+ od++ xout alp, abp, ahp++endop+++;; 2-pole (12dB) lowpass/highpass/bandpass filter+;; takes in a a-rate signal, cutoff value in frequency, and+;; Q factor for resonance+opcode zdf_2pole,aaa,aaa++ ain, acf, aQ xin++ iT = 1/sr ++ ;; output signals+ alp init 0+ ahp init 0+ abp init 0++ ;; state for integrators+ kz1 init 0+ kz2 init 0++ ;;+ kindx = 0+ while kindx < ksmps do++ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * acf[kindx]+ kwa = (2/iT) * tan(kwd * iT/2) + kG = kwa * iT/2 ++ kR = 1 / (2 * aQ[kindx]) ++ khp = (ain[kindx] - (2 * kR + kG) * kz1 - kz2) / (1 + (2 * kR * kG) + (kG * kG))+ kbp = kG * khp + kz1+ klp = kG * kbp + kz2++ ; z1 register update+ kz1 = kG * khp + kbp + kz2 = kG * kbp + klp ++ alp[kindx] = klp+ ahp[kindx] = khp+ abp[kindx] = kbp+ kindx += 1+ od++ xout alp, abp, ahp++endop++;; 2-pole (12dB) lowpass/highpass/bandpass/notch filter+;; takes in a a-rate signal, cutoff value in frequency, and+;; Q factor for resonance+opcode zdf_2pole_notch,aaaa,aKK++ ain, kcf, kQ xin++ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kG = kwa * iT/2 + kR = 1 / (2 * kQ)++ ;; output signals+ alp init 0+ ahp init 0+ abp init 0+ anotch init 0++ ;; state for integrators+ kz1 init 0+ kz2 init 0++ ;;+ kindx = 0+ while kindx < ksmps do+ kin = ain[kindx]+ khp = (kin - (2 * kR + kG) * kz1 - kz2) / (1 + (2 * kR * kG) + (kG * kG))+ kbp = kG * khp + kz1+ klp = kG * kbp + kz2+ knotch = kin - (2 * kR * kbp)++ ; z1 register update+ kz1 = kG * khp + kbp + kz2 = kG * kbp + klp ++ alp[kindx] = klp+ ahp[kindx] = khp+ abp[kindx] = kbp+ anotch[kindx] = knotch+ kindx += 1+ od++ xout alp, abp, ahp, anotch++endop++;; 2-pole (12dB) lowpass/highpass/bandpass/notch filter+;; takes in a a-rate signal, cutoff value in frequency, and+;; Q factor for resonance+opcode zdf_2pole_notch,aaaa,aaa++ ain, acf, aQ xin++ iT = 1/sr ++ ;; output signals+ alp init 0+ ahp init 0+ abp init 0+ anotch init 0++ ;; state for integrators+ kz1 init 0+ kz2 init 0++ ;;+ kindx = 0+ while kindx < ksmps do++ ; pre-warp the cutoff- these are bilinear-transform filters+ kwd = 2 * $M_PI * acf[kindx]+ kwa = (2/iT) * tan(kwd * iT/2) + kG = kwa * iT/2 ++ kR = 1 / (2 * aQ[kindx])++ kin = ain[kindx]+ khp = (kin - (2 * kR + kG) * kz1 - kz2) / (1 + (2 * kR * kG) + (kG * kG))+ kbp = kG * khp + kz1+ klp = kG * kbp + kz2+ knotch = kin - (2 * kR * kbp)++ ; z1 register update+ kz1 = kG * khp + kbp + kz2 = kG * kbp + klp ++ alp[kindx] = klp+ ahp[kindx] = khp+ abp[kindx] = kbp+ anotch[kindx] = knotch+ kindx += 1+ od++ xout alp, abp, ahp, anotch++endop++;; moog ladder++opcode zdf_ladder, a, akk++ ain, kcf, kres xin+ aout init 0++ kR = limit(1 - kres, 0.025, 1)++ kQ = 1 / (2 * kR) ++ kwd = 2 * $M_PI * kcf+ iT = 1/sr + kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 ++ kk = 4.0*(kQ - 0.707)/(25.0 - 0.707)++ kg_2 = kg * kg+ kg_3 = kg_2 * kg++ ; big combined value+ ; for overall filter+ kG = kg_2 * kg_2 + ; for individual 1-poles+ kG_pole = kg/(1.0 + kg)++ ;; state for each 1-pole's integrator + kz1 init 0+ kz2 init 0+ kz3 init 0+ kz4 init 0++ kindx = 0+ while kindx < ksmps do+ ;; processing+ kin = ain[kindx]++ kS = kg_3 * kz1 + kg_2 * kz2 + kg * kz3 + kz4+ ku = (kin - kk * kS) / (1 + kk * kG)++ ;; 1st stage+ kv = (ku - kz1) * kG_pole + klp = kv + kz1+ kz1 = klp + kv++ ;; 2nd stage+ kv = (klp - kz2) * kG_pole + klp = kv + kz2+ kz2 = klp + kv++ ;; 3rd stage+ kv = (klp - kz3) * kG_pole + klp = kv + kz3+ kz3 = klp + kv++ ;; 4th stage+ kv = (klp - kz4) * kG_pole + klp = kv + kz4+ kz4 = klp + kv++ aout[kindx] = klp++ kindx += 1+ od++ xout aout+endop+++opcode zdf_ladder, a, aaa++ ain, acf, ares xin+ aout init 0++ iT = 1/sr ++ ;; state for each 1-pole's integrator + kz1 init 0+ kz2 init 0+ kz3 init 0+ kz4 init 0++ kindx = 0+ while kindx < ksmps do++ kR = limit(1 - ares[kindx], 0.025, 1)++ kQ = 1 / (2 * kR) ++ kwd = 2 * $M_PI * acf[kindx]+ kwa = (2/iT) * tan(kwd * iT/2) + kg = kwa * iT/2 ++ kk = 4.0*(kQ - 0.707)/(25.0 - 0.707)++ kg_2 = kg * kg+ kg_3 = kg_2 * kg++ ; big combined value+ ; for overall filter+ kG = kg_2 * kg_2 + ; for individual 1-poles+ kG_pole = kg/(1.0 + kg)++ ;; processing+ kin = ain[kindx]++ kS = kg_3 * kz1 + kg_2 * kz2 + kg * kz3 + kz4+ ku = (kin - kk * kS) / (1 + kk * kG)++ ;; 1st stage+ kv = (ku - kz1) * kG_pole + klp = kv + kz1+ kz1 = klp + kv++ ;; 2nd stage+ kv = (klp - kz2) * kG_pole + klp = kv + kz2+ kz2 = klp + kv++ ;; 3rd stage+ kv = (klp - kz3) * kG_pole + klp = kv + kz3+ kz3 = klp + kv++ ;; 4th stage+ kv = (klp - kz4) * kG_pole + klp = kv + kz4+ kz4 = klp + kv++ aout[kindx] = klp++ kindx += 1+ od++ xout aout+endop++;; 4-pole++opcode zdf_4pole, aaaaaa, akk+ ain, kcf, kres xin++ alp2, abp2, ahp2 zdf_2pole ain, kcf, kres++ abp4 init 0+ abl4 init 0+ alp4 init 0++ xout alp2, abp2, ahp2, alp4, abl4, abp4+endop++opcode zdf_4pole, aaaaaa, aaa+ ain, acf, ares xin++ alp2, abp2, ahp2 zdf_2pole ain, acf, ares+ abp4 init 0+ abl4 init 0+ alp4 init 0++ xout alp2, abp2, ahp2, alp4, abl4, abp4+endop+++opcode zdf_4pole_hp, aaaaaa, akk+ ain, kcf, kres xin++ alp2, abp2, ahp2 zdf_2pole ain, kcf, kres++ ahp4 init 0+ abh4 init 0+ abp4 init 0++ xout alp2, abp2, ahp2, abp4, abh4, ahp4+endop++opcode zdf_4pole_hp, aaaaaa, aaa+ ain, acf, ares xin++ alp2, abp2, ahp2 zdf_2pole ain, acf, ares++ ahp4 init 0+ abh4 init 0+ abp4 init 0++ xout alp2, abp2, ahp2, abp4, abh4, ahp4+endop++;; TODO - implement+opcode zdf_peak_eq, a, akkk+ ain, kcf, kres, kdB xin++ aout init 0++ xout aout+endop++opcode zdf_high_shelf_eq, a, akk+ ain, kcf, kdB xin++ ;; TODO - convert db to K, check if reusing zdf_1pole is sufficient+ kK init 0++ alp, ahp zdf_1pole ain, kcf++ aout = ain + kK * ahp++ xout aout+endop++opcode zdf_low_shelf_eq, a, akk+ ain, kcf, kdB xin++ ;; TODO - convert db to K, check if reusing zdf_1pole is sufficient+ kK init 0++ alp, ahp zdf_1pole ain, kcf++ aout = ain + kK * alp++ xout aout+endop
+ data/opcodes/zero-delay-convolution.udo view
@@ -0,0 +1,31 @@+; Here’s a UDO for zero-latency partitioned convolution++;/**************************************************+;asig ZConv ain,ipart,irat,inp,ifn+;ain - input signal+;ipart - first partition size in samples+;irat - partition growth ratio+;inp - total number of partition sizes+;ifn - function table number containing the IR+;**************************************************/+opcode ZConv,a,aiiiio+ asig,iprt,irat,inp,ifn,icnt xin+ if icnt < inp-1 then+ acn ZConv asig,iprt,irat,inp,ifn,icnt+1+ endif+ if icnt == 0 then+ a1 dconv asig,iprt,ifn+ elseif icnt < inp-1 then+ ipt = iprt*irat^(icnt-1)+ isiz = ipt*(irat-1)+ print ipt+ print isiz+ a1 ftconv asig,ifn,ipt,ipt,isiz+ else+ ipt = iprt*irat^(icnt-1)+ a1 ftconv asig,ifn,ipt,ipt+ endif+ xout a1 + acn+endop++; a1 ZConv asig,64,4,6,1
src/Csound/Typed/Control/Api.hs view
@@ -57,9 +57,9 @@ noteFlagExpr <- toGE noteFlag args <- fromTuple (pch, vol, other) return $ do- D.when1 (noteFlagExpr ==* 1) $ do+ D.when1 D.Ir (noteFlagExpr ==* 1) $ do eventi (Event instrIdExpr 0 (-1) args)- D.when1 (noteFlagExpr ==* 0) $ do+ D.when1 D.Ir (noteFlagExpr ==* 0) $ do eventi (Event (negate instrIdExpr) 0 0 args) turnoff
src/Csound/Typed/Control/Vco.hs view
@@ -1,12 +1,37 @@ -- | Band-limited oscillators module Csound.Typed.Control.Vco( saw, isaw, pulse, tri, sqr, blosc,- saw', isaw', pulse', tri', sqr', blosc'+ saw', isaw', pulse', tri', sqr', blosc',++ -- * Hard sync + SyncSmooth(..),++ sawSync, isawSync, pulseSync, triSync, sqrSync, bloscSync,+ sawSync', isawSync', pulseSync', triSync', sqrSync', bloscSync',++ -- ** Hard sync with absolute frequency for slave oscillator+ sawSyncAbs, isawSyncAbs, pulseSyncAbs, triSyncAbs, sqrSyncAbs, bloscSyncAbs,+ sawSyncAbs', isawSyncAbs', pulseSyncAbs', triSyncAbs', sqrSyncAbs', bloscSyncAbs',++ -- ** Hard sync with custom smoothing algorythm+ sawSyncBy, isawSyncBy, pulseSyncBy, triSyncBy, sqrSyncBy, bloscSyncBy,+ sawSyncBy', isawSyncBy', pulseSyncBy', triSyncBy', sqrSyncBy', bloscSyncBy',++ -- ** Hard sync with absolute frequency for slave oscillator+ sawSyncAbsBy, isawSyncAbsBy, pulseSyncAbsBy, triSyncAbsBy, sqrSyncAbsBy, bloscSyncAbsBy,+ sawSyncAbsBy', isawSyncAbsBy', pulseSyncAbsBy', triSyncAbsBy', sqrSyncAbsBy', bloscSyncAbsBy'++ ) where +import Data.Default++import Csound.Dynamic(Gen(..), GenId(..)) import Csound.Typed.GlobalState import Csound.Typed.Types +import Csound.Typed.GlobalState+ -------------------------------------------------------------- -- no phase @@ -79,3 +104,406 @@ phsExpr <- toGE phs waveId <- saveBandLimitedWave waveType return $ readBandLimited (Just phsExpr) waveId expr++--------------------------------------------------------------+-- no phase relative sync++relativeSync :: (Sig -> Sig -> Sig) -> (Sig -> Sig -> Sig)+relativeSync f ratioCps masterCps = f (ratioCps * masterCps) masterCps++-- | Sawtooth oscillator with hard-sync.+-- The first argument is a ration between slave and master oscillators.+-- +-- > sawSync ratio cps+sawSync :: Sig -> Sig -> Sig+sawSync = relativeSync sawSyncAbs++-- | Integrated sawtooth oscillator with hard-sync.+-- The first argument is a ration between slave and master oscillators.+-- +-- > isawSync ratio cps+isawSync :: Sig -> Sig -> Sig+isawSync = relativeSync isawSyncAbs+++-- | Triangle oscillator with hard-sync.+-- The first argument is a ration between slave and master oscillators.+-- +-- > triSync ratio cps+triSync :: Sig -> Sig -> Sig+triSync = relativeSync triSyncAbs++-- | Pulse oscillator with hard-sync.+-- The first argument is a ration between slave and master oscillators.+-- +-- > pulseSync ratio cps+pulseSync :: Sig -> Sig -> Sig+pulseSync = relativeSync pulseSyncAbs++-- | Square oscillator with hard-sync.+-- The first argument is a ration between slave and master oscillators.+-- +-- > sqrSync ratio cps+sqrSync :: Sig -> Sig -> Sig+sqrSync = relativeSync sqrSyncAbs++-- | Band-limited oscillator with hard-sync.+-- The first argument is a ration between slave and master oscillators.+-- +-- > bloscSync tab ratio cps+bloscSync :: Tab -> Sig -> Sig -> Sig+bloscSync t = relativeSync (bloscSyncAbs t)++--------------------------------------------------------------+++relativeSync' :: (D -> Sig -> Sig -> Sig) -> (D -> Sig -> Sig -> Sig)+relativeSync' f phase ratioCps masterCps = f phase (ratioCps * masterCps) masterCps++-- | Sawtooth oscillator with hard-sync with phase.+-- The second argument is a ration between slave and master oscillators.+-- +-- > sawSync' phase ratio cps+sawSync' :: D -> Sig -> Sig -> Sig+sawSync' = relativeSync' sawSyncAbs'++-- | Integrated sawtooth oscillator with hard-sync with phase.+-- The second argument is a ration between slave and master oscillators.+-- +-- > isawSync' phase ratio cps+isawSync' :: D -> Sig -> Sig -> Sig+isawSync' = relativeSync' isawSyncAbs'++-- | Triangle oscillator with hard-sync with phase.+-- The second argument is a ration between slave and master oscillators.+-- +-- > triSync' phase ratio cps+triSync' :: D -> Sig -> Sig -> Sig+triSync' = relativeSync' triSyncAbs'++-- | Pulse oscillator with hard-sync with phase.+-- The second argument is a ration between slave and master oscillators.+-- +-- > pulseSync' phase ratio cps+pulseSync' :: D -> Sig -> Sig -> Sig+pulseSync' = relativeSync' pulseSyncAbs'++-- | Square oscillator with hard-sync with phase.+-- The second argument is a ration between slave and master oscillators.+-- +-- > sqrSync' phase ratio cps+sqrSync' :: D -> Sig -> Sig -> Sig+sqrSync' = relativeSync' sqrSyncAbs'++-- | Band-limited oscillator with hard-sync with phase.+-- The second argument is a ration between slave and master oscillators.+-- +-- > bloscSync' phase tab ratio cps+bloscSync' :: Tab -> D -> Sig -> Sig -> Sig+bloscSync' t = relativeSync' (bloscSyncAbs' t)++--------------------------------------------------------------+-- no phase relative sync++relativeSyncBy :: (SyncSmooth -> Sig -> Sig -> Sig) -> (SyncSmooth -> Sig -> Sig -> Sig)+relativeSyncBy f smoothType ratioCps masterCps = f smoothType (ratioCps * masterCps) masterCps++-- | Sawtooth oscillator with hard-sync. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > sawSyncBy spec ratio cps+sawSyncBy :: SyncSmooth -> Sig -> Sig -> Sig+sawSyncBy = relativeSyncBy sawSyncAbsBy++-- | Integrated sawtooth oscillator with hard-sync. We can specify the smoothness type.+-- The first argument is a ration between slave and master oscillators.+-- +-- > isawSyncB specy ratio cps+isawSyncBy :: SyncSmooth -> Sig -> Sig -> Sig+isawSyncBy = relativeSyncBy isawSyncAbsBy++-- | Triangle oscillator with hard-sync. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > triSyncBy spec ratio cps+triSyncBy :: SyncSmooth -> Sig -> Sig -> Sig+triSyncBy = relativeSyncBy triSyncAbsBy++-- | Pulse oscillator with hard-sync. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > pulseSyncBy spec ratio cps+pulseSyncBy :: SyncSmooth -> Sig -> Sig -> Sig+pulseSyncBy = relativeSyncBy pulseSyncAbsBy++-- | Square oscillator with hard-sync. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > sawSyncBy spec ratio cps+sqrSyncBy :: SyncSmooth -> Sig -> Sig -> Sig+sqrSyncBy = relativeSyncBy sqrSyncAbsBy++-- | Bandlimited table oscillator with hard-sync. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > bloscSyncBy spec tab ratio cps+bloscSyncBy :: SyncSmooth -> Tab -> Sig -> Sig -> Sig+bloscSyncBy smoothType t = relativeSyncBy (\smoothType -> bloscSyncAbsBy smoothType t) smoothType++------------------------------------------------------------+-- phase++relativeSyncBy' :: (SyncSmooth -> D -> Sig -> Sig -> Sig) -> (SyncSmooth -> D -> Sig -> Sig -> Sig)+relativeSyncBy' f smoothType phase ratioCps masterCps = f smoothType phase (ratioCps * masterCps) masterCps++-- | Sawtooth oscillator with hard-sync with phase. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > sawSyncBy' spec phase ratio cps+sawSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+sawSyncBy' = relativeSyncBy' sawSyncAbsBy'++-- | Integrated sawtooth oscillator with hard-sync with phase. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > isawSyncBy' spec phase ratio cps+isawSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+isawSyncBy' = relativeSyncBy' isawSyncAbsBy'++-- | Triangle oscillator with hard-sync with phase. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > triSyncBy' spec phase ratio cps+triSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+triSyncBy' = relativeSyncBy' triSyncAbsBy'++-- | Pulse oscillator with hard-sync with phase. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > pulseSyncBy' spec phase ratio cps+pulseSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+pulseSyncBy' = relativeSyncBy' pulseSyncAbsBy'++-- | Square oscillator with hard-sync with phase. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > sawSyncBy' spec phase ratio cps+sqrSyncBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+sqrSyncBy' = relativeSyncBy' sqrSyncAbsBy'++-- | Bandlimited table oscillator with hard-sync with phase. We can specify the smoothness type.+-- The @ratio@ argument is a ration between slave and master oscillators.+-- +-- > bloscSyncBy' spec phase tab ratio cps+bloscSyncBy' :: SyncSmooth -> Tab -> D -> Sig -> Sig -> Sig+bloscSyncBy' smoothType t = relativeSyncBy' (\smoothType -> bloscSyncAbsBy' smoothType t) smoothType++------------------------------------------------------------++-- | Sawtooth oscillator with hard-sync.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > sawSyncAbs freq slaveCps masterCps+sawSyncAbs :: Sig -> Sig -> Sig+sawSyncAbs = sawSyncAbsBy def++-- | Integrated sawtooth oscillator with hard-sync.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > isawSyncAbs freq slaveCps masterCps+isawSyncAbs :: Sig -> Sig -> Sig+isawSyncAbs = isawSyncAbsBy def++-- | Triangle oscillator with hard-sync.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > triSyncAbs freq slaveCps masterCps+triSyncAbs :: Sig -> Sig -> Sig+triSyncAbs = triSyncAbsBy def++-- | Pulse oscillator with hard-sync.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > pulseSyncAbs freq slaveCps masterCps+pulseSyncAbs :: Sig -> Sig -> Sig+pulseSyncAbs = pulseSyncAbsBy def++-- | Square oscillator with hard-sync.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > sqrSyncAbs freq slaveCps masterCps+sqrSyncAbs :: Sig -> Sig -> Sig+sqrSyncAbs = sqrSyncAbsBy def++-- | Bandlimited table oscillator with hard-sync.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > bloscSyncAbs tab freq slaveCps masterCps+bloscSyncAbs :: Tab -> Sig -> Sig -> Sig+bloscSyncAbs = bloscSyncAbsBy def++-----------------------------------------------------------++-- | Sawtooth oscillator with hard-sync with phase.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > sawSyncAbs' phase freq slaveCps masterCps+sawSyncAbs' :: D -> Sig -> Sig -> Sig+sawSyncAbs' = sawSyncAbsBy' def++-- | Integrated sawtooth oscillator with hard-sync with phase.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > isawSyncAbs' phase freq slaveCps masterCps+isawSyncAbs' :: D -> Sig -> Sig -> Sig+isawSyncAbs' = isawSyncAbsBy' def++-- | Triangle oscillator with hard-sync with phase.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > triSyncAbs' phase freq slaveCps masterCps+triSyncAbs' :: D -> Sig -> Sig -> Sig+triSyncAbs' = triSyncAbsBy' def++-- | Pulse oscillator with hard-sync with phase.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > pulseSyncAbs' phase freq slaveCps masterCps+pulseSyncAbs' :: D -> Sig -> Sig -> Sig+pulseSyncAbs' = pulseSyncAbsBy' def++-- | Square oscillator with hard-sync with phase.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > sqrSyncAbs' phase freq slaveCps masterCps+sqrSyncAbs' :: D -> Sig -> Sig -> Sig+sqrSyncAbs' = sqrSyncAbsBy' def++-- | Bandlimited table oscillator with hard-sync with phase.+-- The @freq@ argument is an absolute frequency of a slave oscillator.+-- +-- > bloscSyncAbs' phase tab freq slaveCps masterCps+bloscSyncAbs' :: Tab -> D -> Sig -> Sig -> Sig+bloscSyncAbs' = bloscSyncAbsBy' def++--------------------------------------------------------------+-- no phase++-- | A hard sync for sawtooth with absolute slave frequency.+--+-- > sawSyncAbs syncType salveCps masterCps+sawSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig+sawSyncAbsBy = noPhaseWaveHardSync Saw++-- | A hard sync for integrated sawtooth: 4 * x * (1 - x) with absolute slave frequency.+--+-- > isawSyncAbs syncType salveCps masterCps+isawSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig+isawSyncAbsBy = noPhaseWaveHardSync IntegratedSaw++-- | A hard sync for triangle wave with absolute slave frequency.+--+-- > triSyncAbs syncType salveCps masterCps+triSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig+triSyncAbsBy = noPhaseWaveHardSync Triangle++-- | A hard sync for pulse wave with absolute slave frequency.+--+-- > pulseSyncAbs syncType salveCps masterCps+pulseSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig +pulseSyncAbsBy = noPhaseWaveHardSync Pulse++-- | A hard sync for square wave with absolute slave frequency.+--+-- > sqrSyncAbs syncType salveCps masterCps+sqrSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig+sqrSyncAbsBy = noPhaseWaveHardSync Square++-- | A hard sync for band-limited oscillator with user defined waveform (it's stored in the table) woth absolute frequency.+--+-- > bloscSyncAbs syncType ftable salveCps masterCps+bloscSyncAbsBy :: SyncSmooth -> Tab -> Sig -> Sig -> Sig+bloscSyncAbsBy smoothType tab ratioCps cps = hideGE $ do+ gen <- fromPreTab $ getPreTabUnsafe "blosc: tab should be primitive, not an expression." tab+ return $ noPhaseWaveHardSync (UserGen gen) smoothType ratioCps cps++--------------------------------------------------------------+-- with phase++-- | A sawtooth.+sawSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+sawSyncAbsBy' = withPhaseWaveHardSync Saw++-- | Integrated sawtooth: 4 * x * (1 - x).+isawSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+isawSyncAbsBy' = withPhaseWaveHardSync IntegratedSaw++-- | A triangle wave.+triSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+triSyncAbsBy' = withPhaseWaveHardSync Triangle++-- | Pulse (not normalized).+pulseSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig +pulseSyncAbsBy' = withPhaseWaveHardSync Pulse++-- | A square wave.+sqrSyncAbsBy' :: SyncSmooth -> D -> Sig -> Sig -> Sig+sqrSyncAbsBy' = withPhaseWaveHardSync Square++-- | A band-limited oscillator with user defined waveform (it's stored in the table).+bloscSyncAbsBy' :: SyncSmooth -> Tab -> D -> Sig -> Sig -> Sig+bloscSyncAbsBy' smoothType tab phs ratioCps cps = hideGE $ do+ gen <- fromPreTab $ getPreTabUnsafe "blosc: tab should be primitive, not an expression." tab+ return $ withPhaseWaveHardSync (UserGen gen) smoothType phs ratioCps cps++-----------------------------------------------++-- | Type of smooth shape to make smooth transitions on retrigger.+-- Available types are: +--+-- * No smooth: @RawSync@+--+-- * Ramp smooth: @SawSync@+--+-- * Triangular smooth: @TriSync@+--+-- * User defined shape: @UserSync@+data SyncSmooth = RawSync | SawSync | TriSync | TrapSync | UserSync Tab++instance Default SyncSmooth where+ def = TrapSync++getSyncShape :: SyncSmooth -> GE (Maybe BandLimited)+getSyncShape x = case x of+ RawSync -> return $ Nothing+ SawSync -> gen7 4097 [1, 4097, 0]+ TriSync -> gen7 4097 [0, 2048, 1, 2049, 0]+ TrapSync -> gen7 4097 [1, 2048, 1, 2049, 0]+ UserSync tab -> do+ gen <- fromPreTab $ getPreTabUnsafe "blosc: tab should be primitive, not an expression." tab+ return $ Just $ UserGen gen+ where+ gen7 size args = return $ Just $ UserGen $ Gen { genSize = size, genId = IntGenId 7, genArgs = args, genFile = Nothing }++noPhaseWaveHardSync :: BandLimited -> SyncSmooth -> Sig -> Sig -> Sig+noPhaseWaveHardSync waveType smoothWaveType slaveCps cps = fromGE $ do+ smoothWave <- getSyncShape smoothWaveType+ exprSlaveCps <- toGE slaveCps+ exprCps <- toGE cps+ waveId <- saveBandLimitedWave waveType+ smoothWaveId <- case smoothWave of+ Nothing -> return Nothing+ Just wave -> fmap Just $ saveBandLimitedWave wave+ return $ readHardSyncBandLimited smoothWaveId Nothing waveId exprSlaveCps exprCps++withPhaseWaveHardSync :: BandLimited -> SyncSmooth -> D -> Sig -> Sig -> Sig+withPhaseWaveHardSync waveType smoothWaveType phs slaveCps cps = fromGE $ do+ smoothWave <- getSyncShape smoothWaveType+ phsExpr <- toGE phs+ exprSlaveCps <- toGE slaveCps+ exprCps <- toGE cps+ waveId <- saveBandLimitedWave waveType+ smoothWaveId <- case smoothWave of+ Nothing -> return Nothing+ Just wave -> fmap Just $ saveBandLimitedWave wave+ return $ readHardSyncBandLimited smoothWaveId (Just phsExpr) waveId exprSlaveCps exprCps
src/Csound/Typed/GlobalState.hs view
@@ -5,7 +5,7 @@ module Csound.Typed.GlobalState.Instr, module Csound.Typed.GlobalState.Cache, -- * Reexports dynamic - BandLimited(..), readBandLimited, renderBandLimited,+ BandLimited(..), readBandLimited, readHardSyncBandLimited, renderBandLimited, Instrs(..), IdMap(..), getInstrIds, getIn, chnUpdateUdo, renderGlobals, turnoff, turnoff2, exitnow, oscListen, oscInit, oscSend,
src/Csound/Typed/GlobalState/Elements.hs view
@@ -8,9 +8,10 @@ -- Sf2 SfFluid(..), SfSpec(..), SfMap, newSf, sfVar, renderSf, -- ** Band-limited waveforms- BandLimited(..), BandLimitedMap, + BandLimited(..), BandLimitedMap(..), BandLimitedId(..), saveBandLimited, renderBandLimited,- readBandLimited,+ readBandLimited, readHardSyncBandLimited,+ -- ** String arguments StringMap, newString, -- * Midi@@ -29,7 +30,9 @@ subinstr, subinstr_, event_i, event, safeOut, autoOff, changed, -- * Udo plugins UdoPlugin, addUdoPlugin, getUdoPluginNames,- tabQueuePlugin, tabQueue2Plugin + tabQueuePlugin, tabQueue2Plugin,+ zdfPlugin, solinaChorusPlugin, audaciouseqPlugin, adsr140Plugin, + diodePlugin, korg35Plugin, zeroDelayConvolutionPlugin ) where import Data.List@@ -51,7 +54,8 @@ data IdMap a = IdMap { idMapContent :: M.Map a Int- , idMapNewId :: Int }+ , idMapNewId :: Int + } deriving (Eq, Ord) instance Default (IdMap a) where def = IdMap def 1@@ -187,36 +191,85 @@ data BandLimited = Saw | Pulse | Square | Triangle | IntegratedSaw | UserGen Gen deriving (Eq, Ord) -type BandLimitedMap = M.Map BandLimited Int+data BandLimitedId = SimpleBandLimitedWave Int | UserBandLimitedWave Int+ deriving (Eq, Ord) -saveBandLimited :: BandLimited -> State (GenMap, BandLimitedMap) Int+bandLimitedIdToExpr :: BandLimitedId -> E+bandLimitedIdToExpr x = case x of+ SimpleBandLimitedWave simpleId -> int simpleId+ UserBandLimitedWave userId -> noRate $ ReadVar $ bandLimitedVar userId++bandLimitedVar userId = Var GlobalVar Ir ("BandLim" ++ show userId)++data BandLimitedMap = BandLimitedMap + { simpleBandLimitedMap :: M.Map BandLimited BandLimitedId+ , vcoInitMap :: GenMap+ } deriving (Eq, Ord)++instance Default BandLimitedMap where+ def = BandLimitedMap def def++saveBandLimited :: BandLimited -> State BandLimitedMap BandLimitedId saveBandLimited x = case x of Saw -> simpleWave 1 0 IntegratedSaw -> simpleWave 2 1 Pulse -> simpleWave 4 2 Square -> simpleWave 8 3 Triangle -> simpleWave 16 4- UserGen _ -> userGen + UserGen gen -> userGen gen where- simpleWave writeId readId = state $ \s@(genMap, blMap) ->- if (M.member x blMap) - then (readId, s)- else (readId, (genMap, M.insert x writeId blMap))+ simpleWave writeId readId = state $ \blMap ->+ if (M.member x (simpleBandLimitedMap blMap)) + then (SimpleBandLimitedWave readId, blMap)+ else (SimpleBandLimitedWave readId, blMap { simpleBandLimitedMap = M.insert x (SimpleBandLimitedWave writeId) (simpleBandLimitedMap blMap) }) - userGen = state $ \s@(genMap, blMap) -> case M.lookup x blMap of- Just n -> (n, s)- Nothing -> - let (newId, genMap1) = runState newGenId genMap- blMap1 = M.insert x newId blMap- in (negate newId, (genMap1, blMap1)) + userGen gen = state $ \blMap -> + let genMap = vcoInitMap blMap+ (newId, genMap1) = runState (saveId gen) genMap+ blMap1 = blMap { vcoInitMap = genMap1 } + in (UserBandLimitedWave newId, blMap1) + renderBandLimited :: Monad m => GenMap -> BandLimitedMap -> DepT m ()-renderBandLimited genMap blMap = case M.toList blMap of- [] -> return ()- as -> render (idMapNewId genMap) (getUserGens as) as+renderBandLimited genMap blMap = + if isEmptyBlMap blMap + then return ()+ else render (idMapNewId genMap) (M.toList $ idMapContent $ vcoInitMap blMap) (M.toList $ simpleBandLimitedMap blMap) where - render n gens vcos = do- mapM_ renderGen gens+ isEmptyBlMap m = (M.null $ simpleBandLimitedMap m) && (M.null $ idMapContent $ vcoInitMap m)++ render lastGenId gens vcos = do+ writeVar freeVcoVar $ int (lastGenId + length gens + 100) + mapM_ (renderGen lastGenId) gens+ mapM_ renderVco vcos++ renderGen :: Monad m => Int -> (Gen, Int) -> DepT m ()+ renderGen lastGenId (gen, genId) = do+ renderFtgen lastGenId (gen, genId)+ renderVcoGen genId+ renderVcoVarAssignment genId ++ freeVcoVar = Var GlobalVar Ir "free_vco"+ ftVar n = Var GlobalVar Ir $ "vco_table_" ++ show n ++ renderFtgen lastGenId (g, n) = writeVar (ftVar n) $ ftgen (int $ lastGenId + n) g ++ renderVcoGen ftId = do+ ft <- readVar (ftVar ftId)+ free <- readVar freeVcoVar+ writeVar freeVcoVar $ vco2init [-ft, free, 1.05, -1, -1, ft]++ renderVcoVarAssignment n = writeVar (bandLimitedVar n) =<< (fmap negate $ readVar (ftVar n))++ renderVco :: Monad m => (BandLimited, BandLimitedId) -> DepT m ()+ renderVco (bandLimited, blId) = case blId of+ SimpleBandLimitedWave waveId -> do+ free <- readVar freeVcoVar+ writeVar freeVcoVar $ vco2init [int waveId, free]+ UserBandLimitedWave _ -> return ()++ +{- renderFirstVco n (head vcos) mapM_ renderTailVco (tail vcos) @@ -240,10 +293,23 @@ dummyVar = Var LocalVar Ir "ft" toDummy = writeVar dummyVar+-} -readBandLimited :: Maybe E -> Int -> E -> E-readBandLimited mphase n cps = oscilikt 1 cps (vco2ft cps (int n)) mphase+readBandLimited :: Maybe E -> BandLimitedId -> E -> E+readBandLimited mphase n cps = oscilikt 1 cps (vco2ft cps (bandLimitedIdToExpr n)) mphase +readHardSyncBandLimited :: Maybe BandLimitedId -> Maybe E -> BandLimitedId -> E -> E -> E+readHardSyncBandLimited msmoothShape mphase n slaveCps masterCps = smoothWave * readShape n phasorSlave slaveCps+ where+ (phasorMaster, syncMaster) = syncphasor masterCps 0 Nothing+ (phasorSlave, syncSlave) = syncphasor slaveCps syncMaster mphase++ smoothWave = case msmoothShape of+ Nothing -> 1+ Just shape -> readShape shape phasorMaster masterCps++ readShape shapeId phasor freq = tableikt phasor (vco2ft freq (bandLimitedIdToExpr shapeId)) + ---------------------------------------------------------- -- Midi @@ -431,12 +497,24 @@ newtype UdoPlugin = UdoPlugin { unUdoPlugin :: String } -tabQueuePlugin = UdoPlugin "tabQueue"-tabQueue2Plugin = UdoPlugin "tabQueue2"- addUdoPlugin :: UdoPlugin -> State [UdoPlugin] () addUdoPlugin a = modify (a :) getUdoPluginNames :: [UdoPlugin] -> [String] getUdoPluginNames xs = nub (fmap unUdoPlugin xs) +-- tabQueue++tabQueuePlugin = UdoPlugin "tabQueue"+tabQueue2Plugin = UdoPlugin "tabQueue2"++----------------------------------------------------------+-- Steven Yi wonderful UDOs++zdfPlugin = UdoPlugin "zdf" -- Zero delay filters+solinaChorusPlugin = UdoPlugin "solina_chorus" -- solina chorus+audaciouseqPlugin = UdoPlugin "audaciouseq" -- audacious 10 band EQ+adsr140Plugin = UdoPlugin "adsr140" -- adsr with retriggering+diodePlugin = UdoPlugin "diode" -- diode ladder filter+korg35Plugin = UdoPlugin "korg35" -- korg 35 filter+zeroDelayConvolutionPlugin = UdoPlugin "zero-delay-convolution" -- zero delay convolutio by Victor Lazzarini
src/Csound/Typed/GlobalState/GE.hs view
@@ -33,6 +33,8 @@ guiInstrExp, listenKeyEvt, Key(..), KeyEvt(..), Guis(..), getKeyEventListener,+ -- * Cabbage Guis+ cabbage, -- * Hrtf pan simpleHrtfmove, simpleHrtfstat, -- * Udo plugins@@ -62,6 +64,8 @@ import Csound.Typed.GlobalState.Opcodes(hrtfmove, hrtfstat, primInstrId) import Csound.Typed.Gui.Gui(Panel(..), Win(..), GuiNode, GuiHandle(..), restoreTree, guiMap, mapGuiOnPanel, defText)+import qualified Csound.Typed.Gui.Cabbage.CabbageLang as Cabbage+import qualified Csound.Typed.Gui.Cabbage.Cabbage as Cabbage import qualified Csound.Typed.GlobalState.Elements as E(saveNamedInstr, addUdoPlugin) @@ -112,10 +116,11 @@ , userInstr0 :: Dep () , bandLimitedMap :: BandLimitedMap , cache :: Cache GE- , guis :: Guis }+ , guis :: Guis+ , cabbageGui :: Maybe Cabbage.Lang } instance Default History where- def = History def def def def def def def def def def def def def def def (return ()) def def def+ def = History def def def def def def def def def def def def def def def (return ()) def def def def data Msg = Msg data MidiAssign = MidiAssign MidiType Channel InstrId@@ -194,11 +199,12 @@ sfTable :: History -> [(SfSpec, Int)] sfTable = M.toList . idMapContent . sfMap -saveBandLimitedWave :: BandLimited -> GE Int+saveBandLimitedWave :: BandLimited -> GE BandLimitedId saveBandLimitedWave = onBandLimitedMap . saveBandLimited where onBandLimitedMap = onHistory - (\a -> (genMap a, bandLimitedMap a)) - (\(gm, blm) h -> h { genMap = gm, bandLimitedMap = blm})+ (\a -> (bandLimitedMap a)) + (\(blm) h -> h { bandLimitedMap = blm})+ setTotalDur :: TotalDur -> GE () setTotalDur = onTotalDur . modify . const . Just where onTotalDur = onHistory totalDur (\a h -> h { totalDur = a })@@ -491,8 +497,8 @@ keyEventInstrBody keyMap = execDepT $ do let keys = flKeyIn isChange = changed keys ==* 1- when1 isChange $ do- whens (fmap (uncurry $ listenEvt keys) events) doNothing+ when1 Kr isChange $ do+ whens Kr (fmap (uncurry $ listenEvt keys) events) doNothing where doNothing = return () @@ -513,6 +519,11 @@ body <- keyEventInstrBody $ guiKeyEvents $ guis h return $ Just (Instr keyEventInstrId body) +-----------------------------------------------+-- cabbage++cabbage :: Cabbage.Cab -> GE ()+cabbage cab = modifyHistory $ \h -> h { cabbageGui = Just $ Cabbage.runCab cab } ----------------------------------------------- -- head pan
src/Csound/Typed/GlobalState/Opcodes.hs view
@@ -12,6 +12,7 @@ out, outs, safeOut, autoOff, turnoff, turnoff2, exitnow, -- * vco2 oscili, oscilikt, vco2ft, vco2ift, vco2init, ftgen,+ syncphasor, tableikt, -- * OSC oscInit, oscListen, oscSend, -- * channels@@ -84,7 +85,7 @@ servantUpdateChnAlive pargId = do let sName = chnAliveName (pn pargId) kAlive <- chngetK sName- when1 (kAlive <* -10) $ do+ when1 Kr (kAlive <* -10) $ do turnoff chnsetK (kAlive - 1) sName @@ -96,7 +97,7 @@ let sName = chnRetrigName (pn pargId) let retrigVal = pn $ pargId + 1 kRetrig <- chngetK sName- when1 (kRetrig /=* retrigVal) $ do+ when1 Kr (kRetrig /=* retrigVal) $ do turnoff servantUpdateChnEvtLoop :: Monad m => Int -> DepT m ()@@ -219,12 +220,12 @@ safeOut gainLevel = fmap (( * double gainLevel) . limiter) limiter :: E -> E-limiter x = opcs "compress" [(Ar, [Ar, Ar, Kr, Kr, Kr, Kr, Kr, Kr, Ir])] [x, 1, 0, 89, 89, 100, 0, 0, 0]+limiter x = opcs "compress" [(Ar, [Ar, Ar, Kr, Kr, Kr, Kr, Kr, Kr, Ir])] [x, 1, 0, 90, 90, 100, 0, 0, 0] autoOff :: Monad m => E -> [E] -> DepT m [E] autoOff dt a = do ihold - when1 (trig a)+ when1 Kr (trig a) turnoff return a where@@ -300,6 +301,14 @@ vco2init :: [E] -> E vco2init = opcs "vco2init" [(Ir, repeat Ir)]++syncphasor :: E -> E -> Maybe E -> (E, E)+syncphasor xcps asyncin mphase = getPair $ mopcs "syncphasor" ([Ar, Ar], [Xr, Ar, Ir]) $ case mphase of+ Nothing -> [xcps, asyncin]+ Just phase -> [xcps, asyncin, phase]++tableikt :: E -> E -> E +tableikt xndx kfn = opcs "tableikt" [(Ar, [Xr, Kr, Ir, Ir, Ir])] [xndx, kfn, 1] ----------------------------------------------------------- -- OSC
src/Csound/Typed/GlobalState/Options.hs view
@@ -34,7 +34,7 @@ , csdSampleRate :: Maybe Int -- ^ The sample rate , csdBlockSize :: Maybe Int -- ^ The number of audio samples in one control step , csdGain :: Maybe Double -- ^ A gain of the final output- , csdTabFi :: Maybe TabFi -- ^ Default fidelity of the arrays+ , csdTabFi :: Maybe TabFi -- ^ Default fidelity of the arrays } instance Default Options where@@ -134,4 +134,3 @@ idSone = "sone" idFarey = "farey" idWave = "wave"-
src/Csound/Typed/Gui.hs view
@@ -5,4 +5,3 @@ import Csound.Typed.Gui.Gui import Csound.Typed.Gui.Widget-
+ src/Csound/Typed/Gui/Cab.hs view
@@ -0,0 +1,25 @@+module Csound.Typed.Gui.Cab(+ Cab, CabProp, Col(..), cabbage,++ -- * Widgets+ button, filebutton, infobutton, checkbox, combobox, csoundoutput, encoder, gentable, + hrange, vrange, form, groupbox, image, keyboard, label, hslider, vslider,+ rslider, soundfiler, signaldisplay, textbox, texteditor, xypad,++ -- * Properties+ bounds, channel, text1, text2, value, colour, colour0, colour1, backgroundcolour, textcolour, trackercolour, outlinecolour, + fontcolour, fontcolour0, fontcolour1, latched, identchannel, rotate, alpha, visible, caption, widgetarray, popuptext, + active, svgfile, populate, mode, file, shape, corners, channeltype, align, sliderincr, max, min, textbox', trackerthickness,+ linethickness, range, range2, size, pluginid, guirefresh, plant, child, show, middlec, keywidth, scrollbars, fontstyle,+ scrubberpos, zoom, displaytype, updaterate, wrap+) where++import Prelude hiding (show, min, max)++import Csound.Typed.Gui.Cabbage.Cabbage++import qualified Csound.Typed.GlobalState as G+import Csound.Typed.GlobalState(SE)++cabbage :: Cab -> SE ()+cabbage = G.geToSe . G.cabbage
+ src/Csound/Typed/Gui/Cabbage/Cabbage.hs view
@@ -0,0 +1,256 @@+{-# Language GeneralizedNewtypeDeriving #-}+module Csound.Typed.Gui.Cabbage.Cabbage( + Cab, CabProp, Col(..), runCab, + + -- * Widgets+ button, filebutton, infobutton, checkbox, combobox, csoundoutput, encoder, gentable, + hrange, vrange, form, groupbox, image, keyboard, label, hslider, vslider,+ rslider, soundfiler, signaldisplay, textbox, texteditor, xypad,++ -- * Properties+ bounds, channel, text1, text2, value, colour, colour0, colour1, backgroundcolour, textcolour, trackercolour, outlinecolour, + fontcolour, fontcolour0, fontcolour1, latched, identchannel, rotate, alpha, visible, caption, widgetarray, popuptext, + active, svgfile, populate, mode, file, shape, corners, channeltype, align, sliderincr, max, min, textbox', trackerthickness,+ linethickness, range, range2, size, pluginid, guirefresh, plant, child, show, middlec, keywidth, scrollbars, fontstyle,+ scrubberpos, zoom, displaytype, updaterate, wrap++) where++import Prelude hiding (show, min, max)++import Data.Maybe+import Control.Monad.Trans.Writer.Strict++import Csound.Typed.Gui.Cabbage.CabbageLang ++type Cab = Cab' ()+type CabProp = CabProp' ()++-- | The Cab is a monad for Cabbage markup language. +-- The markup description can be constructed in the same way as blaze-html markup.+newtype Cab' a = Cab' { unCab' :: Writer [Line] a }+ deriving (Functor, Applicative, Monad)++runCab :: Cab -> [Line]+runCab = snd . runWriter . unCab'++newtype CabProp' a = CabProp' { unCabProp' :: Writer [Property] a }+ deriving (Functor, Applicative, Monad)++runCabProp :: CabProp -> [Property]+runCabProp = snd . runWriter . unCabProp'++---------------------------------------+-- widgets++widget :: String -> CabProp -> Cab+widget name props = Cab' $ tell [Line name $ runCabProp props]++---------------------------------------++button, filebutton, infobutton, checkbox, combobox, csoundoutput, encoder, gentable, + hrange, vrange, form, groupbox, image, keyboard, label, hslider, vslider,+ rslider, soundfiler, signaldisplay, textbox, texteditor, xypad :: CabProp -> Cab++button = widget "button"+filebutton = widget "filebutton"+infobutton = widget "infobutton"+checkbox = widget "checkbox"+combobox = widget "combobox"+csoundoutput = widget "csoundoutput"+encoder = widget "encoder"+gentable = widget "gentable"+hrange = widget "hrange"+vrange = widget "vrange"+form = widget "form"+groupbox = widget "groupbox"+image = widget "image"+keyboard = widget "keyboard"+label = widget "label"+hslider = widget "hslider"+vslider = widget "vslider"+rslider = widget "rslider"+soundfiler = widget "soundfiler"+signaldisplay = widget "signaldisplay"+textbox = widget "textbox"+texteditor = widget "texteditor"+xypad = widget "xypad"+ +---------------------------------------+-- properties++mkProperty :: String -> [Arg] -> CabProp+mkProperty name args = CabProp' $ tell [Property name args]++data Col = Hash String | Rgb Int Int Int++colProp x = case x of+ Hash a -> [StringArg a]+ Rgb r g b -> fmap IntArg [r, g, b]++boolProp x = IntArg $ if x then 1 else 0 ++bounds :: Int -> Int -> Int -> Int -> CabProp+bounds x y w h = mkProperty "bounds" (fmap IntArg [x, y, w, h])++channel :: String -> CabProp+channel name = mkProperty "channel" [StringArg name]++text1 :: String -> CabProp+text1 name = mkProperty "text" [StringArg name]++text2 :: String -> String -> CabProp+text2 name1 name2 = mkProperty "text" [StringArg name1, StringArg name2]++value :: Float -> CabProp+value x = mkProperty "value" [FloatArg x]++colour :: Col -> CabProp+colour col = mkProperty "colour" (colProp col)++colour0 :: Col -> CabProp+colour0 col = mkProperty "colour:0" (colProp col)++colour1 :: Col -> CabProp+colour1 col = mkProperty "colour:1" (colProp col)++backgroundcolour :: Col -> CabProp+backgroundcolour col = mkProperty "backgroundcolour" (colProp col)++textcolour :: Col -> CabProp+textcolour col = mkProperty "textcolour" (colProp col)++trackercolour :: Col -> CabProp+trackercolour col = mkProperty "trackercolour" (colProp col)++outlinecolour :: Col -> CabProp+outlinecolour col = mkProperty "outlinecolour" (colProp col)++fontcolour :: Col -> CabProp+fontcolour col = mkProperty "fontcolour" (colProp col)++fontcolour0 :: Col -> CabProp+fontcolour0 col = mkProperty "fontcolour:0" (colProp col)++fontcolour1 :: Col -> CabProp+fontcolour1 col = mkProperty "fontcolour:1" (colProp col)++latched :: Bool -> CabProp+latched b = mkProperty "latched" [boolProp b]++identchannel :: String -> CabProp+identchannel s = mkProperty "identchannel" [StringArg s]++rotate :: Float -> Float -> Float -> CabProp+rotate radians pivotx pivoty = mkProperty "rotate" $ fmap FloatArg [radians, pivotx, pivoty]++alpha :: Float -> CabProp+alpha a = mkProperty "alpha" [FloatArg a]++visible :: Bool -> CabProp+visible a = mkProperty "visible" [boolProp a]++caption :: String -> CabProp+caption a = mkProperty "caption" [StringArg a]++widgetarray :: String -> Int -> CabProp+widgetarray name n = mkProperty "widgetarray" [StringArg name, IntArg n]++popuptext :: String -> CabProp+popuptext a = mkProperty "popuptext" [StringArg a]++active :: Bool -> CabProp+active a = mkProperty "active" [boolProp a]++svgfile :: String -> String -> CabProp+svgfile ty file = mkProperty "svgfile" (fmap StringArg [ty, file])++populate :: String -> String -> CabProp+populate filetype dir = mkProperty "populate" (fmap StringArg [filetype, dir])++mode :: String -> CabProp+mode a = mkProperty "mode" [StringArg a]++file :: String -> CabProp+file a = mkProperty "file" [StringArg a]++shape :: String -> CabProp+shape a = mkProperty "shape" [StringArg a]++corners :: Float -> CabProp+corners a = mkProperty "corners" [FloatArg a]++channeltype :: String -> CabProp+channeltype a = mkProperty "channeltype" [StringArg a]++align :: String -> CabProp+align a = mkProperty "align" [StringArg a]++sliderincr :: Float -> CabProp+sliderincr a = mkProperty "sliderincr" [FloatArg a]++max :: Float -> CabProp+max a = mkProperty "max" [FloatArg a]++min :: Float -> CabProp+min a = mkProperty "min" [FloatArg a]++textbox' :: Bool -> CabProp+textbox' a = mkProperty "textbox" [boolProp a]++trackerthickness :: Float -> CabProp+trackerthickness a = mkProperty "trackerthickness" [FloatArg a]++linethickness :: Float -> CabProp+linethickness a = mkProperty "linethickness" [FloatArg a]++range :: Float -> Float -> (Float, Float) -> CabProp+range min max value = range2 min max value Nothing Nothing++range2 :: Float -> Float -> (Float, Float) -> Maybe Float -> Maybe Float -> CabProp+range2 min max value mskew mincr = mkProperty "range" $ catMaybes [Just $ FloatArg min, Just $ FloatArg max, Just $ (uncurry ColonArg) value, fmap FloatArg mskew, fmap FloatArg mincr]++size :: Int -> Int -> CabProp+size w h = mkProperty "size" (fmap IntArg [w, h])++pluginid :: String -> CabProp+pluginid a = mkProperty "pluginid" [StringArg a]++guirefresh :: Int -> CabProp+guirefresh a = mkProperty "guirefresh" [IntArg a]++plant :: String -> CabProp+plant a = mkProperty "plant" [StringArg a]++child :: Bool -> CabProp+child a = mkProperty "child" [boolProp a]++show :: Bool -> CabProp+show a = mkProperty "show" [boolProp a]++middlec :: Int -> CabProp+middlec a = mkProperty "middlec" [IntArg a]++keywidth :: Int -> CabProp+keywidth a = mkProperty "keywidth" [IntArg a]++scrollbars :: Bool -> CabProp+scrollbars a = mkProperty "scrollbars" [boolProp a]++fontstyle :: String -> CabProp+fontstyle a = mkProperty "fontstyle" [StringArg a]++scrubberpos :: Int -> CabProp+scrubberpos a = mkProperty "scrubberpos" [IntArg a]++zoom :: Float -> CabProp+zoom a = mkProperty "zoom" [FloatArg a]++displaytype :: String -> CabProp+displaytype a = mkProperty "displaytype" [StringArg a]++updaterate :: Int -> CabProp+updaterate a = mkProperty "updaterate" [IntArg a]++wrap :: Bool -> CabProp+wrap a = mkProperty "wrap" [boolProp a]
+ src/Csound/Typed/Gui/Cabbage/CabbageLang.hs view
@@ -0,0 +1,38 @@+module Csound.Typed.Gui.Cabbage.CabbageLang(+ Lang, Line(..), Property(..), Arg(..), ppCabbage+) where++import Text.PrettyPrint.Leijen++type Lang = [Line]++data Line = Line + { lineDef :: String+ , lineProperties :: [Property]+ }++data Property = Property + { propertyName :: String+ , propertyArgs :: [Arg] + }++data Arg = StringArg String | FloatArg Float | IntArg Int | ColonArg Float Float++--------------------------------------------------+-- pretty print++ppCabbage :: Lang -> Doc+ppCabbage xs = vcat $ fmap ppLine xs++ppLine :: Line -> Doc+ppLine (Line name props) = text name <+> hcat (punctuate comma (fmap ppProp props))++ppProp :: Property -> Doc+ppProp (Property name args) = text name <> tupled (fmap ppArg args)++ppArg :: Arg -> Doc+ppArg x = case x of+ StringArg s -> dquotes (text s)+ FloatArg a -> float a+ IntArg a -> int a+ ColonArg a b -> float a <> colon <> float b
src/Csound/Typed/Gui/Widget.hs view
@@ -370,7 +370,7 @@ where instr ref = SE $ do val <- readVar ref- whens + whens Kr [ (val ==* 0, writeVar ref 1) ] (writeVar ref 0) turnoff
− src/Csound/Typed/Lib/StableMaps/Dynamic.hs
@@ -1,77 +0,0 @@-{-# LANGUAGE TypeFamilies, Rank2Types #-}--------------------------------------------------------------------------------- |--- Module : System.Mem.StableName.Dynamic--- Copyright : (c) Edward Kmett 2010--- License : BSD3--- Maintainer : ekmett@gmail.com--- Stability : experimental--- Portability : GHC only------ Dynamic stable names are a way of performing fast (O(1)), not-quite-exact comparison between objects.------ Dynamic stable names solve the following problem: suppose you want to build a hash table with Haskell objects as keys, but you want to use pointer equality for comparison; maybe because the keys are large and hashing would be slow, or perhaps because the keys are infinite in size. We can't build a hash table using the address of the object as the key, because objects get moved around by the garbage collector, meaning a re-hash would be necessary after every garbage collection.--------------------------------------------------------------------------------module Csound.Typed.Lib.StableMaps.Dynamic - ( DynamicStableName(..)- , hashDynamicStableName- , makeDynamicStableName- , wrapStableName- ) where--import GHC.Prim--import System.Mem.StableName (StableName, makeStableName, hashStableName)-import Unsafe.Coerce (unsafeCoerce)--{-|- An abstract name for an object, that supports equality and hashing.-- Dynamic stable names have the following property:-- * If @sn1 :: DynamicStableName@ and @sn2 :: DynamicStableName@ and @sn1 == sn2@- then @sn1@ and @sn2@ were created by calls to @makeStableName@ on - the same object.-- The reverse is not necessarily true: if two dynamic stable names are not- equal, then the objects they name may still be equal. Note in particular- that `makeDynamicStableName` may return a different `DynamicStableName` - after an object is evaluated.-- Dynamic Stable Names are similar to Stable Pointers ("Foreign.StablePtr"),- but differ in the following ways:-- * There is no @freeDynamicStableName@ operation, unlike "Foreign.StablePtr"s.- Dynamic Stable Names are reclaimed by the runtime system when they are no- longer needed.-- * There is no @deRefDynamicStableName@ operation. You can\'t get back from- a dynamic stable name to the original Haskell object. The reason for- this is that the existence of a stable name for an object does not- guarantee the existence of the object itself; it can still be garbage- collected.---}--newtype DynamicStableName = DynamicStableName (StableName Any)---- | Makes a 'DynamicStableName' for an arbitrary object. The object passed as--- the first argument is not evaluated by 'makeDynamicStableName'.-makeDynamicStableName :: t -> IO DynamicStableName-makeDynamicStableName a = do- s <- makeStableName a- return (wrapStableName s)---- | Convert a 'DynamicStableName' to an 'Int'. The 'Int' returned is not--- necessarily unique; several 'DynamicStableName's may map to the same 'Int'--- (in practice however, the chances of this are small, so the result--- of 'hashDynamicStableName' makes a good hash key).-hashDynamicStableName :: DynamicStableName -> Int-hashDynamicStableName (DynamicStableName sn) = hashStableName sn--instance Eq DynamicStableName where- DynamicStableName sn1 == DynamicStableName sn2 = sn1 == sn2--wrapStableName :: StableName a -> DynamicStableName-wrapStableName s = DynamicStableName (unsafeCoerce s)
− src/Csound/Typed/Lib/StableMaps/Dynamic/Map.hs
@@ -1,88 +0,0 @@-{-# LANGUAGE CPP #-}-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702-{-# LANGUAGE Unsafe #-}-#endif-module Csound.Typed.Lib.StableMaps.Dynamic.Map- ( Map- , empty- , null- , singleton- , member- , notMember- , insert- , insertWith- , insertWith'- , lookup- , find- , findWithDefault- ) where--import qualified Prelude-import Prelude hiding (lookup, null)-import Csound.Typed.Lib.StableMaps.Dynamic-import qualified Data.IntMap as IntMap-import Data.IntMap (IntMap)--newtype Map a = Map { getMap :: IntMap [(DynamicStableName, a)] } --empty :: Map a-empty = Map IntMap.empty--null :: Map a -> Bool-null (Map m) = IntMap.null m--singleton :: DynamicStableName -> a -> Map a-singleton k v = Map $ IntMap.singleton (hashDynamicStableName k) [(k,v)]--member :: DynamicStableName -> Map a -> Bool-member k m = case lookup k m of- Nothing -> False- Just _ -> True--notMember :: DynamicStableName -> Map a -> Bool-notMember k m = not $ member k m --insert :: DynamicStableName -> a -> Map a -> Map a-insert k v = Map . IntMap.insertWith (++) (hashDynamicStableName k) [(k,v)] . getMap- --- | /O(log n)/. Insert with a function for combining the new value and old value.--- @'insertWith' f key value mp@--- will insert the pair (key, value) into @mp@ if the key does not exist--- in the map. If the key does exist, the function will insert the pair--- @(key, f new_value old_value)@-insertWith :: (a -> a -> a) -> DynamicStableName -> a -> Map a -> Map a-insertWith f k v = Map . IntMap.insertWith go (hashDynamicStableName k) [(k,v)] . getMap - where - go _ ((k',v'):kvs) - | k == k' = (k', f v v') : kvs- | otherwise = (k',v') : go undefined kvs- go _ [] = []---- | Same as 'insertWith', but with the combining function applied strictly.-insertWith' :: (a -> a -> a) -> DynamicStableName -> a -> Map a -> Map a-insertWith' f k v = Map . IntMap.insertWith go (hashDynamicStableName k) [(k,v)] . getMap - where - go _ ((k',v'):kvs) - | k == k' = let v'' = f v v' in v'' `seq` (k', v'') : kvs- | otherwise = (k', v') : go undefined kvs- go _ [] = []---- | /O(log n)/. Lookup the value at a key in the map.--- --- The function will return the corresponding value as a @('Just' value)@--- or 'Nothing' if the key isn't in the map.-lookup :: DynamicStableName -> Map v -> Maybe v-lookup k (Map m) = do- pairs <- IntMap.lookup (hashDynamicStableName k) m- Prelude.lookup k pairs--find :: DynamicStableName -> Map v -> v-find k m = case lookup k m of- Nothing -> error "Map.find: element not in the map"- Just x -> x ---- | /O(log n)/. The expression @('findWithDefault' def k map)@ returns--- the value at key @k@ or returns the default value @def@--- when the key is not in the map.-findWithDefault :: v -> DynamicStableName -> Map v -> v-findWithDefault dflt k m = maybe dflt id $ lookup k m
+ src/Csound/Typed/Plugins.hs view
@@ -0,0 +1,39 @@+module Csound.Typed.Plugins(+ adsr140,+ audaciousEq,+ + -- Solina chorus+ solinaChorus, testSolinaChorus,++ -- One pole filters+ zdf1, zlp1, zhp1, zap1,++ -- Two pole filters+ zdf2, zlp, zbp, zhp, zdf2_notch, zbr,++ -- Ladder filter+ zladder, ++ -- Four poles filters+ zdf4, zlp4, zbp4, zhp4, ++ -- Eq-filters+ peakEq, highShelf, lowShelf,++ -- Diode ladder filters+ diode, linDiode, noNormDiode,++ -- Korg 35 filters+ linKorg_lp, linKorg_hp, korg_lp, korg_hp,++ -- zero delay convolution+ ZConvSpec(..), zconv, zconv'+) where++import Csound.Typed.Plugins.Adsr140+import Csound.Typed.Plugins.Zdf+import Csound.Typed.Plugins.Diode+import Csound.Typed.Plugins.Audaciouseq+import Csound.Typed.Plugins.Korg35+import Csound.Typed.Plugins.SolinaChorus+import Csound.Typed.Plugins.ZeroDelayConvolution
+ src/Csound/Typed/Plugins/Adsr140.hs view
@@ -0,0 +1,25 @@+module Csound.Typed.Plugins.Adsr140( + adsr140 +) where++import Data.Boolean+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(adsr140Plugin)+++-------------------------------------------------------------------------------++-- | Gated, Re-triggerable ADSR modeled after the Doepfer A-140 +-- opcode adsr140, a, aakkkk+--+-- inputs: agate, aretrig, kattack, kdecay, ksustain, krelease +adsr140 :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig+adsr140 agate aretrig kattack kdecay ksustain krelease = fromGE $ do+ addUdoPlugin E.adsr140Plugin+ f <$> toGE agate <*> toGE aretrig <*> toGE kattack <*> toGE kdecay <*> toGE ksustain <*> toGE krelease+ where f agate aretrig kattack kdecay ksustain krelease = opcs "adsr140" [(Ar, [Ar, Ar, Kr, Kr, Kr, Kr])] [agate, aretrig, kattack, kdecay, ksustain, krelease]
+ src/Csound/Typed/Plugins/Audaciouseq.hs view
@@ -0,0 +1,33 @@+module Csound.Typed.Plugins.Audaciouseq( + audaciousEq +) where++import Data.Boolean+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(audaciouseqPlugin)++-------------------------------------------------------------------------------++-- | opcode audaciouseq, a, kkkkkkkkkka+--+-- inputs: kgain1, kgain2, kgain3, kgain4, kgain5, +-- kgain6, kgain7, kgain8, kgain9, kgain10 ain+--+-- 10-band EQ +-- Input: kgain1, kgain2, ... kgain10, asig+-- Output: aout+--+-- 10 kgain arguments maps to each band+-- Bands are: 31.25, 52.6, 125, 500, 1000, +-- 2000, 4000, 8000, 16000 +--+audaciousEq :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig+audaciousEq kgain1 kgain2 kgain3 kgain4 kgain5 kgain6 kgain7 kgain8 kgain9 kgain10 ain = fromGE $ do+ addUdoPlugin E.audaciouseqPlugin+ f <$> toGE ain <*> toGE kgain1 <*> toGE kgain2 <*> toGE kgain3 <*> toGE kgain4 <*> toGE kgain5 <*> toGE kgain6 <*> toGE kgain7 <*> toGE kgain8 <*> toGE kgain9 <*> toGE kgain10+ where f ain kgain1 kgain2 kgain3 kgain4 kgain5 kgain6 kgain7 kgain8 kgain9 kgain10 = opcs "audaciouseq" [(Ar, [Ar, Kr, Kr, Kr, Kr, Kr, Kr, Kr, Kr, Kr, Kr])] [ain, kgain1, kgain2, kgain3, kgain4, kgain5, kgain6, kgain7, kgain8, kgain9, kgain10]
+ src/Csound/Typed/Plugins/Diode.hs view
@@ -0,0 +1,75 @@+module Csound.Typed.Plugins.Diode( + diode, linDiode, noNormDiode+) where++import Data.Boolean+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(diodePlugin)++-- | Linear diode ladder filter. +--+-- > linDiode centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+linDiode :: Sig -> Sig -> Sig -> Sig+linDiode cfq res ain = diodeLadder ain cfq (normReson res) 0 1++-- | Non-Linear normalized diode ladder filter. +--+-- > diode saturation centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+--+-- saturation ranges from 1 and higher (typical value: 4)+diode :: Sig -> Sig -> Sig -> Sig -> Sig+diode ksaturation cfq res ain = diodeLadder ain cfq (normReson res) 1 ksaturation++-- | Non-Linear not normalized diode ladder filter. +--+-- > noNormDiode saturation centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+--+-- saturation ranges from 1 and higher (typical value: 4)+noNormDiode :: Sig -> Sig -> Sig -> Sig -> Sig+noNormDiode ksaturation cfq res ain = diodeLadder ain cfq (normReson res) 2 ksaturation++normReson :: Sig -> Sig+normReson res = res * 17++-------------------------------------------------------------------------------++-- | Diode Ladder Filter+-- +-- Based on code by Will Pirkle, presented in:+--+-- http://www.willpirkle.com/Downloads/AN-6DiodeLadderFilter.pdf+-- +-- and in his book "Designing software synthesizer plug-ins in C++ : for +-- RackAFX, VST3, and Audio Units"+--+-- UDO version by Steven Yi (2016.xx.xx)+--+-- ARGS+-- ain - signal to filter+-- acf/kcf - cutoff frequency +-- ak/kk - k-value that controls resonance, self-resonance occurs at k=17;+-- knlp - use non-linear processing: +-- 0 - none +-- 1 - normalized (outputs to range +-1.0)+-- 2 - non-normalized (less expensive than normalized, range +-0.8)+-- ksaturation - saturation amount for non-linear processing +-- (default: 1.0, greater values lead to higher saturation)+diodeLadder :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig+diodeLadder ain xcf xk knlp ksaturation = fromGE $ do+ addUdoPlugin E.diodePlugin+ f <$> toGE ain <*> toGE xcf <*> toGE xk <*> toGE knlp <*> toGE ksaturation+ where f ain xcf xk knlp ksaturation = opcs "diode_ladder" [(Ar, [Ar, Xr, Xr, Kr, Kr])] [ain, xcf, xk, knlp, ksaturation]
+ src/Csound/Typed/Plugins/Korg35.hs view
@@ -0,0 +1,99 @@+module Csound.Typed.Plugins.Korg35( + linKorg_lp, linKorg_hp, korg_lp, korg_hp+) where++import Data.Boolean+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(korg35Plugin)++-- | Linear korg 35 low pass filter (12 dB). +--+-- > linDiode centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+linKorg_lp :: Sig -> Sig -> Sig -> Sig+linKorg_lp cfq res ain = k35_lpf ain cfq (normReson res) 0 1++-- | Linear korg 35 high pass filter (6 dB). +--+-- > linDiode centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+linKorg_hp :: Sig -> Sig -> Sig -> Sig+linKorg_hp cfq res ain = k35_hpf ain cfq (normReson res) 0 1+++-- | Korg 35 low pass filter (12 dB). +--+-- > diode saturation centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+--+-- saturation ranges from 1 and higher (typical value: 4)+korg_lp :: Sig -> Sig -> Sig -> Sig -> Sig+korg_lp ksaturation cfq res ain = k35_lpf ain cfq (normReson res) 1 ksaturation++-- | Korg 35 high pass filter (6 dB). +--+-- > diode saturation centerFrequency resonance asig+--+-- resonance ranges in the interval [0, 1] and higher. +-- self-resonance occurs at 1.+--+-- saturation ranges from 1 and higher (typical value: 4)+korg_hp :: Sig -> Sig -> Sig -> Sig -> Sig+korg_hp ksaturation cfq res ain = k35_hpf ain cfq (normReson res) 1 ksaturation++normReson :: Sig -> Sig+normReson res = res * 10++-------------------------------------------------------------------------------++-- 12db/oct low-pass filter based on Korg 35 module+-- (found in MS-10 and MS-20).+-- +-- Based on code by Will Pirkle, presented in:+-- +-- http://www.willpirkle.com/Downloads/AN-5Korg35_V3.pdf+-- +-- [ARGS]+-- +-- ain - audio input+-- acutoff - frequency of cutoff+-- kQ - filter Q [1, 10.0] (k35-lpf will clamp to boundaries)+-- knonlinear - use non-linear processing+-- ksaturation - saturation for tanh distortion+k35_lpf :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig+k35_lpf ain acutoff kQ knonlinear ksaturation = fromGE $ do+ addUdoPlugin E.korg35Plugin+ f <$> toGE ain <*> toGE acutoff <*> toGE kQ <*> toGE knonlinear <*> toGE ksaturation+ where f ain acutoff kQ knonlinear ksaturation = opcs "k35_lpf" [(Ar, [Ar, Xr, Kr, Kr, Kr])] [ain, acutoff, kQ, knonlinear, ksaturation]+++-- 6db/oct high-pass filter based on Korg 35 module+-- (found in MS-10 and MS-20).+-- +-- Based on code by Will Pirkle, presented in:+-- +-- http://www.willpirkle.com/Downloads/AN-7Korg35HPF_V2.pdf +-- +-- [ARGS]+-- +-- ain - audio input+-- acutoff - frequency of cutoff+-- kQ - filter Q [1, 10.0] (k35_hpf will clamp to boundaries)+-- knonlinear - use non-linear processing+-- ksaturation - saturation for tanh distortion+k35_hpf :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig+k35_hpf ain acutoff kQ knonlinear ksaturation = fromGE $ do+ addUdoPlugin E.korg35Plugin+ f <$> toGE ain <*> toGE acutoff <*> toGE kQ <*> toGE knonlinear <*> toGE ksaturation+ where f ain acutoff kQ knonlinear ksaturation = opcs "k35_hpf" [(Ar, [Ar, Xr, Kr, Kr, Kr])] [ain, acutoff, kQ, knonlinear, ksaturation]
+ src/Csound/Typed/Plugins/SolinaChorus.hs view
@@ -0,0 +1,60 @@+module Csound.Typed.Plugins.SolinaChorus( + solinaChorus, testSolinaChorus +) where++import Data.Boolean+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(solinaChorusPlugin)++-- Solina Chorus, based on Solina String Ensemble Chorus Module+-- +-- based on:+--+-- J. Haible: Triple Chorus+-- http://jhaible.com/legacy/triple_chorus/triple_chorus.html+-- +-- > solinaChorus (lfo_amp1, lfo_freq1) (lfo_amp2, lfo_freq2)+--+-- Author: Steven Yi+-- Date: 2016.05.22 +--+-- Example+--+-- > x = solinaChorus (0.6, 0.18) (0.2, 6) x+solinaChorus :: (Sig, Sig) -> (Sig, Sig) -> Sig -> Sig+solinaChorus (amp1, cps1) (amp2, cps2) ain = solina_chorus ain cps1 amp1 cps2 amp2++testSolinaChorus :: Sig -> Sig+testSolinaChorus x = solinaChorus (0.6, 0.18) (0.2, 6) x++-------------------------------------------------------------------------------++-- Solina Chorus, based on Solina String Ensemble Chorus Module+-- +-- based on:+--+-- J. Haible: Triple Chorus+-- http://jhaible.com/legacy/triple_chorus/triple_chorus.html+--+-- Hugo Portillo: Solina-V String Ensemble+-- http://www.native-instruments.com/en/reaktor-community/reaktor-user-library/entry/show/4525/ +--+-- Parabola tabled shape borrowed from Iain McCurdy delayStereoChorus.csd:+-- http://iainmccurdy.org/CsoundRealtimeExamples/Delays/delayStereoChorus.csd+--+-- Author: Steven Yi+-- Date: 2016.05.22 +--+-- opcode solina_chorus, a, aKKKK+--+-- aLeft, klfo_freq1, klfo_amp1, klfo_freq2, klfo_amp2 xin+solina_chorus :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig+solina_chorus aLeft klfo_freq1 klfo_amp1 klfo_freq2 klfo_amp2 = fromGE $ do+ addUdoPlugin E.solinaChorusPlugin+ f <$> toGE aLeft <*> toGE klfo_freq1 <*> toGE klfo_amp1 <*> toGE klfo_freq2 <*> toGE klfo_amp2+ where f aLeft klfo_freq1 klfo_amp1 klfo_freq2 klfo_amp2 = opcs "solina_chorus" [(Ar, [Ar, Kr, Kr, Kr, Kr])] [aLeft, klfo_freq1, klfo_amp1, klfo_freq2, klfo_amp2]
+ src/Csound/Typed/Plugins/Zdf.hs view
@@ -0,0 +1,209 @@+-- Zero delay filters (implemented in Csound by Steven Yi)+module Csound.Typed.Plugins.Zdf( + -- One pole filters+ zdf1, zlp1, zhp1, zap1,++ -- Two pole filters+ zdf2, zlp, zbp, zhp, zdf2_notch, zbr,++ -- Ladder filter+ zladder, ++ -- Four poles filters+ zdf4, zlp4, zbp4, zhp4, ++ -- Eq-filters+ peakEq, highShelf, lowShelf +) where++import Data.Boolean+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(zdfPlugin)++-------------------------------------------------------------------------------+-- Haskell way (reorder arguments, split some funs)++-- zdf_1pole++zdf1 :: Sig -> Sig -> (Sig, Sig)+zdf1 cfq asig = zdf_1pole asig cfq++zlp1 :: Sig -> Sig -> Sig+zlp1 cfq asig = lows+ where (lows, _) = zdf_1pole asig cfq++zhp1 :: Sig -> Sig -> Sig+zhp1 cfq asig = highs+ where (_, highs) = zdf_1pole asig cfq++-- zdf_allpass_1pole++zap1 :: Sig -> Sig -> Sig+zap1 cfq asig = zdf_allpass_1pole asig cfq++-- zdf_2pole++-- outs: lp, bp, hp+zdf2 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig)+zdf2 cfq q asig = zdf_2pole asig cfq q++zlp :: Sig -> Sig -> Sig -> Sig+zlp cfq q asig = lows+ where (lows, _, _) = zdf2 cfq q asig++zbp :: Sig -> Sig -> Sig -> Sig+zbp cfq q asig = mids+ where (_, mids, _) = zdf2 cfq q asig++zhp :: Sig -> Sig -> Sig -> Sig+zhp cfq q asig = highs+ where (_, _, highs) = zdf2 cfq q asig++zdf2_notch :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)+zdf2_notch cfq q asig = zdf_2pole_notch asig cfq q++zbr cfq q asig = notch+ where (_, _, _, notch) = zdf2_notch cfq q asig++-- ladder++zladder :: Sig -> Sig -> Sig -> Sig+zladder cfq q asig = zdf_ladder asig cfq q ++-- zdf_4pole++zdf4 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig, Sig, Sig)+zdf4 cfq q asig = zdf_4pole asig cfq q++zlp4 :: Sig -> Sig -> Sig -> Sig +zlp4 cfq q asig = lows+ where (_, _, _, lows, _, _) = zdf4 cfq q asig++zbp4 :: Sig -> Sig -> Sig -> Sig +zbp4 cfq q asig = mids+ where (_, _, _, _, mids, _) = zdf4 cfq q asig++zhp4 :: Sig -> Sig -> Sig -> Sig +zhp4 cfq q asig = highs+ where (_, _, _, _, _, highs) = zdf4 cfq q asig++-- zdf_peak_eq+peakEq :: Sig -> Sig -> Sig -> Sig -> Sig+peakEq kcf kres kdB ain = zdf_peak_eq ain kcf kres kdB++-- zdf_high_shelf_eq+highShelf :: Sig -> Sig -> Sig -> Sig+highShelf kcf kres ain = zdf_high_shelf_eq ain kcf kres++-- zdf_low_shelf_eq+lowShelf :: Sig -> Sig -> Sig -> Sig+lowShelf kcf kres ain = zdf_low_shelf_eq ain kcf kres ++-------------------------------------------------------------------------------+-- Steven implementation++-- 1-pole (6dB) lowpass/highpass filter+-- takes in a a-rate signal and cutoff value in frequency+--+-- xout alp, ahp+zdf_1pole :: Sig -> Sig -> (Sig, Sig)+zdf_1pole asig cfq = toTuple $ fmap ($ 2) $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq+ where f asig cfq = mopcs "zdf_1pole" ([Ar, Ar], [Ar, Ar]) [asig, cfq]++-- 1-pole allpass filter+-- takes in an a-rate signal and corner frequency where input+-- phase is shifted -90 degrees+zdf_allpass_1pole :: Sig -> Sig -> Sig+zdf_allpass_1pole asig cfq = fromGE $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq+ where f asig cfq = opcs "zdf_allpass_1pole" [(Ar, [Ar, Ar])] [asig, cfq]++-- 2-pole (12dB) lowpass/highpass/bandpass filter+-- takes in a a-rate signal, cutoff value in frequency, and+-- Q factor for resonance+--+-- xout alp, abp, ahp+zdf_2pole :: Sig -> Sig -> Sig -> (Sig, Sig, Sig)+zdf_2pole asig cfq q = toTuple $ fmap ($ 3) $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE q+ where f asig cfq q = mopcs "zdf_2pole" ([Ar, Ar, Ar], [Ar, Ar, Ar]) [asig, cfq, q]++-- 2-pole (12dB) lowpass/highpass/bandpass/notch filter+-- takes in a a-rate signal, cutoff value in frequency, and+-- Q factor for resonance+--+-- xout alp, abp, ahp, anotch+zdf_2pole_notch :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)+zdf_2pole_notch asig cfq q = toTuple $ fmap ($ 4) $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE q+ where f asig cfq q = mopcs "zdf_2pole_notch" ([Ar, Ar, Ar, Ar], [Ar, Ar, Ar]) [asig, cfq, q]++-- moog ladder+--+-- opcode zdf_ladder, a, akk+--+-- ain, kcf, kres xin+zdf_ladder :: Sig -> Sig -> Sig -> Sig+zdf_ladder asig cfq res = fromGE $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE res+ where f asig cfq res = opcs "zdf_ladder" [(Ar, [Ar, Ar, Ar])] [asig, cfq, res]++-- 4-pole+--+-- opcode zdf_4pole, aaaaaa, akk+-- ain, kcf, kres xin+--+-- xout alp2, abp2, ahp2, alp4, abl4, abp4+zdf_4pole :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig, Sig, Sig)+zdf_4pole asig cfq res = toTuple $ fmap ($ 6) $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE res+ where f asig cfq res = mopcs "zdf_4pole" ([Ar, Ar, Ar, Ar, Ar, Ar], [Ar, Ar, Ar]) [asig, cfq, res]++-- 4-pole+--+-- opcode zdf_4pole_hp, aaaaaa, akk+-- ain, kcf, kres xin+--+-- xout alp2, abp2, ahp2, alp4, abl4, abp4+zdf_4pole_hp :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig, Sig, Sig)+zdf_4pole_hp asig cfq res = toTuple $ fmap ($ 6) $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE res+ where f asig cfq res = mopcs "zdf_4pole_hp" ([Ar, Ar, Ar, Ar, Ar, Ar], [Ar, Ar, Ar]) [asig, cfq, res]++-- ;; TODO - implement+-- opcode zdf_peak_eq, a, akkk+-- ain, kcf, kres, kdB xin+zdf_peak_eq :: Sig -> Sig -> Sig -> Sig -> Sig+zdf_peak_eq ain kcf kres kdB = fromGE $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE ain <*> toGE kcf <*> toGE kres <*> toGE kdB+ where f ain kcf kres kdB = opcs "zdf_peak_eq" [(Ar, [Ar, Kr, Kr, Kr])] [ain, kcf, kres, kdB]++-- opcode zdf_high_shelf_eq, a, akk+-- ain, kcf, kdB xin+zdf_high_shelf_eq :: Sig -> Sig -> Sig -> Sig+zdf_high_shelf_eq asig cfq res = fromGE $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE res+ where f asig cfq res = opcs "zdf_high_shelf_eq" [(Ar, [Ar, Kr, Kr])] [asig, cfq, res]++-- opcode zdf_low_shelf_eq, a, akk+-- ain, kcf, kdB xin+zdf_low_shelf_eq :: Sig -> Sig -> Sig -> Sig+zdf_low_shelf_eq asig cfq res = fromGE $ do+ addUdoPlugin E.zdfPlugin+ f <$> toGE asig <*> toGE cfq <*> toGE res+ where f asig cfq res = opcs "zdf_low_shelf_eq" [(Ar, [Ar, Kr, Kr])] [asig, cfq, res]
+ src/Csound/Typed/Plugins/ZeroDelayConvolution.hs view
@@ -0,0 +1,52 @@+module Csound.Typed.Plugins.ZeroDelayConvolution( + ZConvSpec(..), zconv, zconv'+) where++import Data.Boolean+import Data.Default+import Control.Monad.Trans.Class++import Csound.Dynamic++import Csound.Typed.Types+import Csound.Typed.GlobalState+import qualified Csound.Typed.GlobalState.Elements as E(zeroDelayConvolutionPlugin)+++-- | Zero convolution specification+data ZConvSpec = ZConvSpec+ { zconvPartSize :: D -- ^ first partition size in samples+ , zconvRatio :: D -- ^ partition growth ratio+ , zconvNp :: D -- ^ total number of partition sizes+ }++instance Default ZConvSpec where+ def = ZConvSpec 64 4 6++-------------------------------------------------------------------------------++-- | Zero delay convolution with default parameters.+--+-- > zconv tabIR ain = ...+zconv :: Tab -> Sig -> Sig+zconv = zconv' def++-- | zero delay convolution.+-- +-- > zconv' (ZConvSpec ipart irat inp) ifn ain+--+-- Original UDO code by Victor Lazzarini.+--+-- /**************************************************+-- asig ZConv ain,ipart,irat,inp,ifn+-- ain - input signal+-- ipart - first partition size in samples+-- irat - partition growth ratio+-- inp - total number of partition sizes+-- ifn - function table number containing the IR+-- **************************************************/+zconv' :: ZConvSpec -> Tab -> Sig -> Sig+zconv' (ZConvSpec ipart irat inp) ifn ain = fromGE $ do+ addUdoPlugin E.zeroDelayConvolutionPlugin+ f <$> toGE ain <*> toGE ipart <*> toGE irat <*> toGE inp <*> toGE ifn+ where f ain ipart irat inp ifn = opcs "ZConv" [(Ar, [Ar, Ir, Ir, Ir, Ir])] [ain, ipart, irat, inp, ifn]
src/Csound/Typed/Render.hs view
@@ -17,6 +17,8 @@ import qualified Data.IntMap as IM import Control.Monad.IO.Class +import Text.PrettyPrint.Leijen(displayS, renderPretty)+ import Csound.Dynamic hiding (csdFlags) import Csound.Typed.Types import Csound.Typed.GlobalState@@ -27,6 +29,7 @@ import Csound.Dynamic.Types.Flags import Csound.Typed.Gui.Gui(guiStmt, panelIsKeybdSensitive)+import Csound.Typed.Gui.Cabbage.CabbageLang(ppCabbage) toCsd :: Tuple a => Maybe Int -> Options -> SE a -> GE Csd@@ -77,16 +80,21 @@ hist2 <- getHistory let namedIntruments = fmap (\(name, body) -> Instr (InstrLabel name) body) $ unNamedInstrs $ namedInstrs hist2 let orc = Orc instr0 ((namedIntruments ++ ) $ maybeAppend keyEventListener $ fmap (uncurry Instr) $ instrsContent $ instrs hist2) - hist3 <- getHistory + hist3 <- getHistory let flags = reactOnMidi hist3 $ csdFlags opt sco = Sco (Just $ pureGetTotalDurForF0 $ totalDur hist3) (renderGens (genMap hist3) (writeGenMap hist3)) $- ((fmap alwaysOn $ alwaysOnInstrs hist3) ++ (getNoteEvents $ notes hist3))- return $ Csd flags orc sco+ ((fmap alwaysOn $ alwaysOnInstrs hist3) ++ (getNoteEvents $ notes hist3)) + let plugins = getPlugins opt hist3+ return $ Csd flags orc sco plugins where renderGens gens writeGens = (fmap swap $ M.toList $ idMapContent gens) ++ writeGens maybeAppend ma = maybe id (:) ma getNoteEvents = fmap $ \(instrId, evt) -> (instrId, [evt])++ getPlugins opt hist = case cabbageGui hist of+ Nothing -> []+ Just x -> [(Plugin "Cabbage" (displayS (renderPretty 1 10000 $ ppCabbage x) ""))] getInstr0 :: Maybe Int -> Int -> Options -> Dep () -> History -> Dep () getInstr0 mnchnls_i nchnls opt udos hist = do
src/Csound/Typed/Types/Prim.hs view
@@ -612,7 +612,7 @@ where elseIfs = mapM_ (\(p, body) -> elseBegin >> ifBegin p >> body) ifBegin :: BoolSig -> SE ()-ifBegin a = fromDep_ $ D.ifBegin =<< lift (toGE a)+ifBegin a = fromDep_ $ D.ifBegin Kr =<< lift (toGE a) ifEnd :: SE () ifEnd = fromDep_ D.ifEnd@@ -644,7 +644,7 @@ where elseIfs = mapM_ (\(p, body) -> elseBegin >> ifBeginD p >> body) ifBeginD :: BoolD -> SE ()-ifBeginD a = fromDep_ $ D.ifBegin =<< lift (toGE a)+ifBeginD a = fromDep_ $ D.ifBegin Ir =<< lift (toGE a) -- elseIfBegin :: BoolSig -> SE () -- elseIfBegin a = fromDep_ $ D.elseIfBegin =<< lift (toGE a)
src/Csound/Typed/Types/Tuple.hs view
@@ -164,6 +164,12 @@ instance Sigs Sig6 instance Sigs Sig8 +instance Sigs (Sig2, Sig2)+instance Sigs (Sig2, Sig2, Sig2)+instance Sigs (Sig2, Sig2, Sig2, Sig2)+instance Sigs (Sig2, Sig2, Sig2, Sig2, Sig2)+instance Sigs (Sig2, Sig2, Sig2, Sig2, Sig2, Sig2)+ instance Sigs (Sig8, Sig8) instance Sigs (Sig8, Sig8, Sig8, Sig8) @@ -354,4 +360,47 @@ signum (a1, a2, a3, a4) = (signum a1, signum a2, signum a3, signum a4) abs (a1, a2, a3, a4) = (abs a1, abs a2, abs a3, abs a4) +instance Num (Sig2, Sig2) where+ (a1, a2) + (b1, b2) = (a1 + b1, a2 + b2)+ (a1, a2) * (b1, b2) = (a1 * b1, a2 * b2)+ negate (a1, a2) = (negate a1, negate a2) + fromInteger n = (fromInteger n, fromInteger n)+ signum (a1, a2) = (signum a1, signum a2)+ abs (a1, a2) = (abs a1, abs a2)++instance Num (Sig2, Sig2, Sig2) where+ (a1, a2, a3) + (b1, b2, b3) = (a1 + b1, a2 + b2, a3 + b3)+ (a1, a2, a3) * (b1, b2, b3) = (a1 * b1, a2 * b2, a3 * b3)+ negate (a1, a2, a3) = (negate a1, negate a2, negate a3)++ fromInteger n = (fromInteger n, fromInteger n, fromInteger n)+ signum (a1, a2, a3) = (signum a1, signum a2, signum a3)+ abs (a1, a2, a3) = (abs a1, abs a2, abs a3)++instance Num (Sig2, Sig2, Sig2, Sig2) where+ (a1, a2, a3, a4) + (b1, b2, b3, b4) = (a1 + b1, a2 + b2, a3 + b3, a4 + b4)+ (a1, a2, a3, a4) * (b1, b2, b3, b4) = (a1 * b1, a2 * b2, a3 * b3, a4 * b4)+ negate (a1, a2, a3, a4) = (negate a1, negate a2, negate a3, negate a4)++ fromInteger n = (fromInteger n, fromInteger n, fromInteger n, fromInteger n)+ signum (a1, a2, a3, a4) = (signum a1, signum a2, signum a3, signum a4)+ abs (a1, a2, a3, a4) = (abs a1, abs a2, abs a3, abs a4)++instance Num (Sig2, Sig2, Sig2, Sig2, Sig2) where+ (a1, a2, a3, a4, a5) + (b1, b2, b3, b4, b5) = (a1 + b1, a2 + b2, a3 + b3, a4 + b4, a5 + b5)+ (a1, a2, a3, a4, a5) * (b1, b2, b3, b4, b5) = (a1 * b1, a2 * b2, a3 * b3, a4 * b4, a5 * b5)+ negate (a1, a2, a3, a4, a5) = (negate a1, negate a2, negate a3, negate a4, negate a5)++ fromInteger n = (fromInteger n, fromInteger n, fromInteger n, fromInteger n, fromInteger n)+ signum (a1, a2, a3, a4, a5) = (signum a1, signum a2, signum a3, signum a4, signum a5)+ abs (a1, a2, a3, a4, a5) = (abs a1, abs a2, abs a3, abs a4, abs a5)++instance Num (Sig2, Sig2, Sig2, Sig2, Sig2, Sig2) where+ (a1, a2, a3, a4, a5, a6) + (b1, b2, b3, b4, b5, b6) = (a1 + b1, a2 + b2, a3 + b3, a4 + b4, a5 + b5, a6 + b6)+ (a1, a2, a3, a4, a5, a6) * (b1, b2, b3, b4, b5, b6) = (a1 * b1, a2 * b2, a3 * b3, a4 * b4, a5 * b5, a6 * b6)+ negate (a1, a2, a3, a4, a5, a6) = (negate a1, negate a2, negate a3, negate a4, negate a5, negate a6)++ fromInteger n = (fromInteger n, fromInteger n, fromInteger n, fromInteger n, fromInteger n, fromInteger n)+ signum (a1, a2, a3, a4, a5, a6) = (signum a1, signum a2, signum a3, signum a4, signum a5, signum a6)+ abs (a1, a2, a3, a4, a5, a6) = (abs a1, abs a2, abs a3, abs a4, abs a5, abs a6)