Copyright | (c) OleksandrZhabenko 2020-2021 |
---|---|

License | MIT |

Maintainer | olexandr543@yahoo.com |

Stability | Experimental |

Safe Haskell | None |

Language | Haskell2010 |

Extensions | BangPatterns |

Helps to create experimental music from a file (or its part) and a Ukrainian text. It can also generate a timbre for the notes. Uses SoX inside.

## Synopsis

- renormF :: OvertonesO -> OvertonesO
- uniq :: Eq a => [a] -> [a]
- luniq :: Eq a => [a] -> Int
- renormFD :: Float -> OvertonesO -> OvertonesO
- sameOvertone :: OvertonesO -> Bool
- sameFreqF :: Float -> (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> OvertonesO -> OvertonesO) -> OvertonesO
- sameFreqFI :: Float -> (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> OvertonesO -> OvertonesO) -> OvertonesO
- fAddFElem :: (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO
- fRemoveFElem :: (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO
- fChangeFElem :: (Float, Float) -> Float -> (Float -> (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Float -> OvertonesO) -> Float -> OvertonesO
- gAdd01 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- gAdd02 :: Float -> (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- gAdd03 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- gAdd04 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- gRem01 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- gRem02 :: Float -> (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- gRem03 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO
- fAddFElems :: OvertonesO -> (Float -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO
- fRemoveFElems :: OvertonesO -> (Float -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO
- fChangeFElems :: OvertonesO -> Float -> (Float -> OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Float -> OvertonesO) -> Float -> OvertonesO
- freqsOverlapOvers :: OvertonesO -> OvertonesO -> Bool
- elemsOverlapOvers :: OvertonesO -> OvertonesO -> Bool
- gAdds01 :: OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO
- gAdds02 :: Float -> OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO

# Functions to edit OvertonesO and function f

renormF :: OvertonesO -> OvertonesO Source #

Renormalizes amplitudes for the frequencies so that the maximum one of them (if `OvertonesO`

is not []) is equal by the absolute value
to 1.0 and the mutual ratios of the amplitudes are preserved.

renormFD :: Float -> OvertonesO -> OvertonesO Source #

Renormalizes amplitudes for the frequencies so that the maximum one of them (if `OvertonesO`

is not []) is equal by the absolute value
to `Float`

argument and the mutual ratios of the amplitudes are preserved.

sameOvertone :: OvertonesO -> Bool Source #

Predicate to check whether all tuples in the list have the same first element.

sameFreqF :: Float -> (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> OvertonesO -> OvertonesO) -> OvertonesO Source #

`g :: (Float,Float) -> 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 `Float`

argument for `f :: Float -> OvertonesO`

so for different `Float`

for `f`

it gives the same result.

sameFreqFI :: Float -> (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> OvertonesO -> OvertonesO) -> OvertonesO Source #

`g :: (Float,Float) -> 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 `(Float,Float)`

. It does not depend on the `Float`

argument for `f :: Float -> OvertonesO`

so for different `Float`

for `f`

it gives the same result.

fAddFElem :: (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO Source #

`gAdd :: (Float,Float) -> Float -> (Float -> OvertonesO) -> OvertonesO`

is a function that defines how the element is added
to the `OvertonesO`

. `fAddFElem`

is
actually a higher-order function, it changes the function `f`

and returns a 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 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 produce rather complex behaviour.

fRemoveFElem :: (Float, Float) -> (Float -> OvertonesO) -> ((Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO Source #

`gRem:: (Float,Float) -> Float -> (Float -> OvertonesO) -> OvertonesO`

is a function that defines how the element is removed
from the `OvertonesO`

. `fRemoveFElem`

is
actually a higher-order function, it changes the function `f`

and returns a 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 produce rather complex behaviour.

fChangeFElem :: (Float, Float) -> Float -> (Float -> (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Float -> OvertonesO) -> Float -> OvertonesO Source #

Changes elements of the `OvertonesO`

using two functions. It is a generalization of the `fAddFElem`

and `fRemoveFElem`

functions. For example, if the first
of the two inner functional arguments acts as `gAdd01`

or similar, then it adds element to the `OvertonesO`

, if it acts as `gRem01`

, then it removes the element.
Its behaviour is defined by the `Float`

parameter (meaning frequency, probably), so you can change elements depending on what point it is applied.

gAdd01 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

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 `(Float, Float)`

. Otherwise, it is just concatenated to the `OvertonesO`

.

gAdd02 :: Float -> (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

gAdd03 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

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 list with two consequent harmonics.

gAdd04 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

gRem01 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

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.

gRem02 :: Float -> (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

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.

gRem03 :: (Float, Float) -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

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 `Float`

in the first argument tuple and the centre
in the first `Float`

in the tuple. Similar to somewhat bandreject filter but with more complex behaviour for the sound to be more complex.

## Working with two OvertonesO

fAddFElems :: OvertonesO -> (Float -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO Source #

Similar to `fAddFElem`

, but instead of one element `(Float,Float)`

it deals with a list of such elements that is `OvertonesO`

.

fRemoveFElems :: OvertonesO -> (Float -> OvertonesO) -> (OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> Float -> OvertonesO Source #

Similar to `fRemoveFElem`

, but instead of one element `(Float,Float)`

it deals with a list of such elements that is `OvertonesO`

.

fChangeFElems :: OvertonesO -> Float -> (Float -> OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO) -> (Float -> OvertonesO) -> Float -> OvertonesO Source #

Similar to `fChangeFElem`

, but use another form of the changing function, so it can deal with not only single element of the `OvertonesO`

,
but also with several ones.

freqsOverlapOvers :: OvertonesO -> OvertonesO -> Bool Source #

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).

elemsOverlapOvers :: OvertonesO -> OvertonesO -> Bool Source #

Similar to `freqsOverlapOvers`

, but checks whether the whole tuples are the same instead of the first elements in the tuples are the same.

gAdds01 :: OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

Example of the function `gAdds`

for the `fAddFElems`

.

gAdds02 :: Float -> OvertonesO -> Float -> (Float -> OvertonesO) -> OvertonesO Source #

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.