import Data.Coerce (coerce) import LambdaSound main :: IO () main = play 44100 0.4 $ simpleReverb 0.1 $ applyIIRFilter (highPassFilter 600 1) sound sound :: Sound T Pulse sound = melody <> background background :: Sound T Pulse background = repeatSound 3 $ sequentially $ fmap (setDuration 0.5) [ note c3, parallel $ note <$> [e3, g3], parallel $ note <$> [e3, g3], parallel $ note <$> [e3, g3] ] melody :: Sound T Pulse melody = let mel = repeatSound 3 ( sequentially $ fmap (setDuration 0.5) [ note c4, note e4, note g4, note e4 ] ) >>> end end = setDuration 2 $ parallel [note c4, note c3, note g3] in mel note :: Semitone -> Sound T Pulse note st = applyEnvelope (Envelope 0.2 0.1 0.2 0.8) $ setDuration 1 $ asNote (harmonic sineWave) st -- Further examples metronome :: Sound T Pulse metronome = repeatSound 10 $ setDuration 1 $ note c4 >>> setDuration 2 silence upSound :: Sound T Pulse upSound = zipSoundWith (*) ((\p -> 1 - coerce p) <$> progress) $ speedUp $ upwards >>> takeSound 2 (raiseSemitones 12 upwards) >>> setDuration 1 (note g5) upwards :: Sound T Pulse upwards = setDuration 3.5 $ sequentially $ note <$> [c4, d4, e4, f4, g4, a4, b4] speedUp :: Sound T Pulse -> Sound T Pulse speedUp = changeTempo $ \p -> p ** 2