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