• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO





Делаем Лазервокс



Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком  "Карта сайта"







В этой статье я собираюсь описать, как сделать инструмент, похожий на терменвокс, под названием LASERVox. LASERVox, как и терменвокс, — это инструмент, на котором вы играете, не касаясь его, но он использует совершенно другую технологию. LASERVox, в отличие от терменвокса, является идеальным проектом для новичка, потому что это настоящий инструмент, который можно очень легко собрать всего из нескольких компонентов. Вы увидите, что, используя многоядерную плату Propeller FLiP и некоторые сложные датчики расстояния LASERPing, мы можем создать инструмент, который обладает многими качествами, подобными терменвоксу, и является выразительным MIDI-контроллером. 

На рисунке 1 показана фотография моего Moog Theremini. Это хороший инструмент для начинающих, который довольно хорошо иллюстрирует общую форму терменвокса. 

РИСУНОК 1. Муг Термини.

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

Рассмотрим блок-схему типичного терменвокса на рисунке 2 .

https://www.nutsvolts.com/uploads/wygwam/NV_0320_Arlow_Figure02.jpg

РИСУНОК 2. Блок-схема типичного терменвокса.

 Мой LASERVox показан на рисунке 3 . Наиболее очевидная разница между LASERVox и терменвоксом заключается в том, что LASERVox заменяет комбинацию датчика расстояния LASERPing time-of-flight и 24-элементного светодиодного кольца как для шаговой, так и для объемной антенны. Вскоре мы увидим, как они работают. Обратите внимание, что LASERVox поддерживает обратную L-образную форму типичного терменвокса.

РИСУНОК 3. LASERVox. Обратите внимание на расположение светодиодных колец и датчиков шага. Они эквивалентны антеннам высоты тона и громкости терменвокса. LASERVox — это не терменвокс. Это MIDI лазерный терменвокс.  Я не буду приводить блок-схему LASERVox, потому что реальная схема (которая показана на рис. 4 ) сама по себе проста. Важно отметить, что схема работает при напряжении 3,3 В, за исключением светодиодных колец WS2812 и последовательного ЖК-дисплея Parallax, которым требуется 5 В. Из-за компонентов 5 В FLiP должен питаться от порта micro-USB!

РИСУНОК 4. Принципиальная схема LASERVox.

FLiP обеспечивает питание 3,3 В через встроенный регулятор на выводе 3,3 В▷. Тем не менее, он будет предлагать только 5 В на своем выводе USB 5V ▷ , когда он питается от порта micro-USB! Это связано с тем, что на плате нет регулятора 5 В, а 5 В на этот контакт поступает напрямую от USB-соединения. Поскольку для некоторых компонентов LASERVox требуется 5 В, вы всегда должны питать его через USB-порт. Вы не можете использовать батарею 9 В или внешний источник питания от 5 В до 9 В. Сердцем LASERVox является Parallax FLiP. Это простая в использовании плата для разработки чрезвычайно мощного многоядерного микроконтроллера Parallax Propeller.  (см. рис. 5 ).

РИСУНОК 5. Блок-схема микросхемы Propeller.

Ключевыми периферийными устройствами, которые делают LASERVox возможным, являются датчики расстояния Parallax LASERPing. Они измеряют время полета импульса инфракрасного лазерного света, который отражается от цели, которой в данном случае является рука музыканта.  Первоначально я планировал разрабатывать программное обеспечение LASERVox, используя графическую среду разработки BlocklyProp. Однако на данный момент BlocklyProp несовместим с MIDI (и другими последовательными протоколами), потому что его последовательный блок записывает только строки с завершающим нулем, а не байты. Это оставляет нас с двумя другими возможными средами разработки: Spin и C. Я решил использовать C, потому что многие из вас уже знакомы с ним. Я надеюсь рассказать о Spin в следующей статье, где смогу отдать должное. Во-первых, вам нужно скачать и установить интегрированную среду разработки SimpleIDE от Parallax. Вы найдете установщики и инструкции для Windows, Mac, Linux и Raspberry Pi. После установки и запуска программного обеспечения вы должны увидеть окно, подобное показанному на рис. 6 .

РИСУНОК 6. Parallax SimpleIDE.

 SimpleIDE основан на проектах, поэтому, чтобы что-то с ним делать, вам нужно создать или загрузить проект. Вы можете управлять проектами с панели инструментов (первые пять кнопок) или из меню. Теперь мы можем протестировать среду разработки:

1) Вставьте FLiP в нижнюю часть полноразмерной макетной платы без пайки (см. рис. 7 ) и в целях безопасности подключите ее через разъем micro-USB к компьютеру через концентратор USB. Зеленый светодиод рядом с символом питания (над P8) должен загореться, сообщая вам, что ваш FLiP готов к работе.

РИСУНОК 7. Компоновка макетной платы. 

2) Убедитесь, что последовательный порт для FLiP виден и выбран в SimpleIDE. Если у вас возникли проблемы с последовательным подключением, это может быть ваш кабель micro-USB. Некоторые кабели предназначены только для зарядки и не имеют полного набора проводов для передачи данных. Нет простого способа определить разницу, кроме как методом проб и ошибок.

3) В SimpleIDE выберите меню Project/Open или воспользуйтесь панелью инструментов и откройте Blink.side из каталога кода LASERVox. Плата FLiP имеет встроенный светодиод, подключенный к контакту 26. Загрузите код в ОЗУ FLiP, и вы должны увидеть мигание светодиода. Как я упоминал выше, в целях безопасности всегда лучше подключать макетную плату, такую ​​как FLiP, к компьютеру через USB-концентратор. Я собрал LASERVox на полноразмерной макетной плате без пайки. На рис. 7 показан рекомендуемый макет. Несмотря на то, что схема проста, лучше действовать методично, потому что в ней довольно много прямых соединений, и легко ошибиться. Я предоставил тестовые программы, чтобы вы могли построить схему поэтапно и протестировать ее по ходу дела. На самом деле, каждую из этих тестовых программ можно считать самостоятельным забавным мини-проектом! ВАЖНО: Всегда отключайте питание (разъем micro-USB) перед внесением изменений в макетную плату или проводку.  Я построил раму для своего инструмента, используя экструдированный алюминий.  Глядя на мой LASERVox на рисунке 3 , вы можете видеть, что это, по сути, прямой угол с горизонтальным светодиодным кольцом громкости и датчиком (соответствует объемной антенне терменвокса слева) и вертикальным светодиодным кольцом и датчиком шага (соответствует шагу антенна справа).  Для инструмента в стиле терменвокса критическим аспектом конструкции является то, что кольцо/датчик СИД высоты тона расположено вертикально, а кольцо/датчик СИД громкости горизонтально, как на рисунке 3 . Конечно, вам не нужно создавать традиционный инструмент в стиле терменвокс! Другим вариантом является размещение кольцевых/сенсорных блоков светодиодов громкости и шага в горизонтальной или вертикальной плоскостях. Я не пробовал, но подозреваю, что это может затруднить игру на инструменте. Сборка макетной платы Как я уже упоминал, на рис. 7 показан макет макетной платы. Начните с подключения шин питания с обеих сторон макетной платы, как показано на рисунке; + к + и - к -. Вставьте FLiP в нижнюю часть платы (если вы еще этого не сделали) и соедините GND под контактом 7 с отрицательной шиной, а контакт 3.3V▷ с положительной шиной. Подключите микро-USB FLiP и убедитесь, что на обеих сторонах макетной платы есть питание 3,3 В. Плата FLiP довольно щадящая, и если есть проблема с ее питанием, она часто указывает на это, загораясь желтым светодиодом над и справа от micro-USB под ! символ. Затем подключите MIDI-разъем. Обратите особое внимание на нумерацию контактов, показанную на рис. 8 . Контакт 0 FLiP — это выход MIDI, и он проходит через резистор от 10 до 100 Ом к контакту 5 разъема MIDI (сигнал). Контакт 4 (ток) разъема подключается через резистор от 10 до 100 Ом к 3,3 В, а контакт 2 (экран) подключается к GND. Внимательно проверьте эту проводку, потому что контакты разъема MIDI имеют довольно странную схему нумерации! Подключите свой MIDI-синтезатор.

РИСУНОК 8. Разъем MIDI Out, вид спереди.

 Загрузите файл проекта MIDITest.side в SimpleIDE и запишите его в ОЗУ вашего FLiP. В тестовой программе воспроизводится тур из трех частей «Viva La Musica» Михаила Преториуса (1571–1681). Каждая часть исполняется отдельным ядром. В программе показано, как использовать блокировки Propeller, чтобы ядра не наступали друг на друга при попытке записи в общий последовательный порт MIDI. Если ваш MIDI-выход не работает, наиболее вероятные проблемы заключаются в том, что вы подключились к неправильному контакту FLiP или у вас неправильный ток и сигнал на MIDI-разъеме.

Кнопки
Затем подключите три кнопки и подтягивающие резисторы к контактам FLiP:

1) Кнопка Pitch -> контакт 3 FLiP

2) Кнопка основной ноты -> контакт 2 FLiP

3) Кнопка Octave -> контакт 1 FLiP

Загрузите проект ButtonTest.side в SimpleIDE и загрузите его на FLiP с параметром «Запустить с терминалом». Нажмите каждую кнопку по очереди, и вы должны увидеть, что числа и примечания в терминале увеличиваются при каждом нажатии кнопки, а затем обнуляются. Если не работает, проверьте проводку. Если вы используете рекомендуемые тактильные кнопки, проверьте, какие из четырех контактов в нижней части кнопки соединены вместе, а какие образуют фактический переключатель. Переключатель обычно находится между ближайшими друг к другу контактами. Подключите контакт SIG датчика шага LASERPing к FLiP P16, а контакт SIG датчика объема LASERPing к FLiP P17. Оба датчика также должны быть подключены к источнику питания 3,3 В и заземлению. Загрузите проект LASERPingTest.side в SimpleIDE и загрузите его на FLiP с опцией «Запустить с терминалом». Переместите руки перед датчиками, и вы должны увидеть изменение цифр в терминале. Эти числа представляют собой время полета в чип-системе Propeller, щелкающее так, чтобы лазерный импульс отразился от ваших рук. Если вы хотите изменить калибровку расстояния в LASERVox, вы можете использовать эту тестовую программу для преобразования расстояний в такты щелчков системы чипа Propeller. Каждое кольцо должно быть установлено таким образом, чтобы в его центре была лазерная гравировка. Убедитесь, что положительная клемма каждого кольца подключена к USB-контакту FLiP 5V, а отрицательная клемма — к GND. DI (вход данных) кольца шага подключен к FLiP P25. DO (выход данных) кольца основного тона соединяется с DI (вход данных) кольца громкости, создавая гирляндную цепочку. Загрузите проект LEDRingTest.side в оперативную память FLiP. Вы должны увидеть, как несколько светящихся светодиодов перемещаются по каждому кольцу. Если вы этого не видите, проверьте подключение питания к кольцам, проверьте гирляндную цепь и убедитесь, что DI кольца шага идет к FLiP P25. Для развлечения я объединил тестовые программы для MIDI и светодиодов в проект MIDILEDTest.side. Это будет воспроизводить Viva La Musica , а также загораться соответствующими светодиодами. Он демонстрирует, как объекты полнодуплексного последовательного интерфейса и интерфейса WS2812 используют ядра, и как вы можете найти идентификатор ядра и использовать его в своей программе. Прежде всего, установите скорость передачи данных ЖК-дисплея на 2400 бод, как показано на рис. 9 .

РИСУНОК 9. Установите переключатели LCD на 2400 бод.

Подключите контакт 5V ЖК-дисплея к контакту FLiP 5VUSB, а контакт GND — к GND макетной платы. Подключите контакт RX (последовательный вход) ЖК-дисплея к FLiP P24. Загрузите проект LCDTest.side и загрузите его в оперативную память FLiP. ЖК-дисплей должен загореться, и должны появиться некоторые сообщения. Если ничего не происходит, проверьте питание ЖК-дисплея; убедитесь, что LCD RX подключен к FLiP P24; и убедитесь, что переключатели скорости передачи ЖК-дисплея установлены на 2400 бод. Теперь вы можете загрузить программное обеспечение LASERVox. Загрузите LASERVox.side в SimpleIDE и загрузите в FLiP RAM.  MIDI (цифровой интерфейс музыкальных инструментов) — это, помимо всего прочего, простой последовательный протокол для управления синтезаторами. Вы можете узнать все о MIDI, посетив веб-сайт Ассоциации MIDI . Любой синтезатор можно запрограммировать так, чтобы он отвечал только на сообщения на определенном канале, но большинство синтезаторов по умолчанию работают в режиме Omni Mode, поэтому они реагируют на сообщения на каждом канале. LASERVox посылает по каналу 0, но это можно изменить, отредактировав функции noteOn() и noteOff() .

После байта состояния остальная часть сообщения содержит один или два байта данных в зависимости от сообщения. Есть только три MIDI-сообщения, с которыми нам нужно иметь дело для LASERVox, и они показаны в Таблице 1 .

Примечание о

Байт состояния, примечание вкл.

Байт данных 1, Примечание

Байт данных 2, скорость

Описание

от 1001 0000 до 1001 1111

0000 0000 до 0111 1111

0000 0000 до 0111 1111

Включает указанную ноту.

от 144 до 159

от 0 до 127

от 0 до 127

 

Примечание выключено

Байт состояния, Note Off

Байт данных 1, Примечание

Байт данных 2, скорость

Описание

от 1000 0000 до 1000 1111

0000 0000 до 0111 1111

0000 0000 Обычно игнорируется

Выключает указанную ноту.

от 128 до 143

от 0 до 127

от 0 до 127

 

Громкость канала

Байт состояния, изменение управления

Байт данных 1, функция

Байт данных 2, объем

Описание

1011 0000 до 1011 1111

00000111 (Громкость канала)

0000 0000 до 0111 1111

Изменяет мастер-громкость синтезатора.

от 176 до 191

7

от 0 до 127

 

ТАБЛИЦА 1. MIDI-сообщения, используемые LASERVox.

Для каждого из сообщений таблица показывает байт состояния и любые байты данных. Для сообщений MIDI Note On и Note Off байт состояния определяет тип сообщения и канал. Первый байт данных всегда является номером MIDI для ноты. Это значение от 0 (C-1) до 127 (G8). Это сопоставление предполагает, что C4 (средний C) = 60 MIDI, что имеет место для большинства синтезаторов. Второй и последний байт данных — это скорость от 0 (молчание) до 127 (максимум). Для Note On скорость обычно определяет атаку ноты, которая определяет ее начальную громкость. Velocity обычно игнорируется для сообщений Note Off и обычно устанавливается на 0, но некоторые сложные синтезаторы могут использовать этот параметр для управления тембром или каким-либо другим параметром ноты при ее отпускании. Сообщение Volume Volume имеет несколько иной формат. Байт состояния говорит, что это сообщение об изменении управления (CC) на конкретном канале. Второй байт говорит, что выбранной функцией CC является громкость канала, а последний байт — это фактическая громкость, которую необходимо установить, где 0 означает без звука, а 127 — максимальную громкость синтезатора. Ключевым моментом является то, что после того, как ноте была назначена начальная велосити в Note On, громкость канала может только уменьшить ее . На самом деле мне потребовалось некоторое время, чтобы понять это! Это означает, что для того, чтобы левая рука могла контролировать весь диапазон громкости, LASERVox должен воспроизводить каждую ноту с максимальной скоростью 127. Для этого LASERVox должен отправлять MIDI-сообщения следующим образом:

При выборе новой заметки:

1) Выключите любую уже играемую ноту с помощью Note Off.

2) Включите текущую выбранную ноту с помощью Note On, динамической чувствительности 127.

3) Уменьшите громкость до текущей выбранной громкости с помощью Volume Volume.

Это дает нам очень выразительный инструмент, в котором левая рука может контролировать громкость ноты во время ее исполнения, позволяя использовать набухания, крещендо, декрещендо, тремоло (быстрые небольшие изменения громкости) и так далее. См. Таблицу 1 . LASERVox имеет диапазон из 12 нот. Это связано с тем, что в кольце высоты тона есть 24 светодиода, и между каждой нотой должен быть светодиод, чтобы указать, когда вы находитесь вне поля. Я предоставил LASERVox полезный набор шкал, представленных в Таблице 2 . В каждой гамме 12 нот, и я перечислил шаблон интервалов (см. ниже), смещения нот MIDI и пример сгенерированной гаммы с C в качестве корня. Я также указал ноты, которые выделены на светодиодном кольце высоты тона.

ТАБЛИЦА 2. Шкалы LASERVox.

 Взгляните на Таблицу 2 . Корень красный, третий желтый, а пятый зеленый. Это выделение очень важно, потому что оно помогает вам понять, где вы находитесь в той или иной шкале. LASERVox позволяет вам выбирать гамму, начальную ноту и октаву, позволяя вам играть в любой тональности в любой октаве. Стоит углубиться в теорию музыки, чтобы понять, как создавать гаммы для LASERVox. Все гаммы в западной традиции строятся путем деления октавы на последовательность интервалов. Двумя наиболее распространенными интервалами являются тон (t) и полутон (s), где t = 2 с. Наименьший интервал — полутон. Их 12 в октаве; по одному на каждую ноту хроматической гаммы. Все они звучат одинакового «размера», поэтому октава поровну делится на 12 полутонов. Это известно как 12-тональная равномерная темперация. Возможны другие темпераменты. Каждый интервал может быть выражен количеством полутонов (кратным s). Это означает, что можно задать гамму как последовательность интервалов от одной ноты к другой. Например, в ионийской гамме есть шаблон интервала ttttts, который можно выразить в полутонах как 221221. Теперь мы можем выполнять вычисления с помощью гаммы и, в частности, генерировать последовательность чисел MIDI для гаммы в любом корне. Давайте посмотрим на пример: мажорная гамма в середине C. Это C4 ионийская, и она имеет интервальный паттерн 2212221 и корень C4. Мы можем легко преобразовать это в число MIDI следующим образом:

1) Возьмите номер MIDI корня. Средний C - это C4, что составляет 60 MIDI.

2) Примените масштаб, начиная с 60: 60, (60+2), (60+2+2), (60+2+2+1), (60+2+2+1+2), (60 +2+2+1+2+2), (60+2+2+1+2+2+2), (60+2+2+1+2+2+2+1) = 60, 62, 64, 65, 67, 69, 71 = C4, D4, E4, F4, G4, A4, B4 = C4 ионийский.

