11namespace ZMidi.Internal
2+ open ZMidi.DataTypes
23
4+ module Evil =
5+ let inline uncurry4 f = fun ( a , b , c , d ) -> f a b c d
6+ module DataTypes =
7+ module FromBytes =
8+
9+ /// Builds a Word16 (big endian).
10+ let word16be ( a : byte ) ( b : byte ) : uint16 =
11+ let a = uint16 a
12+ let b = uint16 b
13+ ( a <<< 8 ) + b
14+
15+ /// Builds a Word14 (big endian).
16+ let word14be ( a : byte ) ( b : byte ) : word14 =
17+ let a = uint16 a
18+ let b = uint16 b
19+ word14(( a <<< 7 ) + b)
20+
21+ let word24be ( a : byte ) ( b : byte ) ( c : byte ) : word24 =
22+ (( uint32 a) <<< 16 )
23+ + (( uint32 b) <<< 8 )
24+ + ( uint32 c)
25+
26+ let word32be ( a : byte ) ( b : byte ) ( c : byte ) ( d : byte ) : word32 =
27+ (( uint32 a) <<< 24 )
28+ + (( uint32 b) <<< 16 )
29+ + (( uint32 c) <<< 08 )
30+ + (( uint32 d) <<< 00 )
31+ module ToBytes =
32+ let word32be ( v : word32 ) =
33+ ( v &&& 0x000000ff u) >>> 00 |> byte
34+ , ( v &&& 0x0000ff00 u) >>> 08 |> byte
35+ , ( v &&& 0x00ff0000 u) >>> 16 |> byte
36+ , ( v &&& 0xff000000 u) >>> 24 |> byte
37+ module Isomorphisms =
38+ type Iso < 'a , 'b > = ( 'a -> 'b) * ( 'b -> 'a)
39+ module Iso =
40+ let reverse iso = snd iso, fst iso
41+
42+ let word32be : Iso < _ , _ > = ( ToBytes.word32be), ( Evil.uncurry4 FromBytes.word32be)
43+
344module Utils =
4- open ZMidi.DataTypes
545 open System.IO
6-
7- /// Builds a Word16 (big endian).
8- let word16be ( a : byte ) ( b : byte ) : uint16 =
9- let a = uint16 a
10- let b = uint16 b
11- ( a <<< 8 ) + b
12-
13- /// Builds a Word14 (big endian).
14- let word14be ( a : byte ) ( b : byte ) : word14 =
15- let a = uint16 a
16- let b = uint16 b
17- word14(( a <<< 7 ) + b)
18-
19- let word24be ( a : byte ) ( b : byte ) ( c : byte ) : word24 =
20- (( uint32 a) <<< 16 )
21- + (( uint32 b) <<< 8 )
22- + ( uint32 c)
23-
24- let word32be ( a : byte ) ( b : byte ) ( c : byte ) ( d : byte ) : uint32 =
25- (( uint32 a) <<< 24 )
26- + (( uint32 b) <<< 16 )
27- + (( uint32 c) <<< 8 )
28- + ( uint32 d)
29-
46+
47+ let inline (| TestBit | _ |) ( bit : int ) ( i : ^T ) =
48+ let mask = LanguagePrimitives.GenericOne <<< bit
49+ if mask &&& i = mask then Some () else None
50+
51+ let inline clearBit ( bit : int ) ( i : ^T ) =
52+ let mask = ~~~ ( LanguagePrimitives.GenericOne <<< bit)
53+ i &&& mask
54+
55+ let inline setBit ( bit : int ) ( i : ^T ) =
56+ let mask = ( LanguagePrimitives.GenericOne <<< bit)
57+ i ||| mask
58+ let inline msbHigh i =
59+ match i with
60+ | TestBit 7 -> true
61+ | _ -> false
62+
63+
64+ module Text =
65+ let prettyBytes ( bytes : byte array ) =
66+ bytes
67+ |> Array.chunkBySize 32
68+ |> Array.map (
69+ fun bytesChunk ->
70+ let bits =
71+ bytesChunk
72+ |> Array.chunkBySize 16
73+ |> Array.map ( fun items ->
74+ items
75+ |> Array.map ( sprintf " %02x " )
76+ |> String.concat " "
77+ )
78+ |> String.concat " - "
79+
80+ bits
81+ )
82+
83+ |> String.concat System.Environment.NewLine
84+ let inline prettyBits number =
85+ let maxSize = 8 * System.Runtime.InteropServices.Marshal.SizeOf ( number.GetType())
86+ [| 0 .. ( maxSize - 1 )|]
87+ |> Array.rev
88+ |> Array.map ( fun shift ->
89+ let mask = LanguagePrimitives.GenericOne <<< shift
90+ if ( number &&& mask <> LanguagePrimitives.GenericZero) then " ■" else " "
91+ )
92+ |> String.concat " "
93+ |> sprintf " [%s ]"
94+
95+ module PreventPrintF =
96+ open System
97+ let [<Obsolete("please do not use printfn in this file", true)>] printfn () = ()
98+ let [<Obsolete("please do not use printf in this file", true)>] printf () = ()
0 commit comments