Go bindings for libportmidi

portmidi

Want to output to an MIDI device or listen your MIDI device as an input? This package contains Go bindings for PortMidi. libportmidi (v. 217) is required as a dependency, it's available via apt-get and brew.

apt-get install libportmidi-dev
# or
brew install portmidi

Or, alternatively you can download the source and build it by yourself. See the instructions on PortMidi homepage.

In order to start, go get this repository:

go get github.com/rakyll/portmidi

Usage

Initialize

portmidi.Initialize()

About MIDI Devices

portmidi.CountDevices() // returns the number of MIDI devices
portmidi.Info(deviceID) // returns info about a MIDI device
portmidi.DefaultInputDeviceID() // returns the ID of the system default input
portmidi.DefaultOutputDeviceID() // returns the ID of the system default output

Write to a MIDI Device

out, err := portmidi.NewOutputStream(deviceID, 1024, 0)
if err != nil {
    log.Fatal(err)
}

// note on events to play C major chord
out.WriteShort(0x90, 60, 100)
out.WriteShort(0x90, 64, 100)
out.WriteShort(0x90, 67, 100)

// notes will be sustained for 2 seconds
time.Sleep(2 * time.Second)

// note off events
out.WriteShort(0x80, 60, 100)
out.WriteShort(0x80, 64, 100)
out.WriteShort(0x80, 67, 100)

out.Close()

Read from a MIDI Device

in, err := portmidi.NewInputStream(deviceID, 1024)
if err != nil {
    log.Fatal(err)
}
defer in.Close()

events, err := in.Read(1024)
if err != nil {
    log.Fatal(err)
}

// alternatively you can filter the input to listen
// only a particular set of channels
in.SetChannelMask(portmidi.Channel(1) | portmidi.Channel.(2))
in.Read(1024) // will retrieve events from channel 1 and 2

// or alternatively listen events
ch := in.Listen()
event := <-ch

Cleanup

Cleanup your input and output streams once you're done. Likely to be called on graceful termination.

