Muzyka algorytmiczna

Zajęcia 2 (2024-10-09)

Cel zajęć

  1. Synteza dźwięku w Sonic Pi
  2. Zaawansowane zarządzanie przepływem kodu w Sonic Pi (niezrealizowano na zajęciach)
  3. Live coding

Zadanie (na 2024-10-16)

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

  1. wykorzystuje obwiednię dźwięku (ADSR)
  2. manipuluje barwą dźwięku

Zrzut kodu z zajęć

Plik: 02.rb

Synteza dźwięku w Sonic Pi

Funkcje play i synth

play :c4
sleep 1

# zachowuje się tak samo jak:

synth current_synth, note: :c4
sleep 1
with_synth :blade do
  play :c4
  sleep 1
end

# zachowuje się tak samo jak:
synth :blade, note: :c4
sleep 1

Jak płynnie przechodzić między dźwiękami

# Brak przejścia między dźwiękami
play :c4, duration: 1
sleep 1
play :c5, duration: 1
sleep 1
play :c4, duration: 1

# Skokowe przejścia między dźwiękami
x = play :c4, duration: 3
sleep 1
x.control note: :c5
sleep 1
x.control note: :c4

# Płynne przejścia między dźwiękami
x = play :c4, duration: 3, note_slide: 0.5
sleep 1
x.control note: :c5
sleep 1
x.control note: :c4

Konfiguracja syntezatora

Poniższe przykłady brzmią identycznie.

# Przykład 1
with_synth :prophet do
  with_synth_defaults res: 0.9 do
    play :c4
    play :e4
    play :g4
  end
  sleep 1
  with_synth_defaults res: 0.1 do
    play :c4
    play :e4
    play :g4
  end
end

# Przykład 2

synth :prophet, note: :c4, res: 0.9
synth :prophet, note: :e4, res: 0.9
synth :prophet, note: :g4, res: 0.9
sleep 1

synth :prophet, note: :c4, res: 0.1
synth :prophet, note: :e4, res: 0.1
synth :prophet, note: :g4, res: 0.1
sleep 1

Syntezator dsaw

synth :saw, note: :c4
synth :saw, note: :cs4
sleep 1

# detune: 1 przesuwa drugą falę o 1 dźwięk MIDI
synth :dsaw, note: :c4, detune: 1

Syntezator :piano

synth :piano, hard: 1
sleep 1
synth :piano, hard: 0.5
sleep 1

synth :piano, vel: 0.5
sleep 1
synth :piano, hard: 0.2
sleep 1

Wątki, synchronizacja, tick

Dwie pętle współbieżnie w wątkach

in_thread do
  4.times do
    play :e4, duration: 0.5
    sleep 1
  end
end

sleep 0.5

in_thread do
  loop do
    play :f4, duration: 0.5
    sleep 1
  end
end

Pętla sterowana inną pętlą

live_loop :primary do
  4.times do
    play :c5, duration: 0.125
    sleep 0.25
  end
end

live_loop :secondary do
  play :c4
  play :e4
  play :g4
  sync :primary
end

Wykorzystanie tick do odtwarzania kolejnych dźwięków

live_loop :up do
  play (note(:c4) + tick)
  sleep 1
end