!K &      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~       !"#$%Nonehosc(The IEEE byte representation of a float.hosc Inverse of .hosc)The IEEE byte representation of a double.hosc Inverse of f64_i64.hoscITransform a haskell string into a C string (a null suffixed byte string).hosc Inverse of .hoscNTransform a haskell string to a pascal string (a length prefixed byte string). hosc Inverse of .  Safe hoscType specialised & hoscType specialised & hoscType specialised &. hoscType specialised &hoscType specialised &hoscType specialised &hoscType specialised &hoscType specialised &hoscType specialised &hoscType specialised &hoscType specialised &hoscType specialised &  None;u2hoscEncode a signed 8-bit integer.hosc"Encode an un-signed 8-bit integer.hoscType specialised '. !encode_w16 0x0102 == L.pack [1,2]hoscLittle-endian. $encode_w16_le 0x0102 == L.pack [2,1]hosc#Encode an un-signed 16-bit integer. !encode_u16 0x0102 == L.pack [1,2]hoscLittle-endian. $encode_u16_le 0x0102 == L.pack [2,1]hoscEncode a signed 16-bit integer.hoscEncode a signed 32-bit integer.hoscType specialised '.hosc"Encode an unsigned 32-bit integer. )encode_u32 0x01020304 == L.pack [1,2,3,4] hoscLittle-endian variant of .!hoscLittle-endian. ,encode_u32_le 0x01020304 == L.pack [4,3,2,1]"hoscEncode a signed 64-bit integer.#hosc"Encode an unsigned 64-bit integer.$hosc+Encode a 32-bit IEEE floating point number.%hoscLittle-endian variant of $.&hosc+Encode a 64-bit IEEE floating point number.'hoscJEncode an ASCII string (ASCII at Datum is an alias for a Char8 Bytetring).(hosc"Decode an un-signed 8-bit integer.)hoscDecode a signed 8-bit integer.*hoscType specialised (.+hosc!Decode an unsigned 8-bit integer.,hoscLittle-endian variant of *.-hoscLittle-endian variant of +..hoscType specialised (./hoscDecode a signed 16-bit integer.0hoscLittle-endian variant of /.1hoscDecode a signed 32-bit integer.2hoscType specialised (.3hosc"Decode an unsigned 32-bit integer. +decode_u32 (L.pack [1,2,3,4]) == 0x010203044hoscLittle-endian variant of 2.5hosc$Little-endian variant of decode_u32. .decode_u32_le (L.pack [1,2,3,4]) == 0x040302016hoscType specialised (.7hoscType specialised (.8hosc+Decode a 32-bit IEEE floating point number.9hoscLittle-endian variant of 8.:hosc+Decode a 64-bit IEEE floating point number.;hosc#Decode an ASCII string, inverse of '.<hosc) of ).=hosc/ of ).>hosc1 of ).?hosc3 of ).@hosc5 of ).Ahosc8 of ).Bhosc5Read u8 length prefixed ASCII string (pascal string).Chosc* of .Dhosc* of !.EhoscBundle header as a (strict) +.Fhosc#Bundle header as a lazy ByteString.GhoscRThe number of bytes required to align an OSC value to the next 4-byte boundary. ,map align [0::Int .. 7] == [0,3,2,1,0,3,2,1]2 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG2 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGSafegHhosc Unix/PosixS time in real-valued (fractional) form. The Unix/Posix epoch is January 1, 1970.IhoscNTP, time in real-valued (fractional) form (ie. ntpr9). This is the primary form of timestamp used by hosc.Jhosc7Type for binary (integeral) representation of a 64-bit NTP timestamp (ie. ntpij). The NTP epoch is January 1, 1900. NTPv4 also includes a 128-bit format, which is not used by OSC.Khosc_Constant indicating a bundle to be executed immediately. It has the NTP64 representation of 1.Lhosc*Convert a real-valued NTP timestamp to an NTPi timestamp. 4ntpr_to_ntpi immediately == 1 fmap ntpr_to_ntpi timeMhosc Convert an NTPi* timestamp to a real-valued NTP timestamp.Nhosc Difference (in seconds) between NTP and UT epochs. Antp_ut_epoch_diff / (24 * 60 * 60) == 25567 25567 `div` 365 == 70Ohosc Convert a H timestamp to an NTPi timestamp.PhoscConvert  Unix/Posix to NTP.QhoscConvert NTP to  Unix/Posix.RhoscConvert NTPi to  Unix/Posix.ShoscConvert I to ,.ThoscConvert , to I.Uhosc The time at 1970-01-01:00:00:00.VhoscConvert - to  Unix/Posix.WhoscRead current real-valued NTP timestamp. get_ct = fmap utc_to_ut T.getCurrentTime get_pt = fmap realToFrac T.getPOSIXTime (ct,pt) <- get_ct >>= \t0 -> get_pt >>= \t1 -> return (t0,t1) print (pt - ct,pt - ct < 1e-5)XhoscThe Y` limit (in seconds). Values larger than this require a different thread delay mechanism, see \0. The value is the number of microseconds in  maxBound::Int.YhoscBPause current thread for the indicated duration (in seconds), see X.ZhoscType restricted Y.[hosc%Pause current thread until the given I, see X.\hoscmSleep current thread for the indicated duration (in seconds). Divides long sleeps into parts smaller than X.]hosc%Sleep current thread until the given I1. Divides long sleeps into parts smaller than X.^hoscHDetailed 37-character ISO 8601 format, including fractional seconds and '+0000' suffix._hoscParse time according to ^ ;iso_8601_to_utctime "2015-11-26T00:29:37,145875000000+0000"`hosc UTC time in ^. tm <- fmap (utctime_to_iso_8601 . T.posixSecondsToUTCTime) T.getPOSIXTime (length tm,sum [4+1+2+1+2,1,2+1+2+1+2,1,12,1,4],sum [10,1,8,1,12,1,4]) == (37,37,37)ahosc ISO 8601 of I. _tm <- fmap ntpr_to_iso_8601 time import System.Process {- process -} rawSystem "date" ["-d",tm] kt = 15708783354150518784 s = "2015-11-26T00:22:19,366058349609+0000" ntpr_to_iso_8601 (ntpi_to_ntpr t) == sbhoscI of ISO 8601. ut = 15708783354150518784 s = "2015-11-26T00:22:19,366058349609+0000" fmap ntpr_to_ntpi (iso_8601_to_ntpr s) == Just tchosc Alias for a. Ptime_pp immediately == "1900-01-01T00:00:00,000000000000+0000" fmap time_pp timeHIJKLMNOPQRSTUVWXYZ[\]^_`abcJIKHLMNOPQRSTUVWXYZ[\]^_`abcSafe"dhosc5Perhaps a precision value for floating point numbers.ehosc#The basic elements of OSC messages.vhosc9Four-byte midi message: port-id, status-byte, data, data.xhosc Type for ." arrays, these are stored with an e length prefix.yhoscType for ASCII strings (strict /8 +).zhosc"Type enumerating Datum categories.{hoscType-specialised 0.|hoscType-specialised 1.}hoscType-specialised 2.~hoscType-specialised 3.hosc'List of required data types (tag,name).hosc'List of optional data types (tag,name).hosc"List of all data types (tag,name).hoscLookup name of type.hoscErroring variant.hosc,Single character identifier of an OSC datum.hoscType and name of e.hosce as 4 if Int32 or Int64. mlet d = [Int32 5,Int64 5,Float 5.5,Double 5.5] map datum_integral d == [Just (5::Int),Just 5,Nothing,Nothing]hosce as 5- if Int32, Int64, Float, Double or TimeStamp. klet d = [Int32 5,Int64 5,Float 5,Double 5,TimeStamp 5] mapMaybe datum_floating d == replicate 5 (5::Double)hoscType generalised Int32. int32 (1::Int32) == int32 (1::Integer) d_int32 (int32 (maxBound::Int32)) == maxBound int32 (((2::Int) ^ (64::Int))::Int) == Int32 0hoscType generalised Int64. Tint64 (1::Int32) == int64 (1::Integer) d_int64 (int64 (maxBound::Int64)) == maxBoundhoscType generalised Float. float (1::Int) == float (1::Double) floatRange (undefined::Float) == (-125,128) isInfinite (d_float (float (encodeFloat 1 256 :: Double))) == TruehoscType generalised Double. idouble (1::Int) == double (1::Double) double (encodeFloat 1 256 :: Double) == Double 1.157920892373162e77hoscj of 0. 5string "string" == ASCII_String (Char8.pack "string")hoscFour-tuple variant of m 6 v. %midi (0,0,0,0) == Midi (MIDI 0 0 0 0)hosc1Message argument types are given by a descriptor. 7descriptor [Int32 1,Float 1,string "1"] == ascii ",ifs"hoscDescriptor tags are comma prefixed.hosc Variant of 7 that deletes trailing zeros. 1map (floatPP (Just 4)) [1,pi] == ["1.0","3.1416"]hoscPretty printer for Time. !timePP (Just 4) (1/3) == "0.3333"hoscPretty printer for vectors. vecPP [1::Int,2,3] == "<1,2,3>"hoscPretty printer for e. let d = [Int32 1,Float 1.2,string "str",midi (0,0x90,0x40,0x60)] in map (datumPP (Just 5)) d == ["1","1.2","\"str\"","<0,144,64,96>"]hosc Variant of  that appends the .hoscGiven z attempt to parse e at 8. aparse_datum 'i' "42" == Just (Int32 42) parse_datum 'h' "42" == Just (Int64 42) parse_datum 'f' "3.14159" == Just (Float 3.14159) parse_datum 'd' "3.14159" == Just (Double 3.14159) parse_datum 's' "\"pi\"" == Just (string "pi") parse_datum 'b' "[112,105]" == Just (Blob (blob_pack [112,105])) parse_datum 'm' "(0,144,60,90)" == Just (midi (0,144,60,90))hoscErroring variant of .3demlkjgfihutsrqponvwxyz{|}~3zy{|x}~vwemlkjgfihutsrqpondSafehoscAn OSC  is either a  or a .hoscAn OSC bundle, a I and a sequence of s.hoscAn OSC message, an  and a sequence of e.hoscOSC address pattern. This is strictly an ASCII value, however it is very common to pattern match on addresses and matching on  requires OverloadedStrings.hosc constructor. It is an 9 if the + doesn't conform to the OSC specification.hosc constructor. It is an 9 if the  list is empty.hosc of .hosc of .hoscThe I of  , if the  is a  this is K.hoscRetrieve the set of  s from a .hoscIf  is a  add K timestamp, else :.hoscIf  is a  or a  with an  immediate, time tag and with one element, return the , else ;.hoscIs  immediate, ie. a  with timestamp K, or a plain Message.hosc Variant of < for .hoscDoes  have the specified .hoscDo any of the s at  have the specified .hoscDoes  have the specified , ie.  or .hoscPretty printer for .hoscPretty printer for .hoscPretty printer for .hoscOSC "s can be ordered (time ascending).None=hosc*Generate a list of zero bytes for padding.>hosc#Nul byte (0) and then zero padding.hoscBuilder for an OSC .hoscEncode an OSC .hoscEncode an OSC , ie.  of . plet m = [47,103,95,102,114,101,101,0,44,105,0,0,0,0,0,0] encodeMessage (Message "/g_free" [Int32 0]) == L.pack mhoscEncode an OSC , ie.  of . let m = [47,103,95,102,114,101,101,0,44,105,0,0,0,0,0,0] let b = [35,98,117,110,100,108,101,0,0,0,0,0,0,0,0,1,0,0,0,16] ++ m encodeBundle (Bundle immediately [Message "/g_free" [Int32 0]]) == L.pack bhoscEncode an OSC  to a strict +. NonehoscAlign byte string, if required.hosc Encode OSC e.hosc Encode OSC .hosc Encode OSC  as an OSC blob.hosc Encode OSC .hosc Encode OSC . None?hosc.Get a 32 bit integer in big-endian byte order.@hosc.Get a 64 bit integer in big-endian byte order.AhoscGet an aligned OSC string.BhoscGet an aligned OSC string.Chosc'Get binary data prefixed by byte count.DhoscGet an OSC datum.Ehosc Get an OSC %, fail if type descriptor is invalid.FhoscGet a sequence of OSC !s, each one headed by its length.Ghosc;Get a bundle. Fail if bundle header is not found in packet.hosc Get an OSC .hoscDecode an OSC  from a lazy ByteString. nlet b = B.pack [47,103,95,102,114,101,101,0,44,105,0,0,0,0,0,0] decodeMessage b == Message "/g_free" [Int32 0]hoscDecode an OSC  from a lazy ByteString.hosc,Decode an OSC packet from a lazy ByteString. ~let b = B.pack [47,103,95,102,114,101,101,0,44,105,0,0,0,0,0,0] decodePacket b == Packet_Message (Message "/g_free" [Int32 0])hosc.Decode an OSC packet from a strict ByteString. NonehoscDecode an OSC .hoscDecode an OSC .hoscDecode an OSC . nlet b = B.pack [47,103,95,102,114,101,101,0,44,105,0,0,0,0,0,0] in decodePacket b == Message "/g_free" [Int 0]HhoscI with J count.KhoscL with J count. Safe;hosc Variant of M+ where time is given in fractional seconds.hoscRepeat action until predicate f is N when applied to result.hoscRepeat action until f does not give ; when applied to result. SafeRhosc0Abstract over the underlying transport protocol.hoscEncode and send an OSC packet.hosc!Receive and decode an OSC packet.hoscClose an existing connection.hoscBracket OSC communication.hosc of .hosc of .hosc Variant of  that runs .hosc Variant of  that runs .hosc Variant of  that runs .hosc Variant of  that implements an n second timeout.hosc Wait for a ! where the supplied predicate is N", discarding intervening packets.hosc Wait for a , where the supplied function does not give ;!, discarding intervening packets.hosc .hosc , ie. an incoming  or immediate mode  with one element.hoscA  for variant using  to match on the  of incoming Packets.hosc Variant on  that returns matching .hosc Variant of  that runs .Safe8hoscTransport connection.hosc is  with a MonadIO constraint.hosc is the union of  and .hoscReceiver monad.hosc!Receive and decode an OSC packet.hosc Sender monad.hoscEncode and send an OSC packet.hosc)Bracket Open Sound Control communication.hoscType restricted synonym for sendOSC.hoscType restricted synonym for sendOSC.hosc Variant of  that runs packet_to_bundle.hosc Variant of  that runs packet_to_message.hoscErroring variant.hosc Variant of  that runs packetMessages.hosc Wait for a Packet! where the supplied predicate is N", discarding intervening packets.hosc Wait for a Packet, where the supplied function does not give ;!, discarding intervening packets.hosc packet_is_immediate.hosc packet_to_message, ie. an incoming Message or immediate mode Bundle with one element.hoscA  for variant using packet_has_address to match on the Address_Pattern of incoming Packets.hosc Variant on  that returns matching Message.hosc Variant of  that runs  messageDatum.hosc over ReaderT.hosc over ReaderT.hosc over ReaderT.hosc over ReaderT.Nonehosc#The UDP transport handle data type. hosc6Return the port number associated with the UDP socket. hoscSend packet over UDP. hoscReceive packet over UDP. hosc Close UDP. hoscBracket UDP communication.hosc!Create and initialise UDP socket.hoscSet option, ie. O or P.hosc Get option.hoscMake a  connection.hoscTrivial  server socket. import Control.Concurrent  plet t0 = udpServer "127.0.0.1" 57300 forkIO (FD.withTransport t0 (\fd -> forever (FD.recvMessage fd >>= print))) jlet t1 = openUDP "127.0.0.1" 57300 FD.withTransport t1 (\fd -> FD.sendMessage fd (Packet.message "/n" []))hosc Variant of ' that doesn't require the host address.hosc*Send variant to send to specified address.hosc/Recv variant to collect message source address.hosc is an instance of .          None hosc#The TCP transport handle data type.hoscSend packet over TCP.hoscReceive packet over TCP.hosc Close TCP.hoscBracket UDP communication.hosc!Create and initialise TCP socket.hoscConvert Q to . hoscCreate and initialise TCP.!hoscMake a  connection. import Sound.OSC.Datum import Sound.OSC.Time let t = openTCP "127.0.0.1" 57110 let m1 = Packet.message "/dumpOSC" [Int32 1] let m2 = Packet.message "/g_new" [Int32 1] FD.withTransport t (\fd -> let f = FD.sendMessage fd in f m1 >> pauseThread 0.25 >> f m2)"hoscR connection at s and run f.#hoscS of T.$hosc A trivial  OSC server.%hosc is an instance of  Transport. !"#$ !"#$None%zHIJKLMNOPQRSTUVWXYZ[\]^_`abcdehifgjklmnopqrstuvwxyz{|}~NoneCHIJKLMNOPQRSTUVWXYZ[\]^_`abcdehifgjklmnopqrstuvwxyz{|}~      !"#$None!HIJKLMNOPQRSTUVWXYZ[\]^_`abcdehifgjklmnopqrstuvwxyz{|}~      !"#$HIJKLMNOPQRSTUVWXYZ[\]^_`abcdehifgjklmnopqrstuvwxyz{|}~      !"#$U !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~        !"#$%&$%'()*()+(,-./-012345(67(68()7()8"9:;<=>?<@AB<CDEFGHI J K L M N O P Q R S()TUVW X()YZ[UV\]^_]^`]ab]^cdefgh hosc-0.17-I360LVldbm9EFN3gVUhetB Sound.OSCSound.OSC.Coding.CastSound.OSC.Coding.ConvertSound.OSC.Coding.ByteSound.OSC.TimeSound.OSC.DatumSound.OSC.PacketSound.OSC.Coding.Encode.BuilderSound.OSC.Coding.Encode.BaseSound.OSC.Coding.Decode.BinarySound.OSC.Coding.Decode.BaseSound.OSC.WaitSound.OSC.Transport.FDSound.OSC.Transport.MonadSound.OSC.Transport.FD.UDPSound.OSC.Transport.FD.TCPC ByteStringSound.OSC.Core Sound.OSC.FDbaseControl.Monad.IO.ClassliftIOMonadIOf32_w32w32_f32f64_w64w64_f64str_cstrcstr_strstr_pstrpstr_str int_to_word8 int_to_word32 int_to_word16 int_to_int8 int_to_int16 int_to_int32 int8_to_int int16_to_int int32_to_int word8_to_int word16_to_int word32_to_int encode_i8 encode_u8 encode_w16 encode_w16_le encode_u16 encode_u16_le encode_i16 encode_i32 encode_w32 encode_u32 encode_w32_le encode_u32_le encode_i64 encode_u64 encode_f32 encode_f32_le encode_f64 encode_str decode_u8 decode_i8 decode_word16 decode_u16decode_word16_le decode_u16_le decode_int16 decode_i16 decode_i16_le decode_i32 decode_word32 decode_u32decode_word32_le decode_u32_le decode_i64 decode_u64 decode_f32 decode_f32_le decode_f64 decode_strread_i8read_i16read_i32read_u32 read_u32_leread_f32 read_pstr write_u32 write_u32_lebundleHeader_strict bundleHeaderalignUTTimeNTP64 immediately ntpr_to_ntpi ntpi_to_ntprntp_ut_epoch_diff ut_to_ntpi ut_to_ntpr ntpr_to_ut ntpi_to_utntpr_to_posixtimeposixtime_to_ntprut_epoch utc_to_uttimepauseThreadLimit pauseThreadwaitpauseThreadUntil sleepThreadsleepThreadUntil iso_8601_fmtiso_8601_to_utctimeutctime_to_iso_8601ntpr_to_iso_8601iso_8601_to_ntprtime_pp FP_PrecisionDatumInt32Int64FloatDouble ASCII_StringBlob TimeStampMidid_int32d_int64d_floatd_doubled_ascii_stringd_blob d_timestampd_midiMIDIBLOBASCII Datum_Typeasciiascii_to_string blob_pack blob_unpackosc_types_requiredosc_types_optional osc_types osc_type_nameosc_type_name_err datum_tagdatum_type_namedatum_integraldatum_floatingint32int64floatdoublestringmidi descriptordescriptor_tagsfloatPPtimePPvecPPdatumPPdatum_pp_typed parse_datumparse_datum_err$fEqMIDI $fShowMIDI $fReadMIDI $fEqDatum $fReadDatum $fShowDatumPacketPacket_Message Packet_Bundle packetMessage packetBundleBundle bundleTimebundleMessagesMessagemessageAddress messageDatumAddress_Patternmessagebundlep_bundle p_message packetTimepacketMessagespacket_to_bundlepacket_to_messagepacket_is_immediate at_packetmessage_has_addressbundle_has_addresspacket_has_address messagePPbundlePPpacketPP $fOrdBundle $fEqMessage $fReadMessage $fShowMessage $fEqBundle $fReadBundle $fShowBundle $fEqPacket $fReadPacket $fShowPacket build_packet encodePacket encodeMessage encodeBundleencodePacket_strictextend encode_datumencode_message_blob get_packet decodeMessage decodeBundle decodePacketdecodePacket_strict timeout_runtilPredicate untilMaybe Transport sendPacket recvPacketclose withTransport sendMessage sendBundle recvBundle recvMessage recvMessagesrecvPacketTimeout waitUntilwaitFor waitImmediate waitMessage waitAddress waitReply waitDatum Connection DuplexOSCRecvOSCSendOSCrecvMessage_err$fSendOSCReaderT$fRecvOSCReaderT$fDuplexOSCReaderT$fTransportReaderTUDP udpSocketudpPortupd_send_packetudp_recv_packet udp_closewith_udp udp_socket set_udp_opt get_udp_optopenUDP udpServer udp_serversendTorecvFrom$fTransportUDPTCP tcpHandletcp_send_packettcp_recv_packet tcp_closewith_tcp tcp_socket socket_to_tcp tcp_handleopenTCP tcp_server_frepeatM_ tcp_server$fTransportTCPGHC.Real fromIntegralbinary-0.8.6.0 Data.Binaryencodedecodebytestring-0.10.8.2Data.ByteString.LazyhGethPutData.ByteString.Internal time-1.8.0.2"Data.Time.Clock.Internal.POSIXTime POSIXTime Data.Time.Clock.Internal.UTCTimeUTCTimeGHC.WordWord8 Text.Read.LexLexemeData.ByteString.Char8packunpackIntegral GHC.FloatFloatingGHC.Base.Numeric showFFloatStringGHC.Errerrorid GHC.MaybeNothing Data.Eithereitherpaddingnul_and_padding getInt32be getInt64be get_string get_ascii get_bytes get_datum get_messageget_message_seq get_bundleb_taketakeghc-prim GHC.TypesIntb_dropdropSystem.TimeouttimeoutTrue&network-2.8.0.0-AkCJm1aNSYz7ekXKYyI0pFNetwork.Socket Broadcast RecvTimeOutNetwork.Socket.TypesSocketaccept Data.Foldable sequence_GHC.Listrepeat