Muzyka algorytmiczna

Zajęcia 1 (2025-02-26)

Zadanie (na 2025-03-05, 1p)

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

  1. Wykorzystuje funkcje: live_loop, sleep, play
  2. Modyfikuje tworzone dźwięki przez dodatkowe parametry funkcji play (np. amp:)
  3. Wykorzystuje ten sam dźwięk w różnych oktawach

Zadania na zajęciach

  1. Weź udział w ankiecie.
  2. Stwórz repozytorium w ramach wydziałowego serwisu Gitea oraz udostępnij je osobie prowadzącej zajęcia.
  3. 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
  4. 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 modyfikację i dodanie dodatkowych wywołań funkcji sleep
    2. przez modyfikajcę funkcji sleep i wykorzystanie parametru delay funkcji live_loop

    Kod z zajęć

    01.rb

    Przykładowe fragmenty kodu w Sonic Pi

    Dźwięki z wykorzystaniem notacji

    play :C4
    sleep 1
    play :E4
    sleep 1
    play :G4

    Dźwięki określone liczbowo

    play 60
    sleep 1
    play 64
    sleep 1
    play 67

    Modyfikacja pojedynczego dźwięku

    play :c4, attack: 1, decay: 1, sustain: 1, release: 1

    Akord

    play :c4, amp: 0.3
    play :e4, amp: 0.3
    play :g4, amp: 0.3
    sleep 1

    Zmiana oktawy dźwięku

    play note(:c4, octave: 3)

    Odczytanie globalnego tempa

    print current_bpm

    Zmiana globalnego tempa

    use_bpm 180

    Zmiana tempa w kontekście

    with_bpm 180 do
      play :c4
      sleep 1
    end

    Zmiana globalnego syntezatora

    use_synth :dsaw

    (podobnie with_synth)

    Iteracja dźwięku przez oktawy

    12.times do |oct|
      play note(:c4, octave: oct)
      sleep 1
    end

    Gra kolejno: :c0, :c1, :c2, ..., :c11

    oct jest nazwą iteratora (zmieną pętli), może być dowolna inna. Sekcję |oct| można pomijać jeśli nie chcemy wykorzystywać licznika.

    Odtworzenie 3 razy tego samego dźwięku

    3.times do
      play :c4
      sleep 1
    end

    Dwie pętle działające równolegle

    live_loop :foo do
      play :c4
      sleep 1
    end
    
    live_loop :bar do
      play :e4
      sleep 2
    end

    Gra kolejno: :c4 i :e4, :c4, :c4 i :e4, :c4 ...

    Nazwy foo i bar są arbitralnie wybranymi nazwami.

    Odtworzenie dźwięków zdefiniowanych w tablicy

    for x in [:c4, :e4, :g4] do
      play x
      sleep 1
    end

    ADSR

    play :c4, duration: 4
    sleep 1
    play :c4, attack: 1, attack_level: 0.5
    sleep 1
    
    play :c4, attack: 0, decay: 1, sustain: 1, release: 0
    play :c4, attack: 0, decay: 1, sustain: 1, release: 0

    Zatrzymanie pętli live_loop po 3 iteracjach

    n = 0
    live_loop :foo do
      if n == 3 then stop end
      n += 1
      play :c4
      sleep 1
    end