-- |
-- Module      :  Composition.Sound.Complex
-- Copyright   :  (c) OleksandrZhabenko 2020-2021
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music from a file (or its part). 
-- Uses SoX inside. Is more complicated than algorithmic-composition-basic and uses its functionality.

{-# OPTIONS_GHC -threaded #-}

module Composition.Sound.Complex (
  -- * Another way to generalize the simple functions of dobutokO2 package
  testSoundGen2G
  , soundGen3G
  , soundGen3G_O
  , soundGen3G_O2
  , soundGen3G_O2G
  -- ** With MN control
  , testSoundGen2GMN
  , soundGen3GMN
  , soundGen3G_OMN
  , soundGen3G_O2MN
  , soundGen3G_O2GMN
  , h1
  , h2
  -- ** With Params control
  , soundGen3G_OPar
  , soundGen3G_O2Par
  , soundGen3G_O2GPar
  , soundGen3G_OMNPar
  , soundGen3G_O2MNPar
  , soundGen3G_O2GMNPar
  , h2Params
) where

import Numeric
import Data.Maybe (fromJust,fromMaybe)
import GHC.Arr
import System.Process
import EndOfExe
import System.Directory
import GHC.Int (Int64)
import Composition.Sound.Keyboard
import Composition.Sound.Functional.Params
import Composition.Sound.Functional.Basics
import Composition.Sound.Functional.Elements

-- | Tesing variant of the 'soundGen3G' with predefined three last functional arguments.
testSoundGen2G :: FilePath -> Float -> String -> IO ()
testSoundGen2G :: FilePath -> Float -> FilePath -> IO ()
testSoundGen2G = Int64 -> Int64 -> FilePath -> Float -> FilePath -> IO ()
testSoundGen2GMN (-Int64
1) (-Int64
1)
{-# INLINE testSoundGen2G #-}

-- | Tesing variant of the 'soundGen3GMN' with predefined last functional arguments.
testSoundGen2GMN :: Int64 -> Int64 -> FilePath -> Float -> String -> IO ()
testSoundGen2GMN :: Int64 -> Int64 -> FilePath -> Float -> FilePath -> IO ()
testSoundGen2GMN Int64
m Int64
n1 FilePath
file Float
y FilePath
zs = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m Int64
n1) FilePath
file) -- >>= print
  let n :: Int
