Ejemplo de código




' --- 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