SWIM (Sequential Wave Imprinting Machine) — машина для последовательного волнового импринтинга, изобретенная в 1974 году в Канаде.

Сегодня посмотрим, как сделать не просто DIY‑устройство, а копию первого в мире пространственного компьютера — исторического предшественника современных концепций метавселенной.

SWIM представляет собой одну из ранних форм расширенной реальности (XR), которая позволяет буквально поймать звуковые волны на фотоснимке.

Принципиальное отличие SWIM от классического осциллографа — в системе координат. Осциллограф отображает амплитуду звуковых колебаний как функцию времени и показывает ее изменение. Напротив, SWIM визуализирует волну как функцию пространства — «замораживает» ее, позволяя увидеть форму и измерить длину.

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

Используйте навигацию, если не хотите читать весь текст

Небольшое предисловие

Научная и историческая основа этого проекта подробно изложена в академических публикациях. Ключевая работа — статья Стива Манна «Феноменологическая дополненная реальность с использованием машины последовательного волнового импринтинга (SWIM)», представленная на конференции IEEE Games, Entertainment, Media Conference (GEM) в 2018 году.

Если авторизоваться на IEEE Xplore не получается, можно скачать PDF‑версию.

Труд Манна формализует концепцию и описывает изобретение. Дополнительные сведения отыскиваются в более ранней публикации Mann and Wyckoff 1991 года, которая также закладывает теоретические основы технологии. Эти документы подтверждают значимость SWIM как фундаментального шага в развитии взаимодействия человека и компьютера.

Перечень материалов и инструментов

Электронная база

Лабораторный набор на основе микроконтроллера Teensy с аудиокартой (Teensy Audio Shield).

Система визуализации

Для начала сгодится и короткая адресуемая светодиодная лента на 24 светодиода. Однако можно использовать и варианты с большей плотностью пикселей. К счастью, сегодня на рынке представлено множество всевозможных моделей.

Примечательно, что во время создания SWIM в 1974 году подобных компонентов не существовало. Автору изобретения пришлось спроектировать и изготовить первую в мире адресуемую светодиодную ленту специально для своего проекта.

Основа для сборки

1. Деревянные бруски для изготовления подвижной каретки — например, сечением 40 x 90 мм и 20 x 65 мм.

2. Длинный устойчивый стол — он же будет служить направляющей.

3. Подходящий материал для измерительной линейки — например, листовой пенокартон.

4. Длинный стержень или рейка для крепления каретки.

5. Опционально: небольшой кусок войлока или ткани для более плавного скольжения по направляющей.

30+ бесплатных курсов на IT-темы в Академии Selectel

Для начинающих и опытных специалистов.

Изучить →

Шаг 1. Изготовление шкалы с крупной разметкой

Первый этап — создание измерительной шкалы, разметка которой будет хорошо читаться на фотографиях. Нужна длинная планка с четкими и крупными делениями.

На помощь можно призвать магазинную измерительную линейку. Наносим на заготовку отметки с шагом, скажем, в сантиметр или два. Чтобы не перегружать шкалу, нумеровать каждое деление не нужно — достаточно прочертить крупные, хорошо заметные цифры с интервалом 10 см. Линии должны быть толстыми и контрастными.

Например, шкалу можно изготовить из листа белого пенокартона размером приблизительно 50 x 80 см. Разрежем его пополам, получится две полосы — 25 x 80 см каждая. Соединим их в длину, выйдет шкала около 160 см — как раз для стола соответствующего размера.

Шаг 2. Сборка подвижной каретки

Подвижная каретка — это ключевой узел в конструкции. Он  должен обеспечить равномерное и прямолинейное движение светодиодной ленты вдоль измерительной шкалы. По сути, это и есть простая, но эффективная система позиционирования. Край стола выполняет роль направляющей — каретка движется по ней, как вагончик по рельсам.

