# Sample Packs

Opmerking dit gedeelte van de handleiding behandeld een meer geavanceerd thema, nl. over het werken met grote bestanden van eigen samples. Dit zal bijvoorbeeld het geval zijn als je sample packs kocht of hebt gedownload en deze in Sonic Pi wenst te gebruiken.

U mag dit gedeelte gerust overslaan wanneer je tevreden bent met de ingebouwde samples.

Wanneer je werkt met grote mappen van externe samples kan het erg onhandig zijn om telkens het hele pad te typen die jouw eigen samples triggeren.

Bijvoorbeeld, stel dat je de volgende map hebt op je computer:

    /path/to/my/samples/

Als we in die map kijken vinden we de volgende voorbeelden:

- `100_A#_melody1.wav`
- `100_A#_melody2.wav`
- `100_A#_melody3.wav`
- `120_A#_melody4.wav`
- `120_Bb_guit1.wav`
- `120_Bb_piano1.wav`

Om de piano sample te spelen gebruiken we dan normaal gezien het volledige pad:

    sample "/pad/naar/mijn/samples/120_Bb_piano1.wav"

Om vervolgens de gitaar sample te willen gebruiken we ook het volledige pad:

    sample "/pad/naar/mijn/samples/120_Bb_guit.wav"

Echter, om beide samples op te roepen zijn we genoodzaakt te weten welke de naam is van deze samples in onze map. Wat als we snel door onze samples willen gaan om deze even te beluisteren?

## Sample Packs Indexeren

Als we de eerste sample binnen een map willen spelen moeten we alleen de naam van de map doorgeven aan `sample` en de index `0` als volgt:

    sample "/pad/naar/mijn/samples/", 0

We kunnen zelfs een binnenweg maken naar ons pad van de map met behulp van een variabele:

    samps = "/pad/naar/mijn/samples/"
    sample samps, 0

Als we dan de tweede sample in onze folder willen afspelen, moeten we gewoon 1 aan onze index toevoegen:

    samps = "/pad/naar/mijn/samples/"
    sample samps, 1

Merk op dat we hierbij niet meer de naam van de sample in de map hoeven op te geven, alleen de map zelf (of de snelkoppeling). Als we nu een indexnummer zouden gebruiken dat hoger is dan het aantal samples, gaan de eerste samples in de map terug aan de beurt komen, als in een kring werpt deze er zich rond. Welk nummer we ook gaan gebruiken, we komen gegarandeerd één van onze samples tegen in deze map.

## Sample Packs Filteren

Meestal is indexeren genoeg, maar soms moeten we wat meer “power” hebben om onze samples te sorteren en te organiseren. Gelukkig voegen veel sample packs nuttige informatie in de bestandsnamen toe. Laten we nog eens kijken naar de sample-bestandsnamen in onze folder:

- `100_A#_melody1.wav`
- `100_A#_melody2.wav`
- `100_A#_melody3.wav`
- `120_A#_melody4.wav`
- `120_Bb_guit1.wav`
- `120_Bb_piano1.wav`

Merk op dat we in deze bestandsnamen vrij veel informatie hebben. Ten eerste hebben we de BPM van de sample (beats per minute) aan het begin. Dus, de piano sample bedraagt 120 BPM en onze eerste drie melodieën hebben 100 BPM. Ook bevatten onze samples,de toonhoogte (key). Dus de sample van de gitaar is in Bb en de melodieën zijn in A #. Deze informatie is zeer nuttig bij het mengen van deze samples, samen met onze andere code. Bijvoorbeeld, nu weten we dat de piano sample enkel in een code past die 120 BPM heeft met toonhoogte van Bb.

Het komt wel goed uit dat we deze bijzondere naamgeving van onze sample sets ook in de code kunnen gebruiken om onze samples uit te filteren naar degene die we willen. Bijvoorbeeld, als we op 120 BPM werken, kunnen we als volgt, alle samples uitfilteren die de tekenreeks `"120"` bevatten:

    samps = "/pad/naar/mijn/samples/"
    sample samps, "120"

Deze zal ons een eerste filtering opleveren. Als we verder willen gaan zoeken naar een sample die goed past, kunnen we de index gebruiken:

    samps = “/pad/naar/mijn/samples/"
    sample samps, "120", 1

We kunnen zelfs meerdere filters tegelijk gebruiken. Bijvoorbeeld, als we willen dat een sample waarvan de bestandsnaam zowel de subtekenreeksen “120” en “A#” bevat, kunnen we die met de volgende code gemakkelijk terugvinden:

    samps = "/pad/naar/mijn/samples/"
    sample samps, "120", "A#"

Voorts zijn we nog altijd vrij om onze gebruikelijke opties voor de weergave van onze `sample` toe te voegen:

    samps = "/pad/naar/mijn/samples/"
    sample samps, "120", "Bb", 1, lpf: 70, amp: 2

## Bronnen

Het prearg(-umenten) van het sample filtersysteem herkent twee informatie types: bronnen en filters. Bronnen worden gebruikt om een lijst van potentiële te maken. Een bron kan twee vormen aannemen: Een bron kan twee vormen aannemen:

1. “/pad/naar/samples” - een tekenreeks dat een geldig pad naar een map weergeeft
2. “/pad/naar/samples/blabla.wav” - en tekenreeks die een geldig pad naar een sample weergeeft

De `sample` functie zal eerst alle bronnen verzamelen en deze gebruiken om een lange lijst van kandidaten te maken.Deze lijst wordt gevormd door eerst alle geldige paden toe te voegen en daarna alle geldige `.flac`, `.aif`, `.aiff`, `.wav`, `.wave` bestanden die deze mappen bevatten.

Kijk bijvoorbeeld even naar deze code:

    samps = "/pad/naar/mijn/samples/"
    samps2 = "/pad/naar/mijn/samples2/"
    path = "/pad/naar/mijn/samples3/foo.wav"
    sample samps, samps2, path, 0

Hier combineren we de inhoud van de samples binnen twee mappen en het toevoegen van een specifieke sample. Als `"/pad/naar/mijn/samples/"` 3 samples bevat en `"/pad/naar/mijn/samples/"` bevat er 12, zouden we 16 potentiële samples om te indexeren en te filteren hebben (3 + 12 + 1).

Standaard worden alleen de voorbeeldbestanden binnen een map in de lijst met kandidaten verzameld. Soms heb je misschien een aantal geneste mappen van samples die je lokaal wil gaan zoeken en filteren. Je kan daarom een recursieve zoekopdracht voor alle samples in alle sub-mappen van een bepaalde map doen door toevoeging van `**` aan het einde van het pad:

    samps = "/pad/naar/geneste/samples/**"
    sample samps, 0

Hou er wel rekening mee dat als je door een groot aantal folders gaat zoeken,dit veel tijd in beslag kan nemen. Maar de inhoud van alle folderbronnen worden ge-cached, dus de vertraging zal maar één keer optreden.

Ten slotte, merk op dat de bronnen eerst moeten gaan. Als er geen bron is opgegeven, zal de set van ingebouwde samples geselecteerd worden als de standaardlijst van kandidaten om mee te werken.

## Filters

Als u eenmaal een lijst van kandidaten hebt mag u het volgende filter typen om de selectie verder te reduceren:

- `"foo"` Tekenreeksen zullen filteren op sub-tekenreeksen gebeurtenissen binnen de bestandsnaam (min het pad van de map en de extensie).
- `/fo[oO]/` Reguliere expressies zullen filteren op patroonherkenning van bestandsnamen (min het pad van de map en de extensie).
- `:foo` -trefwoorden zullen naar kandidaten filteren op basis van hun gelijkenis met de bestandsnaam (min het pad van de map en extentie).
- `lambda{|a| ... }` - Procedures met één argument zullen als een kandidaat-filter gezien worden of als een genereer-functie. Het zal worden doorgegeven aan de lijst van de huidige kandidaten en moet een nieuwe lijst van kandidaten oproepen ( een lijst met geldige paden naar sample bestanden).
- `1` - Nummers zullen de kandidaat met dit index selecteren (en als een kring rond gaan als dit nodig is).

We kunnen bijvoorbeeld alle samples filteren in een map die bevat de tekenreeks `"foo"` bevat en de eerste overeenkomende sample spelen op halve snelheid:

    sample "/pad/naar/samples", "foo", rate: 0.5

Zie hulp voor `sample` voor vele gedetailleerde gebruiksvoorbeelden. Merk op dat de volgorde van de filters geëerd wordt.

## Mengsels

En tot slot, je mag lijsten gebruiken waar ook je een bron of filter kan plaatsen. De lijst zal automatisch afgevlakt worden en hun inhoud zal als reguliere bronnen en filters behandeld worden. Daarom zijn de volgende aanroepen naar `sample`, semantisch equivalent:

    sample "/pad/naar/map", "100", "C#"
    sample ["/pad/naar/map", "100", "C#"]
    sample "/pad/naar/map", ["100", "C#"]
    sample ["/pad/naar/map", ["100", ["C#"]]]

## Rond Wikkelen

Dit was een geavanceerd gedeelte voor mensen die veel kracht om sample packs te manipuleren en gebruiken nodig hebben. Moest het meeste van dit deel vraagtekens oproepen, geen nood. Waarschijnlijk hebt u dan deze functionaliteit nu nog niet echt nodig. Je zal wel merken wanneer je er aan toe bent om dan terug te keren naar dit gedeelte om met grote sample bestanden te gaan werken.