portmidi.Terminate()
Comments
  • How to install libportmidi on OSX?

    How to install libportmidi on OSX?

    Can you recommend a guide? I can't seem to figure out how to install it on OSX. I would really like to use this launchpad library to make instruments.

  • Implement WriteSysEx() and WriteSysExBytes()

    Implement WriteSysEx() and WriteSysExBytes()

    The C side of Pm_WriteSysEx() expects a byte array to read the message data from. We must hence convert the hex string into bytes before handing it over.

    To make the API more flexible, introduce an exported function WriteSysExBytes() that takes in a []byte instead of a string.

  • Issue sending midi messages on Mac OS Montery

    Issue sending midi messages on Mac OS Montery

    Running the following sample code:

    `

    package main

    import( "log" "time" "github.com/rakyll/portmidi" )

    func main() { portmidi.Initialize()

    out, err := portmidi.NewOutputStream(1, 1024, 0) if err != nil { log.Fatal(err) }

    // note on events to play C major chord out.WriteShort(0x90, 60, 100) out.WriteShort(0x90, 64, 100) out.WriteShort(0x90, 67, 100)

    // notes will be sustained for 2 seconds time.Sleep(2 * time.Second)

    // note off events out.WriteShort(0x80, 60, 100) out.WriteShort(0x80, 64, 100) out.WriteShort(0x80, 67, 100)

        out.Close()
    

    }

    `

    I see a flash on my USB midi when the device opens, and another when it closes, but no note events are sent when it writes them. Also not seeing any kind of error.

    If I use the Mac OS midi tester, then I can see note events been sent to my usb midi fine so I don't think it's a device issue.

    Is there any debugging I can turn on or way of investigating further?

  • Parse SysEx messages in (Stream).Read()

    Parse SysEx messages in (Stream).Read()

    This addresses the need to detect SysEx messages that are received during Stream.Read().

    The MIDI protocol says that SysEx messages begin with a 0xF0 byte and end with 0xF7 byte. With this change, Stream.Read() will detect and return SysEx messages using a new Event.SysEx field.

    TESTED=Novation Launch Control XL sends SysEx messages whenever the user changes templates, but they may arrive while polling for control and button updates. This change addresses the situation.

  • Event struct doesn't expose entire Message slice

    Event struct doesn't expose entire Message slice

    Hi, I hacked on a fork of this library to get Go talking to an older synth over Sysex. The changes I made are breaking, but I was interested in contributing if I can. Perhaps there is a non-breaking way of doing this, or a version of this can be included in a future release?

    The diff is here: https://github.com/rakyll/portmidi/compare/master...murdinc:master

    As far as I can tell, only 3 bytes of the Message are available currently, but I needed the entire message.

    Current struct:
    // Event represents a MIDI event.
    type Event struct {
        Timestamp Timestamp
        Status    int64
        Data1     int64
        Data2     int64
    }
    
    The changes I made are modeled after the PmEvent Struct in the portmidi docs:
    // Event represents a MIDI event.
    type Event struct {
        Timestamp Timestamp
        Message   Message
    }
    
    // Message represents a 4 byte message
    type Message []byte
    
    
    func (m Message) Status() byte {
        status := m[0]
        return status
    }
    
    func (m Message) Data1() byte {
        data1 := m[1]
        return data1
    }
    
    func (m Message) Data2() byte {
        data2 := m[2]
        return data2
    }
    
  • 'portmidi.h' file not found

    'portmidi.h' file not found

    I am running OS X 10.10.1. I have installed portmidi v217 via homebrew, and I have verified that the header files are linked from /usr/local/Cellar/portmidi/217/include/ to /usr/local/include.

    When I run "go get github.com/rakyll/portmidi" or "go install" it errors:

    ./portmidi.go:20:11: fatal error: 'portmidi.h' file not found
     #include <portmidi.h>
              ^
    1 error generated.
    

    I am brand new to Go -- really just want to use it for music. Any idea how to get this working? Thanks.

  • Golang MIDI collaboration

    Golang MIDI collaboration

    Hi Jaana,

    I am writing to you, since you worked on MIDI and I wrote a rather complete library in the last weeks that should serve as a toolkit for creating MIDI based applications.

    I would like to invite to help out, making it a common standard for MIDI with Go, by providing you insight and expertise.

    I spend some effort to have a common API for live and SMF messages/events. A second major priority was to make lots of mostly independent small packages to allow small devices to just use what they need.

    The other top priority is to make the API stable as in: no breakage.

    Anyway I created the github group "gomidi" and already invited you - would be glad to have you on board.

    The core repo is: https://github.com/gomidi/midi

    and there are two simple applications

    https://github.com/gomidi/midispy and https://github.com/gomidi/smfimage

    making use of the core.

    Where you could help out:

    • naming, I want to nail down to get the API stable, see https://github.com/gomidi/midi/issues/3
    • ideas for the best abstraction of PitchBend and KeySignature (they are working but I am not sure, I covered all use cases and in the best way).
    • obviously testing and more obscure applications I might not have thought of
    • build higher level tools (quantization, what not) on top of it
    • seemless integration with your portmidi lib?

    I did not announce the library yet, since I first wanted to get some feedback from developers that delved into the MIDI standard.... ;-)

    What do you think?

    Looking forward to hear from you.

    Cheers, Benny (github.com/metakeule)

  • fix the build

    fix the build

    This PR broke the build by renaming a type without refactoring its usage. My PR is just a refactoring so the code base does use the new type name and compiles.

    P.s: we might want to set travis on this repo so we can more easily catch these issues.

  • rm ld -lporttime

    rm ld -lporttime

    Cannot compile on Gentoo Linux, linker whines that it can't find libporttime. Removing linker flag allows successful compile, and testing with real hardware shows no issues. This is with portmidi-src-217.zip, not sure if another distro inappropriately breaks out a separate library .so?

  • Remove package doc from stream.go

    Remove package doc from stream.go

    If it's specified repeatedly, it'll appear repeatedly in e.g. godoc.org/github.com/rakyll/portmidi.

    Remove the copy in stream.go to let portmidi.go be canonical.

  • Send sysex

    Send sysex

    Looks like WriteSysEx was stubbed out. This patch works for me, although I can't get gdb or valgrind to work with go programs, so I'm not sure it's freeing memory correctly.

    Here's a test program: https://gist.github.com/adsr/ecab341fef25f0fcf906

    Run amidi -p virtual -d, and then go run test.go 'Virtual RawMIDI'. You should then see output from amidi.

  • Read(max int) errors on system real time messages

    Read(max int) errors on system real time messages

    MIDI System Real Time Messages are captured by if event.Status&0xF0 == 0xF0 in stream.Read and return an error because they are not SysEx messages.

    There's no data payload for system real time messages so I think there could just be a literal check for messages with a status between 0xF8 and 0xFF. I'm happy to make that as a PR but I don't want to be presumptuous. I'm pretty new to this repo and to MIDI system messages in general.

  • fix: Link libportmidi correctly on Darwin

    fix: Link libportmidi correctly on Darwin

    • Add portmidi.h and porttime.h to /lib as mentioned in the issue: https://github.com/rakyll/portmidi/issues/3

    • Fixes failing builds on Darwin due to hardcoded path to libportmidi.dylib, only compatible with the Linux filesystem. The fix consists of using #cgo darwin LDFLAGS and #cgo linux LDFLAGS to reference the library.

  • Listen() has no stop mechanism.

    Listen() has no stop mechanism.

    I ran into a problem where calling Stream.Close() causes a crash in my app. The call was fine when the app was closing down. i.e. when other go routines being killed. The reason, Stream.Listen() spawns a go routine with no exit feature, so it will keep polling the Stream even if it has been Closed. This of course results in a memory access violation. I assume the reason testing hasn't picked this up before is because Steam.Close() is usually only called on exit.

    I am using the following in my project to allow a stream to stop listening. It's a slight API change adding a stop signal to Stream.Listen(). Though it might be a good idea to use the context package...

    func (s *portmidi.Stream) Listen(stop <-chan int) <-chan portmidi.Event {
    	const pollingInterval = 10 * time.Millisecond
    	timer := time.NewTimer(pollingInterval)
    	ch := make(chan portmidi.Event)
    	go func(s *portmidi.Stream, ch chan portmidi.Event) {
    		for {
    			select {
    			case <-timer.C:
    				events, err := s.Read(1024)
    				if err != nil {
    					timer.Reset(pollingInterval)
    					continue
    				}
    				for i := range events {
    					ch <- events[i]
    				}
    				timer.Reset(pollingInterval)
    			case <-stop:
    				timer.Stop()
    				return
    			}
    		}
    	}(s, ch)
    	return ch
    }
    
  • Segv when reading and writing a storm of events

    Segv when reading and writing a storm of events

    On Macos 10.14.6 (Mojave) go 1.14.1 gitlab.com/gomidi/portmididrv v0.6.0 portmidi installed via homebrew - version 217_2

    This looks very similar to #36 . I tried setting GODEBUG as described there, but don't see anything in the log. I've been successfully using the library for some prototyping, but now get this seg fault whenever my app processes a quick stream of events (each inbound event triggers a corresponding outbound event and soon after the first in the storm, the app crashes). If I break the cycle (process inbound events, but don't immediately send an outbound event in response - or just send a bunch of outbound events), everything works fine. Could there be some problem with attempting to write at same time the read listener is still processing an inbound event?

    Help?

    [signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x7fff4d85068b]
    
    runtime stack:
    runtime.throw(0x151c3e9, 0x2a)
    	/usr/local/go/src/runtime/panic.go:1114 +0x72
    runtime.sigpanic()
    	/usr/local/go/src/runtime/signal_unix.go:679 +0x46a
    
    goroutine 1789 [syscall]:
    runtime.cgocall(0x10025e0, 0xc00070ec88, 0xc00031e300)
    	/usr/local/go/src/runtime/cgocall.go:133 +0x5b fp=0xc00070ec58 sp=0xc00070ec20 pc=0x100616b
    github.com/rakyll/portmidi._Cfunc_Pm_Write(0x68016b0, 0xc00051ccc8, 0x1, 0x0)
    	_cgo_gotypes.go:302 +0x4d fp=0xc00070ec88 sp=0xc00070ec58 pc=0x11d8c4d
    github.com/rakyll/portmidi.(*Stream).Write.func1(0xc000052140, 0xc00051ccc8, 0x1, 0x1, 0x1, 0xc00070ed00)
    	/Users/tynor/go/pkg/mod/github.com/rakyll/[email protected]/stream.go:120 +0x73 fp=0xc00070ecc0 sp=0xc00070ec88 pc=0x11da173
    github.com/rakyll/portmidi.(*Stream).Write(0xc000052140, 0xc00070ed30, 0x1, 0x1, 0x100fae8, 0x3)
    	/Users/tynor/go/pkg/mod/github.com/rakyll/[email protected]/stream.go:120 +0xc5 fp=0xc00070ed00 sp=0xc00070ecc0 pc=0x11d95c5
    github.com/rakyll/portmidi.(*Stream).WriteShort(0xc000052140, 0xbf, 0x73, 0x1c, 0xc00070eda3, 0xc00051ccc3)
    	/Users/tynor/go/pkg/mod/github.com/rakyll/[email protected]/stream.go:131 +0x84 fp=0xc00070ed60 sp=0xc00070ed00 pc=0x11d96a4
    gitlab.com/gomidi/portmididrv.(*out).Write(0xc0001b49f0, 0xc00051ccc3, 0x3, 0x3, 0x5cb97d0, 0x0, 0xc00011e340)
    	/Users/tynor/go/pkg/mod/gitlab.com/gomidi/[email protected]/out.go:43 +0x79 fp=0xc00070ede8 sp=0xc00070ed60 pc=0x11db619
    
    
  • Duplicate symbol messages on Apple Mac

    Duplicate symbol messages on Apple Mac

    Golang 1.9 macOS 10.12.6 Sierra

    Hello, I ran brew install portmidi and that seemed to go OK. I then ran go get github.com/rakyll/portmidi - again, no cause for alarm.

    I then cd'd to the rakyll/portmidi folder and ran go test. I received the following messages:

     carlca  ~/code/go/src/github.com/rakyll/portmidi  master  go test                                   ✓  10:26:17 - 05.09.2017
    # testmain
    /usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Abort in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Close in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_CountDevices in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_GetDefaultInputDeviceID in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_GetDefaultOutputDeviceID in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_GetDeviceInfo in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_GetErrorText in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Initialize in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_OpenInput in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_OpenOutput in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Poll in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Read in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_SetChannelMask in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Terminate in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_Write in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pm_WriteSysEx in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pt_Start in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pt_Stop in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    duplicate symbol __cgo_d8e63e9abae4_Cfunc_Pt_Time in:
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000000.o
        /var/folders/1d/1rqcnlq51zd4j_vqhp1kv3540000gp/T/go-link-946891097/000002.o
    ld: 19 duplicate symbols for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    FAIL	_/Users/carlca/code/go/src/github.com/rakyll/portmidi [build failed]
    
    

    Any ideas what the problem could be? Cheers, Carl.

  • go signal killed when running example

    go signal killed when running example

    package main
    
    import (
    	"fmt"
    	"log"
    
    	"github.com/rakyll/portmidi"
    )
    
    func main() {
    
    	in, err := portmidi.NewInputStream(portmidi.DefaultInputDeviceID(), 1024)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	msg, err := in.Read(1024)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	for i, b := range msg {
    		fmt.Printf("SysEx message byte %d = %02x\n", i, b)
    	}
    }
    
