36 lines
727 B
Go
36 lines
727 B
Go
package main
|
|
|
|
import (
|
|
"gitlab.com/gomidi/midi/v2"
|
|
"gitlab.com/gomidi/midi/v2/drivers"
|
|
_ "gitlab.com/gomidi/midi/v2/drivers/rtmididrv"
|
|
)
|
|
|
|
type MidiInput struct {
|
|
input drivers.In
|
|
Messages chan midi.Message
|
|
Stop func()
|
|
}
|
|
|
|
func NewMidiInput(portName string) (*MidiInput, error) {
|
|
input, err := midi.FindInPort(portName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
messages := make(chan midi.Message)
|
|
|
|
midiListener := func(msg midi.Message, timestampMs int32) {
|
|
if msg.IsOneOf(midi.NoteOnMsg, midi.NoteOffMsg, midi.ControlChangeMsg) {
|
|
messages <- msg
|
|
}
|
|
}
|
|
|
|
stopFunc, err := midi.ListenTo(input, midiListener, midi.UseSysEx())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &MidiInput{input, messages, stopFunc}, nil
|
|
}
|