summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/dolmetschctl/dolmetschctl.go5
-rw-r--r--pkg/controller/controller.go92
-rw-r--r--pkg/mixer/mixer.go7
3 files changed, 99 insertions, 5 deletions
diff --git a/cmd/dolmetschctl/dolmetschctl.go b/cmd/dolmetschctl/dolmetschctl.go
index fe79332..0c03285 100644
--- a/cmd/dolmetschctl/dolmetschctl.go
+++ b/cmd/dolmetschctl/dolmetschctl.go
@@ -46,7 +46,10 @@ func main() {
log.Printf("controller successfully initialized!")
- // TODO: do something
+ if err = c.LedToggle(1); err != nil {
+ log.Printf("%v", err)
+ os.Exit(1)
+ }
log.Printf("exiting.")
}
diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go
index b8d04e7..b982c56 100644
--- a/pkg/controller/controller.go
+++ b/pkg/controller/controller.go
@@ -22,17 +22,103 @@
package controller
+import (
+ "errors"
+ "fmt"
+ "strings"
+
+ "github.com/scgolang/midi"
+)
+
+const (
+ NOTE_OFFSET_BUTTON = byte(0x00)
+ NUM_BUTTONS = 4
+
+ CC_LED = byte(0xB0)
+ NOTE_OFFSET_LED = byte(0x00)
+ NUM_LEDS = 4
+ LED_OFF = byte(0x00)
+ LED_ON = byte(0x01)
+ LED_TOGGLE = byte(0x02)
+ LED_BLINK_MIN = byte(0x03)
+ LED_BLINK_MAX = byte(0x7f)
+)
+
type Controller struct {
+ Dev *midi.Device
+}
+
+func openDevice(devices []*midi.Device, prefix string) (d *midi.Device, err error) {
+ for _, device := range devices {
+ if strings.HasPrefix(device.Name, prefix) {
+ d = device
+ }
+ }
+ if d == nil {
+ return nil, errors.New("could not find device with prefix: " + prefix)
+ }
+ return d, d.Open()
}
func NewController(c Config) (*Controller, error) {
- return &Controller{}, nil
+ devices, err := midi.Devices()
+ if err != nil {
+ return nil, err
+ }
+
+ ctrl := &Controller{}
+ if ctrl.Dev, err = openDevice(devices, c.Dev); err != nil {
+ return nil, err
+ }
+ ctrl.Dev.QueueSize = 100
+
+ return ctrl, nil
+}
+
+func (c *Controller) Init() error {
+ return nil
}
-func (m *Controller) Init() error {
+func (c *Controller) Shutdown() error {
+ if c.Dev != nil {
+ c.Dev.Close()
+ }
+ // TODO: also close all subscribed channels
+ // terminate go-routine started by Init()
return nil
}
-func (m *Controller) Shutdown() error {
+func (c *Controller) setLed(num byte, value byte) error {
+ if num >= NUM_LEDS {
+ return fmt.Errorf("this controller has only %d leds.", NUM_LEDS)
+ }
+
+ n, err := c.Dev.Write([]byte{CC_LED, NOTE_OFFSET_LED + num, value})
+ if err != nil {
+ // reopen device?
+ return err
+ }
+ if n != 3 {
+ return errors.New("sending LED command failed.")
+ }
return nil
}
+
+func (c *Controller) LedOff(num byte) error {
+ return c.setLed(num, LED_OFF)
+}
+
+func (c *Controller) LedOn(num byte) error {
+ return c.setLed(num, LED_ON)
+}
+
+func (c *Controller) LedToggle(num byte) error {
+ return c.setLed(num, LED_TOGGLE)
+}
+
+func (c *Controller) LedBlink(num, wait byte) error {
+ if (wait + LED_BLINK_MIN) > LED_BLINK_MAX {
+ return fmt.Errorf("blink wait must be between 0 and %d.", LED_BLINK_MAX-LED_BLINK_MIN)
+ }
+ return c.setLed(num, wait+LED_BLINK_MIN)
+}
diff --git a/pkg/mixer/mixer.go b/pkg/mixer/mixer.go
index 7b46abc..6e8eb07 100644
--- a/pkg/mixer/mixer.go
+++ b/pkg/mixer/mixer.go
@@ -127,7 +127,7 @@ func openDevice(devices []*midi.Device, prefix string) (d *midi.Device, err erro
}
}
if d == nil {
- return nil, errors.New("could not find device with prefix " + prefix)
+ return nil, errors.New("could not find device with prefix: " + prefix)
}
return d, d.Open()
}
@@ -203,6 +203,7 @@ func (m *Mixer) Init() error {
go func() {
for {
+ // TODO: handle Errors (reopen the device!)
m.handleMidiPacket(<-ch)
}
}()
@@ -216,12 +217,15 @@ func (m *Mixer) Shutdown() error {
if m.DevOut != nil {
m.DevOut.Close()
}
+ // TODO: also close all subscribed channels
+ // terminate go-routine started by Init()
return nil
}
func (m *Mixer) sendMute(channel byte, value byte) error {
n, err := m.DevOut.Write([]byte{CC_MUTE, channel, value})
if err != nil {
+ // reopen device?
return err
}
if n != 3 {
@@ -244,6 +248,7 @@ func (m *Mixer) SetLevel(ch Channel, level FaderLevel) error {
}
n, err := m.DevOut.Write([]byte{CC_FADER, byte(ch), byte(level)})
if err != nil {
+ // reopen device?
return err
}
if n != 3 {