HCodecs 0.5 → 0.5.1
raw patch · 7 files changed
+44/−21 lines, 7 filesdep +semigroupsdep ~basenew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: semigroups
Dependency ranges changed: base
API changes (from Hackage documentation)
- Codec.ByteString.Builder: instance Monoid Builder
- Codec.ByteString.Parser: instance Alternative Parser
- Codec.ByteString.Parser: instance Applicative Parser
- Codec.ByteString.Parser: instance Functor Parser
- Codec.ByteString.Parser: instance Monad Parser
- Codec.ByteString.Parser: instance MonadPlus Parser
- Codec.Midi: channel :: Message -> !Channel
- Codec.Midi: controllerNumber :: Message -> !Int
- Codec.Midi: controllerValue :: Message -> !Int
- Codec.Midi: fileType :: Midi -> FileType
- Codec.Midi: instance Arbitrary FileType
- Codec.Midi: instance Arbitrary Message
- Codec.Midi: instance Arbitrary Midi
- Codec.Midi: instance Arbitrary TimeDiv
- Codec.Midi: instance Eq FileType
- Codec.Midi: instance Eq Message
- Codec.Midi: instance Eq Midi
- Codec.Midi: instance Eq TimeDiv
- Codec.Midi: instance Show FileType
- Codec.Midi: instance Show Message
- Codec.Midi: instance Show Midi
- Codec.Midi: instance Show TimeDiv
- Codec.Midi: key :: Message -> !Key
- Codec.Midi: pitchWheel :: Message -> !PitchWheel
- Codec.Midi: preset :: Message -> !Preset
- Codec.Midi: pressure :: Message -> !Pressure
- Codec.Midi: timeDiv :: Midi -> TimeDiv
- Codec.Midi: tracks :: Midi -> [Track Ticks]
- Codec.Midi: velocity :: Message -> !Velocity
- Codec.SoundFont: amount :: Mod -> Int
- Codec.SoundFont: amtSrcOper :: Mod -> Word
- Codec.SoundFont: bank :: Phdr -> Word
- Codec.SoundFont: destOper :: Mod -> Word
- Codec.SoundFont: end :: Shdr -> Word
- Codec.SoundFont: endLoop :: Shdr -> Word
- Codec.SoundFont: genNdx :: Bag -> Word
- Codec.SoundFont: genre :: Phdr -> Word
- Codec.SoundFont: ibags :: Pdta -> Array Word Bag
- Codec.SoundFont: igens :: Pdta -> Array Word Generator
- Codec.SoundFont: imods :: Pdta -> Array Word Mod
- Codec.SoundFont: infos :: SoundFont -> Array Word Info
- Codec.SoundFont: instBagNdx :: Inst -> Word
- Codec.SoundFont: instName :: Inst -> String
- Codec.SoundFont: instance Arbitrary Bag
- Codec.SoundFont: instance Arbitrary Generator
- Codec.SoundFont: instance Arbitrary Info
- Codec.SoundFont: instance Arbitrary Inst
- Codec.SoundFont: instance Arbitrary Mod
- Codec.SoundFont: instance Arbitrary Pdta
- Codec.SoundFont: instance Arbitrary Phdr
- Codec.SoundFont: instance Arbitrary Sdta
- Codec.SoundFont: instance Arbitrary Shdr
- Codec.SoundFont: instance Arbitrary SoundFont
- Codec.SoundFont: instance Eq Bag
- Codec.SoundFont: instance Eq Generator
- Codec.SoundFont: instance Eq Info
- Codec.SoundFont: instance Eq Inst
- Codec.SoundFont: instance Eq Mod
- Codec.SoundFont: instance Eq Pdta
- Codec.SoundFont: instance Eq Phdr
- Codec.SoundFont: instance Eq Sdta
- Codec.SoundFont: instance Eq Shdr
- Codec.SoundFont: instance Eq SoundFont
- Codec.SoundFont: instance Show Bag
- Codec.SoundFont: instance Show Generator
- Codec.SoundFont: instance Show Info
- Codec.SoundFont: instance Show Inst
- Codec.SoundFont: instance Show Mod
- Codec.SoundFont: instance Show Pdta
- Codec.SoundFont: instance Show Phdr
- Codec.SoundFont: instance Show Sdta
- Codec.SoundFont: instance Show Shdr
- Codec.SoundFont: instance Show SoundFont
- Codec.SoundFont: insts :: Pdta -> Array Word Inst
- Codec.SoundFont: library :: Phdr -> Word
- Codec.SoundFont: modNdx :: Bag -> Word
- Codec.SoundFont: morphology :: Phdr -> Word
- Codec.SoundFont: originalPitch :: Shdr -> Word
- Codec.SoundFont: pbags :: Pdta -> Array Word Bag
- Codec.SoundFont: pdta :: SoundFont -> Pdta
- Codec.SoundFont: pgens :: Pdta -> Array Word Generator
- Codec.SoundFont: phdrs :: Pdta -> Array Word Phdr
- Codec.SoundFont: pitchCorrection :: Shdr -> Int
- Codec.SoundFont: pmods :: Pdta -> Array Word Mod
- Codec.SoundFont: preset :: Phdr -> Word
- Codec.SoundFont: presetBagNdx :: Phdr -> Word
- Codec.SoundFont: presetName :: Phdr -> String
- Codec.SoundFont: sampleLink :: Shdr -> Word
- Codec.SoundFont: sampleName :: Shdr -> String
- Codec.SoundFont: sampleRate :: Shdr -> Word
- Codec.SoundFont: sampleType :: Shdr -> Word
- Codec.SoundFont: sdta :: SoundFont -> Sdta
- Codec.SoundFont: shdrs :: Pdta -> Array Word Shdr
- Codec.SoundFont: sm24 :: Sdta -> Maybe (SampleData Int8)
- Codec.SoundFont: smpl :: Sdta -> SampleData Int16
- Codec.SoundFont: srcOper :: Mod -> Word
- Codec.SoundFont: start :: Shdr -> Word
- Codec.SoundFont: startLoop :: Shdr -> Word
- Codec.SoundFont: transOper :: Mod -> Word
- Codec.Wav: instance AudibleInWav Int16
- Codec.Wav: instance AudibleInWav Int32
- Codec.Wav: instance AudibleInWav Int64
- Codec.Wav: instance AudibleInWav Word8
- Data.Audio: channelNumber :: Audio a -> Int
- Data.Audio: instance (Arbitrary a, IArray UArray a) => Arbitrary (Audio a)
- Data.Audio: instance (Eq a, IArray UArray a) => Eq (Audio a)
- Data.Audio: instance (Show a, IArray UArray a) => Show (Audio a)
- Data.Audio: instance Arbitrary SampleMode
- Data.Audio: instance Audible Double
- Data.Audio: instance Audible Float
- Data.Audio: instance Audible Int16
- Data.Audio: instance Audible Int32
- Data.Audio: instance Audible Int64
- Data.Audio: instance Audible Int8
- Data.Audio: instance Audible Word16
- Data.Audio: instance Audible Word32
- Data.Audio: instance Audible Word64
- Data.Audio: instance Audible Word8
- Data.Audio: instance Eq SampleMode
- Data.Audio: instance Show SampleMode
- Data.Audio: sampleData :: Audio a -> SampleData a
- Data.Audio: sampleRate :: Audio a -> Int
+ Codec.ByteString.Builder: instance Data.Semigroup.Semigroup Codec.ByteString.Builder.Builder
+ Codec.ByteString.Builder: instance GHC.Base.Monoid Codec.ByteString.Builder.Builder
+ Codec.ByteString.Parser: instance GHC.Base.Alternative Codec.ByteString.Parser.Parser
+ Codec.ByteString.Parser: instance GHC.Base.Applicative Codec.ByteString.Parser.Parser
+ Codec.ByteString.Parser: instance GHC.Base.Functor Codec.ByteString.Parser.Parser
+ Codec.ByteString.Parser: instance GHC.Base.Monad Codec.ByteString.Parser.Parser
+ Codec.ByteString.Parser: instance GHC.Base.MonadPlus Codec.ByteString.Parser.Parser
+ Codec.Midi: [channel] :: Message -> !Channel
+ Codec.Midi: [controllerNumber] :: Message -> !Int
+ Codec.Midi: [controllerValue] :: Message -> !Int
+ Codec.Midi: [fileType] :: Midi -> FileType
+ Codec.Midi: [key] :: Message -> !Key
+ Codec.Midi: [pitchWheel] :: Message -> !PitchWheel
+ Codec.Midi: [preset] :: Message -> !Preset
+ Codec.Midi: [pressure] :: Message -> !Pressure
+ Codec.Midi: [timeDiv] :: Midi -> TimeDiv
+ Codec.Midi: [tracks] :: Midi -> [Track Ticks]
+ Codec.Midi: [velocity] :: Message -> !Velocity
+ Codec.Midi: instance GHC.Classes.Eq Codec.Midi.FileType
+ Codec.Midi: instance GHC.Classes.Eq Codec.Midi.Message
+ Codec.Midi: instance GHC.Classes.Eq Codec.Midi.Midi
+ Codec.Midi: instance GHC.Classes.Eq Codec.Midi.TimeDiv
+ Codec.Midi: instance GHC.Show.Show Codec.Midi.FileType
+ Codec.Midi: instance GHC.Show.Show Codec.Midi.Message
+ Codec.Midi: instance GHC.Show.Show Codec.Midi.Midi
+ Codec.Midi: instance GHC.Show.Show Codec.Midi.TimeDiv
+ Codec.Midi: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.Midi.FileType
+ Codec.Midi: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.Midi.Message
+ Codec.Midi: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.Midi.Midi
+ Codec.Midi: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.Midi.TimeDiv
+ Codec.SoundFont: [amount] :: Mod -> Int
+ Codec.SoundFont: [amtSrcOper] :: Mod -> Word
+ Codec.SoundFont: [bank] :: Phdr -> Word
+ Codec.SoundFont: [destOper] :: Mod -> Word
+ Codec.SoundFont: [endLoop] :: Shdr -> Word
+ Codec.SoundFont: [end] :: Shdr -> Word
+ Codec.SoundFont: [genNdx] :: Bag -> Word
+ Codec.SoundFont: [genre] :: Phdr -> Word
+ Codec.SoundFont: [ibags] :: Pdta -> Array Word Bag
+ Codec.SoundFont: [igens] :: Pdta -> Array Word Generator
+ Codec.SoundFont: [imods] :: Pdta -> Array Word Mod
+ Codec.SoundFont: [infos] :: SoundFont -> Array Word Info
+ Codec.SoundFont: [instBagNdx] :: Inst -> Word
+ Codec.SoundFont: [instName] :: Inst -> String
+ Codec.SoundFont: [insts] :: Pdta -> Array Word Inst
+ Codec.SoundFont: [library] :: Phdr -> Word
+ Codec.SoundFont: [modNdx] :: Bag -> Word
+ Codec.SoundFont: [morphology] :: Phdr -> Word
+ Codec.SoundFont: [originalPitch] :: Shdr -> Word
+ Codec.SoundFont: [pbags] :: Pdta -> Array Word Bag
+ Codec.SoundFont: [pdta] :: SoundFont -> Pdta
+ Codec.SoundFont: [pgens] :: Pdta -> Array Word Generator
+ Codec.SoundFont: [phdrs] :: Pdta -> Array Word Phdr
+ Codec.SoundFont: [pitchCorrection] :: Shdr -> Int
+ Codec.SoundFont: [pmods] :: Pdta -> Array Word Mod
+ Codec.SoundFont: [presetBagNdx] :: Phdr -> Word
+ Codec.SoundFont: [presetName] :: Phdr -> String
+ Codec.SoundFont: [preset] :: Phdr -> Word
+ Codec.SoundFont: [sampleLink] :: Shdr -> Word
+ Codec.SoundFont: [sampleName] :: Shdr -> String
+ Codec.SoundFont: [sampleRate] :: Shdr -> Word
+ Codec.SoundFont: [sampleType] :: Shdr -> Word
+ Codec.SoundFont: [sdta] :: SoundFont -> Sdta
+ Codec.SoundFont: [shdrs] :: Pdta -> Array Word Shdr
+ Codec.SoundFont: [sm24] :: Sdta -> Maybe (SampleData Int8)
+ Codec.SoundFont: [smpl] :: Sdta -> SampleData Int16
+ Codec.SoundFont: [srcOper] :: Mod -> Word
+ Codec.SoundFont: [startLoop] :: Shdr -> Word
+ Codec.SoundFont: [start] :: Shdr -> Word
+ Codec.SoundFont: [transOper] :: Mod -> Word
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Bag
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Generator
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Info
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Inst
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Mod
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Pdta
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Phdr
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Sdta
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.Shdr
+ Codec.SoundFont: instance GHC.Classes.Eq Codec.SoundFont.SoundFont
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Bag
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Generator
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Info
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Inst
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Mod
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Pdta
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Phdr
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Sdta
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.Shdr
+ Codec.SoundFont: instance GHC.Show.Show Codec.SoundFont.SoundFont
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Bag
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Generator
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Info
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Inst
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Mod
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Pdta
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Phdr
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Sdta
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.Shdr
+ Codec.SoundFont: instance Test.QuickCheck.Arbitrary.Arbitrary Codec.SoundFont.SoundFont
+ Codec.Wav: instance Codec.Wav.AudibleInWav GHC.Int.Int16
+ Codec.Wav: instance Codec.Wav.AudibleInWav GHC.Int.Int32
+ Codec.Wav: instance Codec.Wav.AudibleInWav GHC.Int.Int64
+ Codec.Wav: instance Codec.Wav.AudibleInWav GHC.Word.Word8
+ Data.Audio: [channelNumber] :: Audio a -> Int
+ Data.Audio: [sampleData] :: Audio a -> SampleData a
+ Data.Audio: [sampleRate] :: Audio a -> Int
+ Data.Audio: instance (GHC.Classes.Eq a, Data.Array.Base.IArray Data.Array.Base.UArray a) => GHC.Classes.Eq (Data.Audio.Audio a)
+ Data.Audio: instance (GHC.Show.Show a, Data.Array.Base.IArray Data.Array.Base.UArray a) => GHC.Show.Show (Data.Audio.Audio a)
+ Data.Audio: instance (Test.QuickCheck.Arbitrary.Arbitrary a, Data.Array.Base.IArray Data.Array.Base.UArray a) => Test.QuickCheck.Arbitrary.Arbitrary (Data.Audio.Audio a)
+ Data.Audio: instance Data.Audio.Audible GHC.Int.Int16
+ Data.Audio: instance Data.Audio.Audible GHC.Int.Int32
+ Data.Audio: instance Data.Audio.Audible GHC.Int.Int64
+ Data.Audio: instance Data.Audio.Audible GHC.Int.Int8
+ Data.Audio: instance Data.Audio.Audible GHC.Types.Double
+ Data.Audio: instance Data.Audio.Audible GHC.Types.Float
+ Data.Audio: instance Data.Audio.Audible GHC.Word.Word16
+ Data.Audio: instance Data.Audio.Audible GHC.Word.Word32
+ Data.Audio: instance Data.Audio.Audible GHC.Word.Word64
+ Data.Audio: instance Data.Audio.Audible GHC.Word.Word8
+ Data.Audio: instance GHC.Classes.Eq Data.Audio.SampleMode
+ Data.Audio: instance GHC.Show.Show Data.Audio.SampleMode
+ Data.Audio: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Audio.SampleMode
- Codec.Midi: fromAbsTime :: Num a => Track a -> Track a
+ Codec.Midi: fromAbsTime :: (Num a) => Track a -> Track a
- Codec.Midi: toAbsTime :: Num a => Track a -> Track a
+ Codec.Midi: toAbsTime :: (Num a) => Track a -> Track a
- Data.Audio: buildSampleData :: IArray UArray a => (a -> Builder) -> SampleData a -> Builder
+ Data.Audio: buildSampleData :: (IArray UArray a) => (a -> Builder) -> SampleData a -> Builder
- Data.Audio: sampleNumber :: IArray UArray a => SampleData a -> Int
+ Data.Audio: sampleNumber :: (IArray UArray a) => SampleData a -> Int
- Data.Audio: sampleType :: IArray UArray a => SampleData a -> a
+ Data.Audio: sampleType :: (IArray UArray a) => SampleData a -> a
Files
- HCodecs.cabal +25/−6
- src/Codec/ByteString/Builder.hs +7/−4
- src/Codec/ByteString/Parser.hs +3/−1
- src/Codec/Midi.hs +6/−6
- src/Codec/SoundFont.hs +1/−1
- src/Codec/Wav.hs +1/−2
- src/Data/Audio.hs +1/−1
HCodecs.cabal view
@@ -1,30 +1,42 @@ name: HCodecs-version: 0.5+version: 0.5.1 cabal-Version: >= 1.8 license: BSD3 license-file: LICENSE copyright: (c) 2007-2014 George Giorgidze author: George Giorgidze maintainer: George Giorgidze (giorgidze@gmail.com)+ , Pavel Krajcevski (krajcevski@gmail.com) homepage: http://www-db.informatik.uni-tuebingen.de/team/giorgidze category: Codec stability: experimental synopsis: A library to read, write and manipulate MIDI, WAVE, and SoundFont2 files. description:- The library provides functions to read, write and manipulate MIDI, WAVE and SoundFont2 multimedia files. It is written entirely in Haskell (without any FFI). It uses efficient parsing and building combinators for binary data stored in ByteStrings (based on the one in 'binary' package).+ The library provides functions to read, write and manipulate MIDI, WAVE and+ SoundFont2 multimedia files. It is written entirely in Haskell (without any+ FFI). It uses efficient parsing and building combinators for binary data+ stored in ByteStrings (based on the one in 'binary' package). .- Correctness of significant parts of the library has been validated with QuickCheck and Haskell Program Coverage (HPC) tool-kits.+ Correctness of significant parts of the library has been validated with+ QuickCheck and Haskell Program Coverage (HPC) tool-kits. build-type: Simple source-repository head type: git- location: https://github.com/giorgidze/HCodecs.git+ location: https://github.com/Mokosha/HCodecs.git library hs-source-dirs: src ghc-options: -O3 -Wall- build-depends: base < 5, bytestring, random, array >= 0.4, QuickCheck >= 2.0+ build-depends:+ base < 5+ , bytestring+ , random+ , semigroups+ , array >= 0.4+ , QuickCheck >= 2.0+ exposed-modules: Codec.Midi Codec.Wav@@ -39,5 +51,12 @@ type: exitcode-stdio-1.0 hs-source-dirs: src ghc-options: -O3 -Wall- build-depends: base < 5, bytestring, random, array >= 0.4, QuickCheck >= 2.0+ build-depends:+ base < 5+ , bytestring+ , random+ , semigroups+ , array >= 0.4+ , QuickCheck >= 2.0+ main-is: Codec/Internal/TestSuite.hs
src/Codec/ByteString/Builder.hs view
@@ -71,12 +71,12 @@ import Foreign.Ptr (Ptr, plusPtr) import Foreign.ForeignPtr (ForeignPtr, withForeignPtr) import System.IO.Unsafe (unsafePerformIO)-import Data.ByteString.Internal (inlinePerformIO,c2w)+import Data.ByteString.Internal (c2w) import Data.Bits import Data.Word import Data.Int-import Data.Monoid+import Data.Semigroup ------------------------------------------------------------------------ @@ -96,9 +96,12 @@ runBuilder :: (Buffer -> [S.ByteString]) -> Buffer -> [S.ByteString] } +instance Semigroup Builder where+ (<>) = append+ instance Monoid Builder where mempty = empty- mappend = append+ mappend = (<>) ------------------------------------------------------------------------ @@ -188,7 +191,7 @@ -- | Sequence an IO operation on the buffer unsafeLiftIO :: (Buffer -> IO Buffer) -> Builder-unsafeLiftIO f = Builder $ \ k buf -> inlinePerformIO $ do+unsafeLiftIO f = Builder $ \ k buf -> unsafePerformIO $ do buf' <- f buf return (k buf')
src/Codec/ByteString/Parser.hs view
@@ -120,6 +120,8 @@ import Data.Bits import Data.Maybe +import System.IO.Unsafe (unsafePerformIO)+ -- | The parse state data S = S {-# UNPACK #-} !B.ByteString -- current chunk L.ByteString -- the rest of the input@@ -375,7 +377,7 @@ getPtr :: Storable a => Int -> Parser a getPtr n = do (fp,o,_) <- readN n B.toForeignPtr- return . B.inlinePerformIO $ withForeignPtr fp $ \p -> peek (castPtr $ p `plusPtr` o)+ return . unsafePerformIO $ withForeignPtr fp $ \p -> peek (castPtr $ p `plusPtr` o) ------------------------------------------------------------------------
src/Codec/Midi.hs view
@@ -74,7 +74,7 @@ import Data.Bits import Data.Maybe import Data.List-import Data.Monoid+import Data.Monoid (mempty, mconcat, mappend) import Control.Applicative import Control.Monad @@ -120,13 +120,13 @@ type Ticks = Int -- 0 - (2^28 - 1) type Time = Double -type Channel = Int -- 0 - 15-type Key = Int -- 0 - 127-type Velocity = Int -- 0 - 127+type Channel = Int -- 0 - 15+type Key = Int -- 0 - 127+type Velocity = Int -- 0 - 127 type Pressure = Int -- 0 - 127-type Preset = Int -- 0 - 127+type Preset = Int -- 0 - 127 type Bank = Int-type PitchWheel = Int -- 0 - (2^14 - 1)+type PitchWheel = Int -- 0 - (2^14 - 1) type Tempo = Int -- microseconds per beat 1 - (2^24 - 1) data Message =
src/Codec/SoundFont.hs view
@@ -50,7 +50,7 @@ import Data.List import Test.QuickCheck-import Data.Monoid+import Data.Monoid (mconcat) import Control.Applicative import Control.Monad
src/Codec/Wav.hs view
@@ -29,11 +29,10 @@ import Data.Word import Data.Int import qualified Data.ByteString.Lazy as L-import Data.Monoid+import Data.Monoid (mconcat) import Data.Array.Unboxed import Data.Array.IO import Data.Bits- import Control.Monad import Control.Applicative
src/Data/Audio.hs view
@@ -42,7 +42,7 @@ import Data.Array.Unboxed import Data.Word import Data.Int-import Data.Monoid+import Data.Monoid (mconcat) type Sample = Double type SampleData a = UArray Int a