Go bindings for the PortAudio audio I/O library

portaudio This package provides an interface to the PortAudio audio I/O library. See the package documentation for details. To build this package you

Jan 1, 2023
Golang bindings for libmediainfo

mediainfo Golang binding for libmediainfo Duration, Bitrate, Codec, Streams and a lot of other meta-information about media files can be extracted thr

Nov 16, 2022
libsox bindings for go

gosox "SoX − Sound eXchange, the Swiss Army knife of audio manipulation" Go bindings for the libsox sound library For more information and documentati

Nov 22, 2022
Go bindings for the PortAudio audio I/O library

portaudio This package provides an interface to the PortAudio audio I/O library. See the package documentation for details. To build this package you

Jan 1, 2023
Golang bindings for the Telegram Bot API

Golang bindings for the Telegram Bot API All methods are fairly self explanatory, and reading the godoc page should explain everything. If something i

Jan 6, 2023
OpenSSL bindings for Go

OpenSSL bindings for Go Please see http://godoc.org/github.com/spacemonkeygo/openssl for more info License Copyright (C) 2017. See AUTHORS. Licensed u

Dec 29, 2022
Golang bindings for libxlsxwriter for writing XLSX files
Golang bindings for libxlsxwriter for writing XLSX files

goxlsxwriter provides Go bindings for the libxlsxwriter C library. Install goxlsxwriter requires the libxslxwriter library to be installe

