From 130bab4bc820bf0c11ff123a643d183c3c6b007e Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Tue, 10 Feb 2026 21:07:47 -0800 Subject: [PATCH] Initial commit: MIDI port discovery tool --- ...OUCH-EXTENDER-MIDI-Mode-Implementation.pdf | Bin 0 -> 30575 bytes go.mod | 5 +++ go.sum | 2 + main.go | 37 ++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 Document_BE_X-TOUCH-X-TOUCH-EXTENDER-MIDI-Mode-Implementation.pdf create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/Document_BE_X-TOUCH-X-TOUCH-EXTENDER-MIDI-Mode-Implementation.pdf b/Document_BE_X-TOUCH-X-TOUCH-EXTENDER-MIDI-Mode-Implementation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cfbc84dca8ad52275e5c5250a43c389cd972cd5f GIT binary patch literal 30575 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 literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c3bdcec --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module qrun + +go 1.25.6 + +require gitlab.com/gomidi/midi/v2 v2.3.22 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7b614e6 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +gitlab.com/gomidi/midi/v2 v2.3.22 h1:4Q20o6q4BDo7i/KGvnwASeytOlrPI7MwsS7F2hA7fOM= +gitlab.com/gomidi/midi/v2 v2.3.22/go.mod h1:jDpP4O4skYi+7iVwt6Zyp18bd2M4hkjtMuw2cmgKgfw= diff --git a/main.go b/main.go new file mode 100644 index 0000000..7a748b6 --- /dev/null +++ b/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "fmt" + "os" + + "gitlab.com/gomidi/midi/v2" + _ "gitlab.com/gomidi/midi/v2/drivers/rtmididrv" +) + +func main() { + defer midi.CloseDriver() + + inPorts := midi.GetInPorts() + outPorts := midi.GetOutPorts() + + fmt.Println("MIDI Input Ports:") + if len(inPorts) == 0 { + fmt.Println(" (none)") + } + for i, port := range inPorts { + fmt.Printf(" [%d] %s\n", i, port) + } + + fmt.Println("\nMIDI Output Ports:") + if len(outPorts) == 0 { + fmt.Println(" (none)") + } + for i, port := range outPorts { + fmt.Printf(" [%d] %s\n", i, port) + } + + if len(inPorts) == 0 && len(outPorts) == 0 { + fmt.Println("\nNo MIDI devices found.") + os.Exit(1) + } +}