Робимо радіостанцію з GTA: San Andreas

Чи хотілося вам перемикатися між радіостанціями так, як ви робили це в Сан-Андреас?

Саундтрек з GTA прославився хорошим вибором музики і забавними вставками. Компанія Rockstar виконала відмінну роботу, створюючи радіостанції для цієї гри – до речі, музику з Vice City і San Andreas можна навіть купити у вигляді наборів CD.

Щоб зробити її прослуховування більш приємним – і дечому навчитися, я вирішив зламати радіоприймач так, щоб він приймав ігрові радіостанції.

Ідея в тому, щоб можна було крутити ручку настройки приймача і перемикатися між віртуальними станціями, так, як це можна було б робити з реальним приймачем. Основною перешкодою став софт – мені хотілося б, щоб кожна віртуальна станція грала свою музику, навіть коли я її не слухаю. Знову-таки, як в реальному світі.

Давайте почнемо!

1. Обладнання

Я б із задоволенням використав би для такого проекту, з переносним і вбудованим обладнанням, щось на зразок Arduino, оскільки архітектура таких плат набагато простіше, ніж у одноплатних комп’ютерів.

Але для програвання десятків файлів одночасно потрібні потужні мізки, тому я зупинився на Raspberry Pi. Я вже використовував його для інших проектів, і впевнено почуваю себе при роботі з ним. А в якості мови програмування я обрав Python, просто тому, що у мене був такий настрій. А чи потрібні інші причини?..

2. Програмний міксер на Python

Після цього мені потрібно вибрати бібліотеку для Python, яка б могла:

  • Працювати з декількома джерелами аудіо.
  • Давала високорівневий інтерфейс для роботи з ними.

Для побудови віртуального радіо мені потрібно тільки завантажувати декілька файлів відразу та керувати гучністю відтворення. По суті, в реальності це і відбувається: кожна станція – джерело аудіо, а ручка налаштування змінює гучність цих джерел, з точки зору слухача.

Читайте також  Правила дизайну, вихід на новий рівень і дизайн-мислення

Після важкого і тривалого тестування різних варіантів (pygame-mixer, python-sounddevice, puredata з патчем для міксера), я зупинився на swmixer. Він навіть уміє відтворювати файли потоково, не завантажуючи їх в пам’ять цілком, що було дуже зручно для мене, оскільки я хотів для кожної станції об’єднати всю музику в один файл. Мені довелося зробити форк цієї бібліотеки і виправити в ній помилку, оскільки її вже не підтримували.

Я вирішив використовувати Raspberry Pi 3, оскільки модель 2B якимось чином затискала виведення аудіо. Не ставши розбиратися з тим, чому це відбувається, а просто вдовольнившись тим, що на новій платі все працює, я перейшов до наступного кроку.

3. Високорівневий датчик кута повороту (ДУП) (познайомтеся з pyKY040)

Кращою бібліотекою для Python на той момент для ДУП KY040 була бібліотека під назвою KY040, але вона не зовсім підходила під мої потреби, до того ж, мені хотілося спробувати зробити свій власний, перший, справжній модуль для Python, тому я і написав pyKY040.

Він надає:

  • Колбек на збільшення значення.
  • Колбек на зменшення.
  • Колбек на зміну.
  • Колбек натискання кнопки.

Налаштування:

  • Режим шкали (внутрішній лічильник змінюється в межах від X до Y, передається як аргумент колбек-функцій).
  • Режим кільцевої шкали (від X до Y, а потім знову X).
  • Налаштування величини кроку на шкалі.

Він дозволив мені делегувати логіку роботи ДУП і сконцентруватися на тому, що відбувається, коли я спілкуюся з ним.

До ДУП в основному коді відносяться тільки такі рядки:

tuning_encoder = pyky040.Encoder(CLK=17, DT=27, SW=22)
tuning_encoder.setup(scale_min=MIN_VFREQ, scale_max=MAX_VFREQ, step=1, chg_callback=vfreq_changed)
tuning_thread = threading.Thread(target=tuning_encoder.watch)

volume_encoder = pyky040.Encoder(CLK=5, DT=6, SW=13)
volume_encoder.setup(scale_min=0, scale_max=10, step=1, inc_callback=inc_global_volume, dec_callback=dec_global_volume, sw_callback=toggle_mute)
global_volume_thread = threading.Thread(target=volume_encoder.watch)

