Muzyka algorytmiczna

Zajęcia 13 (2025-01-08)

Cel zajęć

  1. Zaprezentowanie przykładów kompozycji zaliczeniowych
  2. Przedstawienie dodatkowych inspiracji algorytmicznych

Zadania (do realizacji na zajęciach)

Część 1

  1. Zmień domyślną oktawę dźwięków, tak by play :c wykonało dźwięk :c6
  2. Zmodyfikuj następujący program, tak by jeden z wątków wykonywał się dwa razy szybciej (nie modyfikuj instrukcji sleep):
    use_bpm 60
    
    live_loop :a do
      play :c4
      sleep 1
    end
    
    live_loop :b do
      play :e4
      sleep 1
    end
  3. Zmodyfikuj następujący program, tak by jeden z wątków wykonywał się dwa razy szybciej (nie modyfikuj instrukcji sleep):
    in_thread do
      loop do
        play :c4
        sleep 1
      end
    end
    
    
    in_thread do
      loop do
        play :e4
        sleep 1
      end
    end
    Zwróć uwagę, że w podanym fragmencie kodu nie znamy odgórnie bpm - pomocna może być funkcja current_bpm.
  4. Zmodyfikuj następującą pętlę tak by miała 20% szans by się zatrzymać przy każdym powtórzeniu:
    live_loop :maybe_stops do
      play :c4
      sleep 1
    end
  5. Zmodyfikuj kod tak by pętle foo i bar wykonują się naprzemiennie:
    live_loop :foo do
      play :c4
      sleep 1
    end
    
    live_loop :bar do
      play :e4
      sleep 1
    end
    1. przez dodanie wywołań funkcji cue i sync
    2. przez modyfikację i dodanie dodatkowych wywołań funkcji sleep
    3. przez modyfikajcę funkcji sleep i wykorzystanie parametru delay funkcji live_loop
  6. Zmień kod tak by fragmenty wykonały się w kolejności alfabetycznej bez zmiany ich kolejności w kodzie:
    use_bpm 60
    
    in_thread(name: :b) do
      play_pattern_timed (ring :e4, :f4).repeat(16), 1/8.0
    end
    
    in_thread(name: :c) do
      play_pattern_timed (ring :e4).repeat(16), 1/16.0
    end
    
    in_thread(name: :a) do
      play_pattern_timed (ring :f4, :e4).repeat(8), 1/4.0
    end
    1. przez dodanie wywołań funkcji cue i sync
    2. przez dodanie wywołań funkcji sleep

Część 2

  1. 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ść
    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)
  2. Wykorzystując sample dostępne na stronie ZTM Poznań oraz Kmart October 1989 , stwórz utwór o następującej strukturze:
    1. Przez całą długość utworu wykonywany jest sample Kmart October (pierwsze 2 minuty. Przed załadowaniem do Sonic Pi należy skrócić oryginalny plik by ułatwić załadowanie w Sonic Pi. Rekomendowanym programem do skrócenia jest Audacity).
    2. Sample poddawane są obróbce np. efektami, przesunięciem wysokości dźwięków, itp.
    3. Z losowymi odstępami wykonywane są losowe sample od ZTM Poznań, z efektami takimi jak reverb, slicer, echo.

    Ciekawostka: ZTM Poznań udostępnia też trasy tramwajów, z odstępami między przystankami, pozwalając na stworzenie rekreacji przejazdu tramwajem.

Część 3

Dla poniższego programu wykonaj następujące zadania:

use_bpm 60
use_synth :piano

define :play_section do |snds, durations|
  play_pattern_timed(snds, durations)
end

define :joy do
  # NIE MODYFIKUJ FUNKCJI JOY / DO NOT MODIFY JOY FUNCTION
  define :repeats do
    x = [76, 76, 77, 79, 79, 77, 76, 74, 72, 72, 74, 76]
    play_section x, (ring 0.5).repeat(x.length)
  end

  repeats
  play_section [76, 74, 74], [0.75, 0.25, 1]
  repeats
  play_section [74, 72, 72], [0.75, 0.25, 1]
end

joy
  1. Zdefiniuj dwóch równoległych wykonawców, jeden oktawę wyżej emulujący instrumenty smyczkowe, jeden z domyślną oktawą, używając instrumentu klawiszowego.
  2. Zmień implementację funkcji play_section, tak by wysyłała komunikaty MIDI do zewnętrznego syntezatora.
  3. Zmień implementację funkcji play_section, tak by automatycznie harmonizowała melodię.