Терменвокс – единственный музыкальный инструмент, на котором вы можете играть, не касаясь его. Терменвокс был одним из самых первых электронных инструментов. Он был изобретен в России примерно в 1919 году Львом Терменом. Первый терменвокс состоял из корпуса в форме коробки с двумя антеннами: одна представляет собой прямую вертикальную штангу, которая регулирует высоту звука, другая – горизонтальная петля в форме, напоминающей трость, регулирует громкость. Высота и громкость ноты меняются с изменением расстояния рук до антенн, которые генерируют электромагнитное поле.

Хотя оригинальные терменвоксы стоят не дешево, можно сделать свое подобное устройство на цифровой основе с похожим принципом действия. И для этого мы используем плату Arduino, динамик и светочувствительный резистор (LDR).
Мы создадим установку импульсной модуляции, которая использует LDR в качестве датчика для регистрации интенсивности света, в соответствии с которым она будет модулировать звук.

Для воспроизведения звука использовалась библиотека Mozzi (sensorium.github.io/Mozzi), которая в основном представляет собой аудиотеку MIDI для платформы Arduino. Просто скачайте и распакуйте ее в папку библиотек library, и это все, что вам нужно будет сделать относительно нее.


В данном случае мы использовали динамик на 8 Ом, подключенный к аудио-усилителю PAM8403, что здесь очень важно, потому что вывод Arduino не может выводить громкие звуки из-за низкого прямого тока. Впрочем, если у вас нет усилителя или вам не нужны громкие звуки, тогда не волнуйтесь, просто подключите динамик напрямую с конденсатором последовательно или сделайте свой собственный усилитель с транзистором NPN.

Вот схема без усилителя:

А вот полная схема с усилителем:

Теперь просто подключите выход динамика к выводу D9 вашего Arduino.

Один конец LDR подключите к выводу A0 с сопротивлением 10 кОм последовательно с землей, другой конец LDR к линии питания 5 В. Теперь можно загружать код в Arduino.
#include <MozziGuts.h>
#include <Oscil.h>
#include <tables/sin2048_int8.h>
#include <RollingAverage.h>
#include <ControlDelay.h>
#define INPUT_PIN 0
unsigned int echo_cells_1 = 32;
unsigned int echo_cells_2 = 60;
unsigned int echo_cells_3 = 127;
#define CONTROL_RATE 64
ControlDelay <128, int> kDelay;
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin0(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin1(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin2(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin3(SIN2048_DATA);
RollingAverage <int, 32> kAverage;
int averaged;
void setup(){
kDelay.set(echo_cells_1);
startMozzi();
}
void updateControl(){
int bumpy_input = mozziAnalogRead(INPUT_PIN);
averaged = kAverage.next(bumpy_input);
aSin0.setFreq(averaged);
aSin1.setFreq(kDelay.next(averaged));
aSin2.setFreq(kDelay.read(echo_cells_2));
aSin3.setFreq(kDelay.read(echo_cells_3));
}
int updateAudio(){
return 3*((int)aSin0.next()+aSin1.next()+(aSin2.next()>>1)
+(aSin3.next()>>2)) >>3;
}
void loop(){
audioHook();
}
Эта установка модулирует звук в соответствии с интенсивностью света, поэтому мы использовали лампу в качестве источника света, чтобы изменить интенсивность света с целью получения разных звуков.

© digitrode.ru