-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A program and a library to create experimental music from a mono audio and a Ukrainian text -- -- It can also create a timbre for the notes. Uses SoX inside. @package dobutokO2 @version 0.32.0.0 -- | Maintainer : olexandr543@yahoo.com -- -- A program and a library to create experimental music from a mono audio -- and a Ukrainian text. module DobutokO.Sound.Functional -- | Is used to represent a sequence of intervals, each note being a -- Double value (its frequency in Hz). type SoundsO = Vector (Double, Double) -- | Is used to represent a set of overtones for the single sound, the -- first Double value is a frequency and the second one -- an -- amplitude. type OvertonesO = Vector (Double, Double) -- | Is used to represent a set of pairs of notes for each element of which -- the Double values (notes frequencies in Hz) are somewhat -- musically connected one with another.. type NotePairs = Vector (Double, Double) -- | Vector of musical notes in Hz. notes :: Vector Double -- | Function returns either the nearest two musical notes if frequency is -- higher than one for C0 and lower than one for B8 or the nearest note -- duplicated in a tuple. neighbourNotes :: Double -> Vector Double -> (Double, Double) -- | Returns the closest note to the given frequency in Hz. closestNote :: Double -> Double -- | Returns a pure quint lower than the given note. pureQuintNote :: Double -> Double -- | For the given frequency of the note it generates a Vector of -- the tuples, each one of which contains the harmonics' frequency and -- amplitude. overTones :: Double -> OvertonesO -- | Returns a Vector of tuples with the lowest and highest -- frequencies for the notes in the sets consisting of n -- consequential notes (including semi-tones). An Int parameter -- defines this n. It can be 2, 3, 4, 6, 9, or 12 (the last one -- is for default octaves, see octavesT). So for different valid -- n you obtain doubles, triples and so on. The function being -- applied returns a Vector of such sets with their respective -- lowest and highest frequencies. nkyT :: Int -> NotePairs -- | Similarly to whichOctave returns a Maybe number -- (actually frequency) for the n-th elements set of notes (see -- nkyT). An Int parameter defines that n. whichEnka :: Int -> Double -> Maybe Int -- | Returns an analogous note in the higher n-th elements set (its -- frequency in Hz) (see nkyT). An Int parameter defines -- this n. enkuUp :: Int -> Double -> Double -- | Returns an analogous note in the lower n-th elements set (its -- frequency in Hz) (see nkyT). An Int parameter defines -- this n. enkuDown :: Int -> Double -> Double -- | Similarly to liftInOctaveV returns a Vector -- Double (actually frequencies) for the n-th elements set of -- notes (see nkyT) instead of octaves. A second Int -- parameter defines that n. liftInEnkuV :: Int -> Int -> Vector Double -> Vector Double -- | Similarly to liftInOctave returns a Maybe number -- (actually frequency) for the n-th elements set of notes (see -- nkyT). A second Int parameter defines that n. liftInEnku :: Int -> Int -> Double -> Maybe Double -- | Returns a Vector of tuples with the lowest and highest -- frequencies for the notes in the octaves. octavesT :: NotePairs -- | Combines (mixes) all "test*" files in the given directory. The files -- should be similar in parameters and must be sound files for SoX to -- work on them properly. Afterwards, the function deletes these combined -- files. mixTest :: IO () -- | Combines (mixes) all "test*" files in the given directory. The files -- should be similar in parameters and must be sound files for SoX to -- work on them properly. Afterwards, the function deletes these combined -- files. The name of the resulting file depends on the first two command -- line arguments so that it is easy to produce unique names for the -- consequent call for the function. mixTest2 :: Int -> Int -> IO () -- | Gets Vector of Int frequencies from the given -- FilePath using SoX. The frequencies are "rough" according to -- the SoX documentation and the duration is too small so they can be -- definitely other than expected ones. Is used as a source of variable -- numbers (somewhat close each to another in their order but not -- neccessarily). . freqsFromFile :: FilePath -> Int -> IO (Vector Int) -- | Gets an "end.wav" file from the intermediate "result*.wav" files in -- the current directory. If it is not successful, produces the -- notification message and exits without error. If you would like to -- create the file if there are too many intermediate ones, please, run -- "dobutokO2 8" or "dobutokO2 80" in the current directory. endFromResult :: IO () -- | For the given frequency it generates a musical sound with a timbre. -- The main component of the sound includes the lower pure quint, which -- can be in the same octave or in the one with the number lower by one. -- Please, check before executing whether there is no "x.wav", "test*", -- "result*" and "end.wav" files in the current directory, because they -- can be overwritten. overSoXSynth :: Double -> IO () -- | Similar to overSoXSynth2DN but instead of overTones -- function, it uses volatile function f::Double -> Vector -- (Double, Double) with somewhat sophisticated mechanism to -- normalize the resulting Vector elements (Double, -- Double). The last one is an experimental feature, so it is your -- responsibility to provide a function so that it does not lead to -- clipping. In such a case, the result of application of the -- convertToProperUkrainian to the String parameter must -- not be empty. Int argument is an index of the element to -- be taken from the intervalsFromString applied to the -- String argument. To obtain compatible with versions prior to -- 0.20.0.0 behaviour, use for the Int 0. -- -- Be aware that the result can be rather unpredictable (the program can -- even obtain segmentation fault) for not very suitable function. But -- for a lot of functions this works well. -- -- It is recommended to fully simplify the computation for "f" function -- before using it in the overSoXSynth2FDN. overSoXSynth2FDN :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> IO () -- | Similar to overSoXSynth2DN but instead of overTones -- function, it uses volatile function f::Double -> Vector -- (Double, Double) with somewhat sophisticated mechanism to -- normalize the resulting Vector elements (Double, -- Double). The last one is experimental feature, so it is your -- responsibility to provide a function so that it does not lead to -- clipping. In such a case, the result of application of the -- convertToProperUkrainian to the String parameter must -- not be empty. The function also tries to perform filtering to -- avoid possible beating. The third Double parameter in the tuple -- is used as a limit for frequencies difference in Hz to be filtered out -- from the resulting sound. It is considered to be from the range -- [0.1..10.0]. An Int parameter is used to define the -- needed interval. To obtain compatible with versions prior to 0.20.0.0 -- behaviour, use for the Int 0. -- -- Be aware that the result can be rather unpredictable (the program can -- even obtain segmentation fault) for not very suitable function. But -- for a lot of functions this works well. -- -- It is recommended to fully simplify the computation for "f" function -- before using it in the overSoXSynth2FDN_B. overSoXSynth2FDN_B :: (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> IO () -- | Similar to overSoXSynth2FDN but it does not make any -- normalizing transformations with the Vector argument. To be -- used properly, it is needed that every second element in the tuple in -- the Vector argument must be in the range [-1.0..1.0] and every -- first element must be in between 16.351597831287414 and -- 7902.132820097988 (Hz). An Int parameter is used to define an -- interval. To obtain compatible with versions prior to 0.20.0.0 -- behaviour, use for the Int 0. -- -- Be aware that the result can be rather unpredictable (the program can -- even obtain segmentation fault) for not very suitable function. But -- for a lot of functions this works well. -- -- It is recommended to fully simplify the computation for "f" function -- before using it in the overSoXSynth2FDN_S. overSoXSynth2FDN_S :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> IO () -- | Similar to overSoXSynth2FDN_S but additionally the program -- filters out from the resulting Vector after "f" application -- values that are smaller by absolute value than 0.001. An Int -- parameter is used to define an interval. To obtain compatible with -- versions prior to 0.20.0.0 behaviour, use for the Int 0. -- -- Be aware that the result can be rather unpredictable (the program can -- even obtain segmentation fault) for not very suitable function. But -- for a lot of functions this works well. -- -- It is recommended to fully simplify the computation for "f" function -- before using it in the overSoXSynth2FDN_Sf. overSoXSynth2FDN_Sf :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> IO () -- | Similar to overSoXSynth2FDN_S but additionally the program -- filters out from the resulting Vector after "f" application -- values that are smaller than the third Double parameter by an -- absolute value in the triple of Double's. An Int -- parameter is used to define an interval. To obtain compatible with -- versions prior to 0.20.0.0 behaviour, use for the Int 0. -- -- Be aware that the result can be rather unpredictable (the program can -- even obtain segmentation fault) for not very suitable function. But -- for a lot of functions this works well. -- -- It is recommended to fully simplify the computation for "f" function -- before using it in the overSoXSynth2FDN_Sf3. overSoXSynth2FDN_Sf3 :: (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> IO () -- | Uses additional Int parameters. The first one is a number of -- enka (see nkyT). The second one defines, to which n-th elements -- set (see nkyT) belongs the obtained higher notes in the -- intervals. To obtain reasonable results, please, use for the first one -- 2, 3, 4, 6, 9, or 12. The first String parameter is used to -- produce durations of the notes. The second one is used to define -- intervals. A Double parameter is a basic sound duration, it -- defines tempo of the melody in general. overSoXSynthGen2FDN :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> String -> String -> IO () -- | Uses additional Int parameters. The first one is a number of -- enka (see nkyT). The second one defines, to which n-th elements -- set (see nkyT) belongs the obtained higher notes in the -- intervals. To obtain reasonable results, please, use for the first one -- 2, 3, 4, 6, 9, or 12. The first String parameter is used to -- produce durations of the notes. The second one is used to define -- intervals. The first Double parameter is a basic sound -- duration, it defines tempo of the melody in general. The second one is -- a limit for frequencies difference in Hz to be filtered out from the -- resulting sound. It is considered to be from the range -- [0.1..10.0]. overSoXSynthGen2FDN_B :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> Double -> String -> String -> IO () -- | Similar to overSoXSynthGen2FDN, but instead of -- overSoXSynth2FDN uses overSoXSynth2FDN_S function. overSoXSynthGen2FDN_S :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> String -> String -> IO () -- | Similar to overSoXSynthGen2FDN_S, but instead of -- overSoXSynth2FDN_S uses overSoXSynth2FDN_Sf function. overSoXSynthGen2FDN_Sf :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> String -> String -> IO () -- | Similar to overSoXSynthGen2FDN_S, but instead of -- overSoXSynth2FDN_S uses overSoXSynth2FDN_Sf3 function. overSoXSynthGen2FDN_Sf3 :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> Double -> String -> String -> IO () -- | Function to get from the number of semi-tones and a note a -- Maybe note for the second lower note in the interval if any. If -- there is no need to obtain such a note, then the result is -- Nothing. dNote :: Int -> Double -> Maybe Double -- | Vector of Double is a vector of dB volume adjustments -- for the corresponding harmonices (overtones). overSoXSynth2FDN1G :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> Vector Double -> IO () -- | Vector of Double is a vector of dB volume adjustments -- for the corresponding harmonices (overtones). overSoXSynth2FDN_B1G :: (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> Vector Double -> IO () -- | Generalized version of the overSoXSynth2FDN_S with the -- additional volume adjustment in dB for overtones given by -- Vector of Double. overSoXSynth2FDN_S1G :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> Vector Double -> IO () -- | Generalized variant of the overSoXSynth2FDN_Sf with a -- possibility to adjust volume using adjust_dbVol. Vector -- of Double is used to specify adjustments in dB. For more -- information, please, refer to adjust_dbVol. overSoXSynth2FDN_Sf1G :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> Vector Double -> IO () -- | Generalized variant of the overSoXSynth2FDN_Sf3 function with a -- possibility to adjust volume using adjust_dBVol. -- Vector of Double specifies the needed adjustments in dB. overSoXSynth2FDN_Sf31G :: (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> Vector Double -> IO () -- | Generalized version of the partialTest_k with the additional -- volume adjustment in dB given by Vector of Double. partialTest_k1G :: OvertonesO -> Int -> String -> Vector Double -> IO () -- | Similar to overSoXSynth2FDN1G, but additionally allows to -- specify by the second String argument a quality changes to the -- generated files (please, see soxBasicParams). overSoXSynth2FDN2G :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> Vector Double -> String -> IO () -- | Generalized version of the overSoXSynth2FDN_B1G with a -- possibility to specify sound quality parameters using additional -- second String argument. For more information, please, refer to -- soxBasicParams. overSoXSynth2FDN_B2G :: (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> Vector Double -> String -> IO () -- | Generalized version of the overSoXSynth2FDN_S1G with a -- possibility to specify sound quality parameters using the second -- String argument. For more information, please, refer to -- soxBasicParams. overSoXSynth2FDN_S2G :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> Vector Double -> String -> IO () -- | Generalized variant of the overSoXSynth2FDN_Sf1G with a -- possibility to specify sound quality using the second String -- argument. For more information, please, refer to -- soxBasicParams. overSoXSynth2FDN_Sf2G :: (Double -> OvertonesO) -> (Double, Double) -> Int -> String -> Vector Double -> String -> IO () -- | Generalized variant of the overSoXSynth2FDN_Sf31G with a -- possibility to specify sound quality using the second String -- parameter. For more information, please, refer to -- soxBasicParams. overSoXSynth2FDN_Sf32G :: (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> Vector Double -> String -> IO () -- | Generalized version of the partialTest_k1G with a possibility -- to change sound quality parameters using the additional second -- String argument. For more information, please, refer to -- soxBasicParams. partialTest_k2G :: OvertonesO -> Int -> String -> Vector Double -> String -> IO () -- | Generalized variant of the soundGenF31G with a possibility to -- specify sound quality using the second String argument. For -- more information, please, refer to soxBasicParams. soundGenF32G :: Vector (Double -> Double) -> Vector Double -> Vector Int -> (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> Vector Double -> String -> IO () -- | Generalized variant of the overSoXSynthGen2FDN_SG with a -- possibility to specify with the third String argument sound -- quality parameters. Besides, the second from the end argument (a -- function) needs to be one more argument -- just also String. -- For more information, please, refer to soxBasicParams. overSoXSynthGen2FDN_SG2G :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> String -> String -> ((Double -> OvertonesO) -> (Double, Double) -> Int -> String -> String -> IO ()) -> String -> IO () -- | Generalized variant of the ovorSoXSynthGen2FDN_Sf3G with a -- possibility to specify sound quality with the third String -- argument. Besides, the second from the end argument (a function) needs -- to be one more argument -- just also String. For more -- information, please, refer to soxBasicParams. overSoXSynthGen2FDN_Sf3G2G :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> Double -> String -> String -> ((Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> String -> IO ()) -> String -> IO () -- | Similar to mixTest, but allows to change the sound quality -- parameters for the resulting file. For more information, please, refer -- to soxBasicParams. mixTest2G :: String -> IO () -- | Similar to mixTest, but allows to change the sound quality -- parameters for the resulting file. For more information, please, refer -- to soxBasicParams. The name of the resulting file depends on -- the first two command line arguments so that it is easy to produce -- unique names for the consequent call for the function. mixTest22G :: Int -> Int -> String -> IO () -- | Similar to endFromResult, but uses additional String -- argument to change sound quality parameters. For more information, -- please, refer to soxBasicParams. endFromResult2G :: String -> IO () -- | Can generate multiple notes with their respective overtones that are -- played simultaneously (e. g. it can be just one note with overtones, -- an interval with overtones, an accord with overtones etc.). This -- allows to get a rather complex or even complicated behaviour to obtain -- expressive and rich sound. soundGenF3 :: Vector (Double -> Double) -> Vector Double -> Vector Int -> (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> IO () -- | Similar to overSoXSynthGen2FDN, but instead of -- overSoXSynth2FDN uses overSoXSynth2FDN_S function. overSoXSynthGen2FDN_SG :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> String -> String -> ((Double -> OvertonesO) -> (Double, Double) -> Int -> String -> IO ()) -> IO () -- | Similar to overSoXSynthGen2FDN_S, but instead of -- overSoXSynth2FDN_S uses overSoXSynth2FDN_Sf3 function. overSoXSynthGen2FDN_Sf3G :: FilePath -> Int -> Int -> (Double -> OvertonesO) -> Double -> Double -> String -> String -> ((Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> IO ()) -> IO () -- | Generalized variant of the soundGenF3 with volume adjustment in -- dB given by the second Vector Double for the overtones. soundGenF31G :: Vector (Double -> Double) -> Vector Double -> Vector Int -> (Double -> OvertonesO) -> (Double, Double, Double) -> Int -> String -> Vector Double -> IO () -- | Is used internally in the functions to specify different SoX -- parameters for the sound synthesis (rate, bit depth and file -- extension). Possible file extensions are: ".wav" (a default one) and -- ".flac" (being lossless compressed); rates -- 8000, 11025, 16000, -- 22050 (a default one), 32000, 44100, 48000, 88200, 96000, 176400, -- 192000 Hz; bit depths -- 16 bits and 24 bits. The first two digits in -- a String argument encodes rate, the next one -- bit depth and -- the last symbol -- letter 'w' or 'f' -- file extension. Because of SoX -- uses FLAC optionally, before use it, please, check whether your -- installation supports it. soxBasicParams :: String -> [String] -> [String] -- | Is used internally in the readProcessWithExitCode to adjust -- volume for the sound with additional dB value given by Double -- argument. adjust_dbVol :: [String] -> Double -> [String] -- | Creates part of the needed "test*.wav" files in the current directory. partialTest_k :: OvertonesO -> Int -> String -> IO () -- | Additional function to prepend zeroes to the given String. The -- number of them are just that one to fulfill the length to the given -- Int parameter. prependZeroes :: Int -> String -> String nOfZeroesLog :: Int -> Maybe Int -- | Is a minimal number of decimal places that are just enough to -- represent a length of the Vector given. For an empty -- returns 0. numVZeroesPre :: Vector a -> Int -- | Function is used to generate a rhythm of the resulting file 'end.wav' -- from the Ukrainian text and a number of sounds either in the syllables -- or in the words without vowels. syllableStr :: Int -> String -> [Int] -- | Function is used to get numbers of intervals from a Ukrainian -- String. It is used internally in the -- uniqOverSoXSynthN4 function. intervalsFromString :: String -> Vector Int vStrToVInt :: Vector String -> Vector Int strToInt :: String -> Int -- | Generates a Vector of OvertonesO that represents the -- sound. doubleVecFromVecOfDouble :: (Double -> OvertonesO) -> Double -> Vector (Maybe Double) -> Vector OvertonesO helpF1 :: Vector (Double -> Double) -> Vector Double -> Vector Int -> Vector (Maybe Double) helpF0 :: Int -> String -- | Gets a function f::Double -> OvertonesO that can be used -- further. Has two variants with usage of closestNote (Int -- argument is greater than 0)v and without it (Int argument is -- less than 0). For both cases String must be in a form list of -- tuples of pairs of Double to get somewhat reasonable result. -- The function f can be shown using a special printing function -- showFFromStrVec. It is a simplest multiplicative (somewhat -- acoustically and musically reasonable) form for the function that can -- provide such a result that fits into the given data. -- --
-- let (y,f1) = fromJust (maybeFFromStrVec 1 3583.9783 "[(25.368,0.2486356),(37.259,0.6464867),(486.153,0.374618646),(789.563,0.463486461)]") in (y,f1 3583.9783) -- -- (3520.0,[(25.829079975681818,0.2486356),(37.936206670369316,0.6464867),(494.9891484317899,0.374618646),(803.9138234326421,0.463486461)]) -- -- let (y,f1) = fromJust (maybeFFromStrVec (-1) 3583.9783 "[(25.368,0.2486356),(37.259,0.6464867),(486.153,0.374618646),(789.563,0.463486461)]") in (y,f1 3583.9783) -- -- (3583.9783,[(25.368,0.2486356),(37.259,0.6464867),(486.153,0.374618646),(789.563,0.463486461)]) --maybeFFromStrVec :: Int -> Double -> String -> Maybe (Double, Double -> Vector (Double, Double)) -- | Gets multiplication coefficients for f::Double -> Vector -- (Double,Double) from the maybeFFromStrVec with the same -- arguments. fVecCoefs :: Int -> Double -> String -> Vector Double -- | Experimental show for f::Double -> Vector -- (Double,Double) that is used only for visualisation. It is -- correct only with maybeFFromStrVec or equivalent function. -- Because the shape of the f is known the function can be -- defined. -- --
-- showFFromStrVec (-1) 440 "[(25.358,0.3598),(489.35,0.4588962),(795.35,0.6853)]" -- -- "(440.00,(\t -> <(0.05763181818181818 * t, 0.3598),(1.112159090909091 * t, 0.4588962),(1.8076136363636364 * t, 0.6853)>))" --showFFromStrVec :: Int -> Double -> String -> String -- | Renormalizes amplitudes for the frequencies so that the maximum one of -- them (if OvertonesO is not empty) is equal by the -- absolute value to 1.0 and the mutual ratios of the amplitudes are -- preserved. renormF :: OvertonesO -> OvertonesO -- | Renormalizes amplitudes for the frequencies so that the maximum one of -- them (if OvertonesO is not empty) is equal by the -- absolute value to Double argument and the mutual ratios of the -- amplitudes are preserved. renormFD :: Double -> OvertonesO -> OvertonesO -- | Predicate to check whether all tuples in a Vector have the same -- first element. sameOvertone :: OvertonesO -> Bool -- | Similar to sameOvertone, except that not the Vector is -- checked but a corresponding list. sameOvertoneL :: [(Double, Double)] -> Bool -- | g :: (Double,Double) -> OvertonesO -> OvertonesO is a -- function that defines how the new element is added to the -- OvertonesO. It depends only on the element being added and the -- actual OvertonesO. It does not depend on the Double -- argument for f :: Double -> OvertonesO so for different -- Double for f it gives the same result. sameFreqF :: Double -> (Double, Double) -> (Double -> OvertonesO) -> ((Double, Double) -> OvertonesO -> OvertonesO) -> OvertonesO -- | g :: (Double,Double) -> OvertonesO -> OvertonesO is a -- function that defines how the new element is added to the -- OvertonesO. Variant of sameFreqF where g depends only on -- the elements of the OvertonesO, which first elements in the -- tuples equal to the first element in the (Double,Double). It -- does not depend on the Double argument for f :: Double -- -> OvertonesO so for different Double for f it -- gives the same result. sameFreqFI :: Double -> (Double, Double) -> (Double -> OvertonesO) -> ((Double, Double) -> OvertonesO -> OvertonesO) -> OvertonesO -- | gAdd :: (Double,Double) -> Double -> (Double -> -- OvertonesO) -> OvertonesO is a function that defines how the -- element is added to the OvertonesO. Unlike for -- sameFreqF, it depends also on the Double argument for -- f :: Double -> OvertonesO. fAddFElem is actually a -- higher-order function, it changes the function f (in some -- point) and returns the new one. It can be interesting task (in -- general) to look at such a function through a prism of notion of -- operator (mathematical, for example similar to that ones that are used -- for quantum mechanics and quantum field theory). gAdd allows -- not only to insert an element if missing, but to change all the -- OvertonesO system. So depending on the complexity, it can -- reproduce rather complex behaviour. fAddFElem :: (Double, Double) -> Double -> (Double -> OvertonesO) -> ((Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO) -> Double -> OvertonesO -- | gRem:: (Double,Double) -> Double -> (Double -> -- OvertonesO) -> OvertonesO is a function that defines how the -- element is removed from the OvertonesO. Unlike for -- sameFreqF, it depends also on the Double argument for -- f :: Double -> OvertonesO. fRemoveFElem is actually -- a higher-order function, it changes the function f (in some -- point) and returns the new one. It can be an interesting task (in -- general) to look at such a function through a prism of notion of -- operator (mathematical, for example that ones that are used for -- quantum mechanics and quantum field theory). gRem allows not -- only to delete an element if existing, but to change all the -- OvertonesO system. So depending on the complexity, it can -- reproduce rather complex behaviour. fRemoveFElem :: (Double, Double) -> Double -> (Double -> OvertonesO) -> ((Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO) -> Double -> OvertonesO -- | Example of the function gAdd for the fAddFElem. If the -- frequency is already in the OvertonesO then the corresponding -- amplitude is divided equally between all the elements with the -- repeated given frequency from (Double, Double). Otherwise, it -- is just concatenated to the OvertonesO. gAdd01 :: (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Can be used to produce an example of the function gAdd for -- the fAddFElem. Similar to gAdd01, but uses its first -- argument to renorm the result of the gAdd01 so that its maximum -- by absolute value amplitude equals to the first argument. gAdd02 :: Double -> (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Example of the function gAdd. for the fAddFElem. If -- the frequency is not already in the OvertonesO then the -- corresponding element is added and the OvertonesO are renormed -- with renormF. Otherwise, the element is tried to be inserted -- with a new frequency between the greatest by an absolute values notes -- as an intermediate value with the respective amplitude, or if there is -- only one element, to produce two elements in the resulting -- Vector with two consequent harmonics. gAdd03 :: (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Example of the function gAdd. for the fAddFElem. It -- tries to insert the given (Double,Double) into the less -- dense frequency region. gAdd04 :: (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Example of the function gRem for the fRemoveFElem. If the -- element is already in the OvertonesO then it is removed (if -- there are more than 5 elements already) and OvertonesO are -- renormalized. Otherwise, all the same for the element already existing -- elements become less in an amlitude for a numbers that in sum equal to -- amplitude of the removed element. gRem01 :: (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Can be used to produce an example of the function gRem for -- the fRemoveFElem. Similar to gRem01, but uses its first -- argument to renorm the result of the gRem01 so that its maximum -- by absolute value amplitude equals to the first argument. gRem02 :: Double -> (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Example of the function gRem for the fRemFElem. It -- tries not to remove elements from the less than 6 elements -- OvertonesO and to remove all the elements in the given range -- with the width of the twice as many as the second Double in the -- first argument tuple and the centre in the first Double in the -- tuple. Similar to somewhat bandreject filter but with more complex -- behaviour for the sound to be more complex. gRem03 :: (Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Similar to fAddFElem, but instead of one element -- (Double,Double) it deals with a Vector of such -- elements that is OvertonesO. fAddFElems :: OvertonesO -> Double -> (Double -> OvertonesO) -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> Double -> OvertonesO -- | Similar to fRemoveFElem, but instead of one element -- (Double,Double) it deals with a Vector of such -- elements that is OvertonesO. fRemoveFElems :: OvertonesO -> Double -> (Double -> OvertonesO) -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> Double -> OvertonesO -- | Binary predicate to check whether two given OvertonesO both -- have the elements with the same first element in the tuples. If -- True then this means that OvertonesO are at least -- partially overlaped by the first elements in the tuples (meaning -- frequencies). freqsOverlapOvers :: OvertonesO -> OvertonesO -> Bool -- | Similar to freqsOverlapOvers, but checks whether the whole -- tuples are the same instead of the first elements in the tuples are -- the same. elemsOverlapOvers :: OvertonesO -> OvertonesO -> Bool -- | Example of the function gAdds for the fAddFElems. gAdds01 :: OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Can be used to produce an example of the function gAdds for -- the fAddFElems. Similar to gAdds01, but uses its first -- argument to renorm the result of the gAdds01 so that its -- maximum by absolute value amplitude equals to the first argument. gAdds02 :: Double -> OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO -- | Splits (with addition of the new overtones) a given OvertonesO -- into a number n (specified by the first Int argument) -- of OvertonesO (represented finally as a Vector of them -- repsectively) so that all except the first n greatest by the -- absolute value of the amplitude tuples of Doubles are considered -- overtones for the greatest by the absolute value one in the given -- OvertonesO and all the next n - 1 are treated as the -- greatest by the absolute value and each of them produces the similar -- by the f :: Double -> OvertonesO function overtones. -- -- It is expected to obtain by such a conversion a splitted one sound -- into several simultaneous similar ones with different heights. To -- provide a rich result, the given first argument must be strictly less -- than the length of the given OvertonesO minus one. splitO :: Int -> OvertonesO -> Vector OvertonesO -- | Splits (with addition of the new overtones) a given OvertonesO -- into a number of OvertonesO (represented finally as a -- Vector of them repsectively) so that it intermediately uses a -- special function before applying the "similarization" splitting -- function. Is a generalization of the splitO, which can be -- considered a splitO2 with a first command line argument equals -- to id. -- -- It is expected to obtain by such a conversion a splitted one sound -- into several simultaneous similar (less or more, depending on h :: -- OvertonesO -> OvertonesO) ones with different heights. To -- provide a rich result, the given first argument must be strictly less -- than the length of the given OvertonesO minus one. splitO2 :: (OvertonesO -> OvertonesO) -> Int -> OvertonesO -> Vector OvertonesO -- | Concatenates a Vector of OvertonesO into a single -- OvertonesO. Can be easily used with splitO. overConcat :: Vector OvertonesO -> OvertonesO -- | Auxiliary function that is used inside innerSplit1 and also -- in splitOG1. splitHelp1 :: Int -> Int -> Int -> Int -> OvertonesO -> (Double, Double) -> Vector OvertonesO -- | Auxiliary function that is used inside innerSplit2 and also -- in splitOG2. splitHelp2 :: (OvertonesO -> OvertonesO) -> Int -> Int -> Int -> Int -> OvertonesO -> (Double, Double) -> Vector OvertonesO -- |
-- listVDirectory3G ys "result" == listVDirectory2G ys --listVDirectory3G :: String -> String -> IO (Vector FilePath) -- | Generalized variant of the playSeqAR with a possibility to play -- and mark either FLAC or WAV files. For more information, please, refer -- to soxBasicParams. playSeqAR2G :: String -> Int -> IO () -- | Generalized variant of the playSeqARV with a possibility to -- play and mark either FLAC or WAV files. For more information, please, -- refer to soxBasicParams. playSeqARV2G :: String -> Vector Int -> IO () -- | Plays a sequence of sounds considered of higher quality. playSeqARV22G :: String -> Vector String -> IO () -- | Generalized variant of the playCollectDec with a possibility to -- play and mark either FLAC or WAV files. For more information, please, -- refer to soxBasicParams. playCollectDec2G :: String -> Vector String -> IO (Vector Bool) -- | Generalized variant of the replaceWithHQs with a possibility to -- work either with FLAC files or with WAV files. Please, use with the -- FLAC files or with the WAV files separately. Do not intend to work -- with both types of them simultaneously using this function. replaceWithHQs2G :: String -> FilePath -> Vector Bool -> Vector FilePath -> IO () -- | Takes a filename to be applied a SoX "reverb" effect with parameters -- of list of String (the second argument). Produces the temporary -- new file with the name ((name-of-the-file) ++ ("reverb.wav" OR -- "reverb.flac") -- the type is preserved), which then is removed. -- Please, remember that for the mono audio the after applied function -- file is stereo with 2 channels. -- -- Besides, you can specify other SoX effects after reverberation in a -- list of String. The syntaxis is that every separate literal -- must be a new element in the list. If you plan to create again mono -- audio in the end of processment, then probably use reverb1E -- funcion instead. If you would like to use instead of "reverb" its -- modification "reverb -w" effect (refer to SoX documentation), then -- probably it is more convenient to use reverbWE function. -- Please, check by yourself whether you have enough permissions to read -- and write to the FilePath-specified file and to the containing -- it directory. The function is not intended to be used in otherwise -- cases. reverbE :: FilePath -> [String] -> IO () -- | The same as reverbE, but uses "reverb -w" effect instead of -- "reverb". The name of the temporary file is ((name-of-the-file) ++ -- ("reverbW.wav" OR "reverbW.flac") -- the type is preserved). Please, -- for more information, refer to SoX documentation. Please, check by -- yourself whether you have enough permissions to read and write to the -- FilePath-specified file and to the containing it directory. The -- function is not intended to be used in otherwise cases. reverbWE :: FilePath -> [String] -> IO () -- | The same as reverbE, but at the end file is being mixed to -- obtain mono audio. The name of the temporary file is -- ((name-of-the-file) ++ ("reverb1.wav" OR "reverb1.flac") -- the type -- is preserved). Please, check by yourself whether you have enough -- permissions to read and write to the FilePath-specified file -- and to the containing it directory. The function is not intended to be -- used in otherwise cases. reverb1E :: FilePath -> [String] -> IO () -- | The same as reverbWE, but at the end file is being mixed to -- obtain mono audio. The name of the temporary file is -- ((name-of-the-file) ++ ("reverbW1.wav" OR "reverbW1.flac") -- the type -- is preserved). Please, check by yourself whether you have enough -- permissions to read and write to the FilePath-specified file -- and to the containing it directory. The function is not intended to be -- used in otherwise cases. reverbW1E :: FilePath -> [String] -> IO () -- | Similar to reverbE, but replaces the primary WAV file with the -- new FLAC file (or vice versa). So if successful the resulting file has -- another extension and type. reverbE2C :: FilePath -> [String] -> IO () -- | Similar to reverbWE, but replaces the primary WAV file with the -- new FLAC file (or vice versa). So if successful the resulting file has -- another extension and type. reverbWE2C :: FilePath -> [String] -> IO () -- | Similar to reverb1E, but replaces the primary WAV file with the -- new FLAC file (or vice versa). So if successful the resulting file has -- another extension and type. reverb1E2C :: FilePath -> [String] -> IO () -- | Similar to reverb1WE, but replaces the primary WAV file with -- the new FLAC file (or vice versa). So if successful the resulting file -- has another extension and type. reverb1WE2C :: FilePath -> [String] -> IO () -- | Takes a filename to be applied a SoX chain of effects (or just one) as -- list of String (the second argument). Produces the temporary -- new file with the name ((name-of-the-file) ++ ("effects.wav" OR -- "effects.flac") -- the type is preserved), which then is removed. -- -- The syntaxis is that every separate literal for SoX must be a new -- element in the list. If you plan to create again mono audio in the end -- of processment, then probably use soxE1 function instead. -- Please, for more information, refer to SoX documentation. Please, -- check by yourself whether you have enough permissions to read and -- write to the FilePath-specified file and to the containing it -- directory. The function is not intended to be used in otherwise cases. soxE :: FilePath -> [String] -> IO () -- | The same as soxE, but at the end file is being mixed to obtain -- mono audio. Please, check by yourself whether you have enough -- permissions to read and write to the FilePath-specified file -- and to the containing it directory. The function is not intended to be -- used in otherwise cases. soxE1 :: FilePath -> [String] -> IO () -- | Changes the volume of the given FilePath with supported by SoX -- sound file type so that it becomes 0 (zero). Makes so it a silence -- file with the same parameters for duration, rate, bit depth and file -- type. getSilenceF :: FilePath -> IO () -- | Applies "fade" effect to both ends of the supported by SoX sound file -- FilePath so that concatenating them consequently after such -- application leads to no clipping. Otherwise, the clipping exists if -- not prevented by may be some other means. For more information, -- please, refer to the SoX documentation. fadeEnds :: FilePath -> IO () -- | Applies fadeEnds to all the "zs*.wav" (or instead all the -- "zs*.flac") files in the current directory. The file extension is -- defined by the first String argument in accordance with -- soxBasicParams. zs here is given by the second -- String argument. fadeAllE :: String -> String -> IO () -- | Similar to soxE, but replaces the primary WAV file with the new -- FLAC file (or vice versa). So if successful the resulting file has -- another extension and type. soxE2C :: FilePath -> [String] -> IO () -- | Similar to soxE1, but replaces the primary WAV file with the -- new FLAC file (or vice versa). So if successful the resulting file has -- another extension and type. soxE12C :: FilePath -> [String] -> IO () -- | Function takes a FilePath for the new recorded file (if it -- already exists then it is overwritten) and a list of String. -- The last one is sent to SoX rec or something equivalent as its -- arguments after the filename. If you plan just afterwards to produce -- mono audio, it's simpler to use rec1E function instead. Please, -- check by yourself whether you have enough permissions to read and -- write to the FilePath-specified file and to the containing it -- directory. The function is not intended to be used in otherwise cases. -- Function is adopted and changed recA function. recE :: FilePath -> [String] -> IO () -- | Function takes a FilePath for the new recorded file (if it -- already exists then it is overwritten) and a list of String. -- The last one is sent to SoX rec or something equivalent as its -- arguments after the filename. Please, check by yourself whether you -- have enough permissions to read and write to the -- FilePath-specified file and to the containing it directory. The -- function is not intended to be used in otherwise cases. Function is -- adopted and changed recA function. rec1E :: FilePath -> [String] -> IO () -- | Plays a FilePath file with a SoX further effects specified by -- the list of String. It can be e. g. used to (safely) test the -- result of applying some SoX effects and only then to use soxE -- or some similar functions to actually apply them. Please, check by -- yourself whether you have enough permissions to read the -- FilePath-specified file and the containing it directory. The -- function is not intended to be used in otherwise cases. Function is -- adopted and changed playA function. playE :: FilePath -> [String] -> IO () f2w :: FilePath -> FilePath w2f :: FilePath -> FilePath cfw2wf :: FilePath -> FilePath efw2 :: FilePath -> String efw2vv :: FilePath -> String wOrf :: FilePath -> String -- | Converts WAV file to FLAC file using SoX (please, check before whether -- your installation supports FLAC files) using possible rate and bit -- depth conversion accordingly to soxBasicParams format. If the -- conversion is successful (ExitCode is ExitSuccess) then -- removes the primary file. wavToFlac :: String -> FilePath -> IO () -- | Converts FLAC file to WAV file using SoX (please, check before whether -- your installation supports FLAC files) using possible rate and bit -- depth conversion accordingly to soxBasicParams format. If the -- conversion is successful (ExitCode is ExitSuccess) then -- removes the primary file. flacToWav :: String -> FilePath -> IO () -- | Maintainer : olexandr543@yahoo.com -- -- A program and a library to create experimental music from a mono audio -- and a Ukrainian text. module DobutokO.Sound.Executable -- | Function that actually makes processing in the dobutokO2 -- executable. Please, check before executing whether there is no -- "x.wav", "test*", "result*" and "end*" files in the current directory, -- because they can be overwritten. dobutokO2 :: IO () -- | Function records and processes the sound data needed to generate the -- "end.wav" file in the dobutokO2 function. Please, check before -- executing whether there is no "x.wav" file in the current directory, -- because it can be overwritten. recAndProcess :: FilePath -> Int -> IO String -- | Used to obtain one multiline specially formatted textual input and do -- the full processment for the sound. The function generates overtones -- using additional String and allows maximum control over the -- parameters. Besides, all the needed information it obtains from the -- singular formatted input, which can be ended with a keyboard keys -- combination that means an end of input (e. g. for Unices, that is -- probably Ctrl + D). '@' are separators for the input parts for their -- respective parts. For more information about the format of the single -- input, see: -- -- 'https://drive.google.com/open?id=10Z_GRZR4TKoL5KXfqPm-t-4humuHN0O4' -- -- The file is also provided with the package as text.dat.txt. The last -- two or three inputs (an input just here means a textual input between -- two '@') can be omitted, the program will work also but with less -- control for the user possible. dobutokO2H7 :: Bool -> String -> FilePath -> IO () -- | Actually works as pAnR_ function. dobutokO2H9 :: Bool -> String -> FilePath -> IO () -- | Tesing variant of the soundGen3G with predefined three last -- functional arguments. testSoundGen2G :: FilePath -> (Double -> OvertonesO) -> Double -> String -> IO () -- | Generates a sequence of sounds with changing timbre. Uses several -- functions as parameters. soundGen3G :: FilePath -> (Double -> OvertonesO) -> Double -> String -> ((Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO) -> ((Double, Double) -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (Double -> OvertonesO) -> IO () -- | Generates a sequence of sounds with changing timbre. Uses several -- functions as parameters. Unlike the soundGen3G, the last two -- functions as arguments for their first argument have not -- (Double,Double), but Vector of them so are -- applied to OvertonesO. To provide a generalized functionality, -- it uses two additional functions freq0 :: Int -> -- OvertonesO and proj :: OvertonesO -> (Double,Double) -- to define the first element to which are applied gAdds and -- gRems and the way to obtain a one tuple from the -- Vector of them (probably, each element of which differs from -- the result). Besides, it lifts notes into specified with the first two -- Int arguments enku (see liftInEnku). The Double -- argument is a average duration of the sounds. soundGen3G_O :: Int -> Int -> Double -> FilePath -> (Double -> OvertonesO) -> Double -> String -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> (Double, Double)) -> (Double -> OvertonesO) -> IO () -- | Generates a sequence of sounds with changing timbre. Is a generalized -- version of the soundGen3G_O, instead of predefined conversion -- function inside, it uses a user-defined one. -- --
-- soundGen3G_O = soundGen3G_O2 ---- -- with the first argument -- --
-- conversionFII (f0,fA1,fR1) = V.imap (\j r -> (V.unsafeIndex notes (snd r), ---- --
-- case fst r of ---- --
-- 0 -> (\vv -> f0 vv) ---- --
-- 1 -> fA1 j ---- --
-- 2 -> fA1 j ---- --
-- 3 -> fA1 j ---- --
-- 4 -> fA1 j ---- --
-- _ -> fR1 j)) --soundGen3G_O2 :: ((Double -> OvertonesO, Int -> Double -> OvertonesO, Int -> Double -> OvertonesO) -> Vector (Int, Int) -> Vector (Double, Double -> OvertonesO)) -> Int -> Int -> Double -> FilePath -> (Double -> OvertonesO) -> Double -> String -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> (Double, Double)) -> (Double -> OvertonesO) -> IO () -- | Generates a sequence of sounds with changing timbre. Is a generalized -- version of the soundGen3G_O2, but for the conversion function -- conversionFII as its tuple first argument uses not the tuple of the -- three functions, but a tuple of three Vector of functions of -- the respective types, that allows to specify more comlex behaviour and -- different variants inside the function itself, not its inner function -- parts. Vector as a data type is used instead of more common -- list because it has similar functionality and besides provides easier -- and quicker access to its elements. So these are the following vectors -- of functions: vf :: Vector (Double -> OvertonesO) (no -- changing a function for timbre generation), vfA :: Vector (Int -- -> Double -> OvertonesO) (for "adding" overtones to the -- function for timbre generation), and vfR :: Vector (Int -> -- Double -> OvertonesO (for "removing" overtones from the -- function for timbre generation). soundGen3G_O2G :: ((Vector (Double -> OvertonesO), Vector (Int -> Double -> OvertonesO), Vector (Int -> Double -> OvertonesO)) -> Vector (Int, Int) -> Vector (Double, Double -> OvertonesO)) -> Vector (Double -> OvertonesO) -> Vector (Int -> Double -> OvertonesO) -> Vector (Int -> Double -> OvertonesO) -> Int -> Int -> Double -> FilePath -> (Double -> OvertonesO) -> Double -> String -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (OvertonesO -> Double -> (Double -> OvertonesO) -> OvertonesO) -> (Int -> OvertonesO) -> (OvertonesO -> (Double, Double)) -> (Double -> OvertonesO) -> IO () -- | For the given parameters generates a single sound with overtones. h1 :: (Double -> OvertonesO) -> (Double, Double) -> Int -> IO () -- | For the given parameters generates a single sound with overtones. -- Unlike the h1 function, it lifts into specified by Int -- arguments enku (see liftInEnku) the frequency. h2 :: OvertonesO -> (Double, Double) -> Int -> Int -> Double -> IO () -- | Maintainer : olexandr543@yahoo.com -- -- A program and a library to create experimental music from a mono audio -- and a Ukrainian text. module Main main :: IO ()