summaryrefslogtreecommitdiff
path: root/pkg/mixer
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/mixer')
-rw-r--r--pkg/mixer/mixer.go89
1 files changed, 88 insertions, 1 deletions
diff --git a/pkg/mixer/mixer.go b/pkg/mixer/mixer.go
index 235978c..c3040fe 100644
--- a/pkg/mixer/mixer.go
+++ b/pkg/mixer/mixer.go
@@ -22,17 +22,104 @@
package mixer
+import (
+ "errors"
+ "strings"
+
+ "github.com/scgolang/midi"
+)
+
+type MixerChannel uint8
+type FaderLevel uint8
+
type Mixer struct {
+ DevIn *midi.Device
+ DevOut *midi.Device
+}
+
+// TODO: make this confgurabel
+const (
+ CC_MUTE = byte(0xB1)
+ CC_FADER = byte(0xB0)
+
+ FaderLevelMax = FaderLevel(0x7F)
+ FaderLevel0db = FaderLevel(0x60)
+ FaderLevelOff = FaderLevel(0x00)
+)
+
+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 NewMixer(c Config) (*Mixer, error) {
- return &Mixer{}, nil
+ devices, err := midi.Devices()
+ if err != nil {
+ return nil, err
+ }
+
+ m := &Mixer{}
+ if m.DevIn, err = openDevice(devices, c.DevIn); err != nil {
+ return nil, err
+ }
+ if m.DevOut, err = openDevice(devices, c.DevOut); err != nil {
+ return nil, err
+ }
+
+ return m, nil
}
func (m *Mixer) Init() error {
+ // TODO: sync state
return nil
}
func (m *Mixer) Shutdown() error {
+ if m.DevIn != nil {
+ m.DevIn.Close()
+ }
+ if m.DevOut != nil {
+ m.DevOut.Close()
+ }
+ return nil
+}
+
+func (m *Mixer) sendMute(channel byte, value byte) error {
+ n, err := m.DevOut.Write([]byte{CC_MUTE, channel, value})
+ if err != nil {
+ return err
+ }
+ if n != 3 {
+ return errors.New("sending mute command failed.")
+ }
+ return nil
+}
+
+func (m *Mixer) Mute(ch MixerChannel) error {
+ return m.sendMute(byte(ch), 0x7F)
+}
+
+func (m *Mixer) UnMute(ch MixerChannel) error {
+ return m.sendMute(byte(ch), 0x00)
+}
+
+func (m *Mixer) SetLevel(ch MixerChannel, level FaderLevel) error {
+ if level > FaderLevelMax {
+ level = FaderLevelMax
+ }
+ n, err := m.DevOut.Write([]byte{CC_FADER, byte(ch), byte(level)})
+ if err != nil {
+ return err
+ }
+ if n != 3 {
+ return errors.New("setting fader level failed.")
+ }
return nil
}