О настоящего терменвокса
Много знают изобретение Льва Термена, где генератор аудио-частоты заключается в паре осцилляторов и микшере, используя принцип гетеродина для генерации аудио-сигнала. Один осциллятор работает на фиксированной частоте. Частота другого генератора почти такая же и регулируется расстоянием от исполнителя до антенны управления высотой тона. Эта антенна - простой способ влиять на ёмкость резонансного контура осциллятора, и таким образом сместить частоту. Также добавлен третий осциллятор, с фильтром и детектором для управления модулятора амплитуды через другую антенну. На первый взгляд, этот инструмент выглядит как простое средство для воспроизведения музыки. Но не ошибаетесь. Очень сложно настроить точные ноты. Опытных исполнителей, которые реально умеют играть настоящую музыку с терменвокса, очень немного.
Данная самоделка
Я не исключаю, что однажды я соберу терменвокс близкий к оригинальному принципу, вероятно с современными хитростями для упрощения использования. Но пока, речь здесь идёт о другом типе «дистанционного» инструмента. Он тоже работает на основе принципа ёмкостной связи между пользователем и инструментом, но не эксплуатирует изменение частоты осциллятора. Пользователь трогает источник РЧ левой рукой, и правой рукой управляет высотой тона и амплитудой. Всё происходит как, если пользователь играл бы на пианино, которое уже начинает звучать, когда рука приближается к клавише.
Можно обозначить принцип работы таким способом:
Между руками тело действует как электрическое сопротивление. Поэтому, когда правая рука приближается к одному детектору, создаётся ёмкостная связь между генератором и детектором. Уровень сигнала растёт когда расстояние уменьшается. Одновременно можно узнать какой детектор принимает самый большой уровень и настроить ноту. Подробный алгоритм даже может позволить обнаруживать промежуточные положения, чтобы увеличить количество нот.
Само-калибровка
Конечно детекторы (которые включают в себя пред-усилители) принимают фоновый шум. Нужно подстроить программные смещения, чтобы обнулить значения из АЦП, когда пользователь не приближает правую руку к детекторам.
Налево, все 4 смещения не подстроены. В нашем случае, детекторы дают инвертированные уровни, но это могло бы быть наоборот. Принцип не менялся бы.
Посередине все смещения калиброваны.
Направо все калиброванные сигналы [смещение — значение АЦП] представляются как слабый шум над уровнем ноля, пока пользователь ещё не играет. Так возможно их обработать.
Обработка калиброванных сигналов детекторов
Эти рисунки обозначают все ситуации, которые возможно придумать, и те которые алгоритм должен решить:
1) Все уровни под порогом. Амплитуда подстроена на 0. Рука пользователя далека от инструмента.
2) Детектор 3 принимает самый высокий уровень. Уровни детекторов находящихся рядом не достаточно высокие, чтобы заключить, что положение промежуточное. Амплитуда высокая.
3А-3Б) Детектор 3 или детектор 2 принимает самый высокий уровень. Тем не менее, эти два уровня не сильно отличаются (пропорционально). Поэтому, можно заключить, что палец находится в промежуточном положении между 2 и 3. Амплитуда высокая.
4) Сигналы очень слабые. Амплитуда тоже должна быть слабая. Детектор 2 принимает самый высокий уровень, и сложно узнать, если сигнал детектора 3 пропорционально отличается или нет. Алгоритм может перепутать, но это не важно. Нота ещё почти не слышна.
5) Ситуация не очень нормальная, но нужно принять решение. Здесь видно, что самые активные детекторы не находятся рядом друг с другом. Поэтому, нельзя решить, что мы в ситуации промежуточного положения. Нужно просто решить, что положение совпадает с самым высоким уровнем. Значит, что положение детектора 4, даже если детектор 1 почти достигает тот-же уровень. (Может быть несколько пальцев пользователя случайно находятся там, где не надо).
6) Здесь мы ещё в ситуации промежуточного положения как на пунктах 3А-3Б. Даже, если детектор 1 действует неожиданно, это не мешает. Мы в ситуации промежуточного положения между детекторами 3 и 4.
7) На первый взгляд, похоже на пункт 6. Но ему не соответствует. Это вариант пункта 5. Самые высокие уровни: 2 и 4. Эти детекторы не находятся рядом друг с другом (даже, если уровень детектора 3 почти достигает уровень детектора 4). Поэтому, решение будет как в пункте 5: Положение на детекторе 4, не промежуточное. Вероятно инструмент будет путать ноты из-за плохих условия измерения сигналов, но невозможно сделать лучше. Либо нужно перекалибровать, либо фактически пользователь нелепо манипулирует пальцами.
Реализация алгоритма, кратко говоря
Чтобы выполнить анализ как описано выше, нужно действовать так:
Алгоритм периодично выполняет эту последовательность:
- Захват сигналы от АЦП
- Расчёт [смещение — значение АЦП] для каждого (использует калибровку)
- Если ни один сигнал ни превышал порог обнаружения:
амплитуда = 0 до следующего захвата
Иначе продолжается анализ:
- Обнаружение двух самых высоких уровней и их положения.
- Если положения рядом друг с другом:
-> Если разница уровня < 25% самого высокого уровня,
===> промежуточное положение
===> Иначе, положение на детекторе самого высокого уровня
- Если положения не рядом друг с другом:
-> Положение на детекторе самого высокого уровня
- Подстроить амплитуду пропорционально самому высокому уровню
Реализация инструмента-игрушки
Я решил сделать эту самоделку на основе маленького микроконтроллера Microchip PIC16F819 потому, что не требуется большая мощность калькуляции. PIC16F819 содержит 4 канала АЦП и один ШИМ (PWM). Было удобно использовать этот ШИМ для генерации нот, из-за требования стабильности и точности частот. ШИМ управления амплитуды можно генерировать программно, и фильтр подавит эффекты джиттера.
- Генератор 250КГц собран на основе NE555 (верхний левый угол) и резонансного контура.
- RB3 подаёт тон (частоту ноты)
- RB2 подаёт ШИМ для фильтра ограничителя амплитуды.
- Пред-усилители находятся направо, на основе полевого транзистора 2N7000
Физически, пред-усилители находятся близко от плит обнаружения, как видно на первой фотографии и на видео.
Результат
Конечно нельзя предполагать, что эта игрушка — настоящий музыкальный инструмент. Текущая версия ограничена по количеству нот, и «клавиатура» уже недостаточно широкая, чтобы препятствовать ошибкам анализа алгоритма (как слышно на видео). Если вы намерены собрать такой образец, я советую сделать клавиатуру более широкую. Но, тем не менее, я уже доволен полученным результатом!
Наверно вам не интересно использовать файлы для прошивки PIC16F819 потому, что вы предпочитаете программировать алгоритм на известной платформе (например Arduino). Но, если вы намерены сделать как я, сообщите!