When I got assigned the task to come up with three concept ideas for a rather extensive project in very short time, I started off with experiencing a classic case of blank page syndrome (which is exactly what it sounds like). Even creativity sometimes needs a little nudge, and for someone who knows the sweet scent of procrastination, time pressure might just be the uncomfortable companion that was needed. I spent most my free minutes contemplating, letting my thoughts go looking for new leads, asking myself the question – if I can do anything, what do I want to do? In the end, my brainstorming session was most fruitful on bike rides and right before falling asleep. In the following paragraphs I will introduce the first two of the three concepts that got shaped in those moments.
Category: Sound Design
Unity Flocking
Auf der Unity Hompage findet sich praktischerweise ein simples Tutorial mit Videoanleitung, welches Flocking-Algorithmen verständlich machen soll. Da meine C# Kenntnisse noch recht bescheiden sind, hat mich das Ganze doch etwas Zeit und nerven gekostet, aber nun, endlich, habe ich es vollbracht.
Hier der Code des FlockingManagers und des Flock Files mit Erklärung:
Code Flock manager:
using UnityEngine;
public class FlockManager : MonoBehaviour {
//Erstellt den Flock Manager
//Zugang zum Fish Game Object
public GameObject fishPrefab;
//Variierbare Startnummer an Fischen
public int numFish = 20;
//Array für die Erstellung der Fische
public GameObject[] allFish;
//Räumliche Limits
public Vector3 swimLimits = new Vector3(5.0f, 5.0f, 5.0f);
//Gemeinsame Zielposition
public Vector3 goalPos;
//Variabel verstellbare Parameter in Unity
[Header("Fish Settings")]
[Range(0.0f, 5.0f)]
public float minSpeed;
// Minimum speed range
[Range(0.0f, 5.0f)]
public float maxSpeed;
// Maximum speed range
[Range(1.0f, 10.0f)]
public float neighbourDistance;
//Distanz zum Nachbarn
[Range(0.0f, 5.0f)]
public float rotationSpeed;
//Rotationsgeschwindigkeit der FishPrefabs
void Start() {
// Erstellung der Fische
allFish = new GameObject[numFish];
//looped und instantiiert (Fisch)
for (int i = 0; i < numFish; ++i) {
//Erstellt Position des Fisches → Flockmanager+randomVektor
Vector3 pos = this.transform.position + new Vector3(Random.Range(-swimLimits.x, swimLimits.x),
Random.Range(-swimLimits.x, swimLimits.x),
Random.Range(-swimLimits.x, swimLimits.x));
allFish[i] = (GameObject)Instantiate(fishPrefab, pos, Quaternion.identity);
allFish[i].GetComponent<Flock>().myManager = this;
}
//Ziel zu dem sich die Fische hinbewegen
goalPos = this.transform.position;
}
//Wird pro Frame upgedatet
void Update() {
//dem Ziel wird jedes mal ein neuer randomisierter Faktor hinzugefügt
if (Random.Range(0.0f,
100.0f) < 10.0f) {
goalPos = this.transform.position + new Vector3(Random.Range(-swimLimits.x
, swimLimits.x),
Random.Range(-swimLimits.x, swimLimits.x),
Random.Range(-swimLimits.x, swimLimits.x));
}
}
}
Code Flocking:
using UnityEngine;
public class Flock : MonoBehaviour {
//Zugriff auf den Flock Manager
public FlockManager myManager;
//Initial Speed vom fisch
float speed;
// Bool um die Raumlimitation zu checken
bool turning = false;
void Start() {
// Random speed für jeden einzelnen Fisch
speed = Random.Range(myManager.minSpeed, myManager.maxSpeed);
}
//Wird pro Frame upgedated
void Update() {
// Bbox des Manager Cubes
Bounds b = new Bounds(myManager.transform.position, myManager.swimLimits * 2.0f);
// wenn der Fisch auf Widerstand trifft oder an die Grenzen des Cubes kommt, muss er umdrehen
RaycastHit hit = new RaycastHit();
Vector3 direction = Vector3.zero;
if (!b.Contains(transform.position)) {
turning = true;
direction = myManager.transform.position - transform.position;
} else if (Physics.Raycast(transform.position, this.transform.forward * 50.0f, out hit)) {
turning = true;
// Debug.DrawRay(this.transform.position, this.transform.forward * 50.0f, Color.red);
direction = Vector3.Reflect(this.transform.forward, hit.normal);
} else {
turning = false;
}
// Test ob gedreht wird
if (turning) {
// Drehen zum Cube Center
transform.rotation =
Quaternion.Slerp(transform.rotation,
Quaternion.LookRotation(direction),
myManager.rotationSpeed * Time.deltaTime);
} else {
// 10% chance of altering prefab speed
if (Random.Range(0.0f, 100.0f) < 10.0f) {
speed = Random.Range(myManager.minSpeed, myManager.maxSpeed);
}
// 20& chance of applying the flocking rules
if (Random.Range(0.0f, 100.0f) < 20.0f) {
ApplyRules();
}
}
transform.Translate(0.0f, 0.0f, Time.deltaTime * speed);
}
void ApplyRules() {
GameObject[] gos;
gos = myManager.allFish;
Vector3 vcentre = Vector3.zero;
Vector3 vavoid = Vector3.zero;
float gSpeed = 0.01f;
float nDistance;
int groupSize = 0;
foreach (GameObject go in gos) {
if (go != this.gameObject) {
nDistance = Vector3.Distance(go.transform.position, this.transform.position);
if (nDistance <= myManager.neighbourDistance) {
vcentre += go.transform.position;
groupSize++;
if (nDistance < 1.0f) {
vavoid = vavoid + (this.transform.position - go.transform.position);
}
Flock anotherFlock = go.GetComponent<Flock>();
gSpeed = gSpeed + anotherFlock.speed;
}
}
}
if (groupSize > 0) {
// Find the average centre of the group then add a vector to the target (goalPos)
vcentre = vcentre / groupSize + (myManager.goalPos - this.transform.position);
speed = gSpeed / groupSize;
Vector3 direction = (vcentre + vavoid) - transform.position;
if (direction != Vector3.zero) {
transform.rotation = Quaternion.Slerp(transform.rotation,
Quaternion.LookRotation(direction),
myManager.rotationSpeed * Time.deltaTime);
}
}
}
}
Flocking Tutorial:
Swarm 2
“Trotz seiner Anonymität ist ein Schwarm oft hochgradig geordnet, d.h., die Einzeltiere verhalten sich räumlich und zeitlich eng koordiniert…”
Langsam aber sicher beginnt die Idee sich zu formen. Wir befinden uns immernoch im Larvenstadium, aber unter der harten hüllen formen sich die ersten Auswüchse, welche später zu standfesten Beinen werden. Konkret bedeutet das, ich habe eine Vision.
Nach einem Erstgespräch mit Benjamin Stahl (meiner wissenschaftlichen Betreuung und Ideenmaschine seitens des IEM) sehe ich nun ein nicht mehr ganz so trübes Bild vor meinem inneren Auge. Und zwar ein Raum, aus intrinsisch ästhetischer Entscheidung eine Halbkugel, schwarz ausgefüllt. Jeder Besucher_in wir ein paar Kopfhörer aufgesetzt und ein Tablet in die Hände gegeben. Nun können die Neugierigen auf Entdeckungsreise gehen, und dem Schwarm lauschen. Durch ein Motiontracking-System, welches auf den Kopfhörern platziert ist, weiß auch der Schwarm wo sich die Besucher_innen aufhalten und kann ihnen so gekonnt ausweichen. Als kleine visuelle Stütze werden am Boden LED`s installiert sein, die schwach Leuchten sobald sich der Schwarm an einem Platz akkumuliert. Als weitere visuelle Stütze können die 3D Objekte mit dem Tablet in AR-Manier sichtbar gemacht werden und, als kleines aber interessantes Feature, auch angelockt werden.
Die Kommunikation zwischen 3D Objekten, Sound und Licht wird voraussichtlich über OSC (OpenSoundControl) passieren. Nach langem überlegen, wird Unity als Fundament eingesetzt und dann mit Middleware (Fmod, Touchdesigner, etc…) erweitert.
Als nächste große, zu überschreitende Hürde gilt es, eine gute Lösung für räumlichen Sound in Unity zu finden.
Bild:
https://www.pexels.com/de-de/foto/weihnachtsdekoration-247737/
REUSE, REPAIR, REMAKE
As a sound designer and electronics hobbyist, I enjoy developing experimental prototypes that combine different technologies such as microcontrollers, repurposed analog components, piezoelectric sensors and impulse responses, in order to create working prototypes that can later be turned into functional audio products.
The day I had to propose 3 ideas for my independent project, it was obvious to me that I would create some kind of experimental audio device.
My three proposals were:
- A Noise Box that combines experimental acoustic elements with Arduino modules, such as sensors and electric motors while also adding audio effects like reverb, delay, and some modulation effects, as well as a simple waveform generator and lo-fi Arduino based audio sampler.
- Sound effects that are based on mechanical rotation. Examples are Hammond’s Vibrato Scanner and DeArmond’s Tremolo Control.
- A musical instrument that is made out of used electronics. The proposed idea was to build a Mellotron from used cassette player parts, in which all effects should also be created with magnetic tapes.
After the first meeting with my supervisor, I have decided to go with the third proposal.
The motivation behind this project idea is to experiment with the reuse / repurpose of outdated audio devices and electric instruments.
As a result of rapid innovation, technologies that were once standards in sound recording and reproduction, became quickly outdated. But what happens to all these appliances? E-waste is now the fastest-growing waste stream in the world, estimated at 53.6 million tonnes in 2020.
In order to address this issue, I will investigate existing and possible solutions that allow the repurpose of discarded technologies, into musical instruments and audio effects.
Augenklinik LKH Graz (Nachtrag KW 44)
Nach mehreren Besuchen an der Augenklinik in Graz und langem Überlegen entschied ich mich für diese Einrichtung als Ort meiner Installation. Es soll ein auditives Leitsystem unter Berücksichtigung der Bedürfnisse der Patienten auf dieser Station entworfen und installiert werden. Das Leitsystem soll nicht nur für Patienten, sondern für alle Personen in dieser Einrichtung zugänglich sein.
Zu diesem Zeitpunkt soll jedoch noch möglichst breit gedacht werden. Dabei stellen sich mir bezüglich der Location grundsätzlich folgende Fragen:
Was passiert in dem Krankenhaus?
Wie steht die akustische Eigenschaft des Warteraums zu einem zusätzlichen Audiosignal?
Wie gehe ich mit dem Sättigungsgrad bzw. der Überreizung um?
Subsummierung der Frequenzen eines Audiosignals mit dem vorherrschenden Klang?
Von wo bis wo will ich leiten?
Welche sind die wichtigsten Aktionen der Installation?
Die in der Kalenderwoche 43 angesprochenen Parameter wie der Schalldruckpegel und die Frequenzspektren sind hauptausschlaggebend dafür, ob das System funktionieren kann.
In den nächsten Wochen werde ich mich mit diesen Fragen beschäftigen und diese versuchen zu beantworten.
Die lokale Klangökologie (Nachtrag KW 43)
Auf Basis der Fragen, welche ich in der Kalenderwoche 42 erarbeitet habe, werde ich in diesem Blogeintrag auf die Erkenntnisse der Recherche bezüglich der vorherrschenden Klangökologie eingehen.
An öffentlichen Orten herrscht keine Stille. Vorbeifahrende Autos, gehende Menschen, ein weit entferntes Autohupen und im Gesamten die Summe aller weit entfernten Schallquellen prägen eine lokale Geräuschkulisse. Diese muss auch berücksichtigt werden. Der Mensch ist täglich einer großen Menge an Reizen ausgesetzt. Ein Teil davon wird auch bewusst verarbeitet. Der andere Anteil gelangt aufgrund unserer selektiven Wahrnehmung nicht in unser Bewusstsein und wird ignoriert. Dies ist ein natürlicher Mechanismus unseres Gehirns, um uns vor einer totalen Reizüberflutung zu schützen. Die vorherrschende Geräuschkulisse muss deshalb auch bei der Installation von zusätzlichen Sounds berücksichtigt werden. Deshalb soll ein leitendes Signal unter Berücksichtigung der lokalen Soundökologie eingebettet werden. Die physikalische Größe wie der Schalldruckpegel und eine akustische Szenenanalyse anhand eines Spektrogramms (zeitliche Abfolge von Frequenzspektren) bieten in diesem Fall eine solide Grundlage, um eine erfolgreiche Einbettung in der gewählten Location durchführen zu können. Zusammenfassend soll eine mögliche akustische Nische im örtlichen Frequenzspektrum gefunden werden, damit die Installation nicht mit anderen Frequenzen in der gewählten Umgebung kollidiert.
Auch der Umstand, weshalb Menschen die Location aufsuchen, spielt bei der Klanggestaltung eine wesentliche Rolle. Trotzdem muss ein öffentliches Leitsystem alle Menschen leiten können. Somit muss auch die Bedienung bzw. Zugänglichkeit zum Leitsystem für alle möglich und logisch sein. Das System soll für alle Benutzer, egal mit welchem Hintergrund, Sinn ergeben.
Recherche:
Anwendungsfall einer für die Allgemeinheit bedienbaren Audioinstallation
Christopher Janney – Urban Instrument 1995
Wo macht ein Leitsystem Sinn? (Nachtrag KW 42)
Diese Woche habe ich das erste Gespräch mit meinem Betreuer Herrn Prof. Sontacchi geführt und erste elementare Informationen erhalten, wie das Projekt aufgebaut und abgewickelt werden muss, um den wissenschaftlichen Standards zu entsprechen.
Am Montagabend hatte ich das erste Gespräch mit meinem Betreuer und wir unterhielten uns zuerst noch einmal über die Idee und die Möglichkeiten der Umsetzung. Zu den Punkten, welche ich in der ersten Woche ausgearbeitet habe, bekam ich Literatur, um mein Wissen vertiefen zu können. Das Gespräch war sehr aufschlussreich und ermöglichte mir einen neuen und spezifischeren Blickwinkel auf das gewählte Projekt zu bekommen.
Es wurde mir Literatur zu den Themen:
- Neuropsychological Assessment ( J.A. Hofheimer, B.M. Lester, in Encyclopedia of Infant and Early Childhood Development, 2008)
- Prefrontal Cortex (Robert J. Morecraft, Edward H. Yeterian, in Encyclopedia of the Human Brain, 2002)
- Sonification (https://blog.uni-koeln.de/klangschaften/2018/02/23/sonifikation-anwendungsfaelle-datenbasierter-verklanglichung/)
- Szenenanalyse (https://www.lms.tf.fau.de/forschung/arbeitsgebiete/audiosignalverarbeitung/acoustic-scene-analysis/)
gegeben, um meine Arbeit auf Basis dieser Grundlagen sinnvoll zu beginnen.
Gegenstand dieser Woche war es unter anderem mich mit der Wahl der Location zu beschäftigen. Dabei soll die Location genau beobachtet und folgende grundsätzliche Fragen beantwortet werden, um einen groben Umfang des auditiven Leitsystems definieren zu können:
- Von wo bis wo wird geleitet?
- Muss das Gebäude auf sich aufmerksam machen?
- Was passiert in dem Gebäude?
- Aus welchem Grund wird das Gebäude besucht?
- Macht es Sinn ein auditives Leitsystem zu installieren?
- Wer besucht das Gebäude?
Besucht habe ich folgende Einrichtungen: Kunsthaus Graz, Augenklinik LKH Graz, und das Rathaus Graz.
Resultierend aus den oben genannten Themen ergaben sich für mich folgende Fragen, welche ich im nächsten Gespräch aufklären möchte.
1) Auditory Icons & Verarbeitung von Klängen (prefrontale Cortex) – wie verbinde ich diese zwei Themen?
2) Wie muss eine auditive Information aufgebaut sein (unter Berücksichtigung des menschlichen Gehirns)?
3) Ort & Einsatz – Welche akustischen Parameter muss ich in der gewählten Location berücksichtigen?
Die entstandenen Fragen aus der Literatur werde ich in der vierten Woche mit meinem Betreuer besprechen, um die Konzeption fortsetzen zu können.
Schwarmsimulation mit SoundParticles
Um einen kleinen Eindruck zu bekommen, wie sich das Produkt möglicherweise anhören könnte, habe ich mit der Software SoundParticles (welche für Studenten und nicht-kommerzielle Zwecke frei zur Vefügung steht) eine Simulation eines Schwarms kreiirt, der sich in einem virtuellen 3D Raum über den Beobachter hinweg bewegt. Praktischerweise kann man in SoundParticles mit wenigen einfachen Klicks die verschiedensten Outputmöglichkeiten auswählen. Ich habe das Projekt nun in Stereo gerendert, aber ebenfalls ein File für die Lautsprecheraufstellung im CUBE des IEM erstellt. So kann ich bei Gelegenheit (falls dieser Lockdown jemals endet) auch die Wirkung in verschiedenen Ambisonic-Klassen testen.
Für die “Partikel” habe ich fünf 30-Sekunden Soundfiles mit Xfer Serum erstellt. Speziell wurde darauf geachtet, dass das Signal möglichst trocken bleibt und sich die verschiedenen Spuren nur leicht im Pitch und Frequenzanteil unterschieden, um eine möglichst homogene, aber doch leicht variierte Masse zu erreichen. Für den Effekt eines schlagenden Flügels verwende ich einen Sawtooth-Layer mit einem relativ schnellen LFO der auf die Volume geroutet wurde (Tremolo) und einem wenige ms kurzen Transienten um mehr Charakter hineinzubringen.
Danach füge ich die Soundfiles in SoundParticles ein und erstelle eine Particle-Group. Dies scheint anfangs etwas kompliziert, da ich erst die Navigation für die Automation lernen muss (welche meiner Meinung auch noch ausbaufähig ist) aber mit etwas tüftelei fliegt mein Schwarm bald durch den 3D Raum. Hier und da noch ein paar randomisierte Parameter hinzugefügt wirkt das Ganze auch schon etwas lebendig und das Ergebnis kann sich auch schon hören lassen.
WICHTIG! Das Soundfile wurde Stereo für Lautsprecher exportiert, darum wird das Erlebnis auf Kopfhörern beeinträchtigt sein.
Es ist möglicherweise noch wichtig anzumerken, dass es sich hier nicht um eine Schwarmsimulation handelt, sondern nur um eine Darstellung mit festen Parametern um sich das auditive Abbild vor Augen (oder eher Ohren) führen zu können.
DAHIN TREIBEN
Es dauerte ein paar Tage bis wir einen Termin und einen Ort für unser Treffen festlegen konnten, was mir weitere schlaflose Nächte bescherte in denen ich versuchte mit meinen 3 Ideen zu Jonglieren, sie neu anzuordnen, jedoch fand ich die Idee „Foley-App“ immer wieder an oberster Stelle und ich wurde immer ungeduldiger. Nun konnte mich nur noch IOhannes aus diesem Strudel retten. Ich nutzte die Zeit bis zu unserem treffen nochmal alle 3 Ideen in Ruhe zu verinnerlichen:
GESTRANDET
Hier saß ich nun. Meinen 3 Ideen kreisten im Kopf, wovon mir die Foley-App nach wie vor extrem zusagte, ich jedoch bereits im Vorfeld bedenken hatte, sie in der Realität umzusetzen zu können.
Die andren 2 Ideen wurden währenddessen immer unattraktiver umso länger ich drüber nachdachte. Doch ich konnte vorerst nichts weiter tun. Ich war gestrandet. Gemeinsam mit wenigen Kollegen, bei denen sich ebenfalls noch keinen Betreuer meldete, wartete ich auf die Flaschenpost und jemanden, der auf meine Ideen aufmerksam wurde.
Die folgenden Tage verbrachte ich damit, mich so gut es geht abzulenken, da ich unsicher bezüglich meinen Entscheidungen wurde, die Ideen jedoch abgefeuert und nicht mehr änderbar waren. Ich musste beobachten wie auch die letzten Kollegen abgeholt wurden bis ich komplett alleine war. Doch schließlich war es auch bei mir soweit.
Mir wurde ein Betreuer zugeteilt der ebenfalls gefallen an meinen ersten 2 Ideen gefunden hat. Ich war gerettet!!