home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-10-10 | 5.7 KB | 302 lines | [TEXT/ttxt] |
- 'From Objectworks\Smalltalk(R), Release 4.1 of 15 April 1992 on 10 October 1995 at 12:40:12 pm'!
-
- Object subclass: #MidiShareInterface
- instanceVariableNames: 'open serial incoming tempo offset starttime recording '
- classVariableNames: ''
- poolDictionaries: ''
- category: 'Midi'!
- MidiShareInterface comment:
- 'This class implements an interface to the GRAME MidiShare 1.68 Midi System.
-
- Instance Variables:
- open <Boolean> current state of the interface
- serial <Object> serial port used for midi in/out (modem, printer)
- incoming <Object> received events
- tempo <Object> tempo for playback
- offset <Object> offset for playback (sequencer ticks)
- starttime <Object> offset of last start
- recording <Boolean> enabled/disabled recording'!
-
-
- !MidiShareInterface methodsFor: 'constants'!
-
- defaultConnector
- ^self class connectorModem! !
-
- !MidiShareInterface methodsFor: 'initialize-release'!
-
- initialize
-
- open := false.
- tempo := 120. "default"
- offset := 0.
- incoming := OrderedCollection new.
- recording := true.! !
-
- !MidiShareInterface methodsFor: 'control'!
-
- close
-
- "Close MidiShare interface"
-
- self isOpen ifFalse:[^self].
- open := false.
- recording := false.
-
- self primClose.!
-
- offset: o tempo: t resolution: resolution delay: ms
-
- "Define the timing constants for playing/recording"
-
- tempo := t.
- offset := o.
- ^self
- primSetOffset: o
- tempo: t
- resolution: resolution
- delay: ms!
-
- open
-
- "Open a MidiShare connection"
-
- self isInstalled ifFalse:[^self error:'MidiShare not installed'].
- self isOpen ifTrue:[^self].
- serial := self defaultConnector.
-
- self primOpen.
- open := true.!
-
- recordDisable
- "Disable the collection of incoming events"
- recording := false.!
-
- recordEnable
- "Enable the collection of incoming events"
- recording := true.!
-
- start
-
- "Start everything playing & recording"
-
- self isOpen ifFalse:[^self].
-
- incoming := OrderedCollection new.
- self primClearEvents.
- starttime := self getTime.
- self primStart.!
-
- stop
- "Stop everything playing. Fetch all events that
- have been received since last start"
-
- self isOpen ifFalse:[^self].
-
- self primStop.
-
- self isRecording ifTrue:[
- self receiveEvents.
- ].! !
-
- !MidiShareInterface methodsFor: 'accessing'!
-
- getFreeSpace
- self isInstalled ifFalse:[^0].
- ^self primGetFreeSpace!
-
- getTime
- self isOpen ifFalse:[^0].
- ^self primGetTime!
-
- getTotalSpace
- self isInstalled ifFalse:[^0].
- ^self primGetTotalSpace!
-
- getVersion
-
- "Answer a verbose string showing the current MidiShare version"
-
- |v|
-
- self isInstalled ifFalse:[^'MidiShare Controlpanel not installed.'].
- ^'MidiShare ',
- ((v := self primVersion) // 100) printString,'.',
- (v \\ 100) printString!
-
- port
- ^serial!
-
- status
- "Answer a verbose string showing the
- current status of the interface"
-
- self isInstalled ifFalse:[^'MidiShare not installed.'].
- self isOpen ifFalse:[^'MidiShare stopped.'].
-
- ^self getVersion,
- ' memory total:', self getTotalSpace printString,
- ', free:', self getFreeSpace printString! !
-
- !MidiShareInterface methodsFor: 'testing'!
-
- isInstalled
- <primitive: 11001>
- self primitiveFailed!
-
- isOpen
- ^open == true!
-
- isRecording
-
- ^recording == true! !
-
- !MidiShareInterface methodsFor: 'receiving - private'!
-
- convertULong: aByteArray at: startIndex
-
- | answer i |
-
- i := startIndex.
- answer := 0.
-
- #(16777216 65536 256 1) do:
- [ : n |
- answer := answer + ((aByteArray at: i) * n).
- i := i + 1
- ].
-
- ^answer!
-
- receiveConvert: aByteArray
-
- "Create an internal event-object from the received
- byte array (MidiShare event struct).
- This method has to be changed to be appropriate for
- the host musical system."
-
- | event |
-
- "*** this is only an example taken from my own system:
- event := MidiEvent new.
- event
- type: (aByteArray at: 9)
- clock: (MidiInterface clock: (self convertULong: aByteArray at: 5) - starttime tempo: tempo)
- port: (aByteArray at: 11)
- channel: (aByteArray at: 12)
- data1: (aByteArray at: 13)
- data2: (aByteArray at: 14)
- data3: (aByteArray at: 15).
- "
-
- ^aByteArray!
-
- receiveEvents
-
- "Fetch all received events pending"
-
- | e |
-
- [ (e := self primReceiveEvent) notNil ]
- whileTrue:[
- incoming add: (self receiveConvert: e) ].! !
-
- !MidiShareInterface methodsFor: 'receiving'!
-
- received
- "Answer the collection of all received events"
- ^incoming! !
-
- !MidiShareInterface methodsFor: 'primitives'!
-
- primClearEvents
- <primitive: 11043>
- self primitiveFailed!
-
- primClose
- <primitive: 11004>
- self primitiveFailed!
-
- primGetFreeSpace
- <primitive: 11021>!
-
- primGetTime
- <primitive: 11005>!
-
- primGetTotalSpace
- <primitive: 11020>!
-
- primOpen
- <primitive: 11003>
- self primitiveFailed!
-
- primReceiveEvent
- <primitive: 11042>
- self primitiveFailed!
-
- primSend: clock port: port chan: chan type: type data1: d1 data2: d2 data3: d3
- "Send a MIDI event"
-
- <primitive: 11006>
- self primitiveFailed!
-
- primSetOffset: o tempo: t resolution: resolution delay: ms
- "Define timing constants before sending events"
- <primitive: 11022>
- self primitiveFailed!
-
- primStart
- <primitive: 11031>
- self primitiveFailed!
-
- primStop
- <primitive: 11030>
- self primitiveFailed!
-
- primVersion
- <primitive: 11002>
- self primitiveFailed! !
- "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
-
- MidiShareInterface class
- instanceVariableNames: ''!
-
-
- !MidiShareInterface class methodsFor: 'constants'!
-
- connectorModem
- ^0!
-
- connectorPrinter
- ^1!
-
- eventTypeCtrlChange
- ^4!
-
- eventTypeKeyOff
- ^2!
-
- eventTypeKeyOn
- ^1!
-
- eventTypeNote
- ^0!
-
- eventTypePitchwheel
- ^7!
-
- eventTypeProgChange
- ^5!
-
- midiManagerPort0
- "Answer port which is redirected to MidiManager Out0"
- ^9!
-
- midiManagerPort1
- "Answer port which is redirected to MidiManager Out1"
- ^10! !
-
- !MidiShareInterface class methodsFor: 'instance creation'!
-
- new
- ^super new initialize! !