3.7 Наборы сэмплов

# Наборы сэмплов

**Замечание: этот раздел руководства рассказывает о расширенных возможностях работы с большими директориями ваших собственных сэмплов. Рекомендуем ознакомится с ним в тех случаях, если вы загрузили или купили набор сэмплов и хотите использовать их в Sonic Pi**

**Вы можете смело пропустить этот раздел, если вам хватает встроенных сэмплов**

Работая с большими папками внешних сэмплов, вы можете ощутить неудобства при набирании полного пути к каждому отдельному сэмплу.

Например, предположим, что на вашем компьютере у вас есть папка:

```
/path/to/my/samples/
```

Когда мы посмотрим в директорию, то увидим следующие сэмплы:

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

Как правило, для того, чтобы проиграть сэмпл пианино, мы можем использовать полный путь:

```
sample "/path/to/my/samples/120_Bb_piano1.wav"
```

Если мы хотим проиграть гитарный сэмпл, мы также можем использовать его полный путь:

```
sample "/path/to/my/samples/120_Bb_guit.wav"
```

Тем не менее, оба этих вызова требуют от нас *знания* имён сэмплов внутри нашей директории. Что если мы просто хотим быстро прослушать каждый сэмпл по очереди?

## Индексирование наборов сэмплов

Если мы хотим проиграть первый сэмпл в директории, мы просто должны указать имя директории в `sample` и установить индекс в значение `0` следующим образом:

```
sample "/path/to/my/samples/", 0
```

Мы также можем создать ярлык (shortcut) нашей директории, используя переменную:

```
samps = "/path/to/my/samples/"
sample samps, 0
```

Теперь, если мы хотим проиграть второй сэмпл в директории, нам нужно прибавить 1 к нашему индексу:

```
samps = "/path/to/my/samples/"
sample samps, 1
```

Заметьте, что нам больше не нужно знать имени сэмпла в директории - мы просто должны знать название директории (или иметь её ярлык). Если мы запросим индекс, больший, чем количество сэмплов в директории, порядок сэмплов в директории будет замкнут и пойдёт по следующему кругу. Таким образом, вне зависимости от номера, мы получим один из сэмплов в директории.

## Фильтрация наборов сэмплов

Обычно, индексирования достаточно, но иногда нам необходимо сортировать и организовывать сэмплы. К счастью, большинство наборов сэмплов структурированы. Давайте ещё раз взглянем на имена сэмплов в нашей директории:

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

Заметьте, что в их именах содержится некоторая информация. Во-первых, у нас есть BMP сэмпла (удары в секунду) в начале имени. Таким образом, сэмпл пианино имеет BPM равный 120, а первые три мелодии - 100 BPM. Имена сэмплов также содержат тональность. Таким образом, гитарный сэмпл имеет тон Bb а мелодии A#. Эта информация очень полезна для сведения этих сэмплов в нашем коде. Например, мы знаем, что сэмпл пианино содержит 120 BPM и тональность Bb.

Оказывается, мы можем использовать это конкретное соглашение об именах наших наборов сэмплов в коде, чтобы помочь нам отфильтровать те, которые нам нужны. Например, если мы работаем с 120 BPM, мы можем отфильтровать все образцы, содержащие строку `` 120``, со следующим:

```
samps = "/path/to/my/samples/"
sample samps, "120"
```

Первое совпадение будет проиграно. Если мы хотим, чтобы заиграло второе совпадение, нам нужно просто изменить индекс:

```
samps = "/path/to/my/samples/"
sample samps, "120", 1
```

Более того, мы можем использовать несколько фильтров сразу. Например, если мы хотим сэмпл, имя которого содержит подстроки "120" и "A#", мы можем легко добиться этого следующим кодом:

```
samps = "/path/to/my/samples/"
sample samps, "120", "A#"
```

Наконец, мы по-прежнему можем добавлять свойства к вызову нашего `сэмпла`:

```
samps = "/path/to/my/samples/"
sample samps, "120", "Bb", 1, lpf: 70, amp: 2
```

## Источники

Система аргументов фильтров сэмплов понимает два типа информации: источники и фильтры. Источники представляют собой информацию, используемую для создания списка потенциальных совпадений. Источники бывают двух видов:

1. "/path/to/samples" - строка, представляющая относительный путь к директории
2. "/path/to/samples/foo.wav" - строка, представляющая действительный путь к примеру

Функция `sample` сначала собирает все источники и использует их для создания большого списка совпадений. Этот список создается, сначала добавляя все допустимые пути, а затем добавляя все допустимые файлы `.flac`,` .aif`, `.aiff`,` .wav`, `.wave`, содержащиеся в каталогах.

Например, посмотрите на следующий код:

```
samps = "/path/to/my/samples/"
samps2 = "/path/to/my/samples2/"
path = "/path/to/my/samples3/foo.wav"
sample samps, samps2, path, 0
```

Например, здесь мы комбинируем сэмплы из двух каталогов и добавляем конкретный сэмпл. Если `"/path/to/my/samples/"`содержит 3 сэмпла и `"/path/to/my/samples2/"`содержит 12, в сумме мы получим 16 потенциальных сэмплов на индексирование и фильтрацию (3 + 12 + 1).

По умолчанию в список совпадений попадают только файлы примеров в каталоге. Иногда у вас может быть несколько вложенных папок с сэмплами, которые вы хотите искать и фильтровать внутри. Поэтому вы можете выполнить рекурсивный поиск всех образцов во всех подпапках конкретной папки, добавив `**` в конец пути:

```
samps = "/path/to/nested/samples/**"
sample samps, 0
```

Обратите внимание, что поиск в очень большом наборе папок может занять много времени. Однако, содержимое всех источников папок кэшируется, поэтому задержка будет выполняться только в первый раз.

Наконец, заметьте, что источники *должны идти первыми*. Если не передан источник, тогда набор встроенных сэмплов будет выбран как список совпадений по умолчанию.

## Фильтры

Как только вы получили список совпадений, вы можете использовать следующие фильтры, чтобы уменьшить выборку:

* `"foo"` Строки будут фильтроваться при появлении подстроки в имени файла (минус путь к каталогу и расширение).
* `/fo[oO]/`Регулярное выражение будет фильтровать соответствие имени файла шаблону (минус путь к каталогу и расширение).
* `:foo`- Ключевое слово будет фильтровать совпадения по тому, является ли ключевое слово прямым соответствием имени файла (минус путь к каталогу и расширение).
* `lambda{|a| ... }` - Процесс с одним аргументом будет обрабатываться как фильтр списка совпадений или функция-генератор. Он принимает текущий и должен вернуть новый список совпадений (список действительных путей к сэмплам).
* `1` - Числа будут выбирать совпадение с этим индексом (зацикливаться, если необходимо).

Например, мы можем отфильтровать все образцы в каталоге, содержащем строку `"foo"`, и воспроизвести первый совпадающий образец на половинной скорости:

```
sample "/path/to/samples", "foo", rate: 0.5
```

См. Справку по `sample` для множества подробных примеров использования. Обратите внимание, что порядок фильтров соблюдается.

## Композиции

Наконец, вы можете использовать списки везде, где вы можете разместить источник или фильтр. Список будет автоматически сплющиваться, и содержимое будет рассматриваться как обычные источники и фильтры. Поэтому следующие вызовы `sample` семантически эквивалентны:

```
sample "/path/to/dir", "100", "C#"
sample ["/path/to/dir", "100", "C#"]
sample "/path/to/dir", ["100", "C#"]
sample ["/path/to/dir", ["100", ["C#"]]]
```

## Подведение итогов

Это был расширенный раздел для людей, которым нужны дополнительные возможности для манипулирования и использования наборов сэмплов. Если большая часть этого раздела не имела особого смысла, не беспокойтесь. Скорее всего, вам пока не нужна какая-либо из этих функций. Однако, вы будете знать, когда это понадобится, и вы можете вернуться и перечитать это, когда начнете работать с большими каталогами сэмплов.
