-- |
-- Module      :  Composition.Sound.Faded
-- Copyright   :  (c) OleksandrZhabenko 2020-2021
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music. 
-- Uses SoX fade (in a special 2D way) effect and frequency modulation. 
-- It uses 'Float' instead of 'Double'. This change is inspired by: 
-- https://www.youtube.com/watch?v=FYTZkE5BZ-0
-- For conversion it uses functions from the 'GHC.Float' module.
-- Is rewritten from the dobutokO4 package.
-- 

{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_HADDOCK show-extensions #-}

module Composition.Sound.Faded (
  -- * Provide special faded effects and frequency modulation
  overChangeVolGNC
  , overChangeVolGN
  , overChangeVolG
  , overChangeVolGC
  , overChangeVolGF
  , overChangeVol
  , overChangeVolC
  , overChangeVolF
  , overChangeVolGCN
  , overChangeVolGFN
  , overChangeVolN
  , overChangeVolCN
  , overChangeVolFN
  -- * Mixing function
  , mixGTest
  , mixGTestN
  -- * Generate several files
  , basicFN
  , basicF
  , basicFC
  , basicF2
  , basicF2C
  , basicFCN
  , basicF2N
  , basicF2CN
  -- * Generate several files with frequency modulation
  , moreFNC
  , moreFN
  , moreFCN
  , reverbFix
  -- * Auxiliary functions
  , endingWF
  , charFadeType
  , argString
  , freqChange
  -- * Special numbers
  , sameConst
) where

#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=710
/* code that applies only to GHC 7.10.* and higher versions */
import GHC.Base (mconcat)
#endif
#endif
import System.Exit (ExitCode (ExitSuccess))
import Data.List (isPrefixOf,isSuffixOf)
import Data.Maybe (fromJust)
import System.Process
import EndOfExe (showE)
import MMSyn7l (fadeEndsTMB,fadeEndsTMN)
import Numeric (showFFloat)
import System.Directory
import Composition.Sound.Functional.Basics
import Composition.Sound.IntermediateF (soxBasicParams)
import Data.DoubleZip (evalSndFV)

#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif

-- | Generates a sound, the volume of which (being plotted graphically) comes through the given 2D points at the time-volume scale with possibly 
-- changing frequency (they are specified by the first and the second 'Float' arguments). Uses SoX inside especially the \"fade\" and \"synth\" effects. 
-- For the equal frequencies generates specifically faded output without frequency modulation. 
overChangeVolG :: String -> String -> Int -> Float -> Float -> Float -> Float -> ((Float,Float), (Float,Float)) -> IO ()
overChangeVolG :: String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolG = String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
"test"
{-# INLINE overChangeVolG #-}
 
-- | A generalized version of the 'overChangeVolG' with a possibility to specify the name of the resulting file (by default it is \"test\" based).
overChangeVolGN :: FilePath -> String -> String -> Int -> Float -> Float -> Float -> Float -> ((Float,Float), (Float,Float)) -> IO ()
overChangeVolGN :: String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta ((Float
t0,Float
v0), (Float
t1,Float
v1)) 
 | Float
x0 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
/= Float
0 Bool -> Bool -> Bool
&& Float -> Float
forall a. Num a => a -> a
abs Float
x0 Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
<= Float
1.0 Bool -> Bool -> Bool
&& Float
freq1 Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
> Float
16 Bool -> Bool -> Bool
&& Float
freq1 Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
< Float
20000 = 
  case Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v0) Float
0 of 
    Ordering
GT -> do
     (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",String
"test1.wav",String
"synth", 
       Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float
t1 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
== Float
t0 then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"fade", 
        Char -> String
charFadeType (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cs then Char
'l' else String -> Char
forall a. [a] -> a
head String
cs)] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ 
         if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ((Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v0) Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
LT then [Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""] 
           else [String
"0", String
"-0.0", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"vol", 
             Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float
forall a. Num a => a -> a
signum Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float -> Float
forall a. Num a => a -> a
abs (Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v0)) String
""]) String
""
     if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
     else do
      (ExitCode
code2,String
_,String
herr2) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",String
"test0.wav",String
"synth", 
        Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", 
          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"vol", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float -> Float
forall a. Ord a => a -> a -> a
min Float
v0 Float
v1) String
""]) String
""
      if ExitCode
code2 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess 
        then do
          (ExitCode
code3,String
_,String
herr3) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"-m",String
"test0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"test1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, String
"vol", String
"2"] String
""
          if ExitCode
code3 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess 
            then String -> IO ()
removeFile (String
"test0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"test1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
            else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr3
        else String -> IO ()
forall a. Show a => a -> IO ()
print String
herr2 IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
forall a. HasCallStack => String -> a
error String
"Composition.Sound.Faded.overChangeVolGN: Operation not successful. "
    Ordering
LT -> do  
     String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys String
cs Int
j Float
freq1 ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1)) Float
x0 Float
xdelta ((Float
t0,Float
v0), ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t0) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1),Float
0)) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      String -> String -> IO ()
renameFile ((String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) (String
"temp00" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
     (ExitCode
code0,String
_,String
herr) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"temp00" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, String
"fade", String
"h", String
"0", String
"-0.0",
       Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) ((Float -> Float -> Float
forall a. Ord a => a -> a -> a
max Float
freq1 Float
freq2) Float -> Float -> Float
forall a. Floating a => a -> a -> a
** (-Float
1.0)) String
""] String
"" 
     if ExitCode
code0 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (ShowS
forall a. Show a => a -> String
show String
herr)
     else do
      String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys String
cs Int
j ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1)) Float
freq2 Float
x0 Float
xdelta (((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t0) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1),Float
0), (Float
t1,Float
v1)) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
       String -> String -> IO ()
renameFile ((String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
      (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
       Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys] String
""
      if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess then String -> IO ()
removeFile (String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"temp00" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) 
      else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1 
    Ordering
_  -> 
     case Float
v1 of 
      Float
0 -> 
       if Float
v0 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
== Float
0 
        then do
          (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",(String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            String
".wav",String
"delay", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"trim", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing 
              (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""]) String
""
          if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
          else () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        else do 
          (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",(String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            String
".wav",String
"synth", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", 
              Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"fade", Char -> String
charFadeType (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cs then Char
'l' else String -> Char
forall a. [a] -> a
head String
cs)] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ 
               if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
t0 Float
t1 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT then [Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing 
                (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""] else [String
"0", String
"-0.0", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing 
                  (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"vol", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
v0 String
""]) String
""
          if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
          else () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
      Float
_ -> do
       (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",(String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".wav",
         String
"synth", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", 
          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"fade", Char -> String
charFadeType (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cs then Char
'l' else String -> Char
forall a. [a] -> a
head String
cs)] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ 
           if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
t1 Float
t0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT 
            then [Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 
             else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""] else [String
"0", String
"-0.0", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", 
               String
"vol", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
v1 String
""]) String
""
       if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
       else () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
 | Bool
otherwise = String -> IO ()
forall a. HasCallStack => String -> a
error String
"Composition.Sound.Faded.overChangeVolGN: sound for these conditions is not defined. " 

freqChange :: String -> Float -> Float -> String
freqChange :: String -> Float -> Float -> String
freqChange String
xs Float
freq Float
freq1 
 | Float
freq Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
>= Float
16 Bool -> Bool -> Bool
&& Float
freq Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
<= Float
20000 = if Float
freq Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
/= Float
freq1 then
   case String
xs of 
    String
"l" -> Char
':'Char -> ShowS
forall a. a -> [a] -> [a]
:Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq String
""
    String
"s" -> Char
'+'Char -> ShowS
forall a. a -> [a] -> [a]
:Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq String
""
    String
"e" -> Char
'/'Char -> ShowS
forall a. a -> [a] -> [a]
:Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq String
""
    String
_ -> Char
'-'Char -> ShowS
forall a. a -> [a] -> [a]
:Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq String
"" 
     else String
""
 | Bool
otherwise = ShowS
forall a. HasCallStack => String -> a
error String
"Composition.Sound.Faded.freqChange: undefined for this value of the frequency (the first Float argument). "

-- | Generates a sound, the volume of which (being plotted graphically) comes through the given 2D points at the time-volume scale. Uses SoX inside 
-- especially the \"fade\" and \"synth\" effects. A frequency does not change and is specified (in Hz) by the first 'Float' argument.
overChangeVol :: String -> Char -> Int -> Float -> Float -> Float -> ((Float,Float), (Float,Float)) -> IO () 
overChangeVol :: String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVol String
ys Char
c Int
j Float
freq1 = String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
"test" String
ys [Char
c] Int
j Float
freq1 Float
freq1
{-# INLINE overChangeVol #-}

-- | A generalized version of the 'overChangeVol' with a possibility to specify the name for the mixed files (by default is \"test\" based).
overChangeVolN :: FilePath -> String -> Char -> Int -> Float -> Float -> Float -> ((Float,Float), (Float,Float)) -> IO () 
overChangeVolN :: String
-> String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolN String
filestart String
ys Char
c Int
j Float
freq1 = String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys [Char
c] Int
j Float
freq1 Float
freq1
{-# INLINE overChangeVolN #-}

-- | Generates a sound, the volume of which (being plotted graphically) comes through the given 2D points in the time-volume scale. Uses SoX inside especially 
-- the \"fade\" and \"synth\" effects. A frequency does not change and is specified (in Hz) by the first 'Float' argument. Is a curried variant of the 
-- 'overChangeVol' in its two last arguments.
overChangeVolC :: String -> Char -> Int -> Float -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
overChangeVolC :: String
-> Char
-> Int
-> Float
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> IO ()
overChangeVolC String
ys Char
c Int
j Float
freq Float
x0 Float
xdelta (Float, Float)
w1 = String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVol String
ys Char
c Int
j Float
freq Float
x0 Float
xdelta (((Float, Float), (Float, Float)) -> IO ())
-> ((Float, Float) -> ((Float, Float), (Float, Float)))
-> (Float, Float)
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,) (Float, Float)
w1
{-# INLINE overChangeVolC #-}

-- | A generalized version of the 'overChangeVolC' with a possibility to specify the name for the mixed files (by default is \"test\" based).
overChangeVolCN :: FilePath -> String -> Char -> Int -> Float -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
overChangeVolCN :: String
-> String
-> Char
-> Int
-> Float
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> IO ()
overChangeVolCN String
filestart String
ys Char
c Int
j Float
freq Float
x0 Float
xdelta (Float, Float)
w1 = String
-> String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolN String
filestart String
ys Char
c Int
j Float
freq Float
x0 Float
xdelta (((Float, Float), (Float, Float)) -> IO ())
-> ((Float, Float) -> ((Float, Float), (Float, Float)))
-> (Float, Float)
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,) (Float, Float)
w1
{-# INLINE overChangeVolCN #-}

-- | Generates a sound, the volume of which (being plotted graphically) comes through the given 2D points in the time-volume scale with possibly changing frequency (they are specified by 
-- the first and the second 'Float' arguments). Uses SoX inside especially the \"fade\" and \"synth\" effects. For the equal frequencies generates specifically 
-- faded output without frequency modulation. Is a curried variant of the 'overChangeVolG' in its two last arguments.
overChangeVolGC :: String -> String -> Int -> Float -> Float -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
overChangeVolGC :: String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> IO ()
overChangeVolGC String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta (Float, Float)
w1 = String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolG String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta (((Float, Float), (Float, Float)) -> IO ())
-> ((Float, Float) -> ((Float, Float), (Float, Float)))
-> (Float, Float)
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,) (Float, Float)
w1
{-# INLINE overChangeVolGC #-}

-- | A generalized version of the 'overChangeVolGC' with a possibility to specify the name for the mixed files (by default is \"test\" based).
overChangeVolGCN :: FilePath -> String -> String -> Int -> Float -> Float -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
overChangeVolGCN :: String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> IO ()
overChangeVolGCN String
filestart String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta (Float, Float)
w1 = String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta (((Float, Float), (Float, Float)) -> IO ())
-> ((Float, Float) -> ((Float, Float), (Float, Float)))
-> (Float, Float)
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,) (Float, Float)
w1
{-# INLINE overChangeVolGCN #-}

-- | Generates a sound, the volume of which (being plotted graphically) comes through the given 2D points in the time-volume scale. Uses SoX inside especially 
-- the \"fade\" and \"synth\" effects. Is a somewhat flipped variant of the 'overChangeVol' with changed order of the arguments (is provided here 
-- for convenience).
overChangeVolF :: String -> Char -> Int -> Float -> Float -> (Float,Float) -> (Float,Float) ->  Float -> IO ()
overChangeVolF :: String
-> Char
-> Int
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> Float
-> IO ()
overChangeVolF String
ys Char
c Int
j Float
x0 Float
xdelta (Float, Float)
w1 (Float, Float)
w2 Float
freq  = String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVol String
ys Char
c Int
j Float
freq Float
x0 Float
xdelta ((Float, Float)
w1,(Float, Float)
w2)
{-# INLINE overChangeVolF #-}

-- | A generalized version of the 'overChangeVolF' with a possibility to specify the name for the mixed files (by default is \"test\" based).
overChangeVolFN :: FilePath -> String -> Char -> Int -> Float -> Float -> (Float,Float) -> (Float,Float) ->  Float -> IO ()
overChangeVolFN :: String
-> String
-> Char
-> Int
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> Float
-> IO ()
overChangeVolFN String
filestart String
ys Char
c Int
j Float
x0 Float
xdelta (Float, Float)
w1 (Float, Float)
w2 Float
freq  = String
-> String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolN String
filestart String
ys Char
c Int
j Float
freq Float
x0 Float
xdelta ((Float, Float)
w1,(Float, Float)
w2)
{-# INLINE overChangeVolFN #-}

-- | Generates a sound, the volume of which (being plotted graphically) comes through the given 2D points in the time-volume scale with possibly 
-- changing frequency (they are specified by the first and the second 'Float' arguments). Uses SoX inside especially the \"fade\" and \"synth\" effects. 
-- For the equal frequencies generates specifically faded output without frequency modulation. Is a somewhat flipped variant of the 'overChangeVolGC' 
-- with changed order of the arguments (is provided here for convenience).
overChangeVolGF :: String -> String -> Int -> Float -> Float -> (Float,Float) -> (Float,Float) ->  Float -> Float -> IO ()
overChangeVolGF :: String
-> String
-> Int
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> Float
-> Float
-> IO ()
overChangeVolGF String
ys String
cs Int
j Float
x0 Float
xdelta (Float, Float)
w1 (Float, Float)
w2 Float
freq1 Float
freq2  = String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolG String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta ((Float, Float)
w1,(Float, Float)
w2)
{-# INLINE overChangeVolGF #-}

-- | A generalized version of the 'overChangeVolGF' with a possibility to specify the name for the mixed files (by default is \"test\" based).
overChangeVolGFN :: FilePath -> String -> String -> Int -> Float -> Float -> (Float,Float) -> (Float,Float) ->  Float -> Float -> IO ()
overChangeVolGFN :: String
-> String
-> String
-> Int
-> Float
-> Float
-> (Float, Float)
-> (Float, Float)
-> Float
-> Float
-> IO ()
overChangeVolGFN String
filestart String
ys String
cs Int
j Float
x0 Float
xdelta (Float, Float)
w1 (Float, Float)
w2 Float
freq1 Float
freq2  = String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta ((Float, Float)
w1,(Float, Float)
w2)
{-# INLINE overChangeVolGFN #-}

-- | A simplified variant of the 'soxBasicParameters' function with defining only a file extension.
endingWF :: String -> String
endingWF :: ShowS
endingWF String
ys 
 | Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
ys) = if String -> Char
forall a. [a] -> a
last String
ys Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'f' then String
".flac" else String
".wav"
 | Bool
otherwise = String
".wav"

-- | Converts a character into a corresponding string using \"l\" (a logarithmic one) as the default one. An output can specify then the fade type for SoX.
charFadeType :: Char -> String
charFadeType :: Char -> String
charFadeType Char
c = 
  case Char
c of
   Char
'h' -> String
"h"
   Char
'p' -> String
"p"
   Char
't' -> String
"t"
   Char
_  -> String
"l"

-- | Using SoX mixes all the \"testG*\" (of the WAV or FLAC extension specified by the 'String' argument -- see 'endingWF') in the current directory. 
-- If there are \"resultG.*" (wav or flac respectively) file in the directory, it is overwritten. Also the "testG*" files are deleted afterwards if the 
-- mixing is successful.
mixGTest :: String -> IO ()
mixGTest :: String -> IO ()
mixGTest String
ys = do
  [String]
dir <- String -> IO [String]
listDirectory String
"."
  (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) ([[String]] -> [String]
forall a. Monoid a => [a] -> a
mconcat [[String
"-m"], (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (\String
xs -> String
"testG" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
xs Bool -> Bool -> Bool
&& 
    ShowS
endingWF String
ys String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
xs) [String]
dir, [String
"resultG" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys]]) String
""
  if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.mixGTest: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
  else (String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ String -> IO ()
removeFile ([String] -> IO ()) -> ([String] -> [String]) -> [String] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (\String
xs -> String
"testG" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
xs Bool -> Bool -> Bool
&& ShowS
endingWF String
ys String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
xs) ([String] -> IO ()) -> [String] -> IO ()
forall a b. (a -> b) -> a -> b
$ [String]
dir

-- | A generalized version of the 'mixGTest' with a possibility to specify the name for the mixed files (by default is \"test\" based).
mixGTestN :: FilePath -> String -> IO ()
mixGTestN :: String -> String -> IO ()
mixGTestN String
filestart String
ys = do
  [String]
dir <- String -> IO [String]
listDirectory String
"."
  (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) ([[String]] -> [String]
forall a. Monoid a => [a] -> a
mconcat [[String
"-m"], (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (\String
xs -> (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
xs Bool -> Bool -> Bool
&& 
    ShowS
endingWF String
ys String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
xs) [String]
dir, [String
"resultG" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys]]) String
""
  if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.mixGTestN: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
  else (String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ String -> IO ()
removeFile ([String] -> IO ()) -> ([String] -> [String]) -> [String] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (\String
xs -> (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
xs Bool -> Bool -> Bool
&& ShowS
endingWF String
ys String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
xs) ([String] -> IO ()) -> [String] -> IO ()
forall a b. (a -> b) -> a -> b
$ [String]
dir  
  
-- | Generates a sequence of sounds using 'overChangeVol' so that their time-volume characteristic is going through the 2D points obtained 
-- with the last two arguments.
-- Uses 'fadeEndsTMB', the arguments for which are specified by the second symbol in the second 'String' and by the third 'Float' argument.
basicF :: String -> String -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicF :: String
-> String
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF String
ys String
x2s Float
freq Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v = do
  let (String
xs1,String
xs2) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 String
x2s
      c1 :: Char
c1
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs1 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs1
      c2 :: Char
c2
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs2 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs2
  [((Float, Float), (Float, Float))]
v1 <- (Float -> Float)
-> [Float] -> IO [((Float, Float), (Float, Float))]
forall b a.
(Fractional b, Ord b, Eq a) =>
(a -> b) -> [a] -> IO [((a, b), (a, b))]
evalSndFV Float -> Float
f [Float]
v
  ((Int, ((Float, Float), (Float, Float))) -> IO ())
-> [(Int, ((Float, Float), (Float, Float)))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, ((Float, Float), (Float, Float))
x) -> do
    String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVol String
ys Char
c1 Int
i Float
freq Float
x0 Float
xdelta ((Float, Float), (Float, Float))
x
    Char -> Float -> String -> IO ()
fadeEndsTMB Char
c2 Float
per (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"testG" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
i) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) ([(Int, ((Float, Float), (Float, Float)))] -> IO ())
-> ([((Float, Float), (Float, Float))]
    -> [(Int, ((Float, Float), (Float, Float)))])
-> [((Float, Float), (Float, Float))]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [((Float, Float), (Float, Float))]
-> [(Int, ((Float, Float), (Float, Float)))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([((Float, Float), (Float, Float))] -> IO ())
-> [((Float, Float), (Float, Float))] -> IO ()
forall a b. (a -> b) -> a -> b
$ [((Float, Float), (Float, Float))]
v1

-- | A generalized version of the 'basicF' with a possibility to specify the name for the generated files (by default is \"test\" based).
basicFN :: FilePath -> String -> String -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicFN :: String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicFN String
filestart String
ys String
x2s Float
freq Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v = do
  let (String
xs1,String
xs2) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 String
x2s
      c1 :: Char
c1
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs1 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs1
      c2 :: Char
c2
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs2 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs2
  [((Float, Float), (Float, Float))]
v1 <- (Float -> Float)
-> [Float] -> IO [((Float, Float), (Float, Float))]
forall b a.
(Fractional b, Ord b, Eq a) =>
(a -> b) -> [a] -> IO [((a, b), (a, b))]
evalSndFV Float -> Float
f [Float]
v
  ((Int, ((Float, Float), (Float, Float))) -> IO ())
-> [(Int, ((Float, Float), (Float, Float)))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, ((Float, Float), (Float, Float))
x) -> do
    String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys [Char
c1] Int
i Float
freq Float
freq Float
x0 Float
xdelta ((Float, Float), (Float, Float))
x
    Char -> Float -> String -> IO ()
fadeEndsTMB Char
c2 Float
per (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
i) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) ([(Int, ((Float, Float), (Float, Float)))] -> IO ())
-> ([((Float, Float), (Float, Float))]
    -> [(Int, ((Float, Float), (Float, Float)))])
-> [((Float, Float), (Float, Float))]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [((Float, Float), (Float, Float))]
-> [(Int, ((Float, Float), (Float, Float)))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([((Float, Float), (Float, Float))] -> IO ())
-> [((Float, Float), (Float, Float))] -> IO ()
forall a b. (a -> b) -> a -> b
$ [((Float, Float), (Float, Float))]
v1

-- | Splits its argument (the first six symbols if present) (like 'splitAt') into two 'String' with the length of (if possible) 4 and 2 characters. 
-- The rest of the argument is not used.
argString :: String -> (String,String)
argString :: String -> (String, String)
argString String
xs = (Int -> ShowS
forall a. Int -> [a] -> [a]
take Int
4 String
xs,Int -> ShowS
forall a. Int -> [a] -> [a]
take Int
2 ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
4 ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
xs)
{-# INLINE argString #-}

-- | Generates a sequence of sounds using 'overChangeVol' so that their time-volume characteristic (if being plotted graphically) is going through 
-- the 2D points obtained with the last two arguments.
-- The 'String' should consist of 6 alphanumeric characters. The first four as for the 'soxBasicParams', and the fifth one -- a letter from the \"hlpqt\". The 
-- sixth one is one of the \"els\" or some other symbol.
-- Otherwise, the default values are used (\"221w\" for the first and \"ll\" for the second one).
basicFC :: String -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicFC :: String
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicFC = String
-> String
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicFCN String
"test"
{-# INLINE basicFC #-}

-- | A generalized version of the 'basicFC' with a possibility to specify the name for the mixed files (by default is \"test\" based).
basicFCN :: FilePath -> String -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicFCN :: String
-> String
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicFCN String
filestart String
xs Float
freq Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v = let (String
ys,String
x2s) = String -> (String, String)
argString String
xs in String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicFN String
filestart String
ys String
x2s Float
freq Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v
{-# INLINE basicFCN #-}

-- | Generates a sequence of sounds using 'overChangeVol' so that their time-volume characteristic (if being plotted graphically) is going through the 2D points obtained 
-- with the last two arguments.
-- Uses 'fadeEndsTMN', the arguments for which are specified by the second symbol in the second 'String' and by the third and fourth 'Float' arguments.
basicF2 :: String -> String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicF2 :: String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2 = String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2N String
"test"
{-# INLINE basicF2 #-}

-- | A generalized version of the 'basicF2' with a possibility to specify the name for the mixed files (by default is \"test\" based).
basicF2N :: FilePath -> String -> String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicF2N :: String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2N String
filestart String
ys String
x2s Float
freq Float
x0 Float
xdelta Float
per1 Float
per2 Float -> Float
f [Float]
v = do
  let (String
xs1,String
xs2) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 String
x2s
      c1 :: Char
c1
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs1 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs1
      c2 :: Char
c2
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs2 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs2
  [((Float, Float), (Float, Float))]
v1 <- (Float -> Float)
-> [Float] -> IO [((Float, Float), (Float, Float))]
forall b a.
(Fractional b, Ord b, Eq a) =>
(a -> b) -> [a] -> IO [((a, b), (a, b))]
evalSndFV Float -> Float
f [Float]
v
  ((Int, ((Float, Float), (Float, Float))) -> IO ())
-> [(Int, ((Float, Float), (Float, Float)))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, ((Float, Float), (Float, Float))
x) -> do
    String
-> String
-> Char
-> Int
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolN String
filestart String
ys Char
c1 Int
i Float
freq Float
x0 Float
xdelta ((Float, Float), (Float, Float))
x
    Char -> Float -> Float -> String -> IO ()
fadeEndsTMN Char
c2 Float
per1 Float
per2 (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
i) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) ([(Int, ((Float, Float), (Float, Float)))] -> IO ())
-> ([((Float, Float), (Float, Float))]
    -> [(Int, ((Float, Float), (Float, Float)))])
-> [((Float, Float), (Float, Float))]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [((Float, Float), (Float, Float))]
-> [(Int, ((Float, Float), (Float, Float)))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([((Float, Float), (Float, Float))] -> IO ())
-> [((Float, Float), (Float, Float))] -> IO ()
forall a b. (a -> b) -> a -> b
$ [((Float, Float), (Float, Float))]
v1    

-- | Generates a sequence of sounds using 'overChangeVol' so that their time-volume characteristic (if being plotted graphically) is going through 
-- the 2D points obtained with the last two arguments.
-- The 'String' should consist of 6 alphanumeric characters. The first four as for the 'soxBasicParams' and the the fifth one -- a letter 
-- from the \"hlpqt\". The sixth one is one of the \"els\" or some other symbol. Otherwise, the default values are used (\"221w\" for the first 
-- and \"ll\" for the second one).
basicF2C :: String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicF2C :: String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2C = String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2CN String
"test"
{-# INLINE basicF2C #-}

-- | A generalized version of the 'basicF2C' with a possibility to specify the name for the mixed files (by default is \"test\" based).
basicF2CN :: FilePath -> String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
basicF2CN :: String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2CN String
filestart String
xs Float
freq Float
x0 Float
xdelta Float
per1 Float
per2 Float -> Float
f [Float]
v = let (String
ys,String
x2s) = String -> (String, String)
argString String
xs in String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
basicF2N String
filestart String
ys String
x2s Float
freq Float
x0 Float
xdelta Float
per1 Float
per2 Float -> Float
f [Float]
v
{-# INLINE basicF2CN #-}

-- | A generalized version of the 'basicFN' with a frequency modulation.
moreFN :: FilePath -> String -> String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
moreFN :: String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
moreFN String
filestart String
ys String
x2s Float
freq1 Float
freq2 Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v = do
  let (String
xs1,String
xs2) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 String
x2s
      c1 :: Char
c1
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs1 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs1
      c2 :: Char
c2
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs2 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs2
  [((Float, Float), (Float, Float))]
v1 <- (Float -> Float)
-> [Float] -> IO [((Float, Float), (Float, Float))]
forall b a.
(Fractional b, Ord b, Eq a) =>
(a -> b) -> [a] -> IO [((a, b), (a, b))]
evalSndFV Float -> Float
f [Float]
v
  ((Int, ((Float, Float), (Float, Float))) -> IO ())
-> [(Int, ((Float, Float), (Float, Float)))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, ((Float, Float), (Float, Float))
x) -> do
    String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGN String
filestart String
ys [Char
c1] Int
i Float
freq1 Float
freq2 Float
x0 Float
xdelta ((Float, Float), (Float, Float))
x
    Char -> Float -> String -> IO ()
fadeEndsTMB Char
c2 Float
per (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
i) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) ([(Int, ((Float, Float), (Float, Float)))] -> IO ())
-> ([((Float, Float), (Float, Float))]
    -> [(Int, ((Float, Float), (Float, Float)))])
-> [((Float, Float), (Float, Float))]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [((Float, Float), (Float, Float))]
-> [(Int, ((Float, Float), (Float, Float)))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([((Float, Float), (Float, Float))] -> IO ())
-> [((Float, Float), (Float, Float))] -> IO ()
forall a b. (a -> b) -> a -> b
$ [((Float, Float), (Float, Float))]
v1

-- | A generalized version of the 'basicFCN' with a frequency modulation.
moreFCN :: FilePath -> String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
moreFCN :: String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
moreFCN String
filestart String
xs Float
freq1 Float
freq2 Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v = let (String
ys,String
x2s) = String -> (String, String)
argString String
xs in String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
moreFN String
filestart String
ys String
x2s Float
freq1 Float
freq2 Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v
{-# INLINE moreFCN #-}

--------------------------------------------------------------------------------------------

-- | Approximately equals to 2 ** (1/48) if the argument is zero (0) and the inverse value otherwise.
sameConst :: Int -> Float
sameConst :: Int -> Float
sameConst Int
i  
 | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Float
0.1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float
7.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
forall a. Floating a => a
pi)
 | Bool
otherwise = Float
10.0 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
7.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
forall a. Floating a => a
pi)
{-# INLINE sameConst #-} 

-- | A generalized version of the 'overChangeVolGN' with a possibility to make lower the noisy clipping by specifying the first parameter. The default parameter 
-- \"rev\" it uses reverberation to transform the distortion on the edges in case of existing root on fro the 2D line connection points. 
overChangeVolGNC :: String -> FilePath -> String -> String -> Int -> Float -> Float -> Float -> Float -> ((Float,Float), (Float,Float)) -> IO ()
overChangeVolGNC :: String
-> String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGNC String
check String
filestart String
ys String
cs Int
j Float
freq1 Float
freq2 Float
x0 Float
xdelta ((Float
t0,Float
v0), (Float
t1,Float
v1)) 
 | Float
x0 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
/= Float
0 Bool -> Bool -> Bool
&& Float -> Float
forall a. Num a => a -> a
abs Float
x0 Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
<= Float
1.0 Bool -> Bool -> Bool
&& Float
freq1 Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
> Float
16 Bool -> Bool -> Bool
&& Float
freq1 Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
< Float
20000 = 
  case Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v0) Float
0 of 
    Ordering
GT -> do
     (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",String
"test1.wav",String
"synth", 
       Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float
t1 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
== Float
t0 then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"fade", 
        Char -> String
charFadeType (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cs then Char
'l' else String -> Char
forall a. [a] -> a
head String
cs)] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ 
         if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ((Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v0) Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
LT then [Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""] 
           else [String
"0", String
"-0.0", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"vol", 
             Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float
forall a. Num a => a -> a
signum Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float -> Float
forall a. Num a => a -> a
abs (Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v0)) String
""]) String
""
     if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
     else do
      (ExitCode
code2,String
_,String
herr2) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",String
"test0.wav",String
"synth", 
        Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", 
          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"vol", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Float -> Float -> Float
forall a. Ord a => a -> a -> a
min Float
v0 Float
v1) String
""]) String
""
      if ExitCode
code2 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess 
        then do
          (ExitCode
code3,String
_,String
herr3) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"-m",String
"test0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"test1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, String
"vol", String
"2"] String
""
          if ExitCode
code3 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess 
            then String -> IO ()
removeFile (String
"test0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"test1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
            else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr3
        else String -> IO ()
forall a. Show a => a -> IO ()
print String
herr2 IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
forall a. HasCallStack => String -> a
error String
"Composition.Sound.Faded.overChangeVolGNC: Operation not successful. "
    Ordering
LT -> 
     case String
check of 
      String
"simple" -> do  
        String
-> String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGNC String
check String
filestart String
ys String
cs Int
j Float
freq1 ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1)) Float
x0 Float
xdelta ((Float
t0,Float
v0), ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t0) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1),Float
0)) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
         String -> String -> IO ()
renameFile ((String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) (String
"temp00" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
        (ExitCode
code0,String
_,String
herr) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"temp00" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, String
"fade", String
"h", String
"0", String
"-0.0",
          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) ((Float -> Float -> Float
forall a. Ord a => a -> a -> a
max Float
freq1 Float
freq2) Float -> Float -> Float
forall a. Floating a => a -> a -> a
** (-Float
1.0)) String
""] String
"" 
        if ExitCode
code0 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (ShowS
forall a. Show a => a -> String
show String
herr)
        else do
         String
-> String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGNC String
check String
filestart String
ys String
cs Int
j ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1)) Float
freq2 Float
x0 Float
xdelta (((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t0) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1),Float
0), (Float
t1,Float
v1)) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
           String -> String -> IO ()
renameFile ((String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
         (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys] String
""
         if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess then String -> IO ()
removeFile (String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"temp00" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) 
         else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1 
      String
"silent" -> do  
        (ExitCode
code0,String
_,String
herr) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"trim", String
"0", 
         Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) (Float -> Float
forall a. Num a => a -> a
abs (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float
t0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1))) String
"",String
"vol",String
"0"]) String
"" 
        if ExitCode
code0 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (ShowS
forall a. Show a => a -> String
show String
herr)
        else do
         String
-> String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGNC String
check String
filestart String
ys String
cs Int
j ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1)) Float
freq2 Float
x0 Float
xdelta (((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t0) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1),Float
0), (Float
t1,Float
v1)) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
           String -> String -> IO ()
renameFile ((String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
         (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
           Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys] String
""
         if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess then String -> IO ()
removeFile (String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) 
         else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1 
      String
_ -> do  
        (ExitCode
code0,String
_,String
herr) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"trim", String
"0", 
         Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) (Float -> Float
forall a. Num a => a -> a
abs (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float
t0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1))) String
"",String
"vol",String
"0"]) String
"" 
        if ExitCode
code0 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (ShowS
forall a. Show a => a -> String
show String
herr)
        else do
         String
-> String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGNC String
check String
filestart String
ys String
cs Int
j ((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
freq1) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1)) Float
freq2 Float
x0 Float
xdelta (((Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
t0) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
v0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
v1),Float
0), (Float
t1,Float
v1)) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
           String -> String -> IO ()
renameFile ((String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys)
         (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys, (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
           Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys,String
"reverb",String
"-w",String
"1",String
"1",String
"10",String
"gain",String
"-n",String
"gain",String
"-9"] String
""
         if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== ExitCode
ExitSuccess then String -> IO ()
removeFile (String
"temp0" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
removeFile (String
"temp1" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) 
         else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1 
    Ordering
_  -> 
     case Float
v1 of 
      Float
0 -> 
       if Float
v0 Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
== Float
0 
        then do
          (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",(String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            String
".wav",String
"delay", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"trim", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing 
              (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""]) String
""
          if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
          else () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        else do 
          (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",(String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ 
            String
".wav",String
"synth", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", 
              Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"fade", Char -> String
charFadeType (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cs then Char
'l' else String -> Char
forall a. [a] -> a
head String
cs)] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ 
               if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
t0 Float
t1 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT then [Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing 
                (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""] else [String
"0", String
"-0.0", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing 
                  (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"vol", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
v0 String
""]) String
""
          if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
          else () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
      Float
_ -> do
       (ExitCode
code1,String
_,String
herr1) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) (String -> [String] -> [String]
soxBasicParams String
ys [String
"",String
"-n",(String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
j) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".wav",
         String
"synth", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", String
"sine", 
          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
freq1 (String -> Float -> Float -> String
freqChange (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1 String
cs) Float
freq2 Float
freq1), String
"fade", Char -> String
charFadeType (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cs then Char
'l' else String -> Char
forall a. [a] -> a
head String
cs)] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ 
           if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Float
t1 Float
t0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT 
            then [Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 
             else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
""] else [String
"0", String
"-0.0", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) Float
xdelta Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT then Float -> Float
forall a. Num a => a -> a
abs Float
x0 else Float -> Float
forall a. Num a => a -> a
abs (Float
t1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
t0)) String
"", 
               String
"vol", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Float
v1 String
""]) String
""
       if ExitCode
code1 ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.overChangeVolGNC: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr1
       else () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
 | Bool
otherwise = String -> IO ()
forall a. HasCallStack => String -> a
error String
"Composition.Sound.Faded.overChangeVolGNC: sound for these conditions is not defined. " 

-- | A generalized version of the 'moreFN' with a possibility to change the behaviour for the situation with existing roots on the interval for the line connecting the 2D 
-- points. 
moreFNC :: String -> FilePath -> String -> String -> Float -> Float -> Float -> Float -> Float -> (Float -> Float) -> [Float] -> IO ()
moreFNC :: String
-> String
-> String
-> String
-> Float
-> Float
-> Float
-> Float
-> Float
-> (Float -> Float)
-> [Float]
-> IO ()
moreFNC String
check String
filestart String
ys String
x2s Float
freq1 Float
freq2 Float
x0 Float
xdelta Float
per Float -> Float
f [Float]
v = do
  let (String
xs1,String
xs2) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 String
x2s
      c1 :: Char
c1
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs1 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs1
      c2 :: Char
c2
       | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs2 = Char
'l'
       | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs2
  [((Float, Float), (Float, Float))]
v1 <- (Float -> Float)
-> [Float] -> IO [((Float, Float), (Float, Float))]
forall b a.
(Fractional b, Ord b, Eq a) =>
(a -> b) -> [a] -> IO [((a, b), (a, b))]
evalSndFV Float -> Float
f [Float]
v
  ((Int, ((Float, Float), (Float, Float))) -> IO ())
-> [(Int, ((Float, Float), (Float, Float)))] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, ((Float, Float), (Float, Float))
x) -> do
    String
-> String
-> String
-> String
-> Int
-> Float
-> Float
-> Float
-> Float
-> ((Float, Float), (Float, Float))
-> IO ()
overChangeVolGNC String
check String
filestart String
ys [Char
c1] Int
i Float
freq1 Float
freq2 Float
x0 Float
xdelta ((Float, Float), (Float, Float))
x
    Char -> Float -> String -> IO ()
fadeEndsTMB Char
c2 Float
per (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
i) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys
    String -> IO ()
reverbFix (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (String
filestart String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"G") String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> ShowS
prependZeroes Int
6 (Int -> String
forall a. Show a => a -> String
show Int
i) String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
endingWF String
ys) ([(Int, ((Float, Float), (Float, Float)))] -> IO ())
-> ([((Float, Float), (Float, Float))]
    -> [(Int, ((Float, Float), (Float, Float)))])
-> [((Float, Float), (Float, Float))]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int]
-> [((Float, Float), (Float, Float))]
-> [(Int, ((Float, Float), (Float, Float)))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ([((Float, Float), (Float, Float))] -> IO ())
-> [((Float, Float), (Float, Float))] -> IO ()
forall a b. (a -> b) -> a -> b
$ [((Float, Float), (Float, Float))]
v1

-- | Auxiliary function that can be used to apply a \"reverb\" effect or in this module context to fix unpleasant noise for concatenated parts. Usually, can be used after 
-- application of the other functions in the module to transform the noise into more music sound. It is usually applied after all the other functions.
reverbFix :: FilePath -> IO ()
reverbFix :: String -> IO ()
reverbFix String
file = do
  (ExitCode
code,String
_,String
herr) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode (Maybe String -> String
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe String
showE String
"sox")) [String
file,String
"temp" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file,String
"reverb",String
"-w",String
"10", String
"1", String
"100"] String
""
  if ExitCode
code ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
/= ExitCode
ExitSuccess then do 
    Bool
exi <- String -> IO Bool
doesFileExist (String -> IO Bool) -> String -> IO Bool
forall a b. (a -> b) -> a -> b
$ String
"temp" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file
    if Bool
exi then String -> IO ()
removeFile (String
"temp" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
forall a. HasCallStack => String -> a
error (String
"Composition.Sound.Faded.reverbFix: Operation on the file" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
forall a. Show a => a -> String
show String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" was unsucessful " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr)
    else String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Composition.Sound.Faded.reverbFix: Operation on the file" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
forall a. Show a => a -> String
show String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" was unsucessful " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
herr
  else String -> String -> IO ()
renameFile (String
"temp" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file) String
file