Riff's og datastrukturer

Gentagelser i musik

Gentagelse af passager er en fundamental del af musik. Vi starter med et eksempel, som I nok har hørt før.

Der er ret meget gentagelse i den sang.

Et stykke, der bliver gentaget på den måde kalder man ofte for et riff og det er en basal byggesten når man skal skrive musik.

Tilfældige riffs

Until videre har vores tilfældige musik været en lang strøm af tilfældige noder. Men sådan fungerer musik jo ikke. Vi skal lave nogle tilfældige riffs som gentages.

Datastrukturer i Sonic Pi

SonicPi har noget, der hedder lister og det er en smart måde, til at gemme f.eks. en række noder. Vi har allerede set det lidt i scala funktionen, men nu vil vi grave os dybere ned.

Her trækker vi en scala, skriver den ud og spiller noderne efter tur. Dvs. vi itererer over listen.

use_bpm 120
use_synth :fm

sang = (scale :d3, :major, num_octaves: 2)

print sang

sang.each do |node|
  play node
  sleep 1
end

Ok, det er en liste som vi kan gentage så mange gange som vi har lyst til, men vi skal have smidt noget sjovt tilfældigt ned i den først.

AutoRiffer 1

use_random_seed 42
use_bpm 120
use_synth :fm

sang = []
i = 0
8.times do
  sang[i] = (scale :d3, :major, num_octaves: 2).choose
  i += 1
end

print sang

loop do
  sang.each do |node|
    play node
    sleep 1
  end
end

Her starter vi med en variabel 'sang' der peger på en tom liste. Derefter kører vi 8 gange rundt i en løkke og vælger en tilfældig node ligesom vi plejer. Denne tilfældige node tilføjer vi så til enden af listen og så ender vi med et tilfældigt riff som vi kan cykle rundt i.

Programmet vil altid spille den samme 'tilfældige' sang, hvis ikke man ændre på random seed.

AutoRiffer 2

Genbrug er gud når det gælder programmering så vi vil gerne pakke riff koden ind i en funktion og gøre den mere generel. Så kan man bruge den til riffs af alle mulige længder og forskellige skalaer. På den måde kan den bruges af alle instrumenterne.

use_random_seed 42
use_bpm 120
use_synth :fm

define :riffer do |n, pool|
  riff = []
  i = 0
  n.times do
    riff[i] = pool.choose
    i += 1
  end
  return riff
end

sang = riffer 8, (scale :d3, :major, num_octaves: 2)
print sang

loop do
  sang.each do |node|
    play node
    sleep 1
  end
  sleep 1
end

Hvis vi skal være ekstra smarte så kan vi udvide funktionen så den laver tilfældige pauser i vores riff.

AutoRiffer 3

# Autoriffer

use_random_seed 42 # change number for new riff
use_bpm 120
use_synth :fm

define :riffer do |n, pool, odds=0|
  riff = []
  i = 0
  n.times do
    if one_in(odds)
      riff[i] = :r
    else
      riff[i] = pool.choose
    end
    i += 1
  end
  return riff
end

sang = riffer 8, (scale :d3, :major, num_octaves: 2), 6
print sang

loop do
  sang.each do |node|
    play node
    sleep 1
  end
end

Her kan man justere odds for pauser i musikken. I eksemplet er odds 1/6 for, at en node er tom.

Resourcer


Retur til StartSide

AutoRiff (last edited 2019-11-26 19:21:27 by JohnRohde)