// (midi-write 144 60 80) -> middle C note on // (midi-write 128 60 0) -> middle C note off func midiWrite(argv []*ell.Object) (*ell.Object, error) { status := ell.Int64Value(argv[0]) data1 := ell.Int64Value(argv[1]) data2 := ell.Int64Value(argv[2]) midiMutex.Lock() var err error if midiOut != nil { err = midiOut.WriteShort(status, data1, data2) } midiMutex.Unlock() return ell.Null, err }
func midiOpen(argv []*ell.Object) (*ell.Object, error) { // defaultInput := "USB Oxygen 8 v2" // defaultOutput := "IAC Driver Bus 1" latency := int64(10) if !midiOpened { err := portmidi.Initialize() if err != nil { return nil, err } midiOpened = true midiInDevice = ell.StringValue(argv[0]) midiOutDevice = ell.StringValue(argv[1]) midiBufsize = ell.Int64Value(argv[2]) outdev, outname := findMidiOutputDevice(midiOutDevice) out, err := portmidi.NewOutputStream(outdev, midiBufsize, latency) if err != nil { return nil, err } midiOut = out midiOutDevice = outname if midiInDevice != "" { indev := findMidiInputDevice(midiInDevice) if indev >= 0 { in, err := portmidi.NewInputStream(indev, midiBufsize) if err != nil { return nil, err } midiIn = in } } midiBaseTime = ell.Now() } result := ell.MakeStruct(4) if midiInDevice != "" { ell.Put(result, inputKey, ell.String(midiInDevice)) } if midiOutDevice != "" { ell.Put(result, outputKey, ell.String(midiOutDevice)) } ell.Put(result, bufsizeKey, ell.Number(float64(midiBufsize))) return result, nil }