packages feed

proarrow-0.4.0.0: tools/smc-audio/Main.hs

module Main where

import Control.Arrow ((>>>))
import Data.WAVE (WAVE (..), WAVEHeader (..), doubleToSample, putWAVEFile)
import System.Directory (createDirectoryIfMissing)
import System.Environment (getArgs)
import System.FilePath ((</>))
import Prelude

import SmcAudio (echo, echoPicture, melody, sampleRate, samples)

main :: IO ()
main = do
  args <- getArgs
  case args of
    [dir] -> do
      createDirectoryIfMissing True dir
      writeAudio (dir </> "dry.wav") (samples melody)
      writeAudio (dir </> "echo.wav") (samples (melody >>> echo 0.3 0.5))
      writeFile (dir </> "echo.svg") echoPicture
      putStrLn ("Wrote dry.wav, echo.wav and echo.svg to " ++ dir)
    _ -> ioError (userError "Usage: cabal run smc-audio -- OUTPUT_DIRECTORY")

writeAudio :: FilePath -> [Double] -> IO ()
writeAudio file xs = putWAVEFile file (WAVE header (map (\x -> [doubleToSample (max (-1) (min 1 x))]) xs))
  where
    header = WAVEHeader{waveNumChannels = 1, waveFrameRate = sampleRate, waveBitsPerSample = 16, waveFrames = Nothing}