ブレイクビーツを作るためにちょっと書いた。
slicer.hs
-- Usage:
-- ./slice 32 amen_4bars.wav amenBreak
import System.Environment
import Data.WAVE
import Control.Monad
import System.FilePath.Posix
import Data.Maybe
create :: FilePath -> Int -> IO [WAVE]
create path n = do
WAVE header samples <- getWAVEFile path
let size = (fromJust $ waveFrames header) `div` n
return $ map (WAVE $ WAVEHeader (waveNumChannels header) (waveFrameRate header) (waveBitsPerSample header) (Just size)) $ splitAts (replicate n size) samples
splitAts :: [Int] -> [a] -> [[a]]
splitAts (n:ns) xs = take n xs : splitAts ns (drop n xs)
splitAts _ xs = []
main = getArgs >>= \args -> case args of
(n : path : out : _) -> do
let base = takeBaseName path
waves <- create path (read n)
forM (zip [0..] waves) $ \(i,wave) ->
putWAVEFile (out `combine` replaceBaseName path (base ++ show i)) wave