Створення звукових подій шляхом детекції рухів на відеозображенні у Max 8 (Max/MSP/Jitter)

 

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.

Опис алгоритму:

Сірі дроти відповідають за передачу числових повідомлень, чорно-зелені — за відео.

  1. Перш за все необхідно вибудувати блок об’єктів та операцій угорі ліворуч:

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

  1. Далі переходимо до правої верхньої частини алгоритму:

– за допомогою додавання об’єктів 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) — навпаки, звукова подія виникає)

  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 за посиланням

 

Відеозапис майстер-класу:

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *