Object subclass: #OSCPacket instanceVariableNames: 'byteStream' classVariableNames: '' package: 'OSC-Kernel'! !OSCPacket methodsFor: 'action' stamp: 'mga 9/17/2006 19:17'! sendToYourself self sendTo: NetNameResolver localHostAddress port: 57123! ! !OSCPacket methodsFor: 'action' stamp: 'gk 5/21/2021 22:53'! sendTo: aByteArray port: aPort "Take care, A byte array is not a string. If you want to send to e.g. '192.168.0.2' sendToAddressString: port: instead But use this one if you want to be fast." | aSocket | Socket initializeNetwork. aSocket := Socket newUDP. aSocket sendUDPData: self bytes toHost: aByteArray port: aPort; close; destroy! ! !OSCPacket methodsFor: 'action' stamp: 'mga 9/17/2006 19:17'! sendToAddressString: anAddressString port: aPort self sendTo: ((anAddressString findTokens: '.') collect: [:e | e asNumber]) asByteArray port: aPort! ! !OSCPacket methodsFor: 'initialization' stamp: 'gk 5/21/2021 22:48'! initializeFor: somePackets byteStream := ByteArray new writeStream. self print: somePackets onOSCStream: byteStream! ! !OSCPacket methodsFor: 'accessing' stamp: 'gk 5/21/2021 22:53'! oSCSize ^self bytes size! ! !OSCPacket methodsFor: 'accessing' stamp: 'mga 3/16/2005 08:58'! byteStream ^byteStream! ! !OSCPacket methodsFor: 'accessing' stamp: 'gk 5/21/2021 23:00'! bytes ^self byteStream contents! ! !OSCPacket methodsFor: 'printing' stamp: 'mga 6/24/2000 14:09'! print: somePackets onOSCStream: aStream self subclassResponsibility! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! OSCPacket class instanceVariableNames: ''! !OSCPacket class methodsFor: 'access to cache' stamp: 'StephaneDucasse 9/29/2012 22:59'! for: somePackets ^ self new initializeFor: somePackets ! ! OSCPacket subclass: #OSCBundle instanceVariableNames: 'packets' classVariableNames: '' package: 'OSC-Kernel'! !OSCBundle methodsFor: 'printing' stamp: 'StephaneDucasse 9/29/2012 23:02'! printTimeTagOnOSCStream: aStream "Not yet implemented, just print 8 empty bytes" 8 timesRepeat: [ aStream nextPut: 0 ]! ! !OSCBundle methodsFor: 'printing' stamp: 'gk 5/21/2021 22:53'! print: somePackets onOSCStream: aStream '#bundle' printOnOSCStream: aStream. self printTimeTagOnOSCStream: aStream. somePackets do: [ :aPacket | aPacket oSCSize printOnOSCStream: aStream. aStream nextPutAll: aPacket bytes ] ! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! OSCBundle class instanceVariableNames: ''! !OSCBundle class methodsFor: 'examples' stamp: 'mga 6/24/2000 14:07'! example1 ^self for: {OSCMessage example1 . OSCMessage example2} ! ! !OSCBundle class methodsFor: 'examples' stamp: 'mga 6/24/2000 14:08'! example2 ^self for: {OSCBundle example1 . OSCMessage example3}! ! OSCPacket subclass: #OSCMessage instanceVariableNames: '' classVariableNames: '' package: 'OSC-Kernel'! !OSCMessage methodsFor: 'printing' stamp: 'gk 5/21/2021 23:00'! printTypesOf: someValues on: aStream someValues isEmpty ifTrue: [^self]. someValues do: [ :each | each printTypeOnOSCStream: aStream ]. (4 - (aStream position \\ 4)) timesRepeat: [ aStream nextPut: 0 ] ! ! !OSCMessage methodsFor: 'printing' stamp: 'mga 3/29/2005 21:37'! print: someArguments onOSCStream: aStream | someParams | self printAddress: someArguments first onOSCStream: aStream. "Put the comma, also parameterless messages have one" aStream nextPut: 44. someParams := someArguments copyFrom: 2 to: someArguments size. self printTypesOf: someParams on: aStream; printValues: someParams onOSCStream: aStream ! ! !OSCMessage methodsFor: 'printing' stamp: 'StephaneDucasse 9/29/2012 23:02'! printAddress: anAddress onOSCStream: aStream anAddress printOnOSCStream: aStream ! ! !OSCMessage methodsFor: 'printing' stamp: 'StephaneDucasse 9/29/2012 23:03'! printValues: someValues onOSCStream: aStream someValues do: [ :each | each printOnOSCStream: aStream ] ! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! OSCMessage class instanceVariableNames: ''! !OSCMessage class methodsFor: 'examples' stamp: 'mga 6/24/2000 14:19'! example3 ^self for: {'/example3' . 20 . 30 . 'bla'}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/30/2005 04:23'! exampleBerkeley3Message ^{'/foo' . 1000 . -1 . 'hello' .1.125 . 4.0625 }! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:19'! exampleSCIncreaseVolume ^self for: self increaseVolumeMessage! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:19'! exampleSCRun "self exampleSCRun sendTo: '10.0.1.2' port: 22" ^self for: {'/sc/run'}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 6/24/2000 14:18'! example2 ^self for: {'/example2' . 'tester' . 10.4}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:19'! exampleBerkeley2Message ^{'/foo' . 1000 . -1 . 'hello' . 1.234 . 5.678}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/30/2005 04:23'! exampleBerkeley3 ^self for: self exampleBerkeley3Message! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:19'! exampleBerkeley2 ^self for: self exampleBerkeley2Message! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 6/24/2000 14:18'! example1 ^self for: {'/example1' . 100}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:20'! exampleSCStop ^self for: {'/sc/stop'}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:20'! increaseVolumeMessage ^{'/sc/mixer/volume' . 1 . 1.0}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:19'! exampleSCA ^self for: {'a' . 1 . 0.2}! ! !OSCMessage class methodsFor: 'examples' stamp: 'mga 3/29/2005 21:19'! exampleSCDecreaseVolume ^self for: {'/sc/mixer/volume' . 1 . 0.2}! ! Object subclass: #OSCParser instanceVariableNames: 'byteStream message types' classVariableNames: '' package: 'OSC-Kernel'! !OSCParser methodsFor: 'action' stamp: 'SimonHolland 9/15/2007 10:28'! parseBlob ^ nil! ! !OSCParser methodsFor: 'action' stamp: 'gk 5/21/2021 23:11'! parseTypes | next | byteStream atEnd ifTrue: [^self]. next := byteStream next. next = 0 ifTrue: [ ((4 - (byteStream position \\ 4)) \\ 4) timesRepeat: [byteStream next]. ^self ]. "i f s b" (#[105 102 115 98] includes: next) ifTrue: [types add: next]. self parseTypes.! ! !OSCParser methodsFor: 'accessing' stamp: 'gk 5/21/2021 23:22'! parseHeader |header| header := (byteStream upTo: $, asInteger) copyWithout: 0. message add: (ZnCharacterEncoder ascii decodeBytes: header). ! ! !OSCParser methodsFor: 'accessing' stamp: 'gk 5/21/2021 23:07'! parseInt32 message add: byteStream nextInt32! ! !OSCParser methodsFor: 'accessing' stamp: 'mga 3/27/2005 18:26'! parseValues | aTypeStream | aTypeStream := ReadStream on: types. [aTypeStream atEnd] whileFalse: [self parseNextValueTyped: aTypeStream next]! ! !OSCParser methodsFor: 'accessing' stamp: 'mga 3/27/2005 18:28'! parse self parseHeader; parseTypes; parseValues. ^message asArray! ! !OSCParser methodsFor: 'accessing' stamp: 'gk 5/21/2021 23:12'! parseNextValueTyped: aType aType = 105 "i" ifTrue: [^self parseInt32]. aType = 102 "f" ifTrue: [^self parseFloat]. aType = 115 "s" ifTrue: [^self parseString]. aType = 98 "b" ifTrue: [^self parseBlob] ! ! !OSCParser methodsFor: 'accessing' stamp: 'mga 3/27/2005 18:26'! parseFloat message add: (Float fromIEEE32Bit: (byteStream binary nextNumber: 4))! ! !OSCParser methodsFor: 'parse' stamp: 'gk 5/21/2021 23:19'! parseString message add: (ZnCharacterEncoder ascii decodeBytes: (byteStream upTo: 0)). (4 - (byteStream position)) \\ 4 timesRepeat: [ byteStream next ] ! ! !OSCParser methodsFor: 'initialization' stamp: 'mga 3/27/2005 18:26'! initializeFor: aByteStream byteStream := aByteStream. message := OrderedCollection new. types := OrderedCollection new.! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! OSCParser class instanceVariableNames: ''! !OSCParser class methodsFor: 'parse' stamp: 'gk 5/21/2021 23:06'! parse: aByteStream | messageArrays messageArray | messageArrays := OrderedCollection new. [aByteStream atEnd] whileFalse: [ messageArray := (self new initializeFor: aByteStream) parse. messageArray ifNotNil: [ messageArrays add: messageArray asArray ] ]. ^messageArrays! ! Object subclass: #OSCServer instanceVariableNames: 'process socket messageQueue responsePeriod' classVariableNames: '' package: 'OSC-Kernel'! !OSCServer methodsFor: 'initialize-release' stamp: 'mga 3/27/2005 22:49'! terminate socket notNil ifTrue: [socket destroy]. process notNil ifTrue: [process terminate]! ! !OSCServer methodsFor: 'initialize-release' stamp: 'SimonHolland 9/15/2007 12:43'! initialize super initialize. messageQueue := SharedQueue new. responsePeriod := 10.! ! !OSCServer methodsFor: 'action' stamp: 'gk 5/22/2021 00:25'! listenOnPort: aPort | buffer bytesReceived | self terminate. socket := (Socket udpCreateIfFail: [self error: 'Problems connecting to:',aPort asString]) setPort: aPort. process := [ buffer := ByteArray new: 2048. [ bytesReceived := (socket receiveUDPDataInto: buffer) first "N.B.: receiveUDPDataInto: returns an array with [bytesReceived | IP Address | port | more datagrams follow?]". bytesReceived > 0 ifTrue: [ self receive: (buffer copyFrom: 1 to: bytesReceived) readStream]. ] repeat ] forkAt: Processor userBackgroundPriority. ! ! !OSCServer methodsFor: 'action' stamp: 'gk 5/22/2021 00:11'! receive: aByteStream (OSCParser parse: aByteStream) do: [:eachMessageArray | messageQueue nextPut: eachMessageArray]. Delay forMilliseconds: responsePeriod.! ! !OSCServer methodsFor: 'accessing' stamp: 'mga 9/17/2006 18:24'! nextMessage ^ messageQueue next! ! !OSCServer methodsFor: 'testing' stamp: 'mga 9/17/2006 18:25'! hasMessage ^messageQueue isEmpty not! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! OSCServer class instanceVariableNames: ''! !OSCServer class methodsFor: 'as yet unclassified' stamp: 'mga 3/15/2005 23:45'! listenOnPort: aPort "(self listenOnPort: 7010) inspect" ^self new listenOnPort: aPort! ! TestCase subclass: #OSCMessageEncodingTest instanceVariableNames: '' classVariableNames: '' package: 'OSC-Tests'! !OSCMessageEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 22:53'! testByteArrayRun self assert: OSCMessage exampleSCRun bytes equals: ('/sc/run' , (String with: (Character value: 0) with: $,)) asByteArray! ! !OSCMessageEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 22:53'! testByteArrayDecreaseVolume self assert: OSCMessage exampleSCDecreaseVolume bytes equals: #[47 115 99 47 109 105 120 101 114 47 118 111 108 117 109 101 0 0 0 0 44 105 102 0 0 0 0 1 62 76 204 205].! ! !OSCMessageEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 22:53'! testExampleBerkeley2 "See http://www.cnmat.berkeley.edu/OpenSoundControl/OSC-spec-examples.html" self assert: OSCMessage exampleBerkeley2 bytes equals: #[ 16r2F 16r66 16r6F 16r6F 0 0 0 0 16r2C 16r69 16r69 16r73 16r66 16r66 0 0 0 0 3 16rE8 16rFF 16rFF 16rFF 16rFF 16r68 16r65 16r6C 16r6C 16r6F 0 0 0 16r3F 16r9D 16rF3 16rB6 16r40 16rB5 16rB2 16r2D].! ! !OSCMessageEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 22:53'! testByteArrayStop self assert: OSCMessage exampleSCStop bytes equals: ('/sc/stop',((String new: 4 withAll: (Character value: 0)),',')) asByteArray ! ! !OSCMessageEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 22:53'! testByteArrayIncreaseVolume self assert: OSCMessage exampleSCIncreaseVolume bytes equals: #[47 115 99 47 109 105 120 101 114 47 118 111 108 117 109 101 0 0 0 0 44 105 102 0 0 0 0 1 63 128 0 0]. ! ! TestCase subclass: #OSCParserTest instanceVariableNames: 'server' classVariableNames: '' package: 'OSC-Tests'! !OSCParserTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:15'! testParseIncreaseVolumeMessage self assert: (OSCParser parse: OSCMessage exampleSCIncreaseVolume bytes readStream) first equals: OSCMessage increaseVolumeMessage! ! !OSCParserTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:52'! testParseBundle |messages| messages := OSCParser parse: self rawBundle readStream. self assert: messages size equals: 13. self assert: (messages at: 2) second equals: 'alive'. self assert: (messages at: 12) second equals: 'set'. self assert: (messages at: 13) second equals: 'fseq' ! ! !OSCParserTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:15'! testParse self assert: (OSCParser parse: OSCMessage exampleSCIncreaseVolume bytes readStream) first equals: OSCMessage increaseVolumeMessage! ! !OSCParserTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:54'! testParseExampleBerkely3Message self assert: (OSCParser parse: OSCMessage exampleBerkeley3 bytes readStream) first equals: OSCMessage exampleBerkeley3Message! ! !OSCParserTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:50'! rawBundle ^#[35 98 117 110 100 108 101 0 0 0 0 0 0 0 0 1 0 0 0 32 47 116 117 105 111 47 50 68 111 98 106 0 44 115 115 0 115 111 117 114 99 101 0 0 118 105 115 105 111 110 0 0 0 0 0 76 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 105 105 105 105 105 105 105 105 0 0 0 0 97 108 105 118 101 0 0 0 0 0 0 42 0 0 0 43 0 0 0 44 0 0 0 45 0 0 0 46 0 0 0 47 0 0 0 48 0 0 0 49 0 0 0 50 0 0 0 51 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 42 0 0 0 14 63 88 136 237 63 47 122 89 62 37 252 84 61 115 94 16 60 154 81 117 0 0 0 0 186 128 127 210 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 43 0 0 0 13 63 88 151 24 63 102 3 195 62 1 60 116 61 137 156 31 60 130 116 93 0 0 0 0 186 105 27 53 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 44 0 0 0 7 63 23 3 240 63 92 135 87 61 238 4 233 61 149 61 24 0 0 0 0 0 0 0 0 186 182 82 171 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 45 0 0 0 10 63 56 107 155 63 97 75 217 61 226 44 41 62 17 0 62 60 161 91 39 0 0 0 0 59 13 245 244 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 46 0 0 0 1 62 159 147 223 63 82 44 101 61 217 161 105 61 147 225 210 0 0 0 0 0 0 0 0 186 211 195 233 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 47 0 0 0 4 62 232 110 187 63 87 110 53 61 253 117 41 61 151 241 117 0 0 0 0 0 0 0 0 186 198 7 73 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 48 0 0 0 5 62 241 108 216 63 29 239 197 62 20 220 212 61 147 100 218 0 0 0 0 0 0 0 0 186 164 190 84 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 49 0 0 0 8 63 25 248 194 63 36 28 76 62 18 63 84 61 136 42 109 0 0 0 0 0 0 0 0 186 172 239 184 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 50 0 0 0 11 63 57 145 158 63 41 213 19 62 29 206 148 61 131 164 93 60 178 155 39 0 0 0 0 186 140 41 253 0 0 0 0 0 0 0 72 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 105 102 102 102 102 102 102 102 102 0 0 0 0 115 101 116 0 0 0 0 51 0 0 0 2 62 172 214 28 63 23 74 151 62 9 116 116 61 137 202 171 60 188 34 233 0 0 0 0 186 170 24 46 0 0 0 0 0 0 0 28 47 116 117 105 111 47 50 68 111 98 106 0 44 115 105 0 102 115 101 113 0 0 0 0 0 0 6 70]! ! TestCase subclass: #OSCParserTest3 instanceVariableNames: 'string endingNumberArray startingNumberArray numberArrays streams parsedMessages' classVariableNames: '' package: 'OSC-Tests'! !OSCParserTest3 commentStamp: 'SimonHolland 9/15/2007 11:55' prior: 0! After the null that terminates a string, a well-formed incoming OSC message stream will have been padded with nulls if needed to reach a 32-bit word boundary, as per the OSC specification. This test checks that the parser handles this OK wherever the boundary may fall for a particular string in an incoming message.! !OSCParserTest3 methodsFor: 'tests' stamp: 'gk 5/22/2021 00:36'! testWordAlignment parsedMessages keysAndValuesDo: [ :key :value | "Transcript cr; show: ' Actual - ' , ((parsedMessages at:key) first second); cr. Transcript cr; show: ' Should be - ', ( string copyFrom: key to: string size ); cr." self assert: (parsedMessages at: key) first second equals: (string copyFrom: key to: string size) ]! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'StephaneDucasse 9/29/2012 23:07'! setUpParsedMessages parsedMessages := Dictionary new. streams keysAndValuesDo: [ :key :value | parsedMessages at: key put: (OSCParser parse: value ascii) ]. ! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'StephaneDucasse 9/29/2012 23:07'! setUpStartingNumberArray | headerString typeMarker sizeOfPad nulls headerArray | headerString := 'Head'. typeMarker := ',s'. sizeOfPad := 4 - typeMarker size. nulls := Array new: sizeOfPad withAll: 0. headerArray := (headerString , typeMarker ) asArray. startingNumberArray := ( headerArray , nulls ) . ! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'StephaneDucasse 9/29/2012 23:08'! setUpEndingNumberArray endingNumberArray := string asArray collect: [ :each | each asInteger ] ! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'SimonHolland 9/9/2007 12:34'! setUp self setUpString. self setUpStartingNumberArray. self setUpEndingNumberArray. self setUpNumberArrays. self setUpStreams. self setUpParsedMessages.! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'StephaneDucasse 9/29/2012 23:08'! setUpNumberArrays | endArray | numberArrays := Dictionary new. (1 to: 4) keysAndValuesDo: [:key :value | endArray := endingNumberArray copyFrom: key to: endingNumberArray size. numberArrays at: key put: (startingNumberArray , endArray) ]. ! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'SimonHolland 9/9/2007 10:44'! setUpStreams streams := Dictionary new. numberArrays keysAndValuesDo: [ :key :value | streams at: key put: (self streamFromArray: value) ]. ! ! !OSCParserTest3 methodsFor: 'setup' stamp: 'StephaneDucasse 9/29/2012 23:07'! setUpString string := 'Reaktivision is highly Groovy 0123456789' ! ! !OSCParserTest3 methodsFor: 'converting' stamp: 'gk 5/22/2021 00:35'! streamFromArray: anArray ^(ByteArray streamContents: [:out | anArray do: [:each | out nextPut: each asInteger ]. ]) readStream.! ! TestCase subclass: #OSCServerTest instanceVariableNames: '' classVariableNames: '' package: 'OSC-Tests'! !OSCServerTest methodsFor: 'tests' stamp: 'gk 5/21/2021 22:06'! testSendAndReceive | server | server := OSCServer listenOnPort: 5432. [ OSCMessage example1 sendTo: NetNameResolver localHostAddress port: 5432. (Delay forDuration: (Duration milliSeconds: 30)) wait. self assert: server hasMessage. self assert: server nextMessage equals: #( '/example1' 100 ) ] ensure: [ server terminate ]! ! TestCase subclass: #OSCTypeEncodingTest instanceVariableNames: '' classVariableNames: '' package: 'OSC-Tests'! !OSCTypeEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:58'! testEncodeString |expectedBytes bytesFromEncoder| expectedBytes := ByteArray streamContents: [:out | out nextPutAll: (ZnCharacterEncoder ascii encodeString: 'abc') ; nextPut: 0. ]. bytesFromEncoder := ByteArray new writeStream. 'abc' printOnOSCStream: bytesFromEncoder. self assert: expectedBytes equals: bytesFromEncoder contents. expectedBytes := ByteArray streamContents: [:out | out nextPutAll: (ZnCharacterEncoder ascii encodeString: 'abcd') ; nextPutAll: (ByteArray new: 4 withAll: 0). ]. bytesFromEncoder := ByteArray new writeStream. 'abcd' printOnOSCStream: bytesFromEncoder. self assert: expectedBytes equals: bytesFromEncoder contents. ! ! !OSCTypeEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:56'! testEncodeFloat |aStream| aStream := ByteArray new writeStream. 10.7567 printOnOSCStream: aStream. self assert: aStream contents equals: #[65 44 27 113].! ! !OSCTypeEncodingTest methodsFor: 'tests' stamp: 'gk 5/21/2021 23:57'! testEncodeSmallInteger | aStream | aStream := ByteArray new writeStream. 1124 printOnOSCStream: aStream. self assert: aStream contents equals: #[0 0 4 100].! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.79689 am'! !Symbol methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:54'! printTypeOnOSCStream: aStream aStream nextPut: $s asInteger.! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.797847 am'! !UndefinedObject methodsFor: '*OSC-printing' stamp: 'mga 6/27/2000 15:19'! printOnOSCStream: aStream ^self! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.79884 am'! !UndefinedObject methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:54'! printTypeOnOSCStream: aStream aStream nextPut: $N asInteger ! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.799415 am'! !SequenceableCollection methodsFor: '*OSC-printing' stamp: 'mga 6/27/2000 15:30'! printOnOSCStream: aStream self do: [:each | each printOnOSCStream: aStream]! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.800353 am'! !SequenceableCollection methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:54'! printTypeOnOSCStream: aStream aStream nextPut: $[ asInteger. self do: [:each | each printTypeOnOSCStream: aStream]. aStream nextPut: $] asInteger.! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.800919 am'! !String methodsFor: '*OSC-printing' stamp: 'mga 3/16/2005 09:40'! printOnOSCStream: aStream self isEmpty ifTrue: [^self]. aStream nextPutAll: self asByteArray. (4 - (self size \\ 4)) timesRepeat: [aStream nextPut: 0] ! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.801587 am'! !String methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:51'! printTypeOnOSCStream: aStream aStream nextPut: $s asInteger ! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.802066 am'! !Boolean methodsFor: '*OSC-printing' stamp: 'mga 2/28/2005 17:16'! printOnOSCStream: aStream ^self! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.802689 am'! !True methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:53'! printTypeOnOSCStream: aStream aStream nextPut: $T asInteger! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.803126 am'! !Float methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:44'! printOnOSCStream: aStream aStream nextNumber: 4 put: self asIEEE32BitWord! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.803595 am'! !Float methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:50'! printTypeOnOSCStream: aStream aStream nextPut: $f asInteger.! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.80411 am'! !False methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:53'! printTypeOnOSCStream: aStream aStream nextPut: $F asInteger! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.804615 am'! !SmallInteger methodsFor: '*OSC-printing' stamp: 'mga 3/2/2005 10:47'! printOnOSCStream: aStream aStream nextInt32Put: self! ! 'From Pharo9.0.0 of 6 May 2021 [Build information: Pharo-9.0.0+build.1393.sha.9d0b61644429ec81e56888d037d2772f49e627e0 (64 Bit)] on 22 May 2021 at 12:36:53.805333 am'! !SmallInteger methodsFor: '*OSC-printing' stamp: 'gk 5/21/2021 22:50'! printTypeOnOSCStream: aStream aStream nextPut: $i asInteger.! !