79 строки
1,2 КиБ
Go
79 строки
1,2 КиБ
Go
package midi
|
|
|
|
import (
|
|
"machine"
|
|
)
|
|
|
|
const (
|
|
midiEndpointOut = 5 // from PC
|
|
midiEndpointIn = 6 // to PC
|
|
)
|
|
|
|
var Midi *midi
|
|
|
|
type midi struct {
|
|
buf *RingBuffer
|
|
callbackFuncRx func([]byte)
|
|
waitTxc bool
|
|
}
|
|
|
|
func init() {
|
|
if Midi == nil {
|
|
Midi = newMidi()
|
|
}
|
|
}
|
|
|
|
// New returns hid-mouse.
|
|
func New() *midi {
|
|
return Midi
|
|
}
|
|
|
|
func newMidi() *midi {
|
|
m := &midi{
|
|
buf: NewRingBuffer(),
|
|
}
|
|
machine.EnableMIDI(m.Callback, m.CallbackRx, nil)
|
|
return m
|
|
}
|
|
|
|
func (m *midi) SetCallback(callbackRx func([]byte)) {
|
|
m.callbackFuncRx = callbackRx
|
|
}
|
|
|
|
func (m *midi) Write(b []byte) (n int, err error) {
|
|
i := 0
|
|
for i = 0; i < len(b); i += 4 {
|
|
m.tx(b[i : i+4])
|
|
}
|
|
return i, nil
|
|
}
|
|
|
|
// sendUSBPacket sends a MIDIPacket.
|
|
func (m *midi) sendUSBPacket(b []byte) {
|
|
machine.SendUSBInPacket(midiEndpointIn, b)
|
|
}
|
|
|
|
// from BulkIn
|
|
func (m *midi) Callback() {
|
|
m.waitTxc = false
|
|
if b, ok := m.buf.Get(); ok {
|
|
m.waitTxc = true
|
|
m.sendUSBPacket(b)
|
|
}
|
|
}
|
|
|
|
func (m *midi) tx(b []byte) {
|
|
if m.waitTxc {
|
|
m.buf.Put(b)
|
|
} else {
|
|
m.waitTxc = true
|
|
m.sendUSBPacket(b)
|
|
}
|
|
}
|
|
|
|
// from BulkOut
|
|
func (m *midi) CallbackRx(b []byte) {
|
|
if m.callbackFuncRx != nil {
|
|
m.callbackFuncRx(b)
|
|
}
|
|
}
|