tuning_thread.start()
global_volume_thread.start()

 

4. Віртуальне радіо (код)

Тепер я міг програвати файли і у мене з’явився інтерфейс для роботи з ДУП. Настав час написати код для віртуального радіо.

Читайте також  Виявлені елементарні дизайн-частинки

Працює він, як віртуальний діапазон радіо. На певних віртуальних частотах (або вч) можна почути звук – це канали swmixer. Між двома вч чути суміш двох аудіоджерел.


Chn 1 Chn 2 Chn 3 Chn 4 Chn n 
 | | | | | 
 |--------------|--------------|--------------|-------------| 

 <----------------------------------------------------------> 
 віртуальна частота 

Віртуальна частота насправді являє собою просто ціле число, яке збільшується або зменшується в залежності від вашого взаємодії з ДУП.

Щоб залишити більше свободи при підрахунку гучності під час перемикання між двома вч, цей процес обробляється єдиною функцією, що повертає гучність даної станції для даної вч. Поки що ця величина змінюється лінійно, але її можна змінити, зробивши більш гучну і нестабільну криву гучності.


 VOLUME 
 /- /- 
 /- | -- /-- | -- 
-- | -- /-- | --
 | -- /-- | 
 | - /- | 
 | -- /-- | 
 | -- /-- | 
 | -- /-- | 
 | /-- | 
 | /-- -- | 
 | /-- -- | 
 | /-- -- | 
 | /- - | 
 | /-- -- | 
 - | /-- -- | /- 
 -- | /-- -- | /-- 
 ------------------------------------------------------- 
 | vfreq | 

вч попереднього вч наступного
каналу

Якщо ми застосуємо цей приклад до каналу n-1, він перетнеться з каналом n, в результаті чого ви отримаєте суміш аудіо з двох цих джерел.

У псевдокоді це виглядає так:


Коли вч змінюється (спрацював ДУП)
 -> отримати значення гучності для обох аудіоканалів
[
 -> отримати значення гучності для обох аудіоканалів
[
 обчислити довколишні канали вч (верхній і нижній)
 якщо це не той канал, його гучність дорівнює 0
 інакше обчислити гучність каналу вч
]
]
 -> призначити каналах гучність

Всі деталі є в коді. Почніть з кінця файлу, де описані колбеки для ДУП, а потім ідіть по сліду.

5. Зламуємо корпус радіоприймача

Донором виступив радіоприймач мого дідуся, Optalix TO100. За межами Франції, думаю, знайти його буде нелегко. Приблизно за €20 можна отримати прикольний, вінтажний і компактний приймальничок, який можна тягати з собою в сумці.

Читайте також  Все, що потрібно знати про вирівнювання по Flexbox

ДУП

Самі по собі ДУП влазили якраз так, що можна було закрити корпус – але після приєднання проводів-джамперів конструкція виявлялася занадто великою. Довелося видалити оригінальні пластикові коннектори і замінити на термоусадку, щоб її можна було згинати.

У тих ДУП, що я собі купив, не було різьблення – довелося імпровізувати з приєднанням їх до корпусу за допомогою картонки і термопластичного клею. Клей вирішує, як завжди.

Raspberry Pi

Роз’єм живлення я переніс на корпус, замість того, щоб втикати кабель прямо в Pi – в результаті я міг вибирати, як розміщувати комп’ютер в корпусі, не думаючи про те, куди саме на корпусі треба прилаштувати роз’єм живлення.

Я використовував кабель з роз’ємами micro-USB «мама» і «тато», але щоб звільнити більше місця, я зачистив кабель і безпосередньо припаяв до Pi – плюс до PP2 і мінус до роз’єму, який заземлений (інший варіант – PP5). І обов’язково клею побільше, щоб не відламалося.

Динамік

Динамік – оригінальний на 5Вт від приймача TO100. Він з’єднаний з підсилювачем, який з’єднаний з аудіо штекером 3,5 мм, який увіткнутий в дешевий USB ЦАП.

Все поєднано через дошку для прототипування і готово закритися на віки вічні.

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

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

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