Move libraries to lib/ and PDF to docs/
This commit is contained in:
90
lib/xtouch/output.go
Normal file
90
lib/xtouch/output.go
Normal file
@@ -0,0 +1,90 @@
|
||||
package xtouch
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"gitlab.com/gomidi/midi/v2"
|
||||
"gitlab.com/gomidi/midi/v2/drivers"
|
||||
)
|
||||
|
||||
type LCDColor uint8
|
||||
|
||||
const (
|
||||
ColorBlack LCDColor = 0
|
||||
ColorRed LCDColor = 1
|
||||
ColorGreen LCDColor = 2
|
||||
ColorYellow LCDColor = 3
|
||||
ColorBlue LCDColor = 4
|
||||
ColorMagenta LCDColor = 5
|
||||
ColorCyan LCDColor = 6
|
||||
ColorWhite LCDColor = 7
|
||||
)
|
||||
|
||||
type LEDState uint8
|
||||
|
||||
const (
|
||||
LEDOff LEDState = 0
|
||||
LEDFlash LEDState = 64
|
||||
LEDOn LEDState = 127
|
||||
)
|
||||
|
||||
type Output struct {
|
||||
send func(msg midi.Message) error
|
||||
DeviceID uint8
|
||||
}
|
||||
|
||||
func NewOutput(port drivers.Out, deviceID uint8) (*Output, error) {
|
||||
send, err := midi.SendTo(port)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("open output port: %w", err)
|
||||
}
|
||||
return &Output{send: send, DeviceID: deviceID}, nil
|
||||
}
|
||||
|
||||
func (o *Output) SetFader(fader uint8, value uint8) error {
|
||||
cc := CCFaderFirst + fader
|
||||
if fader == 8 {
|
||||
cc = CCFaderMain
|
||||
}
|
||||
return o.send(midi.ControlChange(0, cc, value))
|
||||
}
|
||||
|
||||
func (o *Output) SetButtonLED(button uint8, state LEDState) error {
|
||||
return o.send(midi.NoteOn(0, button, uint8(state)))
|
||||
}
|
||||
|
||||
func (o *Output) SetEncoderRing(encoder uint8, value uint8) error {
|
||||
return o.send(midi.ControlChange(0, CCEncoderFirst+encoder, value))
|
||||
}
|
||||
|
||||
func (o *Output) SetMeter(channel uint8, value uint8) error {
|
||||
return o.send(midi.ControlChange(0, CCMeterFirst+channel, value))
|
||||
}
|
||||
|
||||
func (o *Output) SetLCD(lcd uint8, color LCDColor, invertUpper bool, invertLower bool, upper string, lower string) error {
|
||||
cc := uint8(color)
|
||||
if invertUpper {
|
||||
cc |= 0x10
|
||||
}
|
||||
if invertLower {
|
||||
cc |= 0x20
|
||||
}
|
||||
|
||||
upper = padOrTruncate(upper, 7)
|
||||
lower = padOrTruncate(lower, 7)
|
||||
|
||||
data := []byte{0x00, 0x20, 0x32, o.DeviceID, 0x4C, lcd, cc}
|
||||
data = append(data, []byte(upper)...)
|
||||
data = append(data, []byte(lower)...)
|
||||
return o.send(midi.SysEx(data))
|
||||
}
|
||||
|
||||
func padOrTruncate(s string, n int) string {
|
||||
if len(s) > n {
|
||||
return s[:n]
|
||||
}
|
||||
for len(s) < n {
|
||||
s += " "
|
||||
}
|
||||
return s
|
||||
}
|
||||
Reference in New Issue
Block a user