Это способ создания весов для LASERVox. Просто найдите шаблон интервала для шкалы и примените его, как показано выше. Таким образом вы можете создать любую шкалу 12TET. Я предоставил три лада мажорной гаммы: ионийский лад (сама мажорная гамма); Эолийский лад (натуральный минор); и миксолидийский лад. Другие режимы не так полезны, поэтому я не заморачивался. Мажорная и минорная гаммы, очевидно, необходимы, но миксолидийский лад нуждается в небольшом объяснении. Mixolydian — особенно полезный режим, если у вас не так много нот для работы. Рассмотрим 12-нотный миксолидийский лад. В него встроена ионийская шкала ладов, начинающаяся с четвертой ступени. Рассмотрим G Mixolidian в качестве примера:

GAB CDEFGABC D

Вы можете видеть, что он начинается с G ниже первой C в до мажорной гамме. Учитывая, что многие мелодии ионийского лада начинаются на одну-три ноты ниже основного тона, вы можете понять, почему это очень полезно! Очевидно, что если на вашем инструменте много нот, то это не проблема. Однако, если у вас есть только 12 нот (как у LASERVox), то этот режим позволяет вам играть мелодии, которые в противном случае были бы невозможны. На самом деле миксолидийский лад обычно отлично подходит для народных инструментов. При использовании Mixolydian для доступа к ионийскому режиму просто помните, что если вам нужна ионийская гамма с корнем X, вы должны начать миксолидийскую гамму с X-3. Я также предоставил ряд немодальных шкал. У них есть шаблоны тона / полутона, которые не являются циклическими перестановками режимов, а некоторые имеют более широкие интервалы, чем тон. Особого внимания заслуживают пентатоника и блюзовые гаммы. Вы просто не ошибетесь с ними, потому что все ноты гаммы звучат великолепно вместе. Они идеальны для импровизации! У вас есть 12 нот для игры, так как насчет 12-нотной мелодии или басовой партии, которую вы играете, просто перемещая руку к сенсору. Я хотел сказать «возможности безграничны», но на самом деле есть выбор из 128 возможных MIDI-нот для каждого из 12 слотов, что дает нам ровно 12 812 = 19 342 813 113 834 066 795 298 816 возможностей! Программное обеспечение LASERVox довольно подробно прокомментировано, поэтому, если вы немного знаете C, вам не составит труда понять его. Во-первых, я немного расскажу о том, как масштабы реализованы в программе, так что вы можете добавить свои собственные, если хотите. Сама шкала представлена ​​в структуре Scale:

typedef struct Scale{
char name[20];
int root;
int *offsets;
int *hilights;
} Scale;

Члены этой структуры имеют следующие значения:

name: слот для 20-символьного имени.

Root: начальный MIDI-номер гаммы.

Offsets: Целочисленный массив из 24 смещений, который при добавлении к корню дает нам масштаб.

Highlights: Целочисленный массив из 24 цветов светодиодов, которые являются пигментом для шкалы.

Мы вычисляем ноты MIDI для гаммы, добавляя смещения к корню. Для удобства массивы смещений и выделений имеют 24 элемента — по одному для каждого светодиода в кольце высоты тона — хотя в гамме всего 12 нот. Вот пример массива смещений для ионийского режима:

int ionianOffsets[] = {0,X,2,X,4,X,5,X,7,X,9,X,11, X,12,X,14,X,16,X,17,X, 19,Х};

Вы видите, что элементов 24; по одному на каждый светодиод в кольце высоты тона. Каждый другой элемент является допустимым смещением, что дает нам 12 нот, разделенных не-нотами (X). Мы сопоставляем расстояние от датчика шага с диапазоном от 0 до 23, что дает нам индекс в этом массиве. Если индекс указывает на допустимое смещение, мы зажигаем соответствующий светодиод синим цветом, добавляем смещение к корню, чтобы получить MIDI-номер ноты, и выводим эту ноту. Если он указывает на X, мы находимся между нотами, поэтому мы не выводим ноту, но зажигаем соответствующий светодиод оранжевым цветом. Есть некоторая дополнительная уборка, отключение любой уже играемой ноты и т.д., но по сути, так программа LASERVox работает с гаммами. Все масштабы хранятся в массиве с именем Scales, и NUM_SCALESдолжен содержать количество весов в этом массиве. Теперь, когда вы понимаете структуру данных Scales, мы можем посмотреть, как работает программа.

Ядро 0
Программа main() выполняется в ядре 0. Она выполняет некоторую работу по дому (настраивает весы и т. д.), а затем создает три объекта для управления периферийными устройствами ( таблица 3 ).

Object

Lock

Description

lcd

N/A

Полнодуплексный последовательный объект для управления последовательной ЖК-панелью. У него нет блокировки, потому что доступ к нему осуществляется только из одного и того же ядра. Мы используем полный дуплекс (хотя мы только отправляем), потому что полудуплексная библиотека работает только с основным ядром.

midi

MIDILock

Другой полнодуплексный последовательный объект для вывода сообщений MIDI.

leds

LEDLock

Объект для управления интеллектуальными светодиодными кольцами WS2812B.

ТАБЛИЦА 3. Периферийные объекты.

После создания объектов для управления периферийными устройствами и связанными с ними замками программа main() запускает три ядра, используя cog_run(...) для следующих функций:

1) getVolume(): ядро ​​тома

2) getPitch(): Питч-ядро

3) getButtons(): ядро ​​кнопки

Затем он переходит в бесконечный цикл, потому что вся остальная работа выполняется в ядрах. Поскольку это многоядерная программа, нам нужно немного подумать об управлении ресурсами. Если ресурс должен быть разделен между ядрами и им можно манипулировать за один такт, то ничего делать не нужно, потому что каждое ядро ​​получает эксклюзивный доступ к ресурсам концентратора в течение одного такта, когда концентратор «вращается». Это относится к глобальным переменным, которые являются целыми числами или целочисленными массивами. Объекты, управляющие периферийными устройствами, более сложны и требуют нескольких тактов для выполнения своей работы. Если такой объект является общим для ядер, то каждое ядро ​​должно быть уверено, что не наступит на пятки другим. Это достигается за счет простого механизма блокировки. Ядро устанавливает блокировку, выполняет свои действия над объектом, а затем снимает блокировку по завершении работы с объектом. Каждое ядро ​​должно дождаться освобождения блокировки, прежде чем оно сможет получить блокировку для себя. Это очень простой и элегантный механизм для борьбы с конфликтами ресурсов. Я привел пример использования блокировок в проекте MIDITest.side. Принимая во внимание объекты, управляющие периферийными устройствами: доступ к ЖК-дисплею осуществляется только из одного ядра (кнопочного ядра; см. далее), поэтому ЖК - объект не нуждается в блокировке. К миди - объекту обращаются ядра Volume и Pitch, поэтому ему нужна блокировка; аналогично с объектом светодиодов .

Далее рассмотрим каждое ядро.

Ядро тома – getVolume()
Это ядро ​​отвечает за:

1) Опрос датчика объема LASERPing и расчет текущего объема.

2) Отправка сообщений MIDI Channel Volume для установки громкости синтезатора.

3) Обновление светодиодов.

Вот некоторый псевдокод, который объясняет, как работает ядро.

Повторяйте вечно:

1) Получить расстояние от объемного LASERPing до левой руки игрока. Это выражается как время пролета в системе микропроцессоров Propeller.

2) Сопоставьте расстояние с диапазоном volumeMinDist ... volumeMaxDist . Эти два глобальных целых числа используются для калибровки расстояний для датчика объема.

3) Сопоставьте диапазон расстояния с целым числом от 0 до 127. Это громкость для сообщения громкости MIDI-канала.

4) Рассчитайте, какой из 24 объемных светодиодов должен загореться.

5) Если есть изменение громкости:

   а. Установите текущую громкость.
   б. Отправьте сообщение громкости канала с текущей громкостью.
   в. Обновите светодиоды.

Обратите внимание, что мы никогда не спамим MIDI! Мы отправляем сообщения о громкости канала только в том случае, если громкость изменилась. Аналогично, для других MIDI-сообщений мы всегда сначала проверяем наличие изменений.

Ядро Pitch – getPitch()
Это ядро ​​отвечает за:

1) Опрос сенсора шага LASERPing и установка текущего шага ( глобальная переменная currentPitch) .

2) Отправка сообщений MIDI Note On, Note Off и Volume Volume.

3) Обновление светодиодов.

Вот некоторый псевдокод, который объясняет, как работает ядро.

Повторяйте вечно:

1) Получить расстояние от поля LASERPing до правой руки игрока. Это выражается как время пролета в системе микропроцессоров Propeller.

2) Если это расстояние больше, чем глобальное целое значение pitchOffDist , то:

   а. Цель вне досягаемости, поэтому выключите все записи. Это функция «автоматического выключения», которая выключает синтезатор, когда вы находитесь вне зоны действия датчика высоты тона.
   б. Установите currentPitch на 0. Он будет сброшен на корень шкалы, как только вы войдете в зону действия датчика высоты тона.
   в. Установите индикатор высоты тона на 23 (незадолго до 12 часов на кольце). Это означает «вне диапазона».
   д. Обновите светодиоды.
   е. Прерваться и перейти к следующему циклу петли (перейти к шагу 1).