Для изготовления каретки понадобятся два деревянных бруска — например, сечением 40 x 90 мм и 20 x 65 мм. Скрепим их винтами под прямым углом. В результате получится конструкция с бортиком, который будет плотно прилегать к краю стола. Бортик предотвращает отклонение каретки от прямой и гарантирует, что светодиодная лента будет перемещаться строго вдоль источника звука. Для более плавного скольжения на нижнюю поверхность каретки можно наклеить кусочек войлока.

Важный момент — повторяемость измерений. Для этого необходимо точно задать рабочую длину хода каретки. На столе установим концевые упоры. Сгодятся даже простые канцелярские зажимы или небольшие бруски. Например, можно ограничить движение так, чтобы общая длина хода составляла ровно 122 см. Эта величина (L) критически важна для последующих расчетов.

Шаг 3. Подключение светодиодной ленты к плате синхронного усилителя

На этом этапе электронный модуль на базе Teensy, выполняющий роль синхронного усилителя, соединяется со светодиодной лентой.

1. Подводим к плате стандартный трехконтактный штыревой разъем. Провода разъема обычно имеют стандартную цветовую маркировку: 

  • Питание +5 В — красный провод; 

  • Земля (GND) — белый или черный, в плоском жгуте часто расположенный на противоположном краю от красного; 

  • Сигнальный (DATA) — зеленый, проходит посередине.

2. Подпаиваем провода питания +5 В и GND к соответствующим выводам на плате Teensy.

3. Сигнальный провод (DATA) от разъема идет к контакту D2 на плате Teensy.

Провода должны прокладываться без натяжки, здесь может выручить отверстие в печатной плате.

Наконец, соединяем гнезда и, таким образом, подключаем светодиодную ленту к установленному на плату разъему.

Шаг 4. Монтаж на каретку

Закрепляем собранный электронный модуль — плату Teensy и аудиокарту — а также светодиодную ленту на подвижной каретке. Динамик, который будет источником звука, размещаем в конце стола.

Нужно решить сразу две задачи: обеспечить питание системы в движении и одновременно повысить устойчивость каретки.

Для этого возьмем портативный аккумулятор с USB-выходом, например power-bank для ноута, и закрепим его на подвижной части. Так удастся запитать всю электронику, при этом обойтись путающихся проводов. Кроме того, массивный источник питания работает как балласт: дополнительный вес смещает центр тяжести вниз и предотвращает опрокидывание во время движения.

Шаг 5. Фотосъемка звуковых волн

Наступает кульминационный момент. Вот‑вот абстрактные звуковые волны станут видимыми. Весь процесс основан на фотосъемке с длинной выдержкой.

Порядок действий следующий.

Теоретический расчет

Прежде всего, рассчитаем ожидаемую скорость звука в помещении, которая зависит от температуры и давления. Для этого воспользуемся формулой:

c = \sqrt{\gamma \frac{P}{\rho}},

где \gamma — показатель адиабаты для воздуха (примерно 1,4), P — давление (стандартное атмосферное — 101 325 Па), а \rho — плотность воздуха (при 20 °C составляет около 1,204 кг/м³).

Важно: необходимо скорректировать плотность, исходя из реальной температуры в комнате.

Проводим эксперимент

С помощью генератора подаем на динамик чистый синусоидальный сигнал известной частоты. Для небольшого звукового излучателя хорошие результаты получаются, начиная от 880 Гц — ноты ля второй октавы.

Устанавливаем фотокамеру на штатив и выбираем режим съемки с длинной выдержкой (несколько секунд).

Работаем в полностью затемненной комнате. Запускаем фотосъемку и одновременно плавно перемещаем каретку от одного концевого упора до другого. При движении светодиоды на ленте мигают с частотой звука. За время съемки их световые следы складываются в видимое изображение стоячей звуковой волны.

Анализ данных

Берем полученную фотографию и считаем количество полных волновых циклов, которые уложились на известной величине хода каретки — например, 120 см. Так мы вычисляем экспериментальную длину волны \lambda_{exp}.

В завершение сравниваем полученный результат с теоретическим значением. Его вычисляем по формуле:

