packages feed

midi 0.2.1.4 → 0.2.1.5

raw patch · 15 files changed

+60/−44 lines, 15 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

midi.cabal view
@@ -1,5 +1,5 @@ Name:             midi-Version:          0.2.1.4+Version:          0.2.1.5 License:          GPL License-File:     LICENSE Author:           Henning Thielemann <haskell@henning-thielemann.de>@@ -30,7 +30,7 @@ Source-Repository this   type:     darcs   location: http://hub.darcs.net/thielema/midi/-  tag:      0.2.1.4+  tag:      0.2.1.5  Flag splitBase   description: Choose the new smaller, split-up base package.
parser/Sound/MIDI/Parser/Exception.hs view
@@ -4,7 +4,6 @@ module Sound.MIDI.Parser.Exception where  import qualified Sound.MIDI.Parser.Report as Report--- import qualified Sound.MIDI.Parser.Warning as Warning  import qualified Control.Monad.Exception.Synchronous as Sync 
parser/Sound/MIDI/Parser/Stream.hs view
@@ -16,8 +16,6 @@ import qualified Sound.MIDI.Parser.Exception as Exception import qualified Sound.MIDI.Parser.Warning   as Warning --- import qualified Control.Monad.Exception.Synchronous as Sync- import qualified Sound.MIDI.IO as MIO  import Data.Word (Word8)
src/Sound/MIDI/Example/ControllerRamp.hs view
@@ -3,20 +3,14 @@ import qualified Sound.MIDI.File      as MidiFile import qualified Sound.MIDI.File.Save as Save --- import qualified Sound.MIDI.File.Event.Meta as MetaEvent import qualified Sound.MIDI.File.Event      as Event  import qualified Sound.MIDI.Message.Channel       as ChannelMsg import qualified Sound.MIDI.Message.Channel.Voice as VoiceMsg --- import qualified Sound.MIDI.Parser.Report as Report- import qualified Data.EventList.Relative.TimeBody as EventList--- import Data.EventList.Relative.MixedBody ((/.), (./), )  import qualified Data.ByteString.Lazy as B---- import qualified Numeric.NonNegative.Wrapper as NonNeg   
src/Sound/MIDI/Example/Tomatosalad.hs view
@@ -14,18 +14,12 @@ import qualified Sound.MIDI.Message.Channel       as ChannelMsg import qualified Sound.MIDI.Message.Channel.Voice as VoiceMsg --- import qualified Sound.MIDI.Parser.Report as Report- import qualified Data.EventList.Relative.TimeMixed as EventListTM import qualified Data.EventList.Relative.BodyTime  as EventListBT import qualified Data.EventList.Relative.MixedTime as EventListMT import qualified Data.EventList.Relative.TimeBody  as EventList--- import Data.EventList.Relative.MixedBody ((/.), (./), )  import qualified Data.ByteString.Lazy as B---- import qualified Numeric.NonNegative.Wrapper as NonNeg- import Data.Tuple.HT (mapFst, )  import qualified Control.Monad.Trans.State as State
src/Sound/MIDI/File.hs view
@@ -37,7 +37,6 @@  import qualified Control.Monad.Trans.State as MS import Control.Monad (liftM, liftM2, )--- import Sound.MIDI.IO(ByteList) import Sound.MIDI.String (rightS, )  import Data.Ratio((%))
src/Sound/MIDI/File/Event.hs view
@@ -112,6 +112,6 @@ put :: Writer.C writer => T -> StatusWriter.T writer put e =    case e of-      MIDIEvent       m -> StatusWriter.lift (ChannelMsg.put m)+      MIDIEvent       m -> ChannelMsg.putWithStatus m       MetaEvent       m -> StatusWriter.clear +#+ StatusWriter.lift (MetaEvent.put  m)       SystemExclusive m -> StatusWriter.clear +#+ StatusWriter.lift (SysEx.put      m)
src/Sound/MIDI/File/Load.hs view
@@ -12,10 +12,10 @@ But it seems to be not sensible to re-use functionality from the @iff@ package. -}-module Sound.MIDI.File.Load-   (fromFile, fromByteList, maybeFromByteList, maybeFromByteString,-    showFile, )-      where+module Sound.MIDI.File.Load (+   fromFile, fromByteList, maybeFromByteList, maybeFromByteString,+   showFile,+   ) where  import           Sound.MIDI.File import qualified Sound.MIDI.File as MIDIFile@@ -26,7 +26,6 @@ import qualified Numeric.NonNegative.Wrapper as NonNeg  import Sound.MIDI.IO (ByteList, readBinaryFile, )--- import qualified Sound.MIDI.Bit as Bit import           Sound.MIDI.String (unlinesS) import           Sound.MIDI.Parser.Primitive import qualified Sound.MIDI.Parser.Class as Parser@@ -42,8 +41,6 @@ import qualified Data.ByteString.Lazy as B  import qualified Control.Monad.Exception.Asynchronous as Async--- import qualified Control.Monad.Exception.Synchronous  as Sync--- import System.IO (hPutStrLn, stderr, ) import Data.List (genericReplicate, genericLength, ) import Data.Maybe (catMaybes, ) 
src/Sound/MIDI/Message/System.hs view
@@ -9,7 +9,6 @@ import qualified Sound.MIDI.Message.System.Common    as Common import qualified Sound.MIDI.Message.System.RealTime  as RealTime --- import           Sound.MIDI.Parser.Primitive import qualified Sound.MIDI.Parser.Class as Parser  import qualified Sound.MIDI.Writer.Basic as Writer
src/Sound/MIDI/Message/System/RealTime.hs view
@@ -5,7 +5,6 @@    T(..), get, put,    ) where --- import           Sound.MIDI.Parser.Primitive import qualified Sound.MIDI.Parser.Class as Parser  import qualified Sound.MIDI.Writer.Basic as Writer
src/Sound/MIDI/Parser/ByteString.hs view
@@ -21,10 +21,6 @@ import qualified Sound.MIDI.Parser.Exception as Exception import qualified Sound.MIDI.Parser.Warning   as Warning --- import qualified Control.Monad.Exception.Synchronous as Sync---- import Data.Word (Word8)- import Data.Int (Int64) import qualified Numeric.NonNegative.Wrapper as NonNeg 
src/Sound/MIDI/Parser/Status.hs view
@@ -52,7 +52,7 @@ This definition should be in Message.Channel, but this results in a cyclic import. -}-newtype Channel     = Channel  {fromChannel  :: Int} deriving (Show, Eq, Ord, Ix)+newtype Channel = Channel {fromChannel :: Int} deriving (Show, Eq, Ord, Ix)  toChannel :: Int -> Channel toChannel = checkRange "Channel" Channel
src/Sound/MIDI/Writer/Basic.hs view
@@ -26,7 +26,6 @@ import Control.Exception (bracket, ) import qualified System.IO as IO import System.IO (openBinaryFile, hClose, hPutChar, Handle, IOMode(WriteMode))--- import System.IO.Error (ioError, userError)  import Prelude hiding (putStr, ) @@ -69,8 +68,7 @@   -newtype ByteString =-   ByteString {unByteString :: Builder}+newtype ByteString = ByteString {unByteString :: Builder}  instance Monoid ByteString where    mempty = ByteString $ mempty@@ -95,8 +93,7 @@   -newtype SeekableFile =-   SeekableFile {unSeekableFile :: ReaderT Handle IO ()}+newtype SeekableFile = SeekableFile {unSeekableFile :: ReaderT Handle IO ()}  instance Monoid SeekableFile where    mempty = SeekableFile $ return ()
src/Sound/MIDI/Writer/Status.hs view
@@ -3,8 +3,6 @@    lift,    ) where --- import qualified Sound.MIDI.Writer.Basic as Writer- import Sound.MIDI.Parser.Status (Channel)  import qualified Data.Monoid.State       as State
test/Main.hs view
@@ -12,7 +12,9 @@ import qualified Sound.MIDI.File      as MidiFile import qualified Sound.MIDI.File.Load as Load import qualified Sound.MIDI.File.Save as Save+import qualified Sound.MIDI.File.Event as Event +import qualified Sound.MIDI.Message.Channel.Voice as VoiceMsg import qualified Sound.MIDI.Parser.Report as Report  import qualified Data.EventList.Relative.TimeBody as EventList@@ -22,13 +24,12 @@ import qualified Data.List.HT as ListHT import qualified Data.List.Match as Match import Data.Int (Int64, )+import Data.Bool.HT (implies, )  import Control.Monad (when, ) --- import Debug.Trace (trace)  - testMidiName :: FilePath testMidiName = "quickcheck-test.mid" @@ -45,7 +46,7 @@ -- provoke a test failure in order to see some examples of Arbitrary MIDI files checkArbitrary :: MidiFile.T -> Bool checkArbitrary (MidiFile.Cons _typ _division tracks) =-   length (EventList.toPairList (EventList.concat tracks)) < 10+   all ((< 10) . length . EventList.toPairList) tracks   saveLoadByteString :: MidiFile.T -> Bool@@ -62,6 +63,48 @@        report = Report.Cons [] (Right (MidiFile.implicitNoteOff midi))    in  struct == report +compressionShortens :: MidiFile.T -> Bool+compressionShortens midi =+   B.length (Save.toByteString midi)+   >=+   B.length (Save.toCompressedByteString midi)+++{-+This does not cover all cases of possible running status compression,+but the most common ones.+-}+equalStatus :: Event.T -> Event.T -> Bool+equalStatus x y =+   case (Event.maybeVoice x, Event.maybeVoice y) of+      (Just (ch0, ev0), Just (ch1, ev1)) ->+         ch0 == ch1+         &&+         case (ev0, ev1) of+            (VoiceMsg.Control _ _, VoiceMsg.Control _ _) -> True+            _ ->+               VoiceMsg.isNoteOn ev0 && VoiceMsg.isNoteOn ev1+               ||+               VoiceMsg.isNoteOff ev0 && VoiceMsg.isNoteOff ev1+      _ -> False++{-+You may test manually with Example.status+which is definitely compressible.+-}+compressible :: MidiFile.T -> Bool+compressible =+   any (or . ListHT.mapAdjacent equalStatus . EventList.getBodies) .+   MidiFile.getTracks++compressionStrictlyShortens :: MidiFile.T -> Bool+compressionStrictlyShortens midi =+   compressible midi+   `implies`+   B.length (Save.toByteString midi)+   >+   B.length (Save.toCompressedByteString midi)+ saveLoadMaybeByteList :: MidiFile.T -> Bool saveLoadMaybeByteList midi =    let bin    = Save.toByteList midi@@ -94,7 +137,7 @@    let bin0 = Save.toCompressedByteString midi0    in  case Load.maybeFromByteString bin0 of           Report.Cons [] (Right midi1) ->-               bin0 == Save.toByteString midi1+               bin0 == Save.toCompressedByteString midi1           _ -> False  loadSaveByteList :: MidiFile.T -> Bool@@ -203,6 +246,9 @@    check "loadSaveByteString" loadSaveByteString    check "loadSaveCompressedByteString" loadSaveCompressedByteString    check "loadSaveByteList" loadSaveByteList++   check "compressionShortens" compressionShortens+   check "compressionStrictlyShortens" compressionStrictlyShortens     check "restrictionByteList" restrictionByteList