module Csound.Catalog.Wave.Flavio(
        amFlavio, fmFlavio, simpleSust, simpleFading
) where

import Data.List
import Control.Monad

import Csound.Base

icero     =  0.000001
icasi     =  0.0001

-- epiano-s

-- irel1 = 16
amFlavio irel1 cps = aout
        where
                irel1     = 16
                iamf      = 1
                irel2     = irel1 * 0.7
                kamp      = expsegr [icero, 0.05, 1, 1, 0.7, irel1, icasi, irel2, icero]  irel2 icero
                aam       = kamp * osc (iamf * cps)
                aout      = aam  * osc cps

-- irel1 = 6, ifm = (2, 7), 
fmFlavio irel1 ifm cps = aout
        where
                irel2   = irel1 * 0.5
                idec    = 1
                iatt    = 0.01

                (iidx1, iidx2, iidx3, iidx4, iidx5) = (4,      4,      4,     4,      3)

                kamp    = expsegr    [icero, iatt, 1, idec, 0.7, irel1, icasi, irel2, icero] irel2 icero
                kidx    = linsegr    [iidx1, iatt, iidx2, idec, iidx3, irel1, iidx4, irel2, iidx5] irel2 iidx5

                afrq    = kidx * osc (ifm * cps)
                aout    = kamp * osc (cps * (1 + afrq))


simpleSust   = genSimple 0.25  0.1
simpleFading = genSimple icasi icero

genSimple isust1 isust2 irel (amp, dcps) = do
        aleft  <- fmap pure $ random 1 (11  * sig amp)
        aright <- fmap pure $ random 1 (10.5  * sig amp)
        return (aleft, aright)
        where
                cps = sig dcps
                pure ichr = aout
                        where
                                irel1 = irel * (0.5 + amp)
                                iatt    = 0.01
                                idec    = 1
                                irel2   = 0.75 * irel1

                                -- kamp    = expsegr    [1, idec, 0.7, irel1, icasi, irel2, icero] irel2 icero
                                kamp    = expsegr    [1, idec, 0.7, irel1, isust1, irel2, isust2] irel2 icero
                                kcf     = 2 * sig amp * linsegr    [3000, irel1 + 1, 500] irel2 500
                                a3      = kamp * (osc (cps - ichr) + osc (cps - ichr))* 0.5

                                aout = blp kcf a3