Nov 18, 2022
Go bindings for ForestDB

goforestdb Go bindings for ForestDB Building Obtain and build forestdb: https://github.com/couchbaselabs/forestdb (run make install to install the lib

Sep 26, 2022
Go bindings for GLib type system.

Go bindings for GLib type system. This package is designed for building bindings to C libraries based on GLib type system (like GTK, GStreamer, and ot

Aug 13, 2019
Source code editor written in Go using go-gtk bindings. It aims to handle navigation effectively among large number of files.
Source code editor written in Go using go-gtk bindings. It aims to handle navigation effectively among large number of files.

tabby Source code editor written in Go using go-gtk bindings. It aims to handle navigation effectively among large number of files. screenshot: depend

Nov 16, 2022
Duktape JavaScript engine bindings for Go

Duktape bindings for Go(Golang) Duktape is a thin, embeddable javascript engine. Most of the api is implemented. The exceptions are listed here. Usage

Jan 6, 2023
PHP bindings for the Go programming language (Golang)

PHP bindings for Go This package implements support for executing PHP scripts, exporting Go variables for use in PHP contexts, attaching Go method rec

Jan 1, 2023
naive go bindings to the CPython C-API

go-python Naive go bindings towards the C-API of CPython-2. this package provides a go package named "python" under which most of the PyXYZ functions

Jan 5, 2023
Go bindings for Lua C API - in progress

Go Bindings for the lua C API Simplest way to install: # go get github.com/aarzilli/golua/lua You can then try to run the examples: $ cd golua/_examp

Dec 28, 2022
Go bindings for libmagic to detect MIME types

magicmime magicmime is a Go package which allows you to discover a file's mimetype by looking for magic numbers in its content. It could be used as a

Nov 9, 2022
Go bindings for raylib, a simple and easy-to-use library to enjoy videogames programming.
Go bindings for raylib, a simple and easy-to-use library to enjoy videogames programming.

raylib-go Golang bindings for raylib, a simple and easy-to-use library to enjoy videogames programming. Requirements Ubuntu X11 apt-get install libgl1

Dec 28, 2022
Go bindings for the Cartographic Projections Library PROJ.4

The Go package proj provides a limited interface to the Cartographic Projections Library PROJ. For PROJ version 5 and beyond, see also: https://github

Nov 10, 2022
Go bindings for GLFW 3

GLFW 3.3 for Go Installation GLFW C library source is included and built automatically as part of the Go package. But you need to make sure you have d

Jan 8, 2023
Go bindings for GLFW 3

GLFW 3.3 for Go Installation GLFW C library source is included and built automatically as part of the Go package. But you need to make sure you have d

Dec 25, 2022
Go bindings for OpenGL (generated via glow)

gl This repository holds Go bindings to various OpenGL versions. They are auto-generated using Glow. Features: Go functions that mirror the C specific

Dec 12, 2022