3) Если вы доберетесь сюда, цель находится в пределах досягаемости. Ограничьте измеренное расстояние между pitchMinDist ... pitchMaxDist . Эти два глобальных целых числа используются для калибровки расстояний датчика шага.

4) Вычислите scaleIndex , который является индексом в выбранной в данный момент шкале. Помните, что шкалы содержат 24 слота — по одному для каждого светодиода — с 12 нотами (значения MIDI 0..127), разделенными не-нотой (X, что равно 255). ScaleIndex может указывать на примечание или на один из пробелов между примечаниями.

5) Если это правильное примечание, а не пробел между примечаниями:

   а. Установите значение newPitch , просмотрев его в текущем масштабе с помощью scaleIndex .

6) Установите midLED (это текущий светодиод между шагами) в scaleIndex . Если он указывает на заметку, ничего страшного. Он будет перезаписан.

7) Если произошло изменение высоты тона ( newPitch != currentPitch ):

   а. Отключите текущую высоту тона, отправив сообщение Note Off.
   б. Установите текущий шаг на новый шаг.
   в. Включите текущую высоту звука на максимальную скорость, отправив сообщение Note On со скоростью = 127.
   d. Уменьшите громкость до текущей громкости, отправив сообщение Volume Volume с помощью currentVolume .
   е. Установите pitchLED на scaleIndex . Этот светодиод показывает текущую высоту тона.

8) Обновить светодиоды.

Ядро кнопок – getButtons()
Это ядро ​​отвечает за считывание значений трех кнопок LASERVox и соответствующее обновление настройки инструмента. Каждое нажатие кнопки увеличивает один из круговых счетчиков currentOctave , currentScaleIndex и currentNote . Они используются для установки настройки инструмента в функции setTuning() . Вот некоторый псевдокод:

Повторяйте вечно:

1) Если нажата кнопка октавы:

   а. Увеличьте значение currentOctave , оставив его в диапазоне от 0 до NUM_OCTAVES .
   б. Вычислите новый корень для шкалы ( currentRoot ).
   в. Обновите тюнинг.
   д. Пауза на 500 мс, чтобы учесть дребезг переключателя.

2) Если нажата кнопка весов:

   а. Увеличивайте значение currentScaleIndex, оставляя его в диапазоне от 0 до NUM_SCALES.
   б. Обновите тюнинг.
   в. Пауза на 500 мс, чтобы учесть дребезг переключателя.

3) Если кнопка заметки нажата:

   а. Увеличьте значение currentNote, оставив его в диапазоне от 0 до 11 (в хроматической гамме всего 11 тонов).
   б. Обновите тюнинг.
   в. Пауза на 500 мс, чтобы учесть дребезг переключателя.

Другие функции
Есть несколько других функций, которые не запускаются как ядра, но вызываются из ядер:

1) updateLEDS () — включает основные моменты, светодиод между шагами и светодиод для текущего шага. Обратите внимание, как блокировка используется вокруг вызова ws2812_set(...) . Это функция, которая фактически отправляет данные светодиодов в светодиодные кольца. Его можно вызывать только из одного ядра за раз, поэтому его необходимо заблокировать.

2) updateTuning() — устанавливает текущую шкалу из массива шкал и устанавливает ее корень. Он также обновляет ЖК-дисплей.

3) printScaleToLCD() – обновляет ЖК-дисплей текущими данными масштаба.

Это по существу! Надеемся, что с помощью этой экскурсии и комментариев в коде вы сможете ориентироваться.

