(Old) Haskell Sound Library

This Haskell sound library can be used to create music by writing a Haskell program. It consists of some EDSLs to describe musical and other structures and outputs the result into a WAV file or a Midi file.
Note
: The library is old and not further developed since 2005, so it is 'optimized' for GHC 6.0.1.
H(askell)ommage is the successor of this library.

Example

import Data.Ratio
import Data.List
import Data.Complex
import Sound
import SoundTools
import Voice

main = do { main1; main2; main3; main4; main5 }

main1 = saveWavSignal "example1_1.wav" $ Mono $ take 100000 $ sinus $ repeat 5.0

main2 = saveWavSignal "example1_2.wav" $ Mono $ zipWith (*) (playEnv 10000 env) (saw $ repeat 2.5)
 where
  env :: Env
  env = Env FitADR EnvLine (1,2,0.3,4)

main3 = saveWavSignal "example1_3.wav" $ 
 Mono $ karplus_strong 400

karplus_strong :: Int -> [Double]
karplus_strong n = 
 let output = take n (noise (-1.0, 1.0)) ++ 
               zipWith (\x y -> x*0.5 + y*0.49) output (tail output)
 in terminateAt 100 ((<0.005).abs) $ output

main4 = let m = map (*0.7) $ sinus $ map ((*0.05).(+2.0)) $ sinus $ repeat 0.01
        in saveWavSignal "example1_4.wav" $ Stereo $ zipWith panorama m (karplus_strong 500)

main5 = saveWavSignal "example1_5.wav" $ Mono $ effect $ signalMono $ openWavSignal "input.wav"
 where
  effect inp = let buf  = replicate 800 0.0 ++ outp
                   outp = zipWith3 (\x x' i -> x*0.5 + x'*0.4 + i*0.3) buf (tail buf) 
                          (inp ++ replicate 10000 0.0)
               in outp

Songs made with this Library

example2.mp3
example3.mp3
example4.mp3

Ressources

External Links

This work would not have been possible without inspiration from the following: