ADN First Generative Try (:minor)


Primer intento con la música generativa, usando SonicPi. Es parte del proyecto «Rivers of Souls». Le falta mucho pero tiene buena pinta.

A quien le interese el tema de la música generativa le recomiendo este vídeo de Andrew Sorensen.

Esta canción es el primer borrador de un proyecto. Aquí vemos que hay cuatro acordes C,F,G y A que hacen referencia a los a=adenina=La, g=guanina=Sol, c=citosina=do y finalmente hice un match raro con timina, escogiendo f=timina=Fa.

Cuando el proyecto esté acabado será una sistema de copia de ADN. Por ahora es un ritmo, un bajo simple, un arpegio 1ª,7ª,3ª,1ª,5ª,3ª
play_pattern_timed [cr[0],cr[3],cr[1],cr[0],cr[2],cr[1]]

Y repite lo mismo en una octava arriba con #lead usando un acorde con 9ª.
play_pattern_timed [cr[5],cr[3],cr[5],cr[4],cr[2],cr[5]]

Todo usando una escala menor
sc=:minor

Debajo está el código…

# Welcome to Sonic Pi v2.8
toL=:C2
toR=:C4
toH=:C6

#escala
sc=:minor

#adn=grados utilizables
adn=(ring :i ,:iv,:v,:vi) # CFGA
#prg=cadena de adn
prg=(ring 0,1,0,3,2) #CFCAG

#tempo
bit=0.25
#tbit/4 total de tempos en compas
tbit=6

#patrones rítmicos
ry=(spread rrand(3, tbit), tbit) #bass
ry2=(spread rrand(1, tbit), tbit) #cymball

#en el arpegio lead el volumen y la distorción varían 
v=(range 0,1, step:bit) + (range 1,0, step:bit)

#índice del programa
prgi=0
#total de vueltas
ctotal=0

46.times do
  #c=chord base que copiamos del programa
  #más adelante prg mutará
  c=adn[prg[prgi]]
  puts prgi ,prg[prgi],c, ctotal

  in_thread do #rythm
    j=0
    tbit.times do
      if ry[j]
        sample :drum_bass_hard, amp:3
      end
      if ry2[j]
        sample :drum_cymbal_pedal, amp:0.5
      end
      j=j+1
      sleep bit
    end
  end

  if ctotal > 1
    in_thread do #Bass
      use_synth :fm
      with_fx(:level, amp:5) do
        play degree(c,toL,sc), release: bit * tbit
      end
    end
  end

  if ctotal > 4 and ctotal < 40
    in_thread do #Chord
      use_synth :tb303
      cr=chord_degree(c,toR,sc,4)
      with_fx(:reverb, room:1 ) do
        play_pattern_timed [cr[0],cr[3],cr[1],cr[0],cr[2],cr[1]], bit
      end
    end
  end

  if ctotal > 9 and ctotal < 35
    in_thread do #lead
      use_synth :tri
      cr=chord_degree(c,toH,sc,5)
      with_fx(:distortion, distort: v[ctotal]/1.25, amp: v[ctotal]/2)  do
        play_pattern_timed [cr[5],cr[3],cr[5],cr[4],cr[2],cr[5]], bit
      end
    end
  end

  #los thread se ejecutan tbits y acaban sincronizados
  #el hilo principal duerme hasta que terminan
  sleep bit * tbit

  prgi=prgi+1
  if prgi>4
    prgi=0
    #elegir otro patrón rítimco
    ry=(spread rrand(3, tbit) , tbit)
    ry2=(spread rrand(1, tbit), tbit)
  end
  ctotal=ctotal+1

  if factor?(ctotal,tbit)

  end
end