LXF128:SuperCollider

Материал из Linuxformat.

Перейти к: навигация, поиск
SuperCollider

Содержание

Рингтоны в ваш телефон. SuperCollider

Создайте звуки и музыку с нуля при помощи языка сценариев. От Дэна Стоуэлла у вас в ушах зазвенит...

Случалось ежиться от звуков отвратительной мелодии для звонка? Мы это исправим. Собственные аудио-эффекты и мелодии позволит создать SuperCollider, простой язык программирования сценариев. Вам предоставляются ноты и сэмплы, и вы можете применить их для того, чтобы удивить окружающих уникальной мелодией звонка, созданной лично вами.

Чтобы установить SuperCollider из исходных текстов, скачай те и разархивируйте код с сайта http://supercollider.sourceforge.net/downloads. Имеется несколько зависимостей, которые вам предоставит менеджер пакетов (SCons для компиляции и fftw3, jackd и libsndfile для работы со звуком). Затем скомпилируйте и установите SuperCollider, а также его модули расширения для Vim и Emacs:

scons && sudo scons install && cd editors/scvim && sudo scons install-all

Конечно, если ваш дистрибутив уже содержит последнюю версию SuperCollider, ее незачем собирать вручную. Пакеты для Ubuntu доступны на https://launchpad.net/~supercollider.

Запускаем двигатель

SuperCollider можно вызы вать из скриптов, но предлагаемый нами метод позволяет легко править код.

После установки SuperCollider у вас появятся два исполняемых файла: scsynth (суперэффективный аудиодвижок) и SCLang (язык). Их можно вызывать напрямую, но удобнее работать в любимом текстовом редакторе. Сам я предпочитаю Vim.

SuperCollider использует Jack – продвинутый способ общения со звуковой картой под Linux (в качестве альтернативы, во время сборки можно выбрать Portaudio). Для управления Jack я рекомендую на редкость удобный графический интерфейс QjackCtl. Установите его из вашего менеджера пакетов, запустите из менюи нажмите Start.

Пакет SuperCollider для Ubuntu включает графические иконки для меню приложений, но в любой системе вы сможете выполнить программу через окно терминала, или вызвать scvim для запуска Vim в режиме SuperCollider. При этом появится сам Vim плюс окно, где будут отражаться результаты работы кода. Наберите в вашем редакторе Vim следующее:

“Hello world!”;

Для выполнения этого простого кода убедитесь, что ваш курсор находится на той же строке, что и код, и нажмите F6 (это в scvim; в Emacs используйте Ctrl+C Ctrl+C). Вы определили String [Строку] и попросили SuperCollider обработать ее – результат (та самая строка) появится в окне отчета. Но вы не ограничены одной строчкой кода. Наберите

(
“Maths lesson”.postln;
(3+5).postln;
)

Теперь, при курсоре внутри скобок, нажмите F5 в вашем редакторе Vim для запуска блока кода (F6 выполняет отдельную строку, F5 – целый кусок внутри скобок). Вы должны получить результа ты в окне отчета; надеюсь, их связь с набранным кодом ясна. Теперь мы можем рассмотреть, как структурирован объектно-ориентированный язык SuperCollider. В первой строке, «Math lesson» задает объект String (строка), и мы выполняем его метод postln.

Все объекты знают, что делать с методом postln – они выводят свое представление, а также символ перевода строки. Примерно то же произойдет и в следующей строке, но здесь есть один нюанс. Когда мы пишем 3+5, то создаем два целых числа, затем метод + возвращает другой целочисленный объект, являющийся результатом их сложения. Сумма распечатывается методом postln. (Скобки поставлены просто чтобы применить .postln к результату, а не к слагаемому 5). Результат на самом деле выводится дважды, но не бойтесь! Первый раз он печатается по нашему запросу с postln, а второй – потому что язык всегда выдает результат последнего выражения.

Хватит приветствий и математики: давайте, наконец, издадим какой-нибудь звук. До сих пор мы использовали только язык SuperCollider; на сей раз привлечем и аудиодвижок:

s.boot;

По умолчанию, переменная s означает аудиосервер. Вы увидите ряд сообщений в окне отчета во время загрузки сервера, соединения с Jack, и т. д., а итоговым сообщением будет

SuperCollider 3 server ready..
notification is on

Сначала мы сохраним SynthDef – определение синтезатора. Затем воспользуемся им для создания нот. Вот строка, создающая SynthDef:

SynthDef(‘sinesound’, { Out.ar(0, SinOsc.ar(440) * 0.1) }).
store;

Мы сохраняем объект типа SynthDef и сообщаем в скобках две вещи. Первая – его имя, «sinesound». Вторая – функция, определяющая звук, который мы хотим воспроизвести. Мы скоро перейдемк ней, но покамест отметим, что все находящееся внутри круглых скобок является частью функции.

