OSC kurz & knapp erklärt (OscMagic bridge)

1️⃣ Was ist OSC?

Open Sound Control (OSC) ist ein Kommunikationsprotokoll für Musik, Medien und Netzwerke. Es legt keine festen Transportwege fest, wird aber meist über UDP-Sockets gesendet.

OSC verwendet eine offene, dynamische URL-Symbolik, ähnlich wie Webadressen.

2️⃣ Das Protokoll

3️⃣ TypeTags

4️⃣ Packet

5️⃣ Message – einzelne Nachricht

Form einer OSC-Message:

<address pattern> <type tag string> <data>

Beispieladresse

/Sounds/Synthesizer/VCF/CutOff-Frequency

Typische Message

Erklärung: Dieser Befehl setzt den Parameter CutOff-Frequency auf 0,75.

Wildcards für mehrere Ziele gleichzeitig

Praktisches Beispiel mit Wildcards

Adresse mit Wildcards:

/Sounds/*/VCF/CutOff-?

→ Diese Nachricht würde gleichzeitig mehrere Parameter in verschiedenen Synthesizern ansprechen. Beispiele für Treffer:

So kann ein OSC-Server **alle passenden Adressen gleichzeitig erkennen** und die jeweiligen Daten anwenden.

6️⃣ TimeTag

Ein OSC-TimeTag ist eine 64-Bit-Zeitangabe (8 Bytes), die angibt, wann eine Nachricht ausgeführt werden soll.

Value: 3523101604,595 Sekunden
ASCII: 065, 234, 063, 200, 116, 147, 010, 062

Oft werden nur die oberen 32 Bits gesendet:

Value: 55491,275 Sekunden
ASCII: 000, 000, 000, 000, 127, 104, 204, 204

Immediate-TimeTag (sofort ausführen):

000 000 000 000 000 000 000 001

Beispiel: Value

3523101604,595 Sekunden

Schritt 1: Ganze Sekunden und Bruchteile aufteilen

Schritt 2: Umrechnung in 32-Bit Hex

Teil Dezimal Hex
Ganze Sekunden 3523101604 D1 C7 40 14
Bruchteile 0,595 × 2^32 ≈ 2557352656 98 73 92 00

Schritt 3: Hex → Dezimal (Byteweise)

Byte Hex Dezimal Bemerkung
1 D1 209 höchstes Byte Sekunden
2 C7 199
3 40 64
4 14 20 niedrigstes Byte Sekunden
5 98 152 höchstes Byte Bruchteile
6 73 115
7 92 146
8 00 0 niedrigstes Byte Bruchteile

Schritt 4: Dezimal → ASCII

Die Bytes werden zur Übertragung häufig als ASCII-Zahlen gesendet:

209, 199, 64, 20, 152, 115, 146, 0

Schritt 5: Vereinfachung

7️⃣ Bundle – mehrere Nachrichten gleichzeitig

Ein OSC-Bundle enthält mehrere Messages, optional mit Zeitstempel. Alle enthaltenen Nachrichten werden gemäß dem TimeTag ausgeführt.

Beispiel eines Bundles:

#bundle
  /Sounds/Synthesizer/VCF/CutOff-Frequency ,f 0.75
  /Sounds/Drums/Kick ,i 127

Beide Nachrichten werden gleichzeitig ausgeführt. Bundles können auch verschachtelt sein.

Schritt 1: Header „#bundle“ → ASCII-Codes

ZeichenASCII
#35
b98
u117
n110
d100
l108
e101
\0 (Padding)0

💡 Hinweis: OSC-Pakete müssen Vielfache von 4 Bytes sein → Nullbytes auffüllen.

Schritt 2: TimeTag → 8 Bytes

Beispiel: TimeTag = sofortige Ausführung → 0 Sekunden

000 000 000 000 000 000 000 001

Die 8 Bytes entsprechen der 64-Bit-Zeitangabe.

Schritt 3: Bundle-Elemente

Jedes Element = Länge (int32, 4 Bytes) + Inhalt (Message)

Beispiel Message:

/Sounds/Synthesizer/VCF/CutOff-Frequency ,f 0.75

Schritt 3a: Länge berechnen

Nachricht in Bytes (inkl. Kommas, Leerzeichen) = z. B. 44 Bytes → auf 4er-Multiple prüfen → evtl. Nullbytes auffüllen

Schritt 3b: Nachricht → ASCII-Codes

ZeichenASCII
/47
S83
o111
u117
n110
d100
s115
/47
S83
y121
0.7548 46 55 53
Padding0 0

Schritt 4: Zusammengesetzte ASCII-Liste

Die komplette Nachricht als ASCII-Zahlen (Byte für Byte) für Übertragung:

035 098 117 110 100 108 101 000 000 000 000 000 000 000 001
000 000 000 044 047 083 111 117 110 100 115 047 083 121 110 116 ...
48 46 55 53 000 000

Zusammenfassung

8️⃣ Pattern Matching – Nachrichten gezielt adressieren

OSC-Adressen ähneln URLs und können Wildcards enthalten, um Nachrichten flexibel zu routen. Hier erklären wir Schritt für Schritt, wie die verschiedenen Pattern funktionieren.

1. Wildcard ? – genau ein beliebiges Zeichen

Beispiel:

/Sounds/Synthesizer/VCF/CutOff-?

→ Matcht genau ein Zeichen an der Stelle des ?. Beispiele für Treffer: /Sounds/Synthesizer/VCF/CutOff-F, /Sounds/Synthesizer/VCF/CutOff-Q

2. Wildcard * – beliebige Zeichenkette

/Sounds/*/VCF/CutOff-Frequency

→ Matcht beliebige Zeichen zwischen /Sounds/ und /VCF/CutOff-Frequency. Beispiele für Treffer: /Sounds/Synthesizer/VCF/CutOff-Frequency, /Sounds/Drums/VCF/CutOff-Frequency

3. Zeichenliste [ ] – eins von mehreren Zeichen

/Lights/LED[123]

→ Matcht genau eine Stelle, die 1, 2 oder 3 enthält. Treffer: /Lights/LED1, /Lights/LED3. Nicht: /Lights/LED4

4. Bereich [ - ] – ASCII-Bereich

/Lights/LED[A-F]

→ Matcht einen Buchstaben von A bis F. Treffer: /Lights/LEDA, /Lights/LEDF. Nicht: /Lights/LEDG

5. Negation [!...] – alles außer …

/Lights/LED[!123]

→ Matcht jedes Zeichen außer 1, 2 oder 3. Treffer: /Lights/LED0, /Lights/LED4. Nicht: /Lights/LED2

6. Kombinationen

Du kannst Wildcards kombinieren:

/Sounds/*/VCF/CutOff-?[A-C]

→ Matcht beliebige Zeichenkette nach /Sounds/, dann /VCF/CutOff-, gefolgt von genau einem Zeichen, das A, B oder C ist. Beispiel: /Sounds/Drums/VCF/CutOff-B

7. Visualisierung

Stell dir die OSC-Adresse als **Reihe von Zeichen** vor, die nacheinander überprüft werden:

Ein OSC-Server vergleicht die Adresse eingehender Nachrichten **Zeichen für Zeichen** mit dem Pattern, um zu entscheiden, ob die Nachricht passt.

Diese Zusammenfassung entstand im Zusammenhang mit meiner Arbeit an der Mediensteuerung für Daimler-Benz auf der IAA 2011.

© 2011 Rolf Meurer, Worringer-Str. 9, D-40211 Düsseldorf