SoundMaster
Was passiert, wenn der eigene Körper zum Controller wird?
SoundMaster verbindet Bewegung, Klang und visuelle Abstraktion zu einer interaktiven Anwendung.
Was als Experiment mit Webcam und ASCII-Darstellung begann, entwickelte sich im Laufe des Projekts zu einer kooperativen, spielerischen Erfahrung für mehrere Personen.
Projektidee
SoundMaster ist eine interaktive Medieninstallation für zwei bis vier Personen. Über eine Kamera werden die Körperhaltungen der Teilnehmenden erfasst und in auditives Feedback umgewandelt. Das Bild wird dabei in eine abstrahierte ASCII-Darstellung übersetzt. Jeder Teilnehmende steuert dabei sein eigenes Instrument.
Gemeinsam sollen die Teilnehmenden eine verborgene Klangkombination entschlüsseln. Dabei gibt das System bewusst keine direkte Rückmeldung darüber, wer falsch und wer richtig positioniert ist. Feedback erfolgt stattdessen rein durch visuelles und auditives Feedback. Dadurch soll Interaktion und Komminikation im Mittelpunkt unserer Installation stehen.
Von Abstraktion zu Spiel
Zu Beginn stand die Frage: Wie lässt sich menschliche Bewegung ins Digitale übersetzen? Inspiriert von Matrix-Ästhetik und Glitch-Art entstand zunächst eine rein visuelle ASCII-Darstellung des Webcam-Bildes.
Im weiteren Verlauf erweiterten wir den Prototyp um Klang und das Spielprinzip von Mastermind. In SoundMaster steuern zwei bis vier Personen durch Stehen, Bücken und Knien die Instrumente Bass, Piano, Gitarre und Synthesizer. Gemeinsam gilt es, eine verborgene Klangkombination zu entschlüsseln. So wurde die visuelle Anwendung um Pose-Tracking, Sound und Kooperation erweitert. Es wurde zudem ein Punktemodus ergänzt sowie ein Zeitlimit von zwei Minuten in denen so viele Kombinationen wie möglich zu lösen sind. Die Punktzahlen werden in einem Leaderboard festgehalten.
Technische Umsetzung
SoundMaster wurde als browserbasierte Anwendung mit p5.js umgesetzt. Für die Körpererkennung verwenden wir ml5.js BodyPose mit dem MoveNet-Modell, während die Klangerzeugung über p5.sound erfolgt. Die technische Umsetzung lässt sich dabei in drei zentrale Bereiche unterteilen: Erkennung der Personen, Klassifizierung ihrer Körperhaltung und Übersetzung dieser Haltung in Klang.
1. Pose Tracking und Körpererkennung:
Mithilfe von BodyPose und -MoveNet-Modell ermittelt unser System wo und wie die Spieler positioniert sind:
bodyPose = ml5.bodyPose("MoveNet", {
modelType: "MULTIPOSE_LIGHTNING",
maxPoses: MAX_PLAYERS,
enableSmoothing: true,
minPoseScore: 0.15
});
Durch MULTIPOSE_LIGHTNING können mehrere Personen gleichzeitig erkannt werden. maxPoses begrenzt die Anzahl entsprechend unserer maximalen Spielerzahl auf vier. Das Modell liefert anschließend sogenannte Keypoints – unter anderem Positionen von Schultern, Hüften, Knien und Fußgelenken.
2. Spieler zuordnen
Da jede Person ein eigenes Instrument steuert, müssen die erkannten Körper zunächst eindeutig den einzelnen Spielpositionen zugeordnet werden:
const mirroredCenterX =
CAMERA_WIDTH - body.centerX;
let zone = floor(
map(
mirroredCenterX,
0,
CAMERA_WIDTH,
0,
playerCount
)
);
zone = constrain(
zone,
0,
playerCount - 1
);
Das Kamerabild wird je nach Spieleranzahl in zwei bis vier Bereiche aufgeteilt. Über die Position des Körpermittelpunkts wird jede Person einem Bereich und damit einem Instrument zugeordnet. Die Spiegelung des Kamerabildes wird dabei automatisch berücksichtigt.
3. Körperhaltung erkennen
Für die eigentliche Pose-Erkennung werden vor allem Schultern, Hüften, Knie und Fußgelenke ausgewertet. Aus den jeweils linken und rechten Punkten werden Mittelwerte berechnet, um die Position stabiler bestimmen zu können. Anschließend wird anhand verschiedener Merkmale zwischen den drei relevanten Körperhaltungen unterschieden.
Beim Knien wird beispielsweise überprüft, ob die Knie deutlich angewinkelt sind oder die Hüfte gegenüber der zuvor kalibrierten Stehposition abgesunken ist:
const kneesBent =
averageKneeAngle !== null &&
averageKneeAngle < 125;
const hipClearlyLower =
hipDrop > CAMERA_HEIGHT * 0.075;
if (kneesBent || hipClearlyLower) {
return "KNIEN";
}
Für das Bücken wird im Gegensatz stärker der Oberkörper berücksichtigt:
const torsoCompressed =
torsoCompression < 0.82;
const torsoMovedSideways =
torsoShiftRatio > 0.34;
if (
torsoCompressed ||
torsoMovedSideways
) {
return "BÜCKEN";
}
Trifft keine dieser Bedingungen zu, interpretiert das System die Pose als Stehen.
4. Stabilisierung
Beim Pose-Tracking kann es zu Schwankungen der erkannten Körperhaltungen kommen. Dadurch könnten leichte Veränderungen sofort übernommen werden und unser System würde schnell zwischen verschiedenen Posen wechseln.
Deshalb wird eine neue Pose erst akzeptiert, wenn diese über mehrere Frames hinweg stabil erkannt wird:
if (
poseCandidateFrames[playerIndex] >=
STABLE_POSE_FRAMES
) {
currentPoses[playerIndex] =
detectedPose;
}
Sind die Posen beide Spieler richtig, ertönt eine Erfolgsmelodie und der Bildschirm leuchtet grün auf.
5. Körperhaltung und Klangausgabe
Nach der Erkennung muss die jeweilige Körperhaltung in ein akustisches Signal übersetzt werden. Dafür verwenden wir p5.sound.
Jeder der drei Posen wird zunächst eine Note zugeordnet:
const POSE_TO_NOTE = {
STEHEN: "G",
KNIEN: "A",
BÜCKEN: "C"
};
const NOTE_FREQUENCIES = {
C: 130.81,
G: 196.00,
A: 220.00
};
6. Instrumente
Damit sich unsere Instrumente Piano, Bass, Gitarre und Synthesizer voneinander unterscheiden, werden unterschiedliche Oszillatoren miteinander kombiniert.
Beispiel Piano:
this.addOscillator(
"triangle",
1,
1
);
this.addOscillator(
"sine",
2,
0.28
);
this.addOscillator(
"sine",
3,
0.10
);
Durch die unterschiedlichen Frequenzverhältnisse erhält der Klang mehr Charakter und klingt näher am tatsächlichen Instrument, als bei einem einzelnen Sinuston. Dasselbe Prinzip wird mit unterschiedlichen Einstellungen auch für die anderen Instrumente verwendet.
7. Zusammenspiel von Tracking und Sounds
Der entscheidende Schritt besteht schließlich darin, Pose Tracking und Sound miteinander zu verbinden.
Wird eine neue Körperhaltung erkannt, wird die entsprechende Note ausgelesen und deren Frequenz an das jeweilige Instrument weitergegeben:
const base =
NOTE_FREQUENCIES[note] * 2;
this.setFrequencies(
base,
0.01
);
Dadurch erzeugt jede der drei Körperhaltungen einen anderen Ton. Die Bewegung der Spielenden wird also direkt in ein akustisches Signal übersetzt und der Klang wird gleichzeitig zur Feedbackmechanik des Spiels.
Aufbau
Die Teilnehmer stehen alle im selben Abstand vor der Kamera. Die ASCII Übersetzung wird auf einem großen Bildschirm angezeigt. Der hintere Teil des Raumes liegt im Schatten, nur die Spieler selbst benötigen das Licht, damit die Pose-Erkennung funktioniert. Die Lautsprecher links und rechts des Bildschirms spielen das Sound-Feedback ab.
Herausforderungen und Reflexion
Die Verbindung von Pose-Tracking, Sound und visueller Darstellung stellte uns besonders technisch vor Herausforderungen. Performanceprobleme und die zuverlässige Erkennung der Körperhaltungen erforderten mehrere Anpassungen. Dadurch lernten wir, unsere Ideen flexibel an technische Möglichkeiten anzupassen und schätzen besonders den Lernprozess, der SoundMaster vom visuellen Experiment zur interaktiven Anwendung weiterentwickelte.
Fazit und Ausblick
Mit SoundMaster entstand eine Installation, die Körperbewegung, Klang, visuelle Gestaltung und Game Design miteinander verbindet. Zukünftig könnte das Spiel durch weitere Posen, komplexere Kombinationen und vollständige Musikstücke erweitert werden, um Schwierigkeit und Wiederspielwert zu erhöhen.
Autoren
Michelle Ahrens, Tabea Geiger