-- |
-- Module      :  DobutokO.Sound.Effects.Classes.ComplexParamSet
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music. 
-- Can be used for applying the SoX effects. 
-- 

{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}

module DobutokO.Sound.Effects.Classes.ComplexParamSet where

import DobutokO.Sound.Effects.Segment
import DobutokO.Sound.Effects.Silence
import DobutokO.Sound.Effects.Sinc
import DobutokO.Sound.Effects.Timespec

class Complex2ParamSet a b c where
  set21c :: a -> b -> c

instance Complex2ParamSet a b (Duration a b) where
   set21c x y = durationSet x y 3

instance Complex2ParamSet Position Float FirstTSpec where
  set21c = seconds2FstTSpec

instance Complex2ParamSet Position Int FirstTSpec where
  set21c = samples2FstTSpec

instance Complex2ParamSet Position2 Float NextTSpec where
  set21c = seconds2NextTSpec

instance Complex2ParamSet Position2 Int NextTSpec where
  set21c = samples2NextTSpec

class Complex3ParamSet a b c d where
  set31c :: a -> b -> c -> d

instance Complex3ParamSet STSpecification1 Duration2 Threshold1 ATSpec where
  set31c = aboveTSpecSet1

instance Complex3ParamSet STSpecification2 Duration2 Threshold1 BTSpec where
  set31c = belowTSpecSet1

class BoolParamSet1 a b where
  set1B :: Bool -> a -> b

instance BoolParamSet1 a (SincAB a) where
  set1B = sincABSet1

instance BoolParamSet1 a (SincTN a) where
  set1B = sincTNSet1

class ComplexParamSet2 a b where
  set2c :: a -> a -> b -> b

instance ComplexParamSet2 a (Segment a) where
  set2c = segmentSet2

class ComplexParamSet3 a b where
  set3c :: a -> a -> a -> b

instance ComplexParamSet3 a (Segment a) where
  set3c = segmentSet3