Картинка Bettmann, Corbis, What's On the Air Company

В первой половине прошлого века появился замечательный инструмент, получивший название «терменвокс» — по имени советского изобретателя Льва Сергеевича Термена. Он позволял излучать интересные «космические» звуки, просто манипулируя руками около антенн этого аппарата.

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

В какой-то мере это поэтически перекликается с самой идеей терменвокса — как раз и позволяющего извлекать музыку «напрямую из воздуха».

Итак, поглядим, что же это такое и как такое можно реализовать!

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

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

Кратко о терменвоксе


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

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

image
Картинка: Hutschi

image
Картинка: IKP Music Kisszabogabor

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

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

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

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

Терменвокс конструкции Л.С.Термена с двумя антеннами (на фотографиях в шапке статьи и чуть ниже) считается классическим и производится с прошлого века и до сих пор американской компанией Moog.

Но существует ещё и альтернативная версия, где управление разделено на три, условно назовём их «интерфейса»: с помощью антенны, которая позволяет регулировать высоту тона, с помощью кнопочного манипулятора, позволяющего регулировать некоторые другие характеристики звука, а также ножной педали, регулирующей громкость.

К слову, клавиши для ручного управления в этой версии предназначены для переключения октав или предустановленных тонов (система работает примерно как орган).

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

Эта версия получила название «терменвокс системы Ковальского», но, тем не менее, не приобрела большого распространения, и представляет собой своего рода гибридный вариант, сочетающий в себе бесконтактное управление и классический контактный способ.

Кстати, о распространении: не нужно быть слишком наблюдательным, чтобы обратить внимание на то, что терменвоксы вовсе не продаются в каждом магазине и не звучат из «каждого утюга». :-)

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

Кроме того, нужно учитывать, что он появился ещё в 1920-м, когда не были настолько распространены, как сейчас, альтернативные электронные инструменты, так как в настоящее время гораздо проще взять синтезатор или MIDI-клавиатуру, что позволяет играть музыку намного легче.

В общем, налицо принцип «красота — в простАте», которого, судя по всему, придерживаются многие...

Несмотря на это, терменвокс прочно занимает свою нишу в музыкальных инструментах, а в деле извлечения «потусторонних» и «космических» звуков, пожалуй, ему нет равных:-) Чем и пользовался, к примеру, кинематограф (возможно, пользуется и сейчас, но не уверен).

В данный момент существует некоторое количество ещё и «виртуальных» терменвоксов, использующих, например, сенсорный экран смартфона (я посмотрел, действительно есть, ссылку не дам, дабы не реклама), но вы при желании без труда сможете найти их сами, например, на том же самом Google Play).

Самодельный терменвокс? Самодельный терменвокс!


Итак, мы подошли к самому интересному — созданию своей маленькой модели настоящего терменвокса.

Первой мыслью, возможно, станет осознание сложности устройства и невозможности реализовать его самостоятельно.

Однако на данный момент это вовсе не так: терменвокс легко реализуется на базе обычного микроконтроллера, в роли которого я взял esp32.

Сразу скажу, что я весьма критически отношусь к своим музыкальным способностям :-) Cобственно, поэтому я и решил остановиться на более простой версии терменвокса, которая содержит всего лишь одну антенну (что, впрочем, не мешает вам взять код, который будет ниже, и переработать его таким образом, чтобы он мог работать с двумя антеннами).

Итак, у нас одна и та же антенна будет отвечать как за высоту тона, так и за громкость.

Микроконтроллер esp32 содержит целый ряд аналоговых пинов, которые можно применить для наших целей, где лучшими являются относящиеся к блоку выводов ADC1 (по ссылке выше на картинке обозначены как «A1»), из которых целый ряд имеет ограничения, но, тем не менее, вполне можно использовать для наших целей такие выводы, как GPIO 39, GPIO 36.

Для этого же проекта был взят только один, так как антенна у нас одна — GPIO 36.

Почему были взяты эти выводы: так как они имеют большой импеданс, соответственно, малое влияние на изменения ёмкости.

Кстати, об антенне: в качестве неё в самом простом варианте (который вы увидите ниже) сгодится даже простой кусок соединительного провода для хобби-проектов (насколько знаю, называется «перемычка типа DuPont»).

Но понятно, что если антенна будет длиннее (где-нибудь в 300 мм), то было бы лучше: ёмкость будет существеннее меняться при приближении руки, что будет означать заметные изменения звука даже при плавных движениях руки.

Ещё один вариант увеличения чувствительности заключается в подтяжке этой антенны через резистор большого сопротивления, например, в 1...10 МОм — к земле (пину GND).

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

Итак, посмотрим на компоненты системы и на то, как они соединены.

Для сборки использовано всего три аппаратных компонента:

  • микроконтроллер esp32 wroom32;
  • цифровой усилитель звука с I2S-интерфейсом MAX98357;
  • антенна: кусок соединительного провода.

Схему соединений вы можете найти ниже:



Код ниже представляет собой программную реализацию принципов, заложенных в изначальный терменвокс Львом Терменом, где в оригинальном аппарате использовались LC-генераторы с гетерогенной схемой, тогда как микроконтроллерная версия ниже реализует цифровую генерацию звука:

  • Программно реализовано естественное дрожание рук исполнителя.
  • Огибающая громкость имитирует работу ламповых усилителей и аналоговое насыщение.
  • Многоуровневая фильтрация предназначена для подавления помех от электромагнитных наводок (в реальных аппаратах за это отвечают RC-цепи).
  • Реализовано нелинейное преобразование (аналогично логике работы усилителей 1920-х годов).
  • Использовано двойное сглаживание с компромиссным значением 0,05, которое является компромиссом между плавностью и задержкой.
Сам код вы можете найти здесь
//Разработано с применением DeepSeek. 
//Код предоставляется без каких-либо гарантий

#include <driver/i2s.h>

#define I2S_BCLK_PIN   26
#define I2S_LRC_PIN    25  
#define I2S_DOUT_PIN   22
#define ANTENNA_PIN    36

const int SAMPLE_RATE = 44100;
const int BUFFER_SIZE = 256;
const int BASE_FREQ = 80;
const int MAX_FREQ = 1200;
const float LFO_RATE = 0.2f;

// УВЕЛИЧЕННЫЕ ПАРАМЕТРЫ ГРОМКОСТИ
const float VOLUME_BOOST = 2.0f;          // Новый коэффициент усиления
const float VOLUME_POWER_CURVE = 0.4f;    // Более агрессивная кривая (было 0.5f)

// Параметры сглаживания
const float FREQ_SMOOTHING = 0.1f;
const float VOLUME_SMOOTHING = 0.05f;

// Пороговые значения
const int MIN_RAW_VALUE = 50;
const int MAX_RAW_VALUE = 2000;

// Глобальные переменные
float smoothedVolume = 0;
float smoothedFrequency = BASE_FREQ;

void initI2SOutput() {
  i2s_config_t i2sConfig = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
    .sample_rate = SAMPLE_RATE,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_I2S,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 4,
    .dma_buf_len = BUFFER_SIZE
  };

  i2s_pin_config_t pinConfig = {
    .bck_io_num = I2S_BCLK_PIN,
    .ws_io_num = I2S_LRC_PIN,
    .data_out_num = I2S_DOUT_PIN,
    .data_in_num = I2S_PIN_NO_CHANGE
  };

  i2s_driver_uninstall(I2S_NUM_0);
  i2s_driver_install(I2S_NUM_0, &i2sConfig, 0, NULL);
  i2s_set_pin(I2S_NUM_0, &pinConfig);
}

void generateSmoothTone(int16_t* buffer, float frequency, float volume) {
  static float phase = 0.0;
  static float lfoPhase = 0.0;
  
  // LFO с уменьшенной глубиной
  float lfo = sin(lfoPhase) * 0.03f;
  lfoPhase += 2 * PI * LFO_RATE / SAMPLE_RATE;
  if (lfoPhase > 2 * PI) lfoPhase -= 2 * PI;

  for (int i = 0; i < BUFFER_SIZE; i++) {
    // Основной тон с вибрато
    float sample = sin(2 * PI * phase * (1.0f + lfo));
    
    // УСИЛЕНИЕ ГРОМКОСТИ С МЯГКИМ ОГРАНИЧЕНИЕМ
    sample = tanh(sample * volume * VOLUME_BOOST) * 0.9f;
    
    buffer[i] = (int16_t)(32767 * sample);
    phase += frequency / SAMPLE_RATE;
    if (phase >= 1.0f) phase -= 1.0f;
  }
}

void setup() {
  Serial.begin(115200);
  initI2SOutput();
  pinMode(ANTENNA_PIN, INPUT);
}

void loop() {
  int16_t audioBuffer[BUFFER_SIZE];
  size_t bytesWritten;

  // Чтение с улучшенной фильтрацией
  static int histValues[3] = {0};
  histValues[0] = analogRead(ANTENNA_PIN);
  int filteredValue = (histValues[0] + histValues[1] + histValues[2]) / 3;
  histValues[2] = histValues[1];
  histValues[1] = histValues[0];

  // РАСЧЁТ ГРОМКОСТИ С УСИЛЕНИЕМ
  float targetVolume = 0;
  if (filteredValue > MIN_RAW_VALUE) {
    targetVolume = pow((float)(filteredValue - MIN_RAW_VALUE) / 
                      (MAX_RAW_VALUE - MIN_RAW_VALUE), VOLUME_POWER_CURVE);
    targetVolume = min(targetVolume * 1.3f, 1.0f); // Дополнительный буст
  }

  // Расчёт частоты
  float targetFrequency = BASE_FREQ + (MAX_FREQ - BASE_FREQ) * targetVolume;

  // Сглаживание
  smoothedVolume = smoothedVolume * (1 - VOLUME_SMOOTHING) + targetVolume * VOLUME_SMOOTHING;
  smoothedFrequency = smoothedFrequency * (1 - FREQ_SMOOTHING) + targetFrequency * FREQ_SMOOTHING;

  // Генерация звука
  if (smoothedVolume > 0.01f) {
    generateSmoothTone(audioBuffer, smoothedFrequency, smoothedVolume);
  } else {
    memset(audioBuffer, 0, sizeof(audioBuffer));
  }

  // Воспроизведение
  i2s_write(I2S_NUM_0, &audioBuffer, BUFFER_SIZE * sizeof(int16_t), &bytesWritten, portMAX_DELAY);

  // Отладка
  static uint32_t lastPrint = 0;
  if (millis() - lastPrint > 200) {
    Serial.printf("Raw: %d, Filt: %d, Freq: %.1f, Vol: %.2f\n", 
                 histValues[0], filteredValue, smoothedFrequency, smoothedVolume);
    lastPrint = millis();
  }
}


А ниже можно посмотреть видеоролики работы терменвокса.

Первый тест: выяснилось, что «ёмкость дивана» :-B на котором это всё происходит и к поверхности которого близка антенна, влияет таким образом, что терменвокс практически непрерывно звучит (во втором ролике ниже будет более чистый тест):



А вот тут уже как надо: молчит, если не подносить руку, и звучит — если поднести. Чем ближе подносим — тем выше тон.

Всё это было для меня скорее экспериментом, чтобы проверить интересную мысль: «А вообще это возможно или нет?» Ведь о терменвоксе я читал неоднократно, ещё с детства, в различных книгах по электронике, и мне было интересно, насколько это просто в наше время.

Оказалось, что очень просто и вполне реально!

Таким образом, подытоживая, можно сказать, что теперь, когда у вас есть общее понимание, что такое терменвокс, вы можете «побаловаться» — либо повторив этот проект, либо сделав свой собственный, доработав приведённый выше код. Например, можно добавить дополнительную антенну, чтобы получилось «полностью аутентично» оригиналу (насколько это, конечно, возможно — с учётом использования микроконтроллера).

В любом случае я лично не рискнул использовать вторую антенну, так как моя природная неспособность к музыке вряд ли сделала бы эксперимент успешным. Но вы вполне можете попробовать ;-)

P. S. В ходе осмысления терменвокса было перебрано несколько вариантов — с более «металлическим», «космическим» и «ламповым» звучанием. Остановился на последнем.

© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT ?

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


  1. shiru8bit
    20.06.2025 13:11

    Очень интересная идея, реализовать на МК с реальной антенной! Я давеча пытался сделать на ультразвуковых датчиках, но упёрся в физику, которая слишком сильно ограничивает время реакции.


  1. DashBerlin
    20.06.2025 13:11

    А что антенны используются?


    1. DAN_SEA Автор
      20.06.2025 13:11

      Согласен, строго говоря, это конденсаторы. Но, в обиходе говорят, про них, как про антенны - поэтому и нарисовал так:-) Упрощает понимание на бытовом уровне.


  1. Ilya_Lizard
    20.06.2025 13:11

    Очень интересно, спасибо!
    Сегодня на амазоне можно купить набор для сборки модели терменвокса, реализованного на 556 и LM386.
    Удивительно, насколько 555 - бессмертный чип для музыкальных проектов.


  1. Daddy_Cool
    20.06.2025 13:11

    Ох! Я аж загорелся, но послушал звуки... прям плохо стало. Интересно чем тембр определяется? По идее наверное можно выход подключить как какому-нибудь аналоговому синтезатору и получить что-то приятное.


  1. Javian
    20.06.2025 13:11

    Собрать-то можно. Но главный вопрос в умении играть:

    Борисов. Юный радиолюбитель.
    Борисов. Юный радиолюбитель.


    1. iShrimp
      20.06.2025 13:11

      Немного музыкального слуха и тренировок (стоит изучить основные интервалы - октавы, квинты, кварты, терции), и играть на нём станет легче и интереснее.

      Главное, чтобы сам прибор обладал хорошей разрешающей способностью по частотной шкале.