module Notes
where
import Data.Map (Map, fromList, (!))
import Language.Notes (Note (..), Pitch (..), Tone (..),
getOctaveFromInt, octaves)
import Synthesizer.Structure (Frequency)
playableTonesPitches :: [(Tone, Pitch)]
playableTonesPitches :: [(Tone, Pitch)]
playableTonesPitches = [(Tone
C, Pitch
Flat), (Tone
C, Pitch
Sharp), (Tone
D, Pitch
Flat), (Tone
D, Pitch
Sharp), (Tone
E, Pitch
Flat), (Tone
F, Pitch
Flat), (Tone
F, Pitch
Sharp), (Tone
G, Pitch
Flat), (Tone
G, Pitch
Sharp), (Tone
A, Pitch
Flat), (Tone
A, Pitch
Sharp), (Tone
B, Pitch
Flat)]
amountOfNotes :: Int
amountOfNotes :: Int
amountOfNotes = [Octave] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Octave]
octaves Int -> Int -> Int
forall a. Num a => a -> a -> a
* [(Tone, Pitch)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Tone, Pitch)]
playableTonesPitches
generateNotes :: Frequency
-> Map Note Frequency
generateNotes :: Frequency -> Map Note Frequency
generateNotes Frequency
freqA4 = [(Note, Frequency)] -> Map Note Frequency
forall k a. Ord k => [(k, a)] -> Map k a
fromList [Frequency -> Int -> (Note, Frequency)
generateNote Frequency
c0 Int
i | Int
i <- [Int
0..Int
amountOfNotesInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1]]
where
c0 :: Frequency
c0 :: Frequency
c0 = Frequency
freqA4 Frequency -> Frequency -> Frequency
forall a. Num a => a -> a -> a
* (Frequency
2 Frequency -> Frequency -> Frequency
forall a. Floating a => a -> a -> a
** (-Frequency
4.75))
generateNote :: Frequency
-> Int
-> (Note, Frequency)
generateNote :: Frequency -> Int -> (Note, Frequency)
generateNote Frequency
freqBase Int
i = (Tone -> Pitch -> Octave -> Note
Note Tone
tone Pitch
pitch Octave
octave, Frequency
freq)
where
(Tone
tone, Pitch
pitch) = [(Tone, Pitch)]
playableTonesPitches [(Tone, Pitch)] -> Int -> (Tone, Pitch)
forall a. [a] -> Int -> a
!! (Int
i Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` [(Tone, Pitch)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Tone, Pitch)]
playableTonesPitches)
freq :: Frequency
freq = Frequency -> Int -> Frequency
frequencySteps Frequency
freqBase Int
i
semitone :: Int
semitone = Frequency -> Frequency -> Int
numberOfSemitones Frequency
freqBase Frequency
freq
octave :: Octave
octave = Int -> Octave
getOctaveFromInt (Int -> Octave) -> Int -> Octave
forall a b. (a -> b) -> a -> b
$ Int
semitone Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` [(Tone, Pitch)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Tone, Pitch)]
playableTonesPitches
frequencySteps :: Double
-> Int
-> Double
frequencySteps :: Frequency -> Int -> Frequency
frequencySteps Frequency
freq Int
n = Frequency
freq Frequency -> Frequency -> Frequency
forall a. Num a => a -> a -> a
* (Frequency
a Frequency -> Int -> Frequency
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
n)
where
a :: Double
a :: Frequency
a = Frequency
1.059463094359295
numberOfSemitones :: Double
-> Double
-> Int
numberOfSemitones :: Frequency -> Frequency -> Int
numberOfSemitones Frequency
freqBase Frequency
freqN = Frequency -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round (Frequency -> Int) -> Frequency -> Int
forall a b. (a -> b) -> a -> b
$ Frequency
12 Frequency -> Frequency -> Frequency
forall a. Num a => a -> a -> a
* Frequency -> Frequency -> Frequency
forall a. Floating a => a -> a -> a
logBase Frequency
2 (Frequency
freqN Frequency -> Frequency -> Frequency
forall a. Fractional a => a -> a -> a
/ Frequency
freqBase)
frequencyToWaveLength :: Double
-> Double
frequencyToWaveLength :: Frequency -> Frequency
frequencyToWaveLength Frequency
freq = Frequency
c Frequency -> Frequency -> Frequency
forall a. Fractional a => a -> a -> a
/ Frequency
freq
where
c :: Double
c :: Frequency
c = Frequency
345
wavelengthToFrequency :: Double
-> Double
wavelengthToFrequency :: Frequency -> Frequency
wavelengthToFrequency Frequency
wl = Frequency
c Frequency -> Frequency -> Frequency
forall a. Fractional a => a -> a -> a
/ Frequency
wl
where
c :: Double
c :: Frequency
c = Frequency
345