Aus Raspberry Pi Geek 06/2019

Audio-Programmierung mit Sonic Pi, Teil 4 (Seite 3)

OSC eignet sich gleichermaßen gut für das Verschicken von Nachrichten zwischen Anwendungen auf demselben Rechner, im lokalen Netzwerk und sogar über das Internet. Den einfachsten Fall, eine Sonic-Pi-interne Verbindung, zeigt Listing 7. Die erste Zeile legt mit use_osc die IP-Adresse und den verwendeten Port fest. Statt "127.0.0.1" könnten Sie auch "localhost" schreiben. Sonic Pi lauscht per Voreinstellung auf Port 4559.

Der Live-Loop send (ab Zeile 3) erzeugt zwei Zufallszahlen und verschickt sie per OSC. Aus der Perspektive von Sonic Pi besteht eine OSC-Nachricht aus zwei Elementen: einem URL-artigen Adress-String, den Sie im Prinzip frei wählen können, und einem Array, das den Nachrichteninhalt repräsentiert. Entsprechend fungiert als erstes Argument von osc die Adresse, nachfolgende Argumente beliebiger Anzahl wandern in das Array.

Die Funktionen sync und get kommen auch mit OSC zurecht, wie Zeile 11 demonstriert. Der Empfang und das Entpacken verlaufen exakt wie bei MIDI-Nachrichten, und auch hier können Sie Wildcards einsetzen. Das bietet die interessante Möglichkeit, mit Parameterhierarchien zu arbeiten. Wenn etwa /orgel/vol, /bassdrum/vol und so weiter die Lautstärken einzelner Instrumente repräsentieren, dann adressiert /*/vol sämtliche Lautstärken.

Listing 7

use_osc "127.0.0.1", 4559
live_loop :send do
  i = rand_i 1..100
  f = rand 1..100
  osc "/msg/path", i, f
  sleep 1
end
live_loop :receive do
  msg = sync "/osc/msg/path"
  puts "#{msg} empfangen!"
end

OSC-Nachrichten senden

In RPG 09-10/2018 haben wir die auf Grafik und Animation spezialisierte Programmiersprache Processing vorgestellt [3]. Die Verknüpfung von Sonic Pi und Processing per OSC ermöglicht, komplexe audiovisuelle Kompositionen zu entwickeln, etwa zur grafischen Darstellung von musikalischen Strukturen und Klangparametern in Echtzeit. Auf diesem Weg gelingt auch die dynamische Verknüpfung von Klängen mit Filmsequenzen ohne Weiteres.

Listing 8 und Listing 9 zeigen ein einfaches Beispiel, bei dem Tonhöhen die Helligkeit der Bildfäche einer lokal ausgeführten Processing-Anwendung steuern. Listing 8 spielt zufallsgenerierte Noten. Dabei skaliert Zeile 6 die Notenwerte auf den Bereich von 0 bis 255, Zeile 7 verschickt sie mit dem Adress-String "/color" auf Port 12000.

Listing 8

use_osc "127.0.0.1", 12000
live_loop :send do
  note = rand_i 30..60
  play note
  c = 255/30*(note-30)
  osc "/color", c
  sleep 1
end

Listing 9 zeigt den korrespondierenden Processing-Code. Damit der läuft, müssen Sie die oscP5-Bibliothek installieren. Zeile 9 legt fest, dass Processing auf Port 12000 lauscht. Die Zeilen 16 bis 19 bilden den Kern des Codes: Processing ruft die Funktion oscEvent() immer dann auf, wenn eine OSC-Nachricht eintrifft.

Zunächst prüft checkAddrPattern(), ob die Adresse "/color" entspricht (Zeile 17). Ist das der Fall, dann liest msg.get(0) das erste Element der Nachricht aus, interpretiert es mit intValue() als ganze Zahl und speichert diese in der globalen Variablen c. Die wiederum steuert in Zeile 13 den Grauwert des Programmhintergrunds. Der erscheint im Ergebnis bei hohen Tönen hell und bei tiefen dunkel.

Listing 9

import oscP5.*;
OscP5 oscP5;
int c = 0;
void setup() {
  size(400, 400);
  frameRate(25);
  oscP5 = new OscP5(this, 12000);
}
void draw() {
  background(c);
}
void oscEvent(OscMessage msg) {
  if (msg.checkAddrPattern("/color")) {
    c = msg.get(0).intValue();
  }
}

Der Code aus den beiden Listings funktioniert ebenso gut, wenn Sonic Pi und Processing auf verschiedenen Rechnern im lokalen Netzwerk laufen. Sie müssen dann lediglich die IP-Adresse des empfangenden Rechners ermitteln und sie in die erste Zeile von Listing 8 eintragen.

Falls Sonic Pi als Empfänger von OSC-Nachrichten aus dem lokalen Netzwerk fungieren soll, setzen Sie unter Preferences | IO das Häkchen bei Empfange entfernte OSC-Nachrichten. Dort können Sie übrigens auch die IP-Adresse ablesen.

Externe Audiosignale

Damit Sie am Audio-Interface eingehende Signale in Sonic Pi hören können, müssen sie im Terminal mit dem Aufruf qjackctl die grafische Oberfläche des Audio-Servers Jack öffnen und dort im Feld Verbindungen den Eingang system/capture mit dem Ausgang SuperCollider/in verknüpfen (Abbildung 4).

Abbildung 4: Im grafischen Tool Qjackctl verbinden Sie die Eing&auml;nge des Audio-Interfaces (<span class="ui-element">capture</span>) mit SuperCollider.

Abbildung 4: Im grafischen Tool Qjackctl verbinden Sie die Eingänge des Audio-Interfaces (capture) mit SuperCollider.

Mit der Funktion live_audio können Sie dann ein kontinuierliches externes Signal einbauen und dafür beispielsweise einen Effekt festlegen. In Listing 10 versieht Sonic Pi das eingehende Signal mit einem Hall.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben