-- Partial Encoding of Chick Corea's ``Children's Song No. 6''

module Haskore.Interface.Signal.Example.ChildSong6ToSignal where

import qualified Haskore.Example.ChildSong6 as ChildSong6
import Synthesizer.Plain.Instrument (fastBell)
import qualified Synthesizer.Plain.Signal as Sig
import qualified Sox.File

import qualified Haskore.Music.GeneralMIDI as Music
import Haskore.Interface.Signal.Write(Time, Volume)

import qualified Haskore.Performance.Fancy as FancyPf
import qualified Haskore.Interface.Signal.Write as MusicSignal

import System.Exit (ExitCode)



-- Volume type arises from Haskore
songToSignalMono :: Time -> Time -> Music.T -> Sig.T Volume
songToSignalMono sampleRate dif song =
   MusicSignal.fromRhythmicMusic
      sampleRate
      (MusicSignal.detuneInstrs dif
          [(Music.AcousticGrandPiano,
            MusicSignal.amplify (0.1::Volume) fastBell)])
      FancyPf.map
      (MusicSignal.contextMetro 60 Music.qn)
      song

songSignal :: Time -> Time -> Sig.T Volume
songSignal sampleRate dif =
   songToSignalMono sampleRate dif (Music.transpose 12 ChildSong6.song)


stereoSignal :: Time -> Sig.T (Volume,Volume)
stereoSignal sampleRate =
   zip (songSignal sampleRate 1.001)
       (songSignal sampleRate 0.999)

main :: IO ExitCode
main = Sox.File.renderStereo "ChildSong6" 22050 stereoSignal