Muzyka algorytmiczna

Zajęcia 7 (2024-11-13)

Cel zajęć

  1. Kontrola współbieżnych programów w Sonic Pi

Zadanie (na 2024-11-20)

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 sample (co najmniej jeden zewnętrzny)

Prezentacja z wykładu o minimaliźmie

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

Zrzut kodu z zajęć

Plik: 07.rb, minecraft-sounds.rb

Gotowy materiał audio

Dokumentacja funkcji sample

Wstępne ładowanie długich plików audio: load_sample

Dostosowanie długości odtworzenia sample'a

Przez skurczenie / rozciągnięcie do zadanej długości

use_synth :blade
live_loop :test do
  sample :loop_amen, beat_stretch: 4
  play_pattern_timed(ring(:f4, :f5, :e4, :e5), 1)
end

Przez zmianę prędkości odtwarzania

sample :loop_breakbeat, rate: 1
sleep sample_duration(:loop_breakbeat, rate: 1)

sample :loop_breakbeat, rate: 0.5
sleep sample_duration(:loop_breakbeat, rate: 0.5)

sample :loop_breakbeat, rate: 2
sleep sample_duration(:loop_breakbeat, rate: 2)

Przez wybór fragmentu

sample :arovane_beat_a, start: 0, finish: 0.1
sleep sample_duration(:arovane_beat_a, start: 0, finish: 0.1)

sleep 1

sample :arovane_beat_a, start: 0.9, finish: 1
sleep sample_duration(:arovane_beat_a, start: 0.8, finish: 1)

Wykorzystywanie plików audio

tomatoes.wav

Poniższy przykład zakłada, że plik znajduje się w tej samej ścieżce co Sonic Pi. Rekomendowanym jest używanie pełnych ścieżek (absolute path).

Windows: \ należy zamienić na \\: ścieżka "C:\Users\test\test.wav" na "C:\\Users\\test\\test.wav"

use_bpm 60

tomatoes = "tomatoes.wav"

sample tomatoes, pitch: 12
sleep sample_duration(tomatoes)

12.times do |n|
  rate = 1 + 0.25 * n

  s = 0.4
  f = 0.67
  sample tomatoes, start: s, finish: f, rate: rate, lpf: :c7
  sleep sample_duration(tomatoes, rate: rate, start: s, finish: f)
end

sample tomatoes, rate: 0.8, attack: 0, decay: 0, sustain: 0, release: sample_duration(tomatoes)

Efekty

# W przypadku fxów pomaga wcześniej załadować:
load_sample "tomatoes.wav"

with_fx :panslicer, smooth: 0.25 do
  with_fx :reverb do
    with_fx :flanger do
      with_fx :ring_mod do
        sample "tomatoes.wav"
      end
    end
  end
end

Równolegli „wykonawcy”

use_bpm 60
use_synth :prophet

# Tworzymy 3 wątki wykonujące utwór
3.times do
  # Wywołanie rand pozwala na rozpoczynanie od innej wartości losowej w każdym z fragmentów
  # przez pomijanie stanów generatora liczb pseudolosowych
  in_thread do
    # Każdy z wątków ma szansę na wykonanie od 0 do 6 iteracji danego fragmentu
    rand_i(6).times do
      play :f2, cutoff: :f4
      sleep 1
      play :e2, cutoff: :e4
      sleep 1
    end

    rand_i(6).times do
      with_fx :slicer, phase: 0.5 do
        sn = synth :prophet, sustain: 4, note: :e1, cutoff: :e3, cutoff_slide: 4
        control sn, cutoff: :e4
        sleep 4
      end
    end

    blade = synth :blade, note: :e3, note_slide: 0.5, duration: 10000
    rand_i(6).times do
      blade.control note: (ring :f3, :e3).tick
      sleep 1
    end
    blade.control note: :c9, cutoff: 0, cutoff_slide: 2

    rand_i(6).times do
      with_fx :slicer, phase: 0.25 do
        sn = synth :prophet, sustain: 4, note: :e1, cutoff: :e2, cutoff_slide: 4
        control sn, cutoff: :e3
        sleep 4
      end
    end

    rand_i(6).times do
      play :e5
      sleep 1
      play :f5
      sleep 1
    end
  end
end