\lambda_{th} = c/f,

где c — рассчитанная нами ранее скорость звука, f — частота сигнала.

Для удобства можно использовать следующие стандартные частоты, соответствующие музыкальным нотам:

Обозначение

Частота (Гц)

Примечание

1A

27,5

Ля субконтроктавы — самая низкий звук фортепиано

2A

55

Ля контроктавы

3A

110

Ля большой октавы

4A

220

Ля малой октавы

5A

440

Стандартная нота ля первой октавы

6A

880

Ля второй октавы

7A

1 760

Ля третьей октавы

8A

3 520

Ля четвертой октавы

9A

7 040

Ля пятой октавы

Заметим, что 6A (880 Гц/CPS) — это примерный минимальный уровень, при котором получаются хорошие результаты с небольшим динамиком. Эта частота использовалась на первой из серии фотографий.

Далее идут снимки, сделанные при 7A (1 760 Гц/CPS). Чтобы заданная частота была видна, используем крупный шрифт на экране и затемняем фон.

Также потребуется точно рассчитать скорость звука. Воспользуемся формулой, учитывающей отношение давления воздуха к его плотности при конкретной температуре в помещении. В нашем случае при 20 °C подходят значения:

  • показатель адиабаты \gamma \approx 1,4,

  • давление P = 101325\ Па,

  • плотность воздуха \rho = 1.204\ кг/м³.

В коде расчет выглядит так:

c=sqrt(1.4*101325/1.204);

В завершение подсчитываем количество циклов на фотографиях и сравниваем полученные результаты с ожидаемыми теоретическими данными.

«Пользовательские интерфейсы на основе эффекта гидроудара: фортепиано с гидроударом как интерактивная ударная поверхность», Стив Манн, Райан Джанзен, Джейсон Хуан, Мэтью Келли, Лей Джимми Ба, Александр Чен,

TEI'11, 22−26 января 2011 г., Фуншал, Португалия. ACM 978-1-4503-0478-8/.

Шаг 6. Анализ сложных сигналов

Возможности установки не ограничиваются визуализацией простых синусоидальных волн. С помощью SWIM можно исследовать и более сложные сигналы — например, прямоугольную волну (меандр).

Going Further
Going Further

Любой периодический сигнал раскладывается на простые синусоидальные волны с разными частотами и амплитудами. Математическое представление такой суммы называется рядом Фурье.

Для моделирования того, как SWIM визуализирует прямоугольную волну, воспользуемся симулятором SWIMulator, написанный на языке Octave. Приведенный ниже скрипт генерирует сигнал, состоящий из первых четырех нечетных гармоник, которые и формируют прямоугольную волну.

% Задаем основную частоту сигнала в Гц (7A = 1760 Гц)
f = 1760;

% Скорость звука в воздухе (м/с) при 20°C и давлении 101325 Па
c = sqrt(1.4 * 101325 / 1.204);

% Длина перемещения каретки в метрах (48 дюймов = 1.2192 м)
L = 48 * 2.54 / 100;

% Время, за которое звук проходит это расстояние
t = L / c;

% Количество циклов основной гармоники на всей длине хода
n = f * t;

% Массив точек, представляющий собой количество циклов
x = (0:2047) / 2048 * n;

% Длина волны в дюймах
wavelinch = 48 / max(x);

% Начальное расстояние от микрофона до динамика (3.25 дюйма)
x0 = 3.25;
x = x + x0 / wavelinch; % Корректируем массив x с учетом начального смещения

% Рассчитываем первые четыре нечетные гармоники ряда Фурье
s1 = sin(1  2  pi * x);
s3 = sin(3  2  pi * x) / 3;
s5 = sin(5  2  pi * x) / 5;
s7 = sin(7  2  pi * x) / 7;

% Суммируем гармоники с учетом затухания амплитуды (пропорционально 1/x)
s = (s1 + s3 + s5 + s7)./ x;

% Переводим циклы обратно в расстояние в дюймах
d = x * wavelinch;

