packages feed

music-preludes-1.8: examples/analysis_durations.hs

-- -fno-warn-typed-holes
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}

import Music.Prelude hiding ((</>))
import qualified Music.Score
import qualified System.Process
import qualified Data.List

music = asScore $ times 55 (stretch (1/8) c) |> times 28 (stretch (1/16) d)

main = do
  -- open music
  putStrLn $ "Durations: "
  mapM_ (\(x,y) -> putStrLn ("  " ++ show x ++ " \t" ++ show y)) $ (scoreDurations music)


voiceDurations :: Voice a -> [Duration]
voiceDurations = view durationsV

countDurationsV :: Voice a -> [(Duration, Int)]
countDurationsV = fmap (\xs -> (head xs, length xs)) . Data.List.group . Data.List.sort . voiceDurations

scoreDurations :: (HasPart' a, Ord (Music.Score.Part a)) => Score a -> [(Duration, Int)]
scoreDurations = countDurationsV . view phrases