Фундаментальная техническая проблема при игре на терменвоксе любого типа — это проблема индексации. Все ноты находятся где-то в пространстве вокруг антенны основного тона или перед датчиком основного тона, но где? Как их найти? Индексация для LASERVox несколько отличается. Во-первых, нет необходимости в калибровке. Заметки находятся именно там, где их помещает программа. Во-вторых, высота звука квантуется, так что вы можете взять нужную ноту или нет. Нет скольжения вверх или вниз к ноте. Это все или ничего. Кроме того, нет звуковой обратной связи о том, насколько вы близки к желаемому тону. Текущая высота всегда отображается на 24-элементном светодиодном кольце. 12 нот шкалы расположены на каждом втором светодиоде. Когда вы находитесь на заметке, соответствующий светодиод будет светиться голубым цветом. Когда вы находитесь между двумя нотами, светодиод между этими двумя нотами будет гореть оранжевым цветом. Важнейшей частью настройки является выбор голоса. Очевидно, это зависит от вашего синтезатора, но есть определенные эмпирические правила относительно того, что работает хорошо, а что нет. Вы обнаружите, что голоса с резкой атакой и немедленным затуханием (фортепиано, арфы, щипковые инструменты, настроенная перкуссия и т. д.) могут быть довольно трудными для исполнения. Из-за атаки, если вы взяли неправильную ноту, это может быть очень очевидно в зависимости от того, в какой гамме вы находитесь. Кроме того, из-за затухания не так много возможностей для формирования громкости ноты с помощью левой рука. Различные гаммы имеют разную степень играбельности, и некоторые из них гораздо более снисходительны, чем другие. Вы обнаружите, что хроматическая гамма наименее снисходительна, в то время как блюзовая гамма позволяет вам уйти практически от всего, потому что вы не можете сыграть неправильную ноту. Это похоже на пентатонические гаммы, как упоминалось ранее. Терменвокс и LASERVox требуют аналогичного расположения инструмента и позы исполнителя. LASERVox должен быть размещен таким образом, чтобы датчик тангажа находился перед вами на той же высоте и прямо на одной линии с вашим правым плечом. Если вы сконструировали прибор так, как я рекомендую, датчик объема будет находиться примерно в том месте, где его будет прикрывать левая рука. Вы можете играть на инструменте сидя или стоя, но поначалу вам будет легче сидеть. Держите правую руку на уровне плеча, близко к плечу, ладонью наружу к датчику высоты тона, отодвигайтесь от инструмента, пока не начнет играть самая низкая нота. Если вы отойдете немного дальше, нота перестанет играть. Это функция «автоматического выключения» LASERVox, которая означает, что он не воспроизводится, если цель датчика высоты тона находится слишком далеко. Позиция самой низкой ноты определяет вашу базовую позицию. Это всегда должно быть вашей начальной позицией, потому что, если вы хотите, чтобы ваши мышцы рук запоминали, где находятся ноты, вам нужно всегда начинать с одной и той же базы. Если теперь вы очень медленно переместите руку к датчику высоты тона, вы должны сначала увидеть оранжевый светодиод по мере того, как вы уходите от текущей ноты (он, вероятно, будет немного мерцать), затем прозвучит следующая нота и загорится синим цветом, и так далее. . Вы найдете все отметки на шкале на одинаковом расстоянии от датчика. Я расставил ноты настолько, насколько я считаю это разумным, чтобы на LASERVox было как можно проще играть. Если вы находите датчик громкости немного натянутым, вы можете уменьшить пространственный диапазон нот, настроив глобальную переменную pitchMaxDist в коде. Меньшее значение сжимает диапазон нот. Вы всегда должны убедиться, что pitchMaxDist > pitchMinDist . С LASERVox ваша рука обеспечивает цель для лазерного импульса от датчика шага, и все, что находится дальше вашей руки, игнорируется. Это также означает, что жесты могут быть зарегистрированы или нет, в зависимости от того, где ваша рука находится в поле зрения датчика. Всегда помните, что с LASERVox именно та часть руки, которая находится ближе всего к датчику, определяет высоту тона или громкость. Фактическая форма, которую делает рука, не имеет значения, пока она представляет собой четкую цель. LASERVox — совершенно новый инструмент, и это все, что я могу сказать о его технике на данный момент. Вы можете весело провести время, экспериментируя и находя свой собственный путь.

Надеюсь, вам понравится ваш LASERVox, и вы получите удовольствие от игры! Вот несколько идей того, что вы можете с ним сделать:

1) Используйте LASERVox в качестве универсального MIDI-контроллера. Вы можете изменить сообщения Note On, Note Off и Channel Volume, генерируемые датчиками, на любое MIDI-сообщение, которое вам нравится. LASERVox можно запрограммировать для работы в качестве «педали экспрессии» для синтезатора или для управления параметрами цифровой звуковой рабочей станции, такой как Apple LogicPro или Ableton Live.

2) Запрограммируйте звуки ударных и используйте LASERVox как набор «воздушных барабанов». Весело? Определенно! Полезный? Я не знаю, потому что я не барабанщик.

3) Вместо того, чтобы программировать гаммы, программируйте короткие мелодии или басовые партии.

СПИСОК ДЕТАЛЕЙ

Полноразмерная макетная плата

47R без пайки, два
резистора 10K, три
тактильных кнопки  три
Parallax FLiP, SKU32123
Parallax LASERPing, SKU28041, два
Parallax Serial LCD 4x20, С подсветкой, с пьезодинамиком,
светодиодные кольца SKU27979, 24 светодиода WS2812 (Adafruit #1586 или аналогичный), два выхода
MIDI Out Socket: DIN 41524, разъем mini-DIN 5/180 градусов, под прямым углом, монтаж на печатной плате (например, CUI, Inc.) ., SDS-50J
Блок питания Micro-USB, 5 В, 2,5 А (или выше). НЕ используйте зарядное устройство USB!
 

скачать

 







Просмотров: 338 | Добавил: Chinas | Рейтинг: 0.0/0








Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 372



          

Радио для всех© 2024