💡 Tipp: Mikrofon-Status visuell anzeigen (OpenRGB Integration über MIDI)

Hallo Community,

ich hab eine Lösung gesucht, um den Mikrofon-Status (ON/OFF) visuell über meine RGB-Hardware (Tastatur, Monitor-Hintergrundbeleuchtung, etc.) anzuzeigen. Da ich unter der Suche nichts gefunden habe, teile ich hier, wie ich das Ganze zum Laufen gebracht habe.

Wir nutzen das OpenRGB SDK (Software Development Kit), um die LED-Farben zu steuern. Weil mAirList nicht direkt mit diesem Protokoll sprechen kann, brauchen wir eine kleine Python-Brücke als Übersetzer zwischen mAirList und OpenRGB.

:bridge_at_night: Die Architektur

  1. Dein mAirList-Script (Sender): Registriert Dein MIDI-Signal für Mic-ON/OFF und sendet einen einfachen HTTP-Befehl an die Brücke.
  2. Die Python-Brücke (Übersetzer): Startet einen kleinen Webserver (Flask), empfängt den HTTP-Befehl und steuert dann über die openrgb-python-Bibliothek Deine LEDs.
  3. Der OpenRGB SDK Server (Empfänger): Läuft im Hintergrund und führt die Farbanpassungen durch.

:hammer_and_wrench: 1. Vorbereitung und Python-Brücke einrichten

Stell sicher, dass Du Python 3 installiert hast und der OpenRGB SDK Server in den OpenRGB-Einstellungen auf Port 6742 aktiviert ist.

A. Python-Bibliotheken installieren
Öffne die Kommandozeile und installiere die notwendigen Pakete:

pip install flask openrgb-python

B. Zielgeräte identifizieren (Wichtig!)

Bevor Du die Brücke startest, musst Du die exakten Namen Deiner steuerbaren RGB-Geräte kennen, da die Python-Brücke diese Strings erwartet.

Du kannst die Namen über eine temporäre Python-Konsole auslesen:

from openrgb import OpenRGBClient

client = OpenRGBClient('127.0.0.1', 6742)
print("--- Gefundene Geräte ---")
for i, device in enumerate(client.devices):
    print(f"Index {i}: Name: {device.name}")

Kopiere den exakten Namen (inkl. Groß-/Kleinschreibung und Leerzeichen) und verwende ihn im nächsten Schritt.

B. Python-Brücke (python_bridge.py)
Speichere diesen Code als python_bridge.py. Ganz wichtig: Pass die Zeile TARGET_DEVICE_IDENTIFIERS an und ersetz die Beispiel-Gerätenamen durch die exakten Namen Deiner eigenen OpenRGB-Geräte (z. B. “TopMonR”, “Corsair K95”). Bei mir sind es die LEDs über meinen beiden Monitoren. Ich schau ja in die selbigen während meiner Sendung.

from openrgb import OpenRGBClient
from openrgb.utils import RGBColor
from flask import Flask, request
import time

TARGET_DEVICE_IDENTIFIERS = ["TopMonR", "TopMonL"] 

OPENRGB_IP = "127.0.0.1"
OPENRGB_PORT = 6742
APP_PORT = 5000

MIC_ON_COLOR = RGBColor(255, 0, 0)
MIC_OFF_COLOR = RGBColor(0, 255, 0)

app = Flask(__name__)
client = None

def connect_to_openrgb():
    global client
    try:
        client = OpenRGBClient(OPENRGB_IP, OPENRGB_PORT)
        print("Verbindung zu OpenRGB erfolgreich hergestellt.")
        return True
    except Exception as e:
        client = None
        return False
        
connect_to_openrgb()

def set_multiple_devices_color(color: RGBColor):
    global client
    if client is None:
         if not connect_to_openrgb():
             return "Connection Error", 503

    color_name = "ROT" if color == MIC_ON_COLOR else "GRÜN"
    devices_changed = []
    
    try:
        for identifier in TARGET_DEVICE_IDENTIFIERS:
            target_device = None
            try:
                 target_index = int(identifier)
                 if 0 <= target_index < len(client.devices):
                     target_device = client.devices[target_index]
            except ValueError:
                for device in client.devices:
                    if device.name == identifier:
                        target_device = device
                        break
            
            if target_device:
                target_device.set_color(color) 
                devices_changed.append(target_device.name)
        
        if devices_changed:
            print(f"Farbe auf {color_name} für Geräte: {', '.join(devices_changed)} gesetzt.")
        return "OK", 200
            
    except Exception as e:
        client = None 
        return "Internal Error", 500

@app.route('/mic_on', methods=['GET'])
def mic_on():
    return set_multiple_devices_color(MIC_ON_COLOR)

@app.route('/mic_off', methods=['GET'])
def mic_off():
    return set_multiple_devices_color(MIC_OFF_COLOR)

if __name__ == '__main__':
    print(f"Starte Python Bridge Server auf Port {APP_PORT}...")
    app.run(host='0.0.0.0', port=APP_PORT, threaded=False)

C. Brücke starten
Starte die Python-Brücke in einer Konsole und lass das Fenster im Hintergrund geöffnet:

python python_bridge.py

:laptop: 2. Dein mAirList Script (MIDI-Trigger)
Das folgende mAirList-Hintergrund-Script (.mls) fängt das Signal Deines Controllers ab.

