' --- OXYGEN8 SLIM MIDI ENGINE (CORE) ---
buffer$ = ""
last_status = 0
' Seriellen Port für MIDI (31250 Baud) initialisieren
serial2.mode 31250, -1, 27, 8, 0, 1
ONSERIAL2 MIDI_RX_EVENT
wlog "MIDI Engine aktiv - Warte auf Daten..."
do
if len(buffer$) = 0 then loop
' Byte aus Puffer holen
b = ASC(MID$(buffer$, 1, 1))
buffer$ = MID$(buffer$, 2)
' STATUS-BYTE CHECK (Status-Bytes sind immer >= 128)
if b >= &H80 then
if b < &HF8 then last_status = b
loop
endif
' DATEN-VERARBEITUNG
cmd = last_status >> 4
ch = (last_status AND &H0F) + 1
SELECT CASE cmd
CASE 9: ' --- NOTE ON / OFF ---
d1 = b ' Note
' Oxygen8-Fix: Sofort prüfen ob Velocity folgt
if len(buffer$) > 0 then
next_b = ASC(MID$(buffer$, 1, 1))
if next_b < &H80 then
d2 = next_b
buffer$ = MID$(buffer$, 2)
if d2 > 0 then
wlog "NOTE ON | Ch:"; ch; " Note:"; d1; " Vel:"; d2
' HIER DEINE AKTION FÜR TASTE GEDRÜCKT
else
wlog "NOTE OFF | Ch:"; ch; " Note:"; d1
' HIER DEINE AKTION FÜR TASTE LOSGELASSEN
endif
else
gosub QUICK_OFF
endif
else
gosub QUICK_OFF
endif
CASE 8: ' --- KLASSISCHES NOTE OFF ---
wlog "NOTE OFF | Ch:"; ch; " Note:"; b
' HIER DEINE AKTION FÜR TASTE LOSGELASSEN
CASE 11: ' --- CONTROL CHANGE (REGLER) ---
' Warten auf den Wert-Byte (CC braucht immer 2 Datenbytes)
t_cc = millis + 5
while (len(buffer$) = 0) and (millis < t_cc)
wend
if len(buffer$) > 0 then
cc_val = ASC(MID$(buffer$, 1, 1))
buffer$ = MID$(buffer$, 2)
wlog "CONTROL | Ch:"; ch; " Nr:"; b; " Wert:"; cc_val
' HIER DEINE AKTION FÜR REGLER-BEWEGUNG
endif
END SELECT
loop
QUICK_OFF:
wlog "QUICK OFF| Note:"; d1; ""
' HIER EBENFALLS AKTION FÜR LOSLASSEN EINTRAGEN
return
MIDI_RX_EVENT:
buffer$ = buffer$ + SERIAL2.INPUT$
return