from machine import Pin, ADC
import time
import usb_midi
from adafruit_midi import MIDI
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
from adafruit_midi.control_change import ControlChange
# Setup für MIDI
midi = MIDI(midi_out=usb_midi.ports[1], out_channel=0)
# Taster
button_pins = [15, 16, 17]
buttons = [Pin(pin, Pin.IN, Pin.PULL_UP) for pin in button_pins]
button_states = [1, 1, 1] # 1 = nicht gedrückt, 0 = gedrückt
# Multiplexer
s0 = Pin(2, Pin.OUT)
s1 = Pin(3, Pin.OUT)
s2 = Pin(4, Pin.OUT)
s3 = Pin(5, Pin.OUT)
sig = ADC(Pin(26))
# Potentiometer-Werte für das Senden von ControlChange
last_pot_values = [0, 0, 0, 0]
# Funktion, um den Multiplexer-Kanal auszuwählen
def select_channel(channel):
s0.value(channel & 1)
s1.value((channel >> 1) & 1)
s2.value((channel >> 2) & 1)
s3.value((channel >> 3) & 1)
# MIDI CC-Nachrichten für Potentiometer senden
def send_pot_midi(channel, value):
midi_value = value >> 9 # Umrechnung auf Wertebereich 0-127
midi.send(ControlChange(channel + 20, midi_value)) # CC-Nummer 20+ für Potis
# Hauptloop
while True:
# Taster abfragen
for i, button in enumerate(buttons):
state = button.value()
if state != button_states[i]: # Zustandsänderung
if state == 0: # Taster gedrückt
midi.send(NoteOn(60 + i, 127)) # NoteOn Nachricht
else: # Taster losgelassen
midi.send(NoteOff(60 + i, 0)) # NoteOff Nachricht
button_states[i] = state
# Potentiometer-Werte vom Multiplexer lesen und MIDI CC senden
for channel in range(4): # 4 Potentiometer
select_channel(channel)
pot_value = sig.read_u16() # Wert des Potentiometers lesen (0 - 65535)
if abs(pot_value - last_pot_values[channel]) > 512: # Änderungsschwelle
send_pot_midi(channel, pot_value)
last_pot_values[channel] = pot_value
time.sleep(0.01)