GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - todbot/CircuitPython_TMIDI: MIDI library for CircuitPython, inherits from Winterbloom_SmolMIDI

BranchesTags
Open more actions menu

Latest commit

 

History

48 Commits
48 Commits

Folders and files

NameName
Last commit message
Last commit date
.github
.github
 
 
LICENSES
LICENSES
 
 
docs
docs
 
 
examples
examples
 
 
src
src
 
 
tests
tests
 
 
tmidi
tmidi
 
 
.gitignore
.gitignore
 
 
.pre-commit-config.yaml
.pre-commit-config.yaml
 
 
.pylintrc
.pylintrc
 
 
.readthedocs.yaml
.readthedocs.yaml
 
 
CODE_OF_CONDUCT.md
CODE_OF_CONDUCT.md
 
 
LATENCY_RESULTS.md
LATENCY_RESULTS.md
 
 
LICENSE
LICENSE
 
 
README.rst
README.rst
 
 
README.rst.license
README.rst.license
 
 
REUSE.toml
REUSE.toml
 
 
optional_requirements.txt
optional_requirements.txt
 
 
pyproject.toml
pyproject.toml
 
 
requirements.txt
requirements.txt
 
 

Repository files navigation

Introduction

Documentation Status Discord Build Status Code Style: Black

MIDI library for CircuitPython

TMIDI is a MIDI library for CircuitPython / MicroPython. It attempts to be a provide a simpler API and perform faster, especially for MIDI parsing, compared to adafruit_midi (adafruit_midi github) TMIDI is derived from winterbloom_smolmidi (smolmidi github) by Thea Flowers for Winterbloom.

Like adafruit_midi, TMIDI works on CircuitPython's usb_midi and busio.UART, or any stream-like object that supports .readinto() and .write()

Usage Example

Sending MIDI over USB. Channels are 0-indexed, so channel=0 is MIDI channel 1:

import time
import usb_midi
import tmidi

midi = tmidi.MIDI(midi_out=usb_midi.ports[1])

while True:
    midi.send(tmidi.Message(tmidi.NOTE_ON, 60, 100, channel=0))
    time.sleep(0.5)
    midi.send(tmidi.Message(tmidi.NOTE_OFF, 60, 0, channel=0))
    time.sleep(0.5)

Receiving MIDI over USB. receive() returns None when nothing has arrived:

import usb_midi
import tmidi

midi = tmidi.MIDI(midi_in=usb_midi.ports[0])

while True:
    if msg := midi.receive():
        if msg.type == tmidi.NOTE_ON:
            print("note on:", msg.note, msg.velocity, msg.channel)
        else:
            print(msg)

Callbacks

Instead of receive(), register functions for the message types you want and call poll(). No Message objects are allocated.

def note_on(channel, note, velocity):
    print("note on:", channel, note, velocity)

midi.on(tmidi.NOTE_ON, note_on)
while True:
    midi.poll()

See examples/tmidi_simple_poll.py for a full example.

Turbo parser

TMIDI runs entirely in Python, but uses a faster @micropython.viper parser when your firmware can load native code. The parsers ship inside the tmidi/ library folder as tmidi_kernel.<arch>.mpy, and CircuitPython picks the one for your board. tmidi.ENGINE says which parser is in use.

TMIDI 3.0 is a folder, lib/tmidi/, instead of a single lib/tmidi.mpy. Delete an old lib/tmidi.mpy when upgrading.

tmidi_kernel file Boards
armv6m RP2040
armv7emsp SAMD51, nRF52840, RP2350, STM32F4
xtensawin ESP32-S2, ESP32-S3
rv32imc ESP32-C3, C5, C6

To rebuild them from src/tmidi_turbo.py, use an mpy-cross from the CircuitPython version they will run on. The files land in tmidi/:

cd src
make MPY_CROSS=path/to/circuitpython/mpy-cross/build/mpy-cross

Dependencies

This library depends on:

  • Adafruit CircuitPython

Please ensure all dependencies are available on the CircuitPython filesystem. This is easily achieved by downloading the Adafruit library and driver bundle or individual libraries can be installed using circup.

Installing from PyPI

On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally from PyPI. To install for current user:

pip3 install circuitpython-tmidi

To install system-wide (this may be required in some cases):

sudo pip3 install circuitpython-tmidi

To install in a virtual environment in your current project:

mkdir project-name && cd project-name
python3 -m venv .venv
source .env/bin/activate
pip3 install circuitpython-tmidi

Installing to a Connected CircuitPython Device with Circup

Make sure that you have circup installed in your Python environment. Install it with the following command if necessary:

pip3 install circup

With circup installed and your CircuitPython device connected use the following command to install:

circup install tmidi

Or the following command to update an existing version:

circup update

Documentation

API documentation for this library can be found on Read the Docs.

For information on building library documentation, please check out this guide.

Testing

Install pytest with pip3 install pytest circuitpython-mocks --upgrade and run pytest -v

Contributing

Contributions are welcome! Please read our Code of Conduct before contributing to help this project stay welcoming.

About

MIDI library for CircuitPython, inherits from Winterbloom_SmolMIDI

circuitpython-tmidi.readthedocs.io/en/latest/

Topics

circuitpythonmidiusb

Resources

Readme
MIT license

Code of conduct

Code of conduct
Activity

Stars

4 stars

Watchers

1 watching

Forks

0 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.