# Live Coderen

Nu hebben we genoeg geleerd en kan het echte plezier beginnen. In deze sectie trekken we uit alle vorige secties zaken die jou laten zien hoe je je composities tot live muziek kan maken en ze in een voorstelling kan omtoveren. Daarvoor hebben we 3 hoofd ingrediënten nodig:

- Code kunnen schrijven dat geluiden kan voortbrengen - CHECK!
- Functies kunnen schrijven - CHECK!
- (benoemde) Threads kunnen gebruiken - CHECK!

We gaan aan de slag. We coderen onze eerste geluiden. We moeten eerst een functie hebben met de code die we willen spelen. Laten we eenvoudig beginnen. Wij willen ook loops oproepen die in een thread functioneren:

    define :my_loop do
      play 50
      sleep 1
    end
    in_thread(name: :looper) do
      loop do
        my_loop
      end
    end

Als dat een beetje te ingewikkeld voor je lijkt, ga dan even terug en herlees de passages over functies en threads. Het is niet al te ingewikkeld nu je je al in deze zaken verdiept hebt.

Wat we hier hebben is een functiedefinitie dat gewoon noot 50 speelt en een beat slaapt. Vervolgens definiëren we een benoemde thread genaamd `:looper` die herhaaldelijk rond `my_loop` loopt.

Als u deze code uitvoert, zult je noot 50 altijd opnieuw en opnieuw horen spelen…

## Veranderingen aanbrengen

Nu, hier is waar de pret begint. Terwijl de code nog loopt wijzigen 50 naar een ander nummer, zeg 55, druk nogmaals op de knop afspelen. Woah! Het veranderd! Live!

Het heeft geen nieuwe laag toegevoegd omdat we benoemde threads gebruiken, die voor elke naam één thread toestaat. De klank veranderde ook omdat we de functie hebben geherdefinieerd. We gaven `:my_loop` een nieuwe definitie. Wanneer de `:looper` thread rond Loopt riep deze de nieuwe definitie op.

Probeer het opnieuw te wijzigen, verander de noot, de rusttijd. Hoe zit het met het toevoegen van het `use_synth` statement? Verander het bijvoorbeeld naar:

    define :my_loop do
      use_synth :tb303
      play 50, release: 0.3
      sleep 0.25
    end

Nu het klinkt erg interessant, maar we kunnen het verder verlevendigen. In plaats van dezelfde noot opnieuw en opnieuw te spelen, speel een akkoord:

    define :my_loop do
      use_synth :tb303
      play chord(:e3, :minor), release: 0.3
      sleep 0.5
    end

Wat denk je van random noten van het akkoord te spelen:

    define :my_loop do
      use_synth :tb303
      play choose(chord(:e3, :minor)), release: 0.3
      sleep 0.25
    end

Of met behulp van een willekeurige cutoff waarde:

    define :my_loop do
      use_synth :tb303
      play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
      sleep 0.25
    end

Ten slotte, voeg enkele drums toe:

    define :my_loop do
      use_synth :tb303
      sample :drum_bass_hard, rate: rrand(0.5, 2)
      play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
      sleep 0.25
    end

Nu word het steeds spannender!

Maar voor je recht springt en je begint te live coden met functies en threads, stop met wat je doet en lees de volgende sectie over `live_loop` wat de manier van coderen in Sonic Pi voor eeuwig zal veranderen…