Muzyka algorytmiczna

Zajęcia 5 (2024-10-30)

Cel zajęć

  1. Komunikacja sieciowa w Sonic Pi
  2. Przykłady algorytmicznej kompozycji

Zadanie

Na kolejne zajęcia (2024-11-06)

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

Przydatne informacje: mikrotony, generowanie skal równomiernie temperowanych.

Na zajęciach

Przygotowanie programu w Sonic Pi, który:

  1. Otrzymuje 4 dźwięki (w postaci liczb MIDI) przez komunikaty OSC na ścieżce /next od dowolnego nadawcy
  2. Odtwarza je
  3. Przekształca co najmniej jeden z dźwięków
  4. Wysyła do kolejnej osoby przez komunikat /next

Przyklady przekształceń: zmiana o oktawę, dodanie losowego przesunięcia, reinterpretacja w innej skali, zmiana kolejności dźwięków. Zachęcam do kreatywności!

Zrzut kodu z zajęć

Wykorzystano wyłącznie poniższe przykłady.

Akordy

Akordy można tworzyć poprzez funkcję chord, przyjmującą bazowy dźwięk oraz rodzaj akordu.

# To:
play :c4
play :g4
play :e4
sleep 1

# Jest równoważne temu:
play [:c4, :g4, :e4], amp: 3
sleep 1

# i temu:
play chord(:c4, :maj), amp: 3
sleep 1

# A to:
play [:c4, :g4, :e4]
sleep 1

# Temu:
play :c4, amp: 1/3r
play :g4, amp: 1/3r
play :e4, amp: 1/3r
sleep 1

# I temu:
play chord(:c4, :maj)

Open Sound Control

W trakcie zajęć 2024-10-30 znaleziono kilka problematycznych zachowań Sonic Pi w ramach komunikacji OSC. Komunikaty nie były zawsze przesyłane pomiędzy komputerami, na niektórych udawało się wyłącznie nadawać, na innych wyłącznie odbierać. Wykorzystywanie OSC uznawane jest przez to jako eksperymentalne.

Podstawowa komunikacja

Komunikaty OSC odbierane są poprzez funkcję sync; wysyłane poprzez funkcje osc, osc_send.

Przykład lokalnej komunikacji OSC

live_loop :consumer do
  a, b = sync "/osc:127.0.0.1:*/go"
  play a
  sleep 1
  play b
end

live_loop :producer do
  osc_send "127.0.0.1", 4560, "/go", :e4, :f4
  sleep 2
end

Odbierz, zmień i wyślij dalej

Z użyciem pierścieni:

live_loop :transform do
  sounds = (sync "/osc*/next").ring
  play_pattern_timed sounds, 1
  osc_send "adres IP kolejnej osoby", 4560, "/next", *sounds.reverse
end

Manualnie:

live_loop :transform do
  a, b, c, d = sync "/osc*/next"
  play_pattern_timed ring(a, b, c, d), 1
  osc_send "adres IP kolejnej osoby", 4560, "/next", d, c, b, a
end

Mikrotony

Mikrotony - interwały mniejsze od półtonu. W Sonic Pi półton to wartość 1, więc mikrotony to wartości ułamkowe jak 0.5. Poniższe przykłady odtwarzają te same dźwięki, zapisane w różnych formatach:

# stosując zapis z przecinkiem
play 60
sleep 1
play 60.25 # przesunięcie o 0.25 półtonu (= 25 centów)
sleep 1
play 60.5  # przesunięcie o 0.5 półtonu (= 50 centów)
sleep 1

# stosując zapis ułamkowy
play 60
sleep 1
play 60 + 1/4r
sleep 1
play 60 + 1/2r
sleep 1

# zapisując w centach
play 60
sleep 1
play 60 + 25/100r
sleep 1
play 60 + 50/100r
sleep 1

# zapisując w Hz
play hz_to_midi(261.6255653005986)
sleep 1
play hz_to_midi(265.4309967761148)
sleep 1
play hz_to_midi(269.2917795270241)
sleep 1