Bang 0.1.0.1 → 0.1.0.2
raw patch · 2 files changed
+145/−5 lines, 2 filesdep +stmdep −hmidi
Dependencies added: stm
Dependencies removed: hmidi
Files
- Bang.cabal +6/−5
- src/System/MIDI.hs +139/−0
Bang.cabal view
@@ -1,5 +1,5 @@ name: Bang-version: 0.1.0.1+version: 0.1.0.2 synopsis: A Drum Machine DSL for Haskell description: This library consists of a DSL for piecing together drum compositions. It uses a MIDI backend@@ -24,15 +24,16 @@ Bang.Music.Operators, Bang.Music.Transform - other-modules: Bang.Interpreter+ other-modules: Bang.Interpreter,+ System.MIDI -- other-modules: other-extensions: DeriveFunctor, NoMonomorphismRestriction build-depends: base >=4.6 && <5, mtl >=2.1 && <3, - transformers >=0.3 && <0.4, - hmidi >=0.2 && <0.3,- bifunctors >= 4 && <5+ transformers >=0.3 && <0.4,+ bifunctors >= 4 && <5,+ stm >= 2.4 && < 5 hs-source-dirs: src default-language: Haskell2010
+ src/System/MIDI.hs view
@@ -0,0 +1,139 @@++--+-- Module : System.MIDI+-- Version : 0.1+-- License : BSD3+-- Author : Balazs Komuves+-- Maintainer : bkomuves+hmidi@gmail.com+-- Stability : experimental+-- Portability : not portable+-- Tested with : GHC 6.8.2+--++-- |A lowest common denominator interface to the Win32 and MacOSX MIDI bindings. +-- Error handling is via `fail`-s in the IO monad. ++{-# LANGUAGE CPP #-}+module System.MIDI + ( module System.MIDI.Base++ , Source+ , Destination+ , Connection+ + , enumerateSources+ , enumerateDestinations+ + , getName+ , getModel+ , getManufacturer++ , openSource+ , openDestination+ , close+ , send+ , sendSysEx+ , start+ , stop+ + , getNextEvent+ , getEvents+ , currentTime+ + ) where++import Data.Word (Word8,Word32)+import System.MIDI.Base++#ifdef mingw32_HOST_OS+import qualified System.MIDI.Win32 as S+#define HMIDI_SUPPORTED_OS+#endif++#ifdef darwin_HOST_OS+import qualified System.MIDI.MacOSX as S+#define HMIDI_SUPPORTED_OS+#endif++-- this is just to be able to produce a Haddock documentation on a not supported system (eg. Linux)+#ifndef HMIDI_SUPPORTED_OS+import qualified System.MIDI.Placeholder as S+#endif++-- All the definitions in this file are neccessary to be able to have a nice Haddock-generated+-- documentation independently of the platform. Though I still don't know how to generate documentation+-- for a platform-specific module while being on an a different platform (probably not at all possible +-- at present?) ++-- |The opaque data type representing a MIDI source.+type Source = S.Source++-- |The opaque data type representing a MIDI destination.+type Destination = S.Destination++-- |The opaque data type representing a MIDI connection.+type Connection = S.Connection++-- |Enumerates the MIDI sources present in the system.+enumerateSources :: IO [Source]+enumerateSources = S.enumerateSources++-- |Enumerates the MIDI destinations present in the system.+enumerateDestinations :: IO [Destination]+enumerateDestinations = S.enumerateDestinations++-- |These functions return the name, model and manufacturer of a MIDI source \/ destination.+-- +-- Note: On Win32, only `getName` returns a somewhat meaningful string at the moment.+getName :: S.MIDIHasName a => a -> IO String+getModel :: S.MIDIHasName a => a -> IO String+getManufacturer :: S.MIDIHasName a => a -> IO String++getName = S.getName+getModel = S.getModel+getManufacturer = S.getManufacturer++-- |Opens a MIDI Source.+-- There are two possibilites to receive MIDI messages. The user can either support a callback function,+-- or get the messages from an asynchronous buffer. However, mixing the two approaches is not allowed.+openSource :: Source -> Maybe ClientCallback -> IO Connection +openSource = S.openSource++-- |Opens a MIDI Destination.+openDestination :: Destination -> IO Connection +openDestination = S.openDestination++-- |Gets the next event from a buffered connection (see also `openSource`)+getNextEvent :: Connection -> IO (Maybe MidiEvent)+getNextEvent = S.getNextEvent++-- |Gets all the events from the buffer (see also `openSource`)+getEvents :: Connection -> IO [MidiEvent]+getEvents = S.getEvents+ +-- |Sends a short message. The connection must be a `Destination`.+send :: Connection -> MidiMessage -> IO ()+send = S.send+ +-- |Sends a system exclusive message. You shouldn't include the starting \/ trailing bytes 0xF0 and 0xF7.+-- +-- Note: On Win32, the connection must be a `Destination`+sendSysEx :: Connection -> [Word8] -> IO ()+sendSysEx = S.sendSysEx+ +-- |Starts a connection. This is required for receiving MIDI messages, and also for starting the clock.+start :: Connection -> IO ()+start = S.start++-- |Stops a connection.+stop :: Connection -> IO ()+stop = S.stop+ +-- |Closes a MIDI Connection.+close :: Connection -> IO ()+close = S.close+ +-- |Returns the time elapsed since the last `start` call, in milisecs.+currentTime :: Connection -> IO Word32+currentTime = S.currentTime+