{-# LANGUAGE OverloadedStrings #-}
-- | Tonal descriptors.
module AcousticBrainz.LowLevel.Tonal where

import           AcousticBrainz.StatisticalUnits
import qualified AcousticBrainz.LowLevel.Algorithm.Chords                 as Chords
import qualified AcousticBrainz.LowLevel.Algorithm.HighResolutionFeatures as HighResolutionFeatures
import qualified AcousticBrainz.LowLevel.Algorithm.HPCP                   as HPCP
import qualified AcousticBrainz.LowLevel.Algorithm.Key                    as Key

import           Data.Aeson
import           Data.Aeson.Types
import           Data.Scientific

data Tonal = Tonal
  { _chords                            :: Chords.Output
  , _highResolutionFeatures            :: HighResolutionFeatures.Output
  , _hpcp                              :: HPCP.Output
  , _harmonicPitchClassProfilesEntropy :: StatisticalUnits
  , _key                               :: Key.Output
  , _tuningFrequency                   :: Scientific
  } deriving(Eq, Ord, Read, Show)

instance FromJSON Tonal where
  parseJSON value = flip (withObject "tonal") value $ \v -> Tonal
    <$> parseJSON value
    <*> parseJSON value
    <*> parseJSON value
    <*> v .: "hpcp_entropy"
    <*> parseJSON value
    <*> v .: "tuning_frequency"