0t1 steckt noch in den Kinderschuhen.

Interaktives Kunstwerk mit Audiovisualisierung

In diesem Tutorial werden wir Schritt für Schritt eine faszinierende audiovisuelle Kunstinstallation mit p5.js entwickeln, die durch Nutzung von Mikrofon eingaben und dynamischen Einstellungen einzigartige Formen entstehen lässt.

    Schritt 1: Canvas und Winkelmodus einrichten

    Hier richten wir den Canvas mit einer Breite und Höhe von 700 Pixel ein und legen den Winkelmodus auf Grad fest, um die Rotationswinkel besser zu verstehen.

    function setup() {
      createCanvas(700, 700);
      angleMode(DEGREES);
      // ...
    }

    Schritt 2: Slider für die Steuerung erstellen

    Als Erstes erstellen wir die function setup()in ihr werden die benötigten Slider definiert. Eine wird über 4 Parameter definiert. Von links nach rechts durch Kommata getrennt: (der Startwert, der Endwert, der Ausgangswert, die Zwischenschritte)

    Dahinter wird der Slider durch .position() auf dem Canvas ausgerichtet

    Das createP('Radius')-Statement erstellt ein Textelement mit dem Label "Radius", das oberhalb des Sliders platziert wird.

    function setup() {
      // ...
      // Slider for minimum radius
      s4 = createSlider(50, 300, 100, 5).position(-100, -100); // Set position off-canvas to hide
      p4 = createP('Minimum radius').position(-20, -800);
    
      s6 = createSlider(50, 300, 100, 10).position(25, 850);
      p6 = createP('Radius').position(25, 800);
    
      s7 = createSlider(2, 30, 10, 5).position(175, 850);
      p7 = createP('Stroke').position(175, 800);
    
      s8 = createSlider(3, 50, 3, 3).position(325, 850);
      p8 = createP('Fragments').position(325, 800);
    
      s9 = createSlider(0, 100, 50, 20).position(475, 850);
      p9 = createP('Recurrence').position(475, 800);
      // ...
    }

    Schritt 3: Mikrofon-Input definieren und aktivieren

    Jetzt wird ein Mikrofon-Eingang definiert und eingerichtet, um Audioeingaben zu verarbeiten. Die Funktion mic.start() startet den Mikrofon-Eingang und aktiviert die Aufnahme.

    let mic;
    
    function setup() {
      // ...
      mic = new p5.AudioIn();
      mic.start();
    }

    Schritt 4: Hintergrund zeichnen und Ursprung verschieben

    Wir erstellen die fucntion draw(), um das Zeichnen auf dem Canvas zu steuern. Als Nächstes zeichnen wir den Hintergrund. Der Transparenz-Wert wird dabei dynamisch von Slider S9 vergeben. Dieser sorgt später für den Recurrence-Effekt. translate() verschiebt den Ursprung des Koordinatensystems in die Mitte des Canvas.

    function draw() {
      background(0, 0, 0, s9.value()); // Transparenter Hintergrund
      translate(width / 2, height / 2); // Ursprung in die Mitte des Canvas verschieben
      // ...
    }

    Schritt 5: Formen erstellen

    Die Funktion fill(20) wird verwendet, um die Füllfarbe der Form auf einen Grauwert von 20 festzulegen.

    Zudem wird über strokeWidth() die Linienstärke dynamisch über den Slider s7 reguliert

    Die Variable vol greift die Lautstärke des Mikrofons ab. Dieser Wert wird als Mindestradius in die Variable minRadius weitergegeben und schließlich an den Slider S4 weitergegeben.

    function draw() {
      // ...
      fill(20);
      strokeWeight(s7.value());
    
      let vol = mic.getLevel(); // Lautstärke des Mikrofons abrufen
      let minRadius = map(vol, 0, 1, 100, 1500); // Mindestradius basierend auf der Lautstärke
      s4.value(minRadius); // Slider-Wert entsprechend einstellen
      // ...
    }

    Schritt 6: Die Formen dynamisch variieren

    Hier zeichnen wir dynamische Formen, indem wir einen Bereich von Punkten durchlaufen und ihre Positionen basierend auf dem aktuellen Frame und den Slider-Werten berechnen. Wir verwenden die Sinus-Funktion für Variation und Rotation für Bewegung.

    Die for-Schleifen iteriert 5-mal, um jeweils eine Form zu erstellenfor (var n = 0; n < 5; n++).

    Über stroke() kann die Konturfarbe der Formen definiert werden.

    beginShape(); erstellt jeweils eine neue Form

    for (var i = 0; i < 360; i += s8.value()) { führt eine Schleife durch, die von 0 bis 360 geht. Das bedeutet, dass sie alle Winkel im Kreis durchgeht. Die Variable s8.value() bestimmt, wie groß die Schritte zwischen den Winkeln sind. Wenn s8.value() beispielsweise 10 ist, geht die Schleife in Schritten von 10 Grad.

    Radiusberechnung basierend auf einer Sinuswelle, die sich um den Kreis bewegt. Die Sinuswelle ändert den Radius zwischen zwei vom Benutzer festgelegten Grenzen. Der Wert für s4 stammt aus der Tonaufnahme. Der Wert für s6 aus dem Slider Radius

    var rad = map(sin(i * 5 + frameCount), -1, 1, s4.value(), s6.value());

    var x = rad * cos(i); & var y = rad * sin(i); berechnen den jeweiligen Punkt auf der x- bzw. auf der y-Achse

    vertex(x, y); fügt den aktuellen Punkt zur Form hinzu

    endShape(CLOSE); schließt die Form

    rotate(frameCount / 3); Die 3 legt hier die Rotationsgeschwindigkeit fest

    function draw() {
      // ...
      for (var n = 0; n < 5; n++) { // Anzahl der Elemente begrenzen
        stroke(255, 255, 255);
        beginShape();
        for (var i = 0; i < 360; i += s8.value()) { // Inkrement für die Rotation reduziert
          var rad = map(sin(i * 5 + frameCount), -1, 1, s4.value(), s6.value()); // Dynamische Berechnung des Radius
          var x = rad * cos(i);
          var y = rad * sin(i);
          vertex(x, y);
        }
        endShape(CLOSE);
        rotate(frameCount / 3); // Rotationsgeschwindigkeit
      }
    }

    Vollständiger Code

    function setup() {
      createCanvas(700, 700);
      angleMode(DEGREES);
      
      s4 = createSlider(50, 300, 100, 5).position(-100, -100); // Set position off-canvas to hide
      p4 = createP('Minimum radius').position(-20, -800);
    
      s6 = createSlider(50, 300, 100, 10).position(25, 850);
      p6 = createP('Radius').position(25, 800);
    
      s7 = createSlider(2, 30, 10, 5).position(175, 850);
      p7 = createP('Stroke').position(175, 800);
    
      s8 = createSlider(3, 50, 3, 3).position(325, 850);
      p8 = createP('Fragments').position(325, 800);
    
      s9 = createSlider(0, 100, 50, 20).position(475, 850);
      p9 = createP('Recurrence').position(475, 800);
      
      mic = new p5.AudioIn();
      mic.start();
    }
    
    
    function draw() {
      background(0, 0, 0, s9.value()); // Transparenter Hintergrund
      translate(width / 2, height / 2); // Ursprung in die Mitte des Canvas verschieben
    
      fill(20);
      strokeWeight(s7.value());
    
      let vol = mic.getLevel(); // Lautstärke des Mikrofons abrufen
      let minRadius = map(vol, 0, 1, 100, 1500); // Mindestradius basierend auf der Lautstärke
      s4.value(minRadius); // Slider-Wert entsprechend einstellen
      
        for (var n = 0; n < 5; n++) { // Anzahl der Elemente begrenzen
        stroke(255, 255, 255);
        beginShape();
        for (var i = 0; i < 360; i += s8.value()) { // Inkrement für die Rotation reduziert
          var rad = map(sin(i * 5 + frameCount), -1, 1, s4.value(), s6.value()); // Dynamische Berechnung des Radius
          var x = rad * cos(i);
          var y = rad * sin(i);
          vertex(x, y);
        }
        endShape(CLOSE);
        rotate(frameCount / 3); // Rotationsgeschwindigkeit
      }
    }

    Inspiration

    Hier findet ihr den vollständigen Code und unsere Inspiration für das Tutorial.


    © 0t1

    Cookies

    0t1 mag keine Kekse (und kein Tracking). Wir verwenden lediglich notwendige Cookies für essentielle Funktionen.

    Wir verwenden Schriftarten von Adobe Fonts. Dafür stellt dein Browser eine Verbindung zu den Servern von Adobe in den USA her. Wenn du unsere Seite nutzen möchtest, musst du dich damit einverstanden erklären.

    Weitere Informationen in unserer Datenschutzerklärung.