1
1
namespace ZMidi.Internal
2
+ open ZMidi.DataTypes
2
3
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
+
3
44
module Utils =
4
- open ZMidi.DataTypes
5
45
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