Програмування на PureData. Частина 0

Введення
Трохи загальної інформації
PureData — візуальну мову програмування для створення інтерактивних програм (в даному випадку їх частіше називають «патчі»), використовуваних для виконання і запису комп'ютерної музики, звукового дизайну і візуалізацій. Люди, знайомі, наприклад, з Max/MSP, дізнаються звичний для них графічний код, так як PureData — один з мов сімейства MAX-подібних.

Висловлюючись простіше і трохи перебільшено — це мова, заточений під програмування синтезаторів і ефектів.

У цій статті я опишу деякі елементи мови, а також основні принципи, на яких базується робота зі звуком в PureData.

PureData — багатоплатформовий, є збірки для Windows, MacOS, Linux та FreeBSD; працює як зі стандартними драйверами (ALSA, MMIO), так і з jack, ASIO, так само підтримується трансфер midi. Всі версії доступні для скачування з офіційного сайту. Рекомендую качати extended-версію, так як в ній з коробки міститься великий набір зовнішніх бібліотек, вкрай необхідні у більшості випадків.

Подання цифрового звуку
А ось тут можна згадати патефон і платівки. Який принцип запису звуку на вініл? Різак, дряпає вініловий диск, вимушено коливається під дією якогось джерела (сигнал з мікрофона, наприклад), через що на поверхні диска зріз стає звивистим, і цей слід ідеально повторює коливання різака. Згодом, коли голка рухається по цій звивистій доріжці, вона коливається, точно повторюючи коливання джерела. Тобто голка зазвучить. Так от, якщо цю доріжку представити у вигляді графіка, і записати з маленьким кроком координати точок графіка — ми отримаємо звуковий файл. Таким чином WAV — не що інше, як масив чисел, які є точками якоїсь кривої. Даний процес — розбиття хвилі на точки, називається дискретизацією, а частота, з якою беруться точки для запису у файл — частота дискретизації.

З цього якраз і народжується перший аспект програмного синтезу: математично описувати звук як певну лінію, яка є графічним поданням потрібних нам коливань. Цей підхід універсальний і реалізуємо на будь-якій мові, що мають бібліотеки взаємодії зі звуковими пристроями. Хоча насправді, це не обов'язково, так як масив значень можна просто скласти в файл, повісивши розширення WAV.

Таке уявлення логічно і універсально, але не завжди зручно. Контролювати роботу програмного синтезатора набагато простіше і зручніше, якщо взаємодія елементів інтерфейсній нагадує модульний синтезатор. Для тих хто не в курсі: модульний синтезатор — це пристрій, що складається з різних самостійних компонентів (т. н модулів: генератори, фільтри, перетворювачі тощо), з'єднаних між собою проводами. В цьому випадку виконавцю відомо, який модуль за що відповідає, в якому порядку вони слідують один за одним, і, що важливо, конфігурацію можна змінювати «на гарячу».

Саме такий підхід, з точки зору побудови коду, реалізований в MAX-подібних мовах:



Отже, Другий аспект програмного синтезу на PD: взаємодія елементів мови будується за аналогією з модульним синтезатором.
На практиці ці два підходи знаходяться в симбіозі, взаимодополняя один одного.

Отже, дізнавшись, з чим ми будемо мати справу, приступимо безпосередньо до PureData.

Елементи мови PureData
a+b=?
У загальному і цілому, програмування на PureData зводиться до трьох речей: передача «імпульсів», чисел і сигналів. Основних елементів мови теж небагато, чотири: об'єкти, чисельні блоки (number box), блоки повідомлень (message box) і сполуки, схожі на дроти. Напишемо найпростішу програму, змусимо PD скласти два числа.

Отже, у вікні з новим патчем створимо об'єкт (Сtrl-1), розмістимо де-небудь цей прямокутник і впишемо туди [bng] (він же bang). Без цього об'єкта не обходиться практично не один патч. Його завдання-створити і послати імпульс. Зараз розберемося куди і навіщо. Тепер створимо два блоку з повідомленнями (Сtrl-2) і впишемо туди два довільних числа, з'єднавши bang з кожним з блоків. Отже, тепер ці числа потрібно скласти. Для цього знову створюємо об'єкт, і вписуємо в нього "+". Очікувано, правда? З'єднаємо чисельні блоки з об'єктом "+". Тепер залишилося лише вивести результат. Це можна зробити або в консоль, з допомогою об'єкта print, або залишити всередині патча, відправивши його в number box (Ctrl-3).



Щоб перевірити патч у дії, його потрібно заблокувати (Ctrl-E) і натиснути на об'єкт bang. Отже, в консолі або в numbreBox'e, ми бачимо результат. Якщо він хибний — не лякайтеся, рядком нижче все розберемо. Що сталося, натиснувши на bang, ми створили імпульс, який по сполукам прийшов до блоків повідомлень і передав їх далі об'єкту додавання і т. д.

А тепер спробуємо зрозуміти, чому у деяких з нас результат додавання невірний. Просто натисніть bang ще раз. Тепер вірно? Справа в тому, що на правильність виконання арифметичних операцій впливає порядок з'єднання елементів. При побудові патча, схожим з нашим, правильність гарантується, якщо об'єкти були з'єднані справа-наліво. Це дуже незручно, неможливо налагодити і знайти помилку. Але цього всього можна уникнути, якщо застосувати інший об'єкт, завдання якого розбивати вхід на кілька потоків і слати імпульси одночасно.
Це об'єкт trigger.

Створимо об'єкт з цим ім'ям. Тепер поруч запишемо, що потрібно передати (bang — імпульс, float — числове значення, anything — будь). Так як ми розбиваємо імпульс на два, вміст об'єкта у нас набуває вигляду trigger bang bang, скорочено t b b. Залишилося з'єднати виходи з числами. Ось тепер результат буде вірним незалежно від порядку з'єднання.



Це, звичайно, все чудово, але як вчинити, якщо ми хочемо розрахувати довге вираження, або скористатися математичними функціями? Адже написана вищевикладеним методом найпростіша програма, начебто пошуку коренів квадратних рівнянь, буде надто складною і заплутаною. Для таких випадків в PD існує об'єкт expression або expr. За допомогою цього об'єкта можна описувати математичні і логічні вирази, а так само їх комбінації. Розглянемо той же приклад зі складанням. $f1 і $f2, як неважко здогадатися — змінні, і вони вважаються зліва-направо. Крайній лівий вхід — $f1, і далі по порядку. Кількість входів об'єкта expr дорівнює числу змінних, використовуваних у вираженні.



Післямова і F1
Сьогодні ми розглянули найбільш можливий мінімум і розібралися в різниці уявлень, в наступній статті я опишу роботу умовної логіки і найпростіші об'єкти, пов'язані з роботою над сигналами. Залишилося тільки розповісти про систему довідки. Довідкою доводиться користуватися постійно, і щоб побачити інформацію по об'єкту, досить клацнути по ньому правою кнопкою миші і вибрати пункт «help». Там буде міститися опис і, в більшості випадків, приклади використання. Повний список об'єктів і бібліотек доступний у пункті Pd help browser або по хоткей Ctrl-b.



Наступні статті та уроки, присвячені PureData я постараюся випускати не рідше одного разу в тиждень. Всіх благ.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.