{-# LANGUAGE ImplicitParams #-}
module Generate.QuickCheck where
import Music
import Generate.Generate
import Test.QuickCheck.Gen
import Export
quickCheckSelector :: Selector s a
quickCheckSelector s as =
let conv (x, a) = ((round . (*) 100) x, elements [a]) in
generate $ frequency (map conv as) >>= \a -> return (a,s)
quickCheckEntry :: (Enum a, Bounded a) => s -> Entry s a
quickCheckEntry _ = Entry { values = zip (repeat 1) [minBound ..]
, constraints = []
, selector = quickCheckSelector
}
quickCheckState :: s -> GenState s
quickCheckState st = GenState { state = st
, pc = quickCheckEntry st
, oct = quickCheckEntry st
, dur = Entry { values =
zip (repeat 1) [1%1,1%2,1%4,1%8,1%16,1%32]
, constraints = []
, selector = quickCheckSelector
}
, itv = quickCheckEntry st
, dyn = quickCheckEntry st
, art = quickCheckEntry st
}
runGenerator :: s -> MusicGenerator s a -> IO a
runGenerator = runGenerator' . quickCheckState
clean :: s -> MusicGenerator s a -> MusicGenerator s a
clean s = modified (const $ quickCheckState s)
playGen :: ToMusicCore a => s -> MusicGenerator s (Music a) -> IO ()
playGen s music = do
m <- runGenerator s music
let ?midiConfig = defaultMIDIConfig
playDev 4 m