% Строим график
plot(d, s);
axis([0 d(length(d)) -2 2]);
xlabel("Расстояние до микрофона / дюйм");
title("SWIMulator для первых 4 членов Фурье прямоугольной волны");

Octave‑код выше предсказывает изображение на фотографии, после чего можно сравнить теорию с результатами реального эксперимента.

Благодарности

Автор проекта благодарит всех, кто оказывал помощь в работе. В этот список входят Кайл, Эйден, Нишант, Роклен, Алекс, Митчелл и многие другие.

Также выражает признательность многочисленным соавторам и коллегам, которые участвовали в прошлых исследованиях по этой и смежным темам.

Отдельная благодарность адресована будущим участникам курсов и занятий. Все надеются, что они помогут распространять знания, создавать и использовать собственные установки SWIM.

13 человек уже повторили проект

Комментарии (4)


  1. liutas4x4
    25.10.2025 13:16

    В разделе "Проводим эксперимент" в конце первого абзаца опечатка в номере октавы, там должно быть 2.


    1. oneastok Автор
      25.10.2025 13:16

      Так и есть! Поправил. Благодарю!


      1. liutas4x4
        25.10.2025 13:16

        Не удержусь рассказать байку (быль на самом деле) как мы с моим знакомым настройщиком роялей ... навели инженеров на починку турбины электростанции.

        Году этак в 1980+ мы компанией сидели смотрели что-то смешное по ТВ. Аппарат был модно подключен к сети через регулятор напряжения с тяжеленным и, видимо, коряво собранным автотранформатором (ТВ был ламповый и потому весьма чувствителен к сети). Эта коробка бакелита натужно гудела и явно мешала созерцанию. "Ох уж эти 50 Герц," ляпнул я. На что приятель заметил, что не 50, а 48 и, может даже 47.5. Я завелся: ну ладно, десяток или хотя бы пяток Герц разницы в нижнем диапазоне можно услышать, если есть сравнение. Но вот так!

        Дело было в общаге, наверху -- радисты-любители. Рванули к ним, взяли огромный частотомер и приблуду для подключения к 220 Вольт -- на прямую сожгли бы входы.

        Приходим, меряем. Что-то около 47.6-47.8. Скачет. Приятель: "Вот теперь ты познакомился с понятием абсолютного слуха. Это такая-то (называет, не помню) нота такого-то звукоряда."

        На следующий день я рассказал об этом на кафедре. Препод заявил, что этого не может быть, и что мы уже проходили, что за такое -- тюрьма, как и за косинус фи. Но пошел куда-то звонить.

        Короче, именно вчера вечером регулятор вращения одной из турбин Каунасской ГЭС начал помирать. А персонал то ли пофигистский, то ли неграмотный -- не отметили. И к нам на кафедру пришел седой дед выяснять как это мы поймали баг. Долго смеялся рассказу. И заметил, что ни один завод, работавший в тот вечер, этого не заметил. Про персонал станции он промолчал.

        Не знаю тонкостей энергетики, но дед заявил, что обороты турбины упали на ~10%.

        Вот, собственно.


  1. oneastok Автор
    25.10.2025 13:16

    А мне другое вспомнилось, пока переводил.

    Я в 90-х ходил в детский радиолюбительский кружок и пытался собрать синтезатор. Подстроечные резисторы для каждой клавиши найти было невозможно. (Сами клавиши тоже отсутствовали — пока отлаживал, тыкал проводом по приготовленным контактам.)

    Так вот. Я мелкой шкуркой стирал с постоянных резисторов сначала лак, потом напыление, чтобы таким образом понемногу увеличивать номинал. Из‑за отсутствия лака сопротивление постоянно «плавало» из‑за внешних факторов. Учитель подойдет — сигаретный дым запустит в мою конструкцию (тогда это считалось нормальным) — и все ноты «съехали».:)

    UPD. Промахнулся веткой. Этот комментарий — ответ на байку @liutas4x4 выше.