Візуалізація, яка живе у програвачі
Більшість програвачів дають аналізатор спектра і на цьому зупиняються. У rox ці панелі є, є рушій Milkdrop для двадцяти років пресетів, а під ними шар модуляції: іменовані сигнали, зняті зі звуку, спрямовані у входи шейдерів, які ви пишете самі, і збережені в тому самому файлі, де лежить решта вашої теми.
Спершу звичайні панелі
Панель спектра зі стилями смуг або блоків, градієнтами, позначками піків із власною гравітацією, підписами частот і поділом на зони, який аналізує вище й нижче обраної частоти вікнами різного розміру, тож кожен кінець діапазону сам міняє чутливість на роздільність. Смуга форми хвилі, яка малює весь трек по каналах і перемотує туди, куди ви клікнете. Індикатор VU. Полиця обкладинок, яка крутить їх у справжньому 3D. Нічому з цього не потрібно й рядка коду, і саме цим більшість і користуватиметься.
Пауза заморожує смуги там, де вони були, а не дає їм упасти на підлогу. Звучить дрібницею, поки ви не намагаєтеся роздивитися той самий момент, на якому поставили паузу.
Milkdrop, у панелі й позаду всього
Панель Milkdrop рендерить пресети через libprojectM у власному потоці й малює результат через той самий ланцюжок шейдерів, що й усе інше: вона стикується, іде у вкладку й відокремлюється, як будь-яка інша панель, і поверхневий шейдер лягає на неї так само. Покладіть пакет пресетів у теку, вказану на сторінці пресетів, Cream of the Crop або оригінальний набір MilkDrop, і натисніть «Пересканувати». Текстури, що йдуть усередині пакета, знаходяться самі.
«Вибрати пресет» відкриває браузер в окремому вікні: дерево тек або сітка мініатюр, фільтр, перемикач улюбленого й навігація з клавіатури. Клік по пресету одразу завантажує його позаду вікна, тож ви бачите справжній рендер, а не прев'ю. Ротація задає, що перебирають «Наступний», «Попередній» і зміна за таймером, а блокування тримає один пресет від треку до треку.
Той самий рушій працює тлом позаду кожного вікна, накладений на розмиту обкладинку із силою, яку задаєте ви. Пресет може лишити свої кольори, перевернутися під світлу тему, малювати в палітрі або взяти колір обкладинки, що грає, зберігши свої деталі, а альбомний відтінок зсуває тони до обкладинки. Зупинена черга гасить його, і потік рендера зупиняється, тож бездіяльний візуал нічого не коштує.
Шейдери на чотирьох поверхнях
Шейдер rox - це одна фрагментна стадія WGSL. Він може йти по тілу однієї панелі, окремою панеллю Шейдер, накладкою поверх усього вікна або підкладкою, що малює під усіма панелями, за обкладинкою. У накладки й підкладки є перемикач, який поширює їх на кожне відкрите вікно rox. Та сама мова, той самий блок уніформ, та сама маршрутизація в усіх випадках.
Кожен шейдер отримує годинник, роздільність, вказівник і вісім метазначень, що описують момент: гучність, де стоїть вказівник відтворення в треку, чи рухається звук насправді, довжину треку і те, наскільки темною малюється поточна палітра, тож один шейдер може вдягтися і під світле, і під темне, а не постачатися під ту єдину тему, для якої його писали.
Панельний шейдер може ще й прочитати те, що панель справді намалювала. Прив'язка маски віддає йому власне малювання панелі, повторене на прозорості, а панелі публікують форму свого вмісту, тож тінь або сяйво йдуть за вписаною в поля обкладинкою, а не за порожніми смугами обабіч неї.
Далі однієї стадії коментар // @pass ділить текст на ланцюжок до восьми, і кожна може читати попередні за іменем. Це те, що потрібне піраміді розмиття або двостадійному bloom. Рядок // @asset називає картинку для вибірки, а // @asset art: @cover прив'язує власну обкладинку треку, що грає, і переприв'язує її при зміні треку. Із застосунком ідуть дев'ять прикладів, і кожен показує свою частину цього контракту, а не дев'ять варіацій однієї плазми.
Спрямуйте панель на файл на диску, і rox почне за ним стежити. Збережіть у редакторі, і вікно вже з ним. Збереження, яке не компілюється, лишає на екрані останню робочу версію з помилкою в панелі, бо втрачати картинку - поганий спосіб дізнатися, що ви не там поставили крапку з комою.
Сигнали - та частина, яка відрізняється
Шейдер із годинником усередині - це заставка. Візуалізацією його робить те, чим ви його годуєте, а в rox це пул іменованих сигналів, спільний для всього застосунку. Ви складаєте їх в окремому вікні, у розділі «Застосунок», поруч з еквалайзером, і воно несе спектр і транспорт з тієї ж причини, з якої їх несе еквалайзер: смугу вибирають оком і вухом по тому, що ви насправді граєте.
П'ять видів джерела. Смуга - це енергія між двома частотами, той сигнал, на якому їде наростання. Рівень - це вся суміш. Атака пульсує, коли смуга стрибає вище власного недавнього середнього, і це сигнал, на якому їде удар. Тригер пульсує, коли смуга перетинає намальовану вами межу, для матеріалу, де ковзне середнє не встигає опуститися і атака затихає після першого такту. Сума накопичує інший сигнал із часом і скидається на одиниці, тож шейдер може читати її як фазу, яка рухається, поки музика гучна, і завмирає, поки ні.
У кожного є згладжування відгуку і гейт. Гейт - те налаштування, яке себе виправдовує: смуга, що їде на фоновому шумі кімнати, вічно тримає кожен прив'язаний до неї регулятор трохи вище нуля, а поріг із кривою над ним віддає між ударами тишу. Індикатор малює значення до гейта з відміченим на ньому порогом, адже смуга, що зникла під власним гейтом, ніяк не допомогла б цей гейт поставити.
Маршрут прив'язує один сигнал до одного параметра з діапазоном виходу: цей сигнал, ця ціль, звідси досюди. Шістнадцять слотів доходять до кожного шейдера, а слоти, до яких нічого не прив'язано, отримують звичайний повзунок на сторінці налаштувань, тож вигляд може бути наполовину зіграним і наполовину виставленим вручну.
Critters як аргумент
Один із робочих просторів у коробці - це весь програвач, намальований однобітним друком: упорядкований дизеринг по кожній поверхні, тони, що стискаються з саббасом, і стіна шуму за панелями, яка рухається під пісню. Це п'ять сигналів і чотири шейдери в одному файлі, і ніщо з цього не є особливим випадком у застосунку.

Завантажте його з вікна «Вітання», потім відкрийте налаштування й розберіть на частини. Решта.
Запуск чужого шейдера
Шейдери їздять усередині файлів робочих просторів, а отже імпортований вигляд приїжджає з чужим кодом.
Ніщо не запускається, поки ви не скажете. Джерело кожного шейдера отримує відбиток, а список підтверджених лежить на цій машині й пишеться лише прямою дією: ви вибрали файл, ви натиснули перезавантаження, ви вибрали пресет, ви натиснули «Підтвердити». Вигляд, який приїхав у наборі, доти просто лежить із кнопкою під ним. Приклади, що йдуть із rox, довірені за побудовою, адже вони вкомпільовані в бінарник.
Увімкнення відкриває вікно підтвердження, яке чекає на відповідь, а не відлічує час, і саме це вікно ніколи не затіняється. Що б шейдер не робив із рештою екрана, шлях назад лишається читаним.
Що не зроблено
- Маршрути доходять до слотів шейдерів і регуляторів панелі частинок. Налаштування всіх інших панелей - це й далі регулятори, які ви ставите рукою.
- Пресети Milkdrop, а не AVS. Імпорту для AVS із Winamp немає. І пресет живе файлом на вашому диску, тому який із них завантажено, лишається на цій машині, а не переїжджає всередині робочого простору.
- Немає керувальної поверхні MIDI чи OSC. Є прохід накладки й проходи панелей, і ними керують звук і вказівник.
- Прохід на все вікно - це справжній прохід GPU щокадру. На ноутбуці від батареї це вибір, який ви робите.
Відстань між «хочу, щоб увесь програвач спалахував на бочці» і готовим результатом - це смуга, гейт і маршрут, і жодному з трьох не потрібне перескладання.
Спробуйте на своїй медіатеці
Ніщо тут нікуди не звітує: аналізується той звук, який і так іде через програвач. Докладніше про те, що несе робочий простір.