Hinweis zur Hardware (AKAI Professional APC mini MK2): Ich verwende den letzten Slider dieses Controllers, um das Mikrofon zu steuern. Die MIDI-Nachrichten sind standardmäßig:

  1. Slider ganz oben (ON): B0 38 7F
  2. Slider ganz unten (OFF): B0 38 00
// openrgb_midi_trigger.mls

const
  BRIDGE_URL = 'http://127.0.0.1:5000/'; 
  
  APCMini = 2; // bei mir ist es das Device 2 ... hier im Forum gibt es eine Beschreibung wie man das herrausfindet sofern du es nicht schon weißt!

  // MIDI-Werte für Mic-Controller (ANPASSEN!)
  MIDI_STATUS = $B0;  
  MIDI_DATA1  = $38;
  MIDI_ON_DATA2  = $7F; 
  MIDI_OFF_DATA2 = $00; 

procedure OnLoad;
begin
  MidiOutOpen(APCMini);
end;

procedure OnMidiMessage(Status, Data1, Data2: Integer);
begin
  if (Status = MIDI_STATUS) and (Data1 = MIDI_DATA1) then
  begin
    if Data2 = MIDI_ON_DATA2 then
    begin
      HTTPGet(BRIDGE_URL + 'mic_on');
      SystemLog('OpenRGB Trigger: Mic ON (ROT) gesendet.');
    end
    else if Data2 = MIDI_OFF_DATA2 then
    begin
      HTTPGet(BRIDGE_URL + 'mic_off');
      SystemLog('OpenRGB Trigger: Mic OFF (GRÜN) gesendet.');
    end;
  end;
end;

procedure OnUnload;
begin
  MidiOutClose(APCMini);
end;

begin
end.

Script aktivieren

  1. Speichere diesen Code als openrgb_midi_trigger.mls.
  2. Füge das Skript in der mAirList Konfiguration unter Hintergrund-Scripts hinzu.
  3. Starte mAirList neu.

Jetzt sollte beim schieben des letzten Sliders die Python-Brücke reagieren und Deine ausgewählten Geräte in Rot (AN) oder Grün (AUS) schalten!

Viel Erfolg beim Nachbauen und Senden! :headphone:

Edit: mls fehlende Prozeduren OnLoad /OnUnLoad hinzugefügt inkl Midi-Device angabe.

3 Likes

als Ergänzung zum ersten Post hier noch zwei wichtige Hinweise, die bei der Konfiguration der Python-Brücke (python_bridge.py) helfen, damit die Steuerung perfekt klappt:

1. Steuerung: Einzelne oder alle Geräte

Der wichtigste Teil im Python-Skript ist die Liste TARGET_DEVICE_IDENTIFIERS. Diese Liste bestimmt, welche Geräte gesteuert werden. Hier siehst Du, wie Du die Liste an Deine Bedürfnisse anpassen musst (im Abschnitt C des ersten Posts):

  • Einzelne Geräte steuern: Gib die exakten Namen der Geräte an, die leuchten sollen.
    • Beispiel: TARGET_DEVICE_IDENTIFIERS = ["TopMonR", "Corsair K95 RGB"]
  • Alle Geräte steuern: Wenn Du möchtest, dass alle von OpenRGB erkannten Geräte die Farbe wechseln, verwendest Du einfach eine leere Liste:
    • Beispiel: TARGET_DEVICE_IDENTIFIERS = []

Achtung: Die Namen musst Du genau so verwenden, wie sie die OpenRGB API liefert. Du kannst die Liste in einer temporären Python-Konsole mit client.devices auslesen, um Tippfehler zu vermeiden.


2. OpenRGB SDK: Keine Installation nötig

Das OpenRGB SDK ist standardmäßig im OpenRGB-Programm enthalten. Du musst es nicht separat installieren!

Du musst lediglich sicherstellen, dass Du in den OpenRGB-Einstellungen unter “SDK Server” den Status auf Online stellst. Nur dann kann Deine Python-Brücke über den Port 6742 die Verbindung herstellen und die Befehle senden. :electric_plug:


3. Tipp: Woher bekomme ich OpenRGB?

Da das OpenRGB SDK (der Server-Teil) bereits in der Anwendung enthalten ist, musst Du nur die OpenRGB-Anwendung selbst herunterladen und installieren.

Du bekommst die offizielle Software kostenlos über die offizielle OpenRGB-Webseite:

OpenRGB-Download: Die Anwendung findest Du auf der OpenRGB-Homepage. Wähle dort einfach die passende Version für Dein Betriebssystem (bei mir ist es Download for Windows - Installer) aus und installiere sie. :globe_with_meridians:

Sobald Du OpenRGB installiert und gestartet hast, kannst Du es für deine LEDs einstellen und dann wie beschrieben den SDK Server in den Einstellungen aktivieren.

4 Likes

@mEGGs arbeitet gerade an einer Integration mAirList und Bitfocus Companion. Damit kann man dann ähnliches Realiseren und wer sowieso Companion im Einsatz hat, das wiederum soll eine Implementierung für OpenRGB haben. Aber ich habe keinen Plan ob und wie gut das funktioniert.

Deine Lösung mit der Python bridge ist auf jeden Fall auch schön.

1 Like