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)
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT