Introducció a Sonic Pi

Festa OpenSource Girona - 23 Octubre 2021

@victormartin

Què és Sonic Pi?

  • Instrument musical electrònic (sintetitzador) open source que es programa en directe

Creat al laboratori de computació de la Universitat de Cambridge

Què es pot fer amb Sonic Pi? 😮😮😮😮

In [ ]:
live_loop :low do |idx|
  #  idx = 0
  synth :zawa, wave: 1, invert_wave: 1, phase: 0.25, release: 5, note: :e1, cutoff: (range 60, 120, 10)[idx]
  sleep 4
  idx += 1
end

live_loop :lands, auto_cue: false do |idx|
  use_synth :dsaw
  use_random_seed 66679
  with_fx :reverb, room: 1  do
    16.times do
      ns = (scale :e2, :minor_pentatonic, num_octaves: 3)
      play ns.choose, detune: 12, release: 0.1, amp: 2, amp: rand + 0.5, cutoff: rrand(70, 120)
      sleep 0.125
    end
  end
end

live_loop :bikes do |idx|
  sleep 0.25
  sample :guit_em9, rate: -1
  sleep 7.75
end

live_loop :time, auto_cue: false do |idx|
  sample :bd_haus, amp: 2.5
  sleep 0.5
end

Missió de Sonic Pi

Dissenyat sota els principis:

  • Fácil per a que un nen de 10 anys el pugui utilitzar
  • Divertit per a que fins i tot puguis perdre la noció del temps mentre jugues amb ell
  • Potent per a que puguis expressar-te artísticament a través d'ell

Va començar com un experiment per ensenyar conceptes de programació a les escoles, tot jugant amb el procés de crear nous sons

Ha evolucionat en un potent instrument musical programat, utilitzat per artistes professionals i DJs

Curset ràpid de Sonic Pi

L'aprenentatge de Sonic Pi es basa amb la exploració. No hi ha errors, només descubriments. I per sobre de tot, es tracta de divertir-se.

Recorda això: Passa-t'ho bé, explora i hackeja! 😋😋

Xerrada basada en http://sonic-pi.mehackit.org - Creative programming workshop with Sonic Pi

L'aplicació - Entorn de desenvolupament

Fer sonar una nota

In [ ]:
play 60

Provem diferents valors. Com canvia el so?

Notes Midi

Sonic Pi entén:

  1. notes MIDI (valors de 0 a 127)
  2. notació musical tradicional (:C4, :Eb3, :G5...)

Tocar una melodía

Escriu aquest codi al buffer i pulsa Run (Ctrl+R):

In [ ]:
play :C4
play 67
play 69

Efectivament, Sonic Pi ha tocat les 3 notes a la vegada. Això no es una melodía, es un acord!

Si volem que Sonic Pi reprodueixi les notes sequencialment, li hem de dir que descansi de tant en tant. Prova amb la comanda sleep:

In [ ]:
play :C4
sleep 1
play 67
sleep 1
play 69

Silencis

La comanda sleep 1 li diu a Sonic Pi que esperi un "beat" (en català polsació)

En cas que estiguis familiaritzat amb la notació musical, així es com les diferents notes es representen a Sonic Pi:

Ara sí, toquem la melodía!

In [ ]:
use_bpm 40

play 72
sleep 0.25
play 76
sleep 0.25
play 76
sleep 0.25
play 72
sleep 0.5
play 83
sleep 0.25
play 74
sleep 0.25
play 83
sleep 0.25
play 79
play 84

Repetint melodíes

Per sort, hi ha una forma fàcil de repetir melodíes (o parts de la mateixa) i evitar-nos el copy&paste 😅😅

In [ ]:
2.times do
  play :c4
  sleep 0.5
  play :d4
  sleep 0.5
  play :e4
  sleep 0.5
  play :c4
  sleep 0.5
end

També podem fer servir repeticions dins de repeticions:

In [ ]:
4.times do
  4.times do
    play :c4
    sleep 0.25
  end
  play :d4
  sleep 0.5
  play :f4
  sleep 0.5
end

Creem una cançó! 🎼🕺🎶🎶

Composem la nostra propia cançó en 3 passes:

  • Drum beat
  • Bass track
  • Lead track

Drum beat

Anem a crear un ritme de batería simple, format per bombo (kick), caixa (snare) i charles (hi-hat). Necessitem dues coses noves live_loop i sample

In [ ]:
live_loop :drums do
  sample :drum_heavy_kick
  sleep 1
end
  • live_loop es un bucle sense fi, que pot ser sincronitzat amb altres live_loops. Com a mínim ha de tenir un sleep
  • :drums es l'identificador (o el nom) del bucle. Pots anomenar-lo com vulguis, només serveix per identificar-ho de forma fàcil
  • sample li diu a Sonic Pi que reprodueixi un sample (fitxer d'àudio)

Ritme backbeat simple

El bucle comença amb un kick, caixa en el segon temps, kick en el tercer, caixa en el quart i torna a començar

In [ ]:
use_bpm 100

live_loop :drums do
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
end

Afegim hi-hat

In [ ]:
use_bpm 100

live_loop :drums do
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
end

live_loop :hats do
  sample :drum_cymbal_closed
  sleep 0.5
end

Bonus! dembow rhythm (Reggaeton)

☢️☠️ 💃🕺👯💃 ☠️☢️

In [ ]:
use_bpm 95

live_loop :kick do
  sample :bd_haus
  sleep 1
end

live_loop :snare do
  sleep 0.75
  sample :drum_snare_hard
  sleep 0.75
  sample :drum_snare_hard
  sleep 0.5
end

live_loop :hats do
  sample :drum_cymbal_closed
  sleep 0.5
end

Bass track

Afegim un altre live_loop per els nostres baixos. Composarem un groove de baix simple però sòlid.

Pots fer servir aquest piano dins el browser per ajudar-te a escollir les notes:

In [ ]:
use_bpm 95

live_loop :bass do
  play :c2
  sleep 0.25
  play :c2
  sleep 2
  play :e2
  sleep 0.75
  play :f2
  sleep 1
end

Canvi de sinte

És el moment de fer que la nostra cançó soni més interessant! Podem fer-ho canviant el sons que el sintetitzador està fent servir. El synth per defecte que fa servir Sonic Pi es diu beep. Podem canviar-lo amb el codi use_synth

In [ ]:
live_loop :bass do
  use_synth :fm
  play :c2
  sleep 0.25
  play :c2
  sleep 2
  play :e2
  sleep 0.75
  play :f2
  sleep 1
end

Hem utilitzat el synth :fm, però Sonic Pi en conté molts d'altres. Podem veure el llistat amb una mica d'explicació de cada sinte a la ajuda

Canviar la durada de les notes

En ocasions, voldrem produir sons més llargs o a velocitat diferent. Ho podem fer amb els paràmetres opcionals attack i release, que controlen la amplitud d'una nota en funció del temps

In [ ]:
# Exemple 1 - Nota de 4 'beats' de durada:
play 60, attack: 1, release: 3

# Exemple 2 - Petit 'staccato':
play 60, attack: 0, release: 0.2

El nostre groove de baix

In [ ]:
live_loop :bass do
  use_synth :fm
  play :c2, attack: 0, release: 0.25
  sleep 0.25
  play :c2, attack: 0, release: 0.3
  sleep 2
  play :e2
  sleep 0.75
  play :f2
  sleep 1
end

Lead track

Ha arribat el moment de crear la nostra melodía. En comptes de escriure una pila de comandes play i sleep, farem servir una dreçera: play_pattern_timed

en comptes de:

In [ ]:
play :c2
sleep 0.5
play :d2
sleep 0.25
play :e2
sleep 0.75
play :d2
sleep 0.5

pots escriure:

In [ ]:
play_pattern_timed [:c2, :d2, :e2, :d2], [0.5, 0.25, 0.75, 0.5]

La nostra melodia

In [ ]:
live_loop :melody do
  play_pattern_timed [:c4, :e4, :f4, :g4, :f4, :e4, :f4, :g4, :f4, :e4, :f4], \
    [0.25, 0.25, 0.25, 1.5, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], attack: 0, release: 0.2
end

Ja tenim la nostra cançó acabada 🤘😎🤘

In [ ]:
use_bpm 100

### ===== DRUMS ==========

live_loop :drums do
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
end

live_loop :hats do
  sample :drum_cymbal_closed
  sleep 0.5
end

### ===== BASS ==========

live_loop :bass do
  use_synth :fm
  play :c2, attack: 0, release: 0.25
  sleep 0.25
  play :c2, attack: 0, release: 0.3
  sleep 2
  play :e2
  sleep 0.75
  play :f2
  sleep 1
end

### ===== LEAD ==========

live_loop :melody do
  play_pattern_timed [:c4, :e4, :f4, :g4, :f4, :e4, :f4, :g4, :f4, :e4, :f4], \
    [0.25, 0.25, 0.25, 1.5, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], attack: 0, release: 0.2
end

Aleatorització i música generativa

Aquí rau la verdadera potència de Sonic Pi! Podem afegir components aleatoris a la nostra música per a que es generi en directe!

In [ ]:
use_bpm 50

live_loop :multi_beat do
  use_random_seed 2000
  8.times do
    c = rrand(70, 130)
    n = (scale :e1, :minor_pentatonic).take(3).choose
    synth :tb303, note: n, release: 0.1, cutoff: c if rand < 0.9
    sample :elec_hi_snare if one_in(6)
    sample :drum_cymbal_closed if one_in(2)
    sample :drum_cymbal_pedal if one_in(3)
    sample :bd_haus, amp: 1.5 if one_in(4)
    sleep 0.125
  end
end

Altres funcionalitats avançades de Sonic Pi

  • Escales i acords
  • Efectes de so - FX (reverb, delay, overdrive...)
  • variables i mètodes
  • Estructures de dades especials (ring, tick...)

Gràcies per escoltar! Preguntes?

Ens veiem al fòrum oficial de Sonic Pi! https://in-thread.sonic-pi.net/

Codi font / Transparències: https://github.com/GeeksCAT/2021-intro-sonicpi