done
This commit is contained in:
55
backend/backend.go
Normal file
55
backend/backend.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package backend
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/jacobsa/go-serial/serial"
|
||||
"github.com/tonychee7000/Arremi/consts"
|
||||
)
|
||||
|
||||
var (
|
||||
// MidiDev is a global midi device.
|
||||
MidiDev *MIDIDevice
|
||||
|
||||
// MIDIError check this. if not nil, go exit
|
||||
MIDIError error
|
||||
)
|
||||
|
||||
func init() {
|
||||
MidiDev, MIDIError = NewMIDIDevice()
|
||||
}
|
||||
|
||||
// Run called by frontend.
|
||||
func Run(chSerialName chan string, ch chan int, errCh chan error) {
|
||||
serialName := <-chSerialName
|
||||
|
||||
sPort, err := serial.Open(serial.OpenOptions{
|
||||
PortName: "/dev/" + serialName,
|
||||
BaudRate: consts.SerialBaudrate,
|
||||
DataBits: 8,
|
||||
StopBits: 1,
|
||||
ParityMode: serial.PARITY_NONE,
|
||||
MinimumReadSize: 3,
|
||||
})
|
||||
if err != nil {
|
||||
errCh <- err
|
||||
return
|
||||
}
|
||||
defer MidiDev.AllNoteOff()
|
||||
defer sPort.Close()
|
||||
|
||||
go func() {
|
||||
_, err := io.Copy(MidiDev, sPort)
|
||||
if err != nil {
|
||||
errCh <- err
|
||||
}
|
||||
ch <- 1
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ch:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
7
backend/backend_test.go
Normal file
7
backend/backend_test.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package backend
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestBackendRun(t *testing.T) {
|
||||
|
||||
}
|
50
backend/midiDevice.go
Normal file
50
backend/midiDevice.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package backend
|
||||
|
||||
import (
|
||||
"github.com/tonychee7000/Arremi/consts"
|
||||
midi "github.com/youpy/go-coremidi"
|
||||
)
|
||||
|
||||
// MIDIDevice implies a Writer interface.
|
||||
type MIDIDevice struct {
|
||||
client midi.Client
|
||||
source midi.Source
|
||||
Signal chan midi.Packet
|
||||
}
|
||||
|
||||
// NewMIDIDevice construction func
|
||||
func NewMIDIDevice() (*MIDIDevice, error) {
|
||||
var mididev = new(MIDIDevice)
|
||||
err := mididev.Init()
|
||||
return mididev, err
|
||||
}
|
||||
|
||||
// Init the client and source
|
||||
func (midiDev *MIDIDevice) Init() error {
|
||||
var err error
|
||||
|
||||
midiDev.Signal = make(chan midi.Packet, 4096)
|
||||
midiDev.client, err = midi.NewClient(consts.ClientName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
midiDev.source, err = midi.NewSource(midiDev.client, consts.SourceName)
|
||||
return err
|
||||
}
|
||||
|
||||
func (midiDev *MIDIDevice) Write(p []byte) (int, error) {
|
||||
var pack = midi.NewPacket(p, 0)
|
||||
midiDev.Signal <- pack
|
||||
err := pack.Received(&(midiDev.source))
|
||||
return len(p), err
|
||||
}
|
||||
|
||||
// AllNoteOff I don't want panic!
|
||||
func (midiDev *MIDIDevice) AllNoteOff() {
|
||||
for i := 0; i < 16; i++ {
|
||||
for j := 0; j < 128; j++ {
|
||||
midiDev.Write([]byte{byte(0x90 + i), byte(j), 0})
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user