8 листопада в рамках проєкту Pandemic Media Space медіа-артист Георгій Потопальський (псевдонім Ujif_notfound) провів майстер-клас «Застосування алгоритмів у медіа-арті». Музикант поетапно розповів, як у програмі Max/MSP створити патч (за допомогою віртуальних дротів з’єднати різні модулі), що зможе переводити рухи об’єкта/об’єктів на відеозображенні з вебкамери на звукові події. На практиці цей метод Георгій Потопальський застосував у Car-Beat (2018), його наочне втілення можна побачити у Practice of Strings (укр. «Практика струнних», 2011). Відео майстер-класу і посилання на завантаження патчу — в кінці тексту.
Practice of Strings : live set 2012 from Ujif_Notfound on Vimeo.
Опис алгоритму:
Сірі дроти відповідають за передачу числових повідомлень, чорно-зелені — за відео.
- Перш за все необхідно вибудувати блок об’єктів та операцій угорі ліворуч:
– toggle («Х») — контролер для зображення стану ввімкненості/вимкненості метронома
– qmetro33 — метроном з інтервалом 33 мілісекунди між ударами (фіксує близько 30 кадрів в секунду), запускає процес розрахунків
– jit.grab підключає вебкамеру, повідомлення open і close, що під’єднані до jit.grab вмикають і вимикають вебкамеру відповідно
– jit.resamp @xscale -1. дзеркально відображає зображення з вебкамери
– jit.rgb2luma переводить зображення з вебкамери з кольору у чорно-біле
– jit.matrix 1 float32 127 480 встановлює розмір матриці 127 по осі Х і 480 по осі Y, при цьому X відповідає за звуковисотну шкалу (midi має 127 звуковисот)
– об’єкт t I I і операція jit.op @op absdiff, пов’язані двома дротами, займаються вирахуванням з кожного наступного кадру попередній для того, щоб алгоритм фіксував рух, видаючи абрис, контур зображення в кадрі
– операції jit.op @op> @val 0.1 і jit.slide @slide_down 2 відповідають за threshold — поріг, який регулює чутливість системи детекції руху (чим більше поріг, тим більше пікселів зображення буде відсіюватися); допустимим є зміна значень у цих операціях
– число у numberbox (на скріншоті виставлено значення 0.097), що приєднуваний до jit.op @op> @val 0.1, залежить від освітлення; пропускаються лише ті значення зображення, що більше числа у numberbox
- Далі переходимо до правої верхньої частини алгоритму:
– за допомогою додавання об’єктів pak 0 0, clear, setcell $ 1 $ 2 val 1., bang, jit.matrix 1 float 32 480, jit.matrix 1 float32 127 480 @interp 1 ми створюємо білу горизонтальну лінію висотою в 1 піксель, довжиною у 127 пікселів
– число в numberbox (на скріншоті виставлено значення 196), що приєднаний до об’єкта pak 0 0, визначає положення білої лінії по висоті
– об’єкт jit.matrix 1 char 127 @planemap 1 @thru 1 @srcdimstart 0 0 @srcdimend 128 0 @usesrcdim 1 серед усіх пікселів зображення 127×480 виділяє тільки білу лінію і, відповідно, відсіює усі пікселі, що поза лінією
– повідомлення srcdimstart 0 $ 1 і srcdimend 126 $ 1, що пов’язані з попередньо описаним об’єктом, передають у матрицю координати білої лінії для того, щоб відсікти усе, що вище та нижче неї
– операція jit.op @op + потрібна для складання матриць зображення і білої лінії та їх показу на екрані (для того, щоб бачити їх перетин)
– створюємо вікно відеовиводу (jit.window) і підключаємо до нього зображення з вебкамери і зображення лінії
– операція jit.op @op * відповідає за перемноження матриці зображення з матрицею білої лінії, щоб, наприклад, у подальшому — після підключення аудіогенератора — звукові події з’являлися тільки в момент перетину білої лінії об’єктом/об’єктами на зображенні (білі пікселі мають значення 1, чорні — 0; відповідно, за умови перетину чорних пікселів з білою лінією (1×0=0) результат їх перемноження дорівнює нулю і не призводить до появи звукової події, за умови перетину білих пікселів (контур об’єкта/об’єктів, що рухаються на відеозображенні) з білою лінією (1×1=1) — навпаки, звукова подія виникає)
- Нижня частина алгоритму переводить матрицю в числові значення:
– блок об’єктів jit.iter, +1, pack 0 0, set $ 2 $ 1 відповідає за переведення матриці в числові значення, визначення місця розташування одиниць, отриманих в результаті руху об’єкту/об’єктів на зображенні (перетину білого кольору контуру об’єкта з білою лінією), і співвідношення місця розташування одиниць на 127-піксельній лінії з місцем розташування частот, які будуть звучати з 127-частотної midi-шкали
– multislider потрібен для візуального відображення списків значень, у які переводиться перетин об’єкта/об’єктів зображення з білою лінією, а також для подальшої передачі цих значень за допомогою метронома gmetro 33
– об’єкт listfunnel «розпаковує» список, виводячи значення в форматі «порядковий номер / значення»
– об’єкт unpack 0. 0. (+) переводить лист «порядкових номерів / значень», отриманих раніше, в індивідуальні значення
– наступні об’єкти (t f f b, > 0., sel 1, tbb, f, f) утворюють фільтр, який відсіює нульові значення для обробки тільки одиничних чисел і визначає їх порядковий номер
– об’єкт makenote генерує midi-ноти, має входи (зліва-направо): звуковисотності (f), гучності (f), тривалості (numberbox, на скріншоті — 250)
– numberbox відповідає за тривалість звуків
– об’єкт noteout передає дані (у midi-форматі) у зовнішні пристрої — синтезатор, або іншу програму
Завантажити алгоритм можна у форматі .maxpat за посиланням
Відеозапис майстер-класу: