{-# LANGUAGE ImplicitParams #-} module Grammar.Integration ( integrate ) where import Control.Monad (when) import Dynamics import Grammar.Harmony import Grammar.Melody import Grammar.TonalHarmony import Grammar.Types import Grammar.VoiceLeading import Music integrate :: (?melodyConfig :: MelodyConfig, ?harmonyConfig :: HarmonyConfig) => Duration -> IO (MusicCore, MusicCore) integrate t = do when (t < 4 * wn) $ fail "integrate: requested duration should be at least 4 bars of music" harmonicStructure <- runGrammar tonalHarmony t ?harmonyConfig melodicStructure <- runGrammar melody t () background <- voiceLead harmonicStructure foreground <- mkSolo harmonicStructure melodicStructure return (dyn $ toMusicCore background, dyn $ toMusicCore foreground)