Ну вот, теперь послушаем! В следующей строке заметьте, что мы на сей раз не создаем объект SynthDef, а вызываем Synth – это немного напоминает разницу между формочкой для печенья и самим печеньем:

x = Synth(‘sinesound’);

Вы должны услышать чистый звук (синусоидальную волну), исходящий из левого динамика. Поскольку мы сохранили Synth в переменной x, мы можем остановить его командой

x.free;

(или нажмите F12, чтобы прекратить все звуки разом)

Теперь разберемся с функцией, выполняемой нашим Synth. Мы определили ее так:

{ Out.ar(0, SinOsc.ar(440) * 0.1) }

Вы видите два новых типа объектов: SinOsc и Out. SinOsc может генерировать синусоидальные волны, а Out передает все это на вашу звуковую карту. Мы определяем генератор звука SinOsc, вызвав его метод ar (от «audio rate», частота звука) с одним аргументом, представляющим частоту в герцах. Таким образом, этот внутренний кусочек говорит о том, что нам нужна синусоида с частотой 440 Гц.

Затем мы умножаем ее на 0,1, чтобы приглушить громкость. Тут демонстрируется элегантная штука насчет создания музыки при помощи языка программирования: все стандартные математические операторы можно применить и к аудиосигналам. В данном случае умножение изменяет амплитуду звука.

Out используется схожим образом, но аргументов здесь два. Первый, где стоит число 0, отвечает за то, какой канал выводить: 0 – левый, 1 – правый. Второй – то, что мы хотим получить на выходе, а именно нашу не-слишком-громкую синусоиду.

Теперь, когда вы знаете, как все это работает, пора поиграть с SynthDef и что-нибудь изменить. Как насчет того, чтобы издать вместо SinOsc блеющий или визжащий звук? Или – что получит ся, если умножить нашу синусоиду на другую?

Порезвимся

Прекрасно, ноту мы создали, теперь создадим мелодию из нескольких нот. Но сперва немного видоизменим SynthDef:

Скорая помощь

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

(
SynthDef(‘ringer’, {
arg freq=440, amp=0.1, gate=1;
Out.ar(0, SinOsc.ar(freq) * amp);
FreeSelf.kr(1-gate);
}).store;
)

Звук будет тот же, что и в бывшем SynthDef, но добавилась пара синтаксических конструкций. Во-первых, мы задали для нашей функции аргументы, используя ключевое слово arg — объявив вещи, контролируемые извне. Мы превратили частоту нашей синусоиды, а также множитель ее амплитуды, в параметры под названиями freq и amp. Третий аргумент, gate [вентиль], используется в музыкальных отрывках – они устанавливают вентиль в 0, когда нужно, чтобы Synth перестал издавать звуки. Именно это делает FreeSelf: для Synth это самый простой способ остановиться.

Теперь давайте составим последовательность нот при помощи объекта Pbind. Укажем, какой инструмент использовать (только что созданный SynthDef), и серии частот:

(
p = Pbind(
‘instrument’, ‘ringer’,
‘freq’, Pseq([440, 440, \, \, \], inf)
).play;
)

Для частоты мы создаем Pseq (очередность паттернов), содержащий набор из пяти элементов: две ноты по 440 Гц и три паузы (косая черта обозначает музыкальную паузу). Очередность повторяется вечно (inf означает infinity, бесконечность), но при желании можно остановить ее с помощью

p.stop;

Вы можете также поиграть с настройками Pbind. Измените очередность нот и пауз в Pseq и создайте мелодию на свой вкус. Или даже воспользуйтесь Prand или Pshuf вместо Pseq, для выбора нот случайным образом. Длительность нот контролируется так же, как частота.

Немного помучившись, вы непременно создадите гениальный шедевр – и, естественно, захотите сохранить его для потомства. Запустите запись на сервере следующими двумя строками:

s.prepareForRecord(“/sc3test.aiff”);
s.record;

А по окончании – остановите:

s.stopRecording;

Мы рассмотрели здесь только самые основы. Вы можете создавать в SuperCollider полноценные музыкальные произведения, даже интерактивные, которые реагируют на ввод от пользователя, или генерирующие, которые звучат каждый раз по-разному. Так же можно взаимодействовать с оборудованием и создавать графические интерфейсы. За вдохновением обратитесь к богатой коллекции справочных документов или на сайт http://supercollider.sf.net/videos.

Интересный рингтон

Убедитесь, что аудиосервер загружен (s.boot), затем запустите следующий код:

(
TempoClock.tempo = 1.5;
p = Pbind(
‘midinote’, Pseq([76,74,66,68,73,71,62,64, 71,69,61,64, 69]),
‘dur’, Pseq([1, 1, 2, 2] / 4, inf)
).play;
)

Возможно, вам покажется, что он исполняет слишком знакомую мелодию. Теперь можно поиграть с кодом и испортить его – попробуйте воспользоваться нецелыми числами для полутонов, или заменить Pseq' на Prand для проигрывания нот в случайном порядке.

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию