module Csound.Typed.Plugins.SolinaChorus(  
    solinaChorus, testSolinaChorus    
) where

import Data.Boolean
import Control.Monad.Trans.Class
import Control.Applicative

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]