n = [(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
vecA0
      arr0 :: Array Int (Int, Int)
arr0 = (\[(Int, Int)]
rs -> (Int, Int) -> [(Int, Int)] -> Array Int (Int, Int)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,[(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
rs Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [(Int, Int)]
rs) [(Int, Int)]
vecA0
      freq0 :: Int -> Float
freq0 Int
j = Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes ((Int, Int) -> Int
forall a b. (a, b) -> b
snd ((Int, Int) -> Int) -> (Int -> (Int, Int)) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Int, Int) -> Int -> (Int, Int)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (Int, Int)
arr0 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
n)
      f0 :: a -> [(a, b)]
f0 a
t = [(a
0.05763181818181818 a -> a -> a
forall a. Num a => a -> a -> a
* a
t, b
0.3598),(a
1.112159090909091 a -> a -> a
forall a. Num a => a -> a -> a
* a
t, b
0.4588962),(a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
t, b
0.6853),(a
3 a -> a -> a
forall a. Num a => a -> a -> a
* a
t, b
0.268),(a
4 a -> a -> a
forall a. Num a => a -> a -> a
* a
t, b
0.6823),(a
5 a -> a -> a
forall a. Num a => a -> a -> a
* a
t, b
0.53)]
      fA1 :: Int -> Float -> OvertonesO
fA1 Int
j = (Float, Float)
-> (Float -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fAddFElem (Int -> Float
freq0 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1),Float
0.5) Float -> OvertonesO
forall a b. (Fractional a, Fractional b) => a -> [(a, b)]
f0 (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdd04 
      fR1 :: Int -> Float -> OvertonesO
fR1 Int
j = (Float, Float)
-> (Float -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fRemoveFElem (Int -> Float
freq0 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1),Float
0.5) Float -> OvertonesO
forall a b. (Fractional a, Fractional b) => a -> [(a, b)]
f0 (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
gRem03
      vecB :: [(Float, Float -> OvertonesO)]
vecB = ((Int, (Int, Int)) -> (Float, Float -> OvertonesO))
-> [(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
j, (Int, Int)
r) -> (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes ((Int, Int) -> Int
forall a b. (a, b) -> b
snd (Int, Int)
r),
       case (Int, Int) -> Int
forall a b. (a, b) -> a
fst (Int, Int)
r of
         Int
0 -> Float -> OvertonesO
forall a b. (Fractional a, Fractional b) => a -> [(a, b)]
f0
         Int
1 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
2 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
3 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
4 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
_ -> Int -> Float -> OvertonesO
fR1 Int
j)) ([(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)])
-> ([(Int, Int)] -> [(Int, (Int, Int))])
-> [(Int, Int)]
-> [(Float, Float -> OvertonesO)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [(Int, Int)] -> [(Int, (Int, Int))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
vecA0
      v2 :: Array Int Float
v2 = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        (Float -> OvertonesO) -> (Float, Float) -> IO ()
h1 (\Float
_ -> Float -> OvertonesO
k (Float
1.1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Int -> Float
freq0 Int
j)) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) 
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult

-- | Generates a sequence of sounds with changing timbre. Uses several functions as parameters. 
soundGen3G :: FilePath -> Float -> String -> ((Float,Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) 
  -> ((Float,Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Float -> OvertonesO) -> IO ()
soundGen3G :: FilePath
-> Float
-> FilePath
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G = Int64
-> Int64
-> FilePath
-> Float
-> FilePath
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3GMN (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G #-}

-- | Generates a sequence of sounds with changing timbre. Uses several functions as parameters. To specify how many sounds the resulting files 
-- will provide, you use first two 'Int64' arguments, the first of which is a number of dropped elements for 'readFileDoubles' and the second one 
-- is a number of produced sounds (and, respectively, number of taken elements).
soundGen3GMN :: Int64 -> Int64 -> FilePath -> Float -> String -> ((Float,Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) 
  -> ((Float,Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Float -> OvertonesO) -> IO ()
soundGen3GMN :: Int64
-> Int64
-> FilePath
-> Float
-> FilePath
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3GMN Int64
m Int64
n1 FilePath
file Float
y FilePath
zs (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdd (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
gRem Float -> OvertonesO
f0 = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m Int64
n1) FilePath
file) -- >>= print
  let arr2 :: Array Int (Int, Int)
arr2 = (\[(Int, Int)]
rs -> (Int, Int) -> [(Int, Int)] -> Array Int (Int, Int)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,[(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
rs Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [(Int, Int)]
rs) [(Int, Int)]
vecA0
      n :: Int
n = Array Int (Int, Int) -> Int
forall i e. Array i e -> Int
numElements Array Int (Int, Int)
arr2
      freq0 :: Int -> Float
freq0 Int
j = Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes ((Int, Int) -> Int
forall a b. (a, b) -> b
snd ((Int, Int) -> Int) -> (Int -> (Int, Int)) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Int, Int) -> Int -> (Int, Int)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (Int, Int)
arr2 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
n)
      fA1 :: Int -> Float -> OvertonesO
fA1 Int
j = (Float, Float)
-> (Float -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fAddFElem (Int -> Float
freq0 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1),Float
0.5) Float -> OvertonesO
f0 (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdd
      fR1 :: Int -> Float -> OvertonesO
fR1 Int
j = (Float, Float)
-> (Float -> OvertonesO)
-> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fRemoveFElem (Int -> Float
freq0 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1),Float
0.5) Float -> OvertonesO
f0 (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
gRem
      vecB :: [(Float, Float -> OvertonesO)]
vecB = ((Int, (Int, Int)) -> (Float, Float -> OvertonesO))
-> [(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
j, (Int, Int)
r) -> (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes ((Int, Int) -> Int
forall a b. (a, b) -> b
snd (Int, Int)
r),
       case (Int, Int) -> Int
forall a b. (a, b) -> a
fst (Int, Int)
r of
         Int
0 -> Float -> OvertonesO
f0
         Int
1 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
2 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
3 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
4 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
_ -> Int -> Float -> OvertonesO
fR1 Int
j)) ([(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)])
-> ([(Int, Int)] -> [(Int, (Int, Int))])
-> [(Int, Int)]
-> [(Float, Float -> OvertonesO)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [(Int, Int)] -> [(Int, (Int, Int))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2
      v2 :: Array Int Float
v2 = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        (Float -> OvertonesO) -> (Float, Float) -> IO ()
h1 (\Float
_ -> Float -> OvertonesO
k (Float
1.1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Int -> Float
freq0 Int
j)) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) 
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult

-- | Generates a sequence of sounds with changing timbre. Uses several functions as parameters. Unlike the 'soundGen3G', the last two 
-- functions as arguments for their first argument have not ('Float','Float'), but 'V.Vector' of them so are applied to 'OvertonesO'. To 
-- provide a generalized functionality, it uses two additional functions @freq0 :: Int -> OvertonesO@ and @proj :: OvertonesO -> OvertonesO@ 
-- to define the first element to which are applied @gAdds@ and @gRems@ and the way to obtain a internal 'OvertonesO'.
-- Besides, it lifts notes into specified with the first two 'Int' arguments enku (see 'liftInEnku'). 
-- The 'Float' argument is a average duration of the sounds.
soundGen3G_O :: Int -> Int -> Float -> FilePath -> Float -> String -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) 
  -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> 
    (Float -> OvertonesO) -> IO ()
soundGen3G_O :: Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O = Int64
-> Int64
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_OMN (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G_O #-}

-- | Generalized version of the 'soundGen3G_O' where 'liftInParams' is used instead of lifting with the 'liftInEnku'. This allows e. g. to 
-- use some tonality. For more information, please, refer to 'filterInParams'.
soundGen3G_OPar :: Params -> Float -> FilePath -> Float -> String -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) 
  -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> 
    (Float -> OvertonesO) -> IO ()
soundGen3G_OPar :: Params
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_OPar = Int64
-> Int64
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_OMNPar (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G_OPar #-}

-- | Generates a sequence of sounds with changing timbre. Uses several functions as parameters. To specify how many sounds the resulting files 
-- will provide, you use first two 'Int64' arguments, the first of which is a number of dropped elements for 'readFileDoubles' and the second one 
-- is a number of produced sounds (and, respectively, number of taken elements).
soundGen3G_OMN :: Int64 -> Int64 -> Int -> Int -> Float -> FilePath -> Float -> String -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) 
  -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> 
    (Float -> OvertonesO) -> IO ()
soundGen3G_OMN :: Int64
-> Int64
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_OMN Int64
m1 Int64
n1 Int
m Int
ku Float
freq1 FilePath
file Float
y FilePath
zs OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems Int -> OvertonesO
freq0 OvertonesO -> OvertonesO
proj Float -> OvertonesO
f0 = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m1 Int64
n1) FilePath
file) -- >>= print
  let arr2 :: Array Int (Int, Int)
arr2 = (\[(Int, Int)]
rs -> (Int, Int) -> [(Int, Int)] -> Array Int (Int, Int)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,[(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
rs Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [(Int, Int)]
rs) [(Int, Int)]
vecA0
      n :: Int
n = Array Int (Int, Int) -> Int
forall i e. Array i e -> Int
numElements Array Int (Int, Int)
arr2
      fA1 :: Int -> Float -> OvertonesO
fA1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fAddFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds
      fR1 :: Int -> Float -> OvertonesO
fR1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fRemoveFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems
      vecB :: [(Float, Float -> OvertonesO)]
vecB = ((Int, (Int, Int)) -> (Float, Float -> OvertonesO))
-> [(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
j, (Int, Int)
r) -> (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes ((Int, Int) -> Int
forall a b. (a, b) -> b
snd (Int, Int)
r),
       case (Int, Int) -> Int
forall a b. (a, b) -> a
fst (Int, Int)
r of
         Int
0 -> Float -> OvertonesO
f0
         Int
1 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
2 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
3 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
4 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
_ -> Int -> Float -> OvertonesO
fR1 Int
j)) ([(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)])
-> ([(Int, Int)] -> [(Int, (Int, Int))])
-> [(Int, Int)]
-> [(Float, Float -> OvertonesO)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [(Int, Int)] -> [(Int, (Int, Int))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      v2 :: Array Int Float
v2 = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2 in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        OvertonesO -> (Float, Float) -> Int -> Int -> Float -> IO ()
h2 (Float -> OvertonesO
k Float
x) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) Int
m Int
ku Float
freq1
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult  

-- | Generalized version of the 'soundGen3G_OMN' where 'liftInParams' is used instead of lifting with the 'liftInEnku'. This allows e. g. to 
-- use some tonality. For more information, please, refer to 'filterInParams'.
soundGen3G_OMNPar :: Int64 -> Int64 -> Params -> Float -> FilePath -> Float -> String -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) 
  -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> 
    (Float -> OvertonesO) -> IO ()
soundGen3G_OMNPar :: Int64
-> Int64
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_OMNPar Int64
m1 Int64
n1 Params
params Float
freq1 FilePath
file Float
y FilePath
zs OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems Int -> OvertonesO
freq0 OvertonesO -> OvertonesO
proj Float -> OvertonesO
f0 = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m1 Int64
n1) FilePath
file) -- >>= print
  let arr2 :: Array Int (Int, Int)
arr2 = (\[(Int, Int)]
rs -> (Int, Int) -> [(Int, Int)] -> Array Int (Int, Int)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,[(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
rs Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [(Int, Int)]
rs) [(Int, Int)]
vecA0
      n :: Int
n = Array Int (Int, Int) -> Int
forall i e. Array i e -> Int
numElements Array Int (Int, Int)
arr2
      fA1 :: Int -> Float -> OvertonesO
fA1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fAddFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds
      fR1 :: Int -> Float -> OvertonesO
fR1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fRemoveFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems
      vecB :: [(Float, Float -> OvertonesO)]
vecB = ((Int, (Int, Int)) -> (Float, Float -> OvertonesO))
-> [(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
j, (Int, Int)
r) -> (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes ((Int, Int) -> Int
forall a b. (a, b) -> b
snd (Int, Int)
r),
       case (Int, Int) -> Int
forall a b. (a, b) -> a
fst (Int, Int)
r of
         Int
0 -> Float -> OvertonesO
f0
         Int
1 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
2 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
3 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
4 -> Int -> Float -> OvertonesO
fA1 Int
j
         Int
_ -> Int -> Float -> OvertonesO
fR1 Int
j)) ([(Int, (Int, Int))] -> [(Float, Float -> OvertonesO)])
-> ([(Int, Int)] -> [(Int, (Int, Int))])
-> [(Int, Int)]
-> [(Float, Float -> OvertonesO)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [(Int, Int)] -> [(Int, (Int, Int))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      v2 :: Array Int Float
v2 = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2 in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        OvertonesO -> (Float, Float) -> Params -> Float -> IO ()
h2Params (Float -> OvertonesO
k Float
x) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) Params
params Float
freq1
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult    

-- | Generates a sequence of sounds with changing timbre. Is a generalized version of the 'soundGen3G_O', instead of predefined conversion function 
-- inside, it uses a user-defined one. 
-- 
-- > soundGen3G_O = soundGen3G_O2 
-- with the first argument 
-- 
-- > conversionFII (f0,fA1,fR1) = map (\(j, r) -> (GHC.Arr.unsafeAt notes (snd r),
-- 
-- >      case fst r of
-- 
-- >        0 -> f0
-- 
-- >        1 -> fA1 j
-- 
-- >        2 -> fA1 j
-- 
-- >        3 -> fA1 j
-- 
-- >        4 -> fA1 j
-- 
-- >        _ -> fR1 j)) . zip [0..]
-- 
-- 
soundGen3G_O2 :: ((Float -> OvertonesO,Int -> Float -> OvertonesO,Int -> Float -> OvertonesO) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> Int -> Int -> Float -> FilePath -> Float -> String -> 
    (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> 
      (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> (Float -> OvertonesO) -> IO ()
soundGen3G_O2 :: ((Float -> OvertonesO, Int -> Float -> OvertonesO,
  Int -> Float -> OvertonesO)
 -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O2 = Int64
-> Int64
-> ((Float -> OvertonesO, Int -> Float -> OvertonesO,
     Int -> Float -> OvertonesO)
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O2MN (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G_O2 #-}

-- | Generalized version of the 'soundGen3G_O2' where 'liftInParams' is used instead of lifting with the 'liftInEnku'. This allows e. g. to 
-- use some tonality. For more information, please, refer to 'filterInParams'.
soundGen3G_O2Par :: ((Float -> OvertonesO,Int -> Float -> OvertonesO,Int -> Float -> OvertonesO) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> Params -> Float -> FilePath -> Float -> String -> 
    (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> 
      (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> (Float -> OvertonesO) -> IO ()
soundGen3G_O2Par :: ((Float -> OvertonesO, Int -> Float -> OvertonesO,
  Int -> Float -> OvertonesO)
 -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O2Par = Int64
-> Int64
-> ((Float -> OvertonesO, Int -> Float -> OvertonesO,
     Int -> Float -> OvertonesO)
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O2MNPar (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G_O2Par #-}

-- | Generates a sequence of sounds with changing timbre. Is a generalized version of the 'soundGen3G_O2'. To specify how many sounds the resulting files 
-- will provide, you use first two 'Int64' arguments, the first of which is a number of dropped elements for 'readFileDoubles' and the second one 
-- is a number of produced sounds (and, respectively, number of taken elements).
soundGen3G_O2MN :: Int64 -> Int64 -> ((Float -> OvertonesO,Int -> Float -> OvertonesO,Int -> Float -> OvertonesO) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> Int -> Int -> Float -> FilePath -> Float -> String -> 
    (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> 
      (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> (Float -> OvertonesO) -> IO ()
soundGen3G_O2MN :: Int64
-> Int64
-> ((Float -> OvertonesO, Int -> Float -> OvertonesO,
     Int -> Float -> OvertonesO)
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O2MN Int64
m1 Int64
n1 (Float -> OvertonesO, Int -> Float -> OvertonesO,
 Int -> Float -> OvertonesO)
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII Int
m Int
ku Float
freq1 FilePath
file Float
y FilePath
zs OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems Int -> OvertonesO
freq0 OvertonesO -> OvertonesO
proj Float -> OvertonesO
f0 = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m1 Int64
n1) FilePath
file) -- >>= print
  let arr2 :: Array Int (Int, Int)
arr2 = (\[(Int, Int)]
rs -> (Int, Int) -> [(Int, Int)] -> Array Int (Int, Int)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,[(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
rs Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [(Int, Int)]
rs) [(Int, Int)]
vecA0
      n :: Int
n = Array Int (Int, Int) -> Int
forall i e. Array i e -> Int
numElements Array Int (Int, Int)
arr2
      fA1 :: Int -> Float -> OvertonesO
fA1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fAddFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds
      fR1 :: Int -> Float -> OvertonesO
fR1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fRemoveFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems
      vecB :: [(Float, Float -> OvertonesO)]
vecB = (Float -> OvertonesO, Int -> Float -> OvertonesO,
 Int -> Float -> OvertonesO)
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII (Float -> OvertonesO
f0,Int -> Float -> OvertonesO
fA1,Int -> Float -> OvertonesO
fR1) [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      v2 :: Array Int Float
v2    = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2 in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        OvertonesO -> (Float, Float) -> Int -> Int -> Float -> IO ()
h2 (Float -> OvertonesO
k Float
x) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) Int
m Int
ku Float
freq1
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult

-- | Generalized version of the 'soundGen3G_O2MN' where 'liftInParams' is used instead of lifting with the 'liftInEnku'. This allows e. g. to 
-- use some tonality. For more information, please, refer to 'filterInParams'.
soundGen3G_O2MNPar :: Int64 -> Int64 -> ((Float -> OvertonesO,Int -> Float -> OvertonesO,Int -> Float -> OvertonesO) -> [(Int,Int)] -> [(Float,Float -> OvertonesO)]) -> Params -> Float -> FilePath -> Float -> String -> 
    (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> 
      (Int -> OvertonesO) -> (OvertonesO -> OvertonesO) -> (Float -> OvertonesO) -> IO ()
soundGen3G_O2MNPar :: Int64
-> Int64
-> ((Float -> OvertonesO, Int -> Float -> OvertonesO,
     Int -> Float -> OvertonesO)
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> (Int -> OvertonesO)
-> (OvertonesO -> OvertonesO)
-> (Float -> OvertonesO)
-> IO ()
soundGen3G_O2MNPar Int64
m1 Int64
n1 (Float -> OvertonesO, Int -> Float -> OvertonesO,
 Int -> Float -> OvertonesO)
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII Params
params Float
freq1 FilePath
file Float
y FilePath
zs OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems Int -> OvertonesO
freq0 OvertonesO -> OvertonesO
proj Float -> OvertonesO
f0 = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m1 Int64
n1) FilePath
file) -- >>= print
  let arr2 :: Array Int (Int, Int)
arr2 = (\[(Int, Int)]
rs -> (Int, Int) -> [(Int, Int)] -> Array Int (Int, Int)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,[(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
rs Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [(Int, Int)]
rs) [(Int, Int)]
vecA0
      n :: Int
n = Array Int (Int, Int) -> Int
forall i e. Array i e -> Int
numElements Array Int (Int, Int)
arr2
      fA1 :: Int -> Float -> OvertonesO
fA1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fAddFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gAdds
      fR1 :: Int -> Float -> OvertonesO
fR1 Int
j = OvertonesO
-> (Float -> OvertonesO)
-> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO)
-> Float
-> OvertonesO
fRemoveFElems (OvertonesO -> OvertonesO
proj (OvertonesO -> OvertonesO)
-> (Int -> OvertonesO) -> Int -> OvertonesO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OvertonesO
freq0 (Int -> OvertonesO) -> Int -> OvertonesO
forall a b. (a -> b) -> a -> b
$ Int
j) Float -> OvertonesO
f0 OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
gRems
      vecB :: [(Float, Float -> OvertonesO)]
vecB = (Float -> OvertonesO, Int -> Float -> OvertonesO,
 Int -> Float -> OvertonesO)
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII (Float -> OvertonesO
f0,Int -> Float -> OvertonesO
fA1,Int -> Float -> OvertonesO
fR1) [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      v2 :: Array Int Float
v2    = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2 in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        OvertonesO -> (Float, Float) -> Params -> Float -> IO ()
h2Params (Float -> OvertonesO
k Float
x) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) Params
params Float
freq1
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult          

-- | Generates a sequence of sounds with changing timbre. Is a generalized version of the 'soundGen3G_O2', but for the conversion function conversionFII as its 
-- tuple first argument uses not the tuple of the three functions, but a tuple of three lists of functions of the respective types, that allows to 
-- specify more comlex behaviour and different variants inside the function itself, not its inner function parts. 'V.Vector' as a data type is used 
-- instead of more common list because it has similar functionality and besides provides easier and quicker access to its elements. So these are the 
-- following vectors of functions: @vf :: Vector (Float -> OvertonesO)@ (no changing a function for timbre generation), 
-- @vfA :: Vector (Int -> Float -> OvertonesO)@ (for \"adding\" overtones to the function for timbre generation), 
-- and @vfR :: Vector (Int -> Float -> OvertonesO@ (for \"removing\" overtones from the function for timbre generation).
-- 
soundGen3G_O2G :: (([(Float -> OvertonesO)],[(Int -> Float -> OvertonesO)],[(Int -> Float -> OvertonesO)]) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> [(Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> 
    Int -> Int -> Float -> FilePath -> Float -> String -> IO ()
soundGen3G_O2G :: (([Float -> OvertonesO], [Int -> Float -> OvertonesO],
  [Int -> Float -> OvertonesO])
 -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> IO ()
soundGen3G_O2G = Int64
-> Int64
-> (([Float -> OvertonesO], [Int -> Float -> OvertonesO],
     [Int -> Float -> OvertonesO])
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> IO ()
soundGen3G_O2GMN (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G_O2G #-}

-- | Generalized version of the 'soundGen3G_O2G' where 'liftInParams' is used instead of lifting with the 'liftInEnku'. This allows e. g. to 
-- use some tonality. For more information, please, refer to 'filterInParams'.
soundGen3G_O2GPar :: (([(Float -> OvertonesO)],[(Int -> Float -> OvertonesO)],[(Int -> Float -> OvertonesO)]) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> [(Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> 
    Params -> Float -> FilePath -> Float -> String -> IO ()
soundGen3G_O2GPar :: (([Float -> OvertonesO], [Int -> Float -> OvertonesO],
  [Int -> Float -> OvertonesO])
 -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> IO ()
soundGen3G_O2GPar = Int64
-> Int64
-> (([Float -> OvertonesO], [Int -> Float -> OvertonesO],
     [Int -> Float -> OvertonesO])
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> IO ()
soundGen3G_O2GMNPar (-Int64
1) (-Int64
1)
{-# INLINE soundGen3G_O2GPar #-}

-- | Generates a sequence of sounds with changing timbre. Is a generalized version of the 'soundGen3G_O2G'. To specify how many sounds the resulting files 
-- will provide, you use first two 'Int64' arguments, the first of which is a number of dropped elements for 'readFileDoubles' and the second one 
-- is a number of produced sounds (and, respectively, number of taken elements).
soundGen3G_O2GMN :: Int64 -> Int64 -> (([(Float -> OvertonesO)],[(Int -> Float -> OvertonesO)],[(Int -> Float -> OvertonesO)]) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> [(Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> 
    Int -> Int -> Float -> FilePath -> Float -> String -> IO ()
soundGen3G_O2GMN :: Int64
-> Int64
-> (([Float -> OvertonesO], [Int -> Float -> OvertonesO],
     [Int -> Float -> OvertonesO])
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> Int
-> Int
-> Float
-> FilePath
-> Float
-> FilePath
-> IO ()
soundGen3G_O2GMN Int64
m1 Int64
n1 ([Float -> OvertonesO], [Int -> Float -> OvertonesO],
 [Int -> Float -> OvertonesO])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII [Float -> OvertonesO]
vf [Int -> Float -> OvertonesO]
vfA [Int -> Float -> OvertonesO]
vfR Int
m Int
ku Float
freq1 FilePath
file Float
y FilePath
zs = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m1 Int64
n1) FilePath
file) -- >>= print
  let n :: Int
n = [(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
vecA0
      vecB :: [(Float, Float -> OvertonesO)]
vecB = ([Float -> OvertonesO], [Int -> Float -> OvertonesO],
 [Int -> Float -> OvertonesO])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII ([Float -> OvertonesO]
vf,[Int -> Float -> OvertonesO]
vfA,[Int -> Float -> OvertonesO]
vfR) [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      v2 :: Array Int Float
v2 = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2 in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        OvertonesO -> (Float, Float) -> Int -> Int -> Float -> IO ()
h2 (Float -> OvertonesO
k Float
x) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) Int
m Int
ku Float
freq1
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult

-- | Generalized version of the 'soundGen3G_O2GMN' where 'liftInParams' is used instead of lifting with the 'liftInEnku'. This allows e. g. to 
-- use some tonality. For more information, please, refer to 'filterInParams'.
soundGen3G_O2GMNPar :: Int64 -> Int64 -> (([(Float -> OvertonesO)],[(Int -> Float -> OvertonesO)],[(Int -> Float -> OvertonesO)]) -> [(Int,Int)] -> 
  [(Float,Float -> OvertonesO)]) -> [(Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> [(Int -> Float -> OvertonesO)] -> 
    Params -> Float -> FilePath -> Float -> String -> IO ()
soundGen3G_O2GMNPar :: Int64
-> Int64
-> (([Float -> OvertonesO], [Int -> Float -> OvertonesO],
     [Int -> Float -> OvertonesO])
    -> [(Int, Int)] -> [(Float, Float -> OvertonesO)])
-> [Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> [Int -> Float -> OvertonesO]
-> Params
-> Float
-> FilePath
-> Float
-> FilePath
-> IO ()
soundGen3G_O2GMNPar Int64
m1 Int64
n1 ([Float -> OvertonesO], [Int -> Float -> OvertonesO],
 [Int -> Float -> OvertonesO])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII [Float -> OvertonesO]
vf [Int -> Float -> OvertonesO]
vfA [Int -> Float -> OvertonesO]
vfR Params
params Float
freq1 FilePath
file Float
y FilePath
zs = do
  [(Int, Int)]
vecA0 <- ([Int] -> [(Int, Int)]) -> IO [Int] -> IO [(Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> (Int, Int)) -> [Int] -> [(Int, Int)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
108)) ((if Int64
m1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) Bool -> Bool -> Bool
&& Int64
n1 Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== (-Int64
1) then FilePath -> IO [Int]
readFileDoubles else Int64 -> Int64 -> FilePath -> IO [Int]
readFileDoublesMN Int64
m1 Int64
n1) FilePath
file) -- >>= print
  let n :: Int
n = [(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
vecA0
      vecB :: [(Float, Float -> OvertonesO)]
vecB = ([Float -> OvertonesO], [Int -> Float -> OvertonesO],
 [Int -> Float -> OvertonesO])
-> [(Int, Int)] -> [(Float, Float -> OvertonesO)]
conversionFII ([Float -> OvertonesO]
vf,[Int -> Float -> OvertonesO]
vfA,[Int -> Float -> OvertonesO]
vfR) [(Int, Int)]
vecA0
      zeroN :: Int
zeroN = [(Float, Float -> OvertonesO)] -> Int
forall a. [a] -> Int
numVZeroesPre [(Float, Float -> OvertonesO)]
vecB
      v2 :: Array Int Float
v2 = Int -> FilePath -> Float -> Array Int Float
str2DurationsDef Int
n FilePath
zs Float
y
      l2 :: Int
l2 = Array Int Float -> Int
forall i e. Array i e -> Int
numElements Array Int Float
v2 in ((Int, (Float, Float -> OvertonesO)) -> IO ())
-> [(Int, (Float, Float -> OvertonesO))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
j, (Float
x,Float -> OvertonesO
k)) -> do
        OvertonesO -> (Float, Float) -> Params -> Float -> IO ()
h2Params (Float -> OvertonesO
k Float
x) (Float
x, (Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
v2 (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
l2))) Params
params Float
freq1
        FilePath -> FilePath -> IO ()
renameFile (FilePath
"result.wav") (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"result0" FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Int -> FilePath -> FilePath
prependZeroes Int
zeroN (Int -> FilePath
forall a. Show a => a -> FilePath
show (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ FilePath
".wav") ([(Int, (Float, Float -> OvertonesO))] -> IO ())
-> ([(Float, Float -> OvertonesO)]
    -> [(Int, (Float, Float -> OvertonesO))])
-> [(Float, Float -> OvertonesO)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [(Float, Float -> OvertonesO)]
-> [(Int, (Float, Float -> OvertonesO))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([(Float, Float -> OvertonesO)] -> IO ())
-> [(Float, Float -> OvertonesO)] -> IO ()
forall a b. (a -> b) -> a -> b
$ [(Float, Float -> OvertonesO)]
vecB
  IO ()
endFromResult  

-- | For the given parameters generates a single sound with overtones or pause depending on the sign of the second element in the tuple of 'Float': 
-- if it is greater than zero then the sound is generated, if less -- the silence (pause), if it is equal to zero then it prints an informational message 
-- about a non-standard situation. 
h1 :: (Float -> OvertonesO) -> (Float, Float) -> IO ()
h1 :: (Float -> OvertonesO) -> (Float, Float) -> IO ()
h1 Float -> OvertonesO
f (Float
x, Float
y) = do
    let note0 :: Float
note0 = Float -> Float
closestNote (if Float
x Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
/= Float
0.0 then Float -> Float
forall a. Num a => a -> a
abs Float
x else Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes Int
0)
        v0 :: OvertonesO
v0    = Float -> OvertonesO
f Float
note0
        ts :: FilePath
ts = Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float
forall a. Num a => a -> a
abs Float
y) FilePath
""
    case Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
y Float
0.0 of
     Ordering
GT -> do 
       (ExitCode
_,FilePath
_,FilePath
herr) <- FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
readProcessWithExitCode (Maybe FilePath -> FilePath
forall a. HasCallStack => Maybe a -> a
fromJust (FilePath -> Maybe FilePath
showE FilePath
"sox")) [FilePath
"-r22050", FilePath
"-n", FilePath
"testA.wav", FilePath
"synth", FilePath
ts,FilePath
"sine",Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
note0 FilePath
""] FilePath
""
       FilePath -> IO ()
forall a. Show a => a -> IO ()
print FilePath
herr
       let ll :: Int
ll = OvertonesO -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length OvertonesO
v0
       OvertonesO -> Int -> FilePath -> Array Int Float -> IO ()
partialTest_k1G OvertonesO
v0 Int
0 FilePath
ts ((Int, Int) -> [Float] -> Array Int Float
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
ll Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ([Float] -> Array Int Float)
-> (Float -> [Float]) -> Float -> Array Int Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Float -> [Float]
forall a. Int -> a -> [a]
replicate Int
ll (Float -> Array Int Float) -> Float -> Array Int Float
forall a b. (a -> b) -> a -> b
$ Float
0.0)
       IO ()
mixTest
     Ordering
LT -> FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
readProcessWithExitCode (Maybe FilePath -> FilePath
forall a. HasCallStack => Maybe a -> a
fromJust (FilePath -> Maybe FilePath
showE FilePath
"sox")) [FilePath
"-r22050", FilePath
"-n", FilePath
"result.wav", FilePath
"synth", FilePath
ts,FilePath
"sine",Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
note0 FilePath
"",FilePath
"vol",FilePath
"0"] FilePath
"" IO (ExitCode, FilePath, FilePath)
-> ((ExitCode, FilePath, FilePath) -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= 
        \(ExitCode
_,FilePath
_,FilePath
herr) -> FilePath -> IO ()
putStr FilePath
herr
     Ordering
_ -> FilePath -> IO ()
putStrLn FilePath
"Zero length of the sound! "  

-- | For the given parameters generates a single sound with overtones or pause depending on the sign of the second element in the tuple of 'Float': 
-- if it is greater than zero then the sound is generated, if less -- the silence (pause), if it is equal to zero then it prints an informational message 
-- about a non-standard situation. Unlike the 'h1' function, it lifts the frequency into the enku specified by the 'Int' arguments (see 'liftInEnku').
h2 :: OvertonesO -> (Float, Float) -> Int -> Int -> Float -> IO ()
h2 :: OvertonesO -> (Float, Float) -> Int -> Int -> Float -> IO ()
h2 OvertonesO
v (Float
x, Float
y) Int
m Int
ku Float
freq1 = do
    let note0 :: Float
note0 = Float -> Maybe Float -> Float
forall a. a -> Maybe a -> a
fromMaybe Float
freq1 (Maybe Float -> Float) -> (Float -> Maybe Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> Float -> Maybe Float
liftInEnku Int
m Int
ku (Float -> Maybe Float) -> (Float -> Float) -> Float -> Maybe Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float
closestNote (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ (if Float
x Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
/= Float
0.0 then Float -> Float
forall a. Num a => a -> a
abs Float
x else Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes Int
0)
        ts :: FilePath
ts = Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float
forall a. Num a => a -> a
abs Float
y) FilePath
""
    case Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
y Float
0.0 of
     Ordering
GT -> do 
       (ExitCode
_,FilePath
_,FilePath
herr) <- FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
readProcessWithExitCode (Maybe FilePath -> FilePath
forall a. HasCallStack => Maybe a -> a
fromJust (FilePath -> Maybe FilePath
showE FilePath
"sox")) [FilePath
"-r22050", FilePath
"-n", FilePath
"testA.wav", FilePath
"synth", FilePath
ts,FilePath
"sine",Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
note0 FilePath
""] FilePath
""
       FilePath -> IO ()
forall a. Show a => a -> IO ()
print FilePath
herr
       let ll :: Int
ll = OvertonesO -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length OvertonesO
v
       OvertonesO -> Int -> FilePath -> Array Int Float -> IO ()
partialTest_k1G OvertonesO
v Int
0 FilePath
ts ((Int, Int) -> [Float] -> Array Int Float
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
ll Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ([Float] -> Array Int Float)
-> (Float -> [Float]) -> Float -> Array Int Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Float -> [Float]
forall a. Int -> a -> [a]
replicate Int
ll (Float -> Array Int Float) -> Float -> Array Int Float
forall a b. (a -> b) -> a -> b
$ Float
0.0)
       IO ()
mixTest
     Ordering
LT -> FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
readProcessWithExitCode (Maybe FilePath -> FilePath
forall a. HasCallStack => Maybe a -> a
fromJust (FilePath -> Maybe FilePath
showE FilePath
"sox")) [FilePath
"-r22050", FilePath
"-n", FilePath
"result.wav", FilePath
"synth", FilePath
ts,FilePath
"sine",Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
note0 FilePath
"",FilePath
"vol",FilePath
"0"] FilePath
"" IO (ExitCode, FilePath, FilePath)
-> ((ExitCode, FilePath, FilePath) -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= 
        \(ExitCode
_,FilePath
_,FilePath
herr) -> FilePath -> IO ()
putStr FilePath
herr
     Ordering
_ -> FilePath -> IO ()
putStrLn FilePath
"Zero length of the sound! "  

-- | For the given parameters generates a single sound with overtones or pause depending on the sign of the second element in a tuple of 'Float': 
-- if it is greater than zero then the sound is generated, if less -- the silence (pause), if it is equal to zero then it prints an informational message 
-- about a non-standard situation.  Unlike the 'h1' function, it lifts into the requency specified by the 'Params' argument .
h2Params :: OvertonesO -> (Float, Float) -> Params -> Float -> IO ()
h2Params :: OvertonesO -> (Float, Float) -> Params -> Float -> IO ()
h2Params OvertonesO
v (Float
x, Float
y) Params
params Float
freq1 = do
    let note01 :: Float
note01 = (Float -> Params -> Float) -> Params -> Float -> Float
forall a b c. (a -> b -> c) -> b -> a -> c
flip Float -> Params -> Float
liftInParams Params
params (if Float
x Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
/= Float
0.0 then Float -> Float
forall a. Num a => a -> a
abs Float
x else Array Int Float -> Int -> Float
forall i e. Array i e -> Int -> e
unsafeAt Array Int Float
notes Int
0)
        ts :: FilePath
ts = Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float
forall a. Num a => a -> a
abs Float
y) FilePath
""
        note0 :: Float
note0 = if Float
note01 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
== Float
11440.0 then Float
freq1 else Float
note01
    case Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
y Float
0.0 of
     Ordering
GT -> do 
       (ExitCode
_,FilePath
_,FilePath
herr) <- FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
readProcessWithExitCode (Maybe FilePath -> FilePath
forall a. HasCallStack => Maybe a -> a
fromJust (FilePath -> Maybe FilePath
showE FilePath
"sox")) [FilePath
"-r22050", FilePath
"-n", FilePath
"testA.wav", FilePath
"synth", FilePath
ts,FilePath
"sine",Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
note0 FilePath
""] FilePath
""
       FilePath -> IO ()
forall a. Show a => a -> IO ()
print FilePath
herr
       let ll :: Int
ll = OvertonesO -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length OvertonesO
v
       OvertonesO -> Int -> FilePath -> Array Int Float -> IO ()
partialTest_k1G OvertonesO
v Int
0 FilePath
ts ((Int, Int) -> [Float] -> Array Int Float
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
ll Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ([Float] -> Array Int Float)
-> (Float -> [Float]) -> Float -> Array Int Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Float -> [Float]
forall a. Int -> a -> [a]
replicate Int
ll (Float -> Array Int Float) -> Float -> Array Int Float
forall a b. (a -> b) -> a -> b
$ Float
0.0)
       IO ()
mixTest
     Ordering
LT -> FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
readProcessWithExitCode (Maybe FilePath -> FilePath
forall a. HasCallStack => Maybe a -> a
fromJust (FilePath -> Maybe FilePath
showE FilePath
"sox")) [FilePath
"-r22050", FilePath
"-n", FilePath
"result.wav", FilePath
"synth", FilePath
ts,FilePath
"sine",Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
note0 FilePath
"",FilePath
"vol",FilePath
"0"] FilePath
"" IO (ExitCode, FilePath, FilePath)
-> ((ExitCode, FilePath, FilePath) -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= 
        \(ExitCode
_,FilePath
_,FilePath
herr) -> FilePath -> IO ()
putStr FilePath
herr
     Ordering
_ -> FilePath -> IO ()
putStrLn FilePath
"Zero length of the sound! "