Замечание: этот раздел руководства рассказывает о расширенных возможностях работы с большими директориями ваших собственных сэмплов. Рекомендуем ознакомится с ним в тех случаях, если вы загрузили или купили набор сэмплов и хотите использовать их в 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
Система аргументов фильтров сэмплов понимает два типа информации: источники и фильтры. Источники представляют собой информацию, используемую для создания списка потенциальных совпадений. Источники бывают двух видов:
Функция 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#"]]]
Это был расширенный раздел для людей, которым нужны дополнительные возможности для манипулирования и использования наборов сэмплов. Если большая часть этого раздела не имела особого смысла, не беспокойтесь. Скорее всего, вам пока не нужна какая-либо из этих функций. Однако, вы будете знать, когда это понадобится, и вы можете вернуться и перечитать это, когда начнете работать с большими каталогами сэмплов.