module Sound.MIDI
(
encodeMidi,
encodeMidi',
encodeMidi1,
encodeMidi1',
decodeMidi,
decodeMidi1,
partitionRealtime,
midiParser,
midiSerializer,
module Sound.MIDI.Types
)
where
import Control.Applicative
import Data.Functor.Identity
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BL
import Data.ByteString.Builder (toLazyByteString, Builder)
import qualified Data.Attoparsec.ByteString as A
import Sound.MIDI.Types
import qualified Sound.MIDI.Parser as P
import qualified Sound.MIDI.Serialize as S
encodeMidi :: Foldable t => t MidiMessage -> BL.ByteString
encodeMidi = toLazyByteString . foldMap S.midiMessage
encodeMidi' :: Foldable t => t MidiMessage -> BS.ByteString
encodeMidi' = BL.toStrict . encodeMidi
encodeMidi1 :: MidiMessage -> BL.ByteString
encodeMidi1 = encodeMidi . Identity
encodeMidi1' :: MidiMessage -> BS.ByteString
encodeMidi1' = encodeMidi' . Identity
decodeMidi :: BS.ByteString -> Either String [MidiMessage]
decodeMidi = A.parseOnly (P.skipToStatus *> some P.midiMessage)
decodeMidi1 :: BS.ByteString -> Either String MidiMessage
decodeMidi1 = A.parseOnly (P.skipToStatus *> P.midiMessage)
partitionRealtime :: BS.ByteString -> (BS.ByteString, BS.ByteString)
partitionRealtime = BS.partition isRT
where isRT x = x >= 0xF8 && x <= 0xFF
midiParser :: A.Parser MidiMessage
midiParser = P.midiMessage
midiSerializer :: MidiMessage -> Builder
midiSerializer = S.midiMessage