Muzyka algorytmiczna

Zajęcia 4 (2025-03-19)

Zadanie (na 2025-03-26)

Przygotowanie krótkiego utworu (~1min) w środowisku Sonic Pi, spełniającego następujące wymagania:

  1. Utwór minimalistyczny (wg definicji z wykładu)
  2. Wykorzystujący pseudolosowość (co najmniej jedna wylosowana liczba)
  3. Wykorzystujący wielowątkowość (co najmniej dwa równolegle działające fragmenty programu)

Terry Riley's "In C" - artykuł anglojęzyczny stanowiący dobry wstęp do minimalizmu.

Zadania na zajęciach

  1. Stwórz utwór, realizujący następujący algorytm:
    1. Wybierz dźwięk początkowy
    2. Uruchom dwa wątki, każdy z nich losuje losowe przesunięcie dźwięku początkowego w zakresie od -12 do 12, odtwarza go i śpi 1 uderzenie. Jeśli dźwięk jest poza zakresem od :c2 do :c6 powraca do dźwięku początkowego.
  2. Stwórz utwór o następującej strukturze:
    1. Wylosuj 30 dźwięków o losowej wysokości od 200Hz do 400Hz. Tworzą one akord początkowy.
    2. Odtwórz akord początkowy, stopniowo zwiększając jego głośność (pamiętaj by przed wykonaniem akordu zmienić dźwięki z Hz na MIDI przy pomocy funkcji hz_to_midi)
    3. Powoli przejdź z akordu początkowego do następującego: (ring :d1, :d2, :a2, :d3, :a3, :d4, :a4, :d5, :a5, :d6, :fs6), cały czas zwiększając głośność aż do osiągnięcia maksymalnej głośności (pełnej, 1.0)

Generowanie liczb pseudolosowych

Sonic Pi posiada wbudowany generator liczb pseudolosowych, którego stan początkowy jest taki sam przy każdym uruchomieniu.

Tworzenie losowego akordu

akord = []

# Akord ma 12 dźwięków
12.times do
	# Akord składa się z dźwięków od 60 do 72
  akord.push(rrand_i(60, 72))
end

# Odtwarzamy akord
play akord

Płynne prejście z akordu na akord

x = play [:c4, :e4, :g4], duration: 4, note_slide: 1
sleep 1
control x, notes: [:f4, :d4, :a4]

Rozwiązanie zadania 1

# Wylosuj dźwięk
n = note(:c4)

# Powtórz dwa razy
2.times do
  # Stwórz wątek
  in_thread do
    # Powtarzaj w nieskończoność
    loop do
      # Wylosuj przesunięcie
      d = rand(-12, 12)
      # Odtwórz dźwięk
      play (n + d), amp: 1 / 2.0
      sleep 1

      # Zapisz przesunięcie
      n += d

      # Jeśli jest poza zakresem powróć do niego
      if n <= note(:c2) or n >= note(:c6)
        n = note(:c4)
      end
    end
  end
end