diff options
Diffstat (limited to 'pkg/mixer/mixer.go')
-rw-r--r-- | pkg/mixer/mixer.go | 89 |
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 } |