Skip to content

Instantly share code, notes, and snippets.

@rsbohn
Created March 14, 2022 20:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rsbohn/53bc3c3289d7daa9eb51d9cfd447e80b to your computer and use it in GitHub Desktop.
Save rsbohn/53bc3c3289d7daa9eb51d9cfd447e80b to your computer and use it in GitHub Desktop.
Asyncio and MIDI
import asyncio
import board
import time
import usb_midi
import adafruit_midi
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
from neopixel import NeoPixel
from adafruit_seesaw.seesaw import Seesaw
from adafruit_seesaw.analoginput import AnalogInput
def bpm_to_t(rate):
return 60/rate/4.0
class Ticker:
def __init__(self):
self.bpm = 20
self.tick = bpm_to_t(self.bpm)
self.note = 38
self.running = True
self.tock = 0
async def loop(ticker):
midi = adafruit_midi.MIDI(midi_in=usb_midi.ports[0],
midi_out=usb_midi.ports[1],
in_channel=1,
out_channel=1)
while ticker.running:
note = ticker.note
midi.send(NoteOn(ticker.note, 120))
await asyncio.sleep(ticker.tick)
midi.send(NoteOn(note, 30))
await asyncio.sleep(ticker.tick)
midi.send(NoteOn(note, 30))
await asyncio.sleep(ticker.tick)
midi.send(NoteOff(note, 0))
async def read_ain(ticker):
seesaw = Seesaw(board.I2C())
a7 = AnalogInput(seesaw, 7)
while True:
raw = a7.value
ticker.bpm = int(raw/1023*120)+20
ticker.tick = bpm_to_t(ticker.bpm)
await asyncio.sleep(0.1)
async def main():
ticker = Ticker()
await asyncio.gather(
loop(ticker),
read_ain(ticker)
)
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment