Midi клавиатура на arduino

USB MIDI- клавиатура на arduino mega

Дело было вечером, делать было нечего.

В общем нашел я у дочки игрушку, она даже работала, но играть на ней было практически невозможно, дело в том что при нажатии на 2 клавиши, 3 -я уже не работала, то есть взять аккорд невозможно (хотя я аккорды и не знаю, зато паять умею) а еще совершенно случайно валялись ардуики всякие. Гугл сказал можно сделать из этого всего MIDI — клавиатуру.

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

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

и курочим уже бывшую игрушку

пихаем туда ардуньку

далее по схеме делаем шилд, схема такая

крутилку, энкодер, не стал пока ставить, это в позже.

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

скетч. эээ, а как тут спойлер сделать? ладно не буду выкладывать, только кусками

тут задаются ноты

#define note_2F 0x29

#define note_2Fd 0x2A

#define note_2G 0x2B

#define note_2Gd 0x2C

#define note_2A 0x2D

#define note_2Ad 0x2E

#define note_2B 0x2F4

#define note_3C 0x30

#define note_3Cd 0x31

#define note_3D 0x32

потом еще куча кода

а так происходит обработка событий

if (buttonState_2F == HIGH && note_2F_send_on == false) // Нажатие клавиши

noteOn(0x90, note_2F, 0x7F);

note_2F_send_on = true; // Команда Note On послана

note_2F_send_off = false; // Команда Note Off не послана

else if (buttonState_2F == HIGH && note_2F_send_on == true) // Если клавиша удерживается

noteOn(0x00, note_2F, 0x7F);

else if (buttonState_2F == LOW && note_2F_send_off == false) // Если клавишу отпустили

noteOn(0x90, note_2F, 0x00);

if (buttonState_2Fd == HIGH && note_2Fd_send_on == false)

noteOn(0x90, note_2Fd, 0x7F);

else if (buttonState_2Fd == HIGH && note_2Fd_send_on == true)

noteOn(0x00, note_2Fd, 0x7F);

else if (buttonState_2Fd == LOW && note_2Fd_send_off == false)

noteOn(0x90, note_2Fd, 0x00);

а так передача всего в RS-232

void noteOn(int cmd, int pitch, int velocity) <

Далее ставим LoopMIDI и Serial MIDI Converter

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

Ну а потом ставим что нибудь типа Pro Tools + Kontakt 5 вместе с сэмплами. Ну и вуаля, все работает

Все работает, но играть я не умею, поэтому можно разбирать 🙂 шутка, отдам дочке может понравится, будет учиться.

З.Ы. да да, можно было и купить, стоит рублей 7, но так интересней..

нахрен отдавать 7к, если можно сделать)

Основное отличие мидиклавы — чувствительность к силе нажатия, иначе можно и на обычной QWERTY играть, разницы пости нет, ноты по умолчанию уже привязаны в том же FL

Ну и удобное расположение клавиш, и их количество, и крутилочки/сосочки, куда же без них.

В общем нашел я у сына игрушку, она даже работала, но играть на ней было практически невозможно, дело в том что при нажатии на курок водяного пистолета 10 раз подряд с задержкой в 0.2813 секунды, происходило завоздушивание и нормально стрелять невозможно (хотя стрелять я не умею, зато я сантехник) а еще СОВЕРШЕННО СЛУЧАЙНО валялись ардуики всякие, FGPA, три пентиума 2, водосточная труба, 5 грязных носков, мешок навоза и синяя изолента. Гугл сказал можно сделать из этого пушку гауса и гидропонную установку.

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

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

мне нужен новый мозг

Лига Лени от этого поста впала в кому.

мужик,может знаешь.Я купил нотик,а в нём вход гибридный на микрофон и наушники.Вроде.Ну в общем он один.В него реально гитару втыкнуть,чтоб комп видел её?На старом в микрофонный тыкал,а тут не знаю что делать.

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

найди джек папу главное, можно взять от наушников с гарнитурой

и человека с руками что бы тебе спаял

Я уже давно внешнюю аудиокарту купил)

точно не знаю, но если он как микрофон работает, значит и гитару можно пихать.

GuitarLine.Ru

Arduino для музыканта часть 1. Делаем DIY MIDI контроллер/конвертер

Опубликовано: 30.09.2017, автор: sMiles

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

Где-то с 2007-го года я активный читатель Habr’a, последние его трансформации я уже особо не отслеживаю, но до 2011-го года все статьи получал по RSS и просматривал хотя бы заголовки. Поэтому я хорошо помню момент, когда Arduino и Raspberry пошли в массы как недорогие микроконтроллеры. С тех пор у меня засела в голове мысль попробовать с ними свои силы, но так как и на музыку особо времени не остается, приходилось постоянно откладывать начало экспериментов.

Пару лет назад я окончательно пересел на Fractal Axe FX о чем я чуть позже напишу поподробнее.

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

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

Принял решение перейти на рэк и управление только с миди контроллера.

К тому моменту BJ Devices выпустили новую модель с педалью экспрессии и начался процесс проектирования и оформления для себя ТЗ на покупку или разработку река.

В AXE FX отлично эмулируются усилители, дилеи и тд, но там нет пары моих любимых перегрузов(Fulltone OCD и Xotic Soul Driven), я решил убрать их в рэк и контролировать их включение в цепь по миди. Для этого можно было купить миди свитчи от GLAB или Voodoo LAB, но я решил, что тут поможет Arduino.

Итак, задача начала оформляться, нужно было устройство, которое при получении MIDI сообщений будет управлять включением выключением по реле педалей в цепь.

Начались первые эксперименты.

Я купил контроллер Arduino Uno и реле для него. За один вечер удалось сделать свитч, который управляется сигналами из Arduino.

Вместе с контроллером BJ Devices у меня был куплен их свитч LoopX2, цель уже сейчас не припомню, но кто вообще будет объяснять GAS покупки. При проектировании расположения устройств в рековой полке, решил, что Arduino реле будет управлять свитчем от BJ, так как расположение будет гораздо удобнее.

Вторым этапом разработки были добавлены MIDI IN/OUT в схему и немного расширен объем работ.

В сети есть много мануалов по тому как собрать MIDI контроллер на Arduino, как минимум начните изучать эту тему с Notes And Volts.

Читать еще:  Mozilla firefox vpn plugin

Повозившись с россыпью комплектухи, нашелся наш магазин, который продавал уже собранные модули MIDI IN/OUT.

Купил, включил, скачал библиотеку MIDI.h и быстренько набросал программу управления свитчем LoopX2 по MIDI. Промежуточные программы я не буду приводить по тексту, в итоговом примере вы найдете все эти же программы как блоки с комментариями, поэтому двинемся дальше.

Все эти работы шли вечерами, когда находилось время. В общей сложности на разработку ушло 4 месяца, но это с учетом того, что на старте знаний по Arduino и схемотехнике у меня было практически ноль, сейчас с горем пополам могу собрать схему Big Muff или что-то похожее.

Проект начинал обрастать новыми функциями на этот раз я решил убрать в рэк Whammy, сама педаль на мой слух звучит намного музыкальней, чем ее эмуляция в Axe FX. Почитал мануал на педаль, управление по MIDI там достаточно простое, однако, для переключения режимов используются команды Program Change, а это значит, что посылая это сообщение с контроллера в одну MIDI цепь устройств, вместе с Whammy переключать пресеты начнет и Axe FX.

Пришлось добавить еще один MIDI OUT, в итоге в Arduino заходил MIDI сигнал от контроллера и дальше шло разветвление — MIDI OUT для Axe FX , в который не попадают сообщения для Whammy и MIDI THRU, в который идет весь поток миди данных.

Есть один нюанс, Arduino UNO имеет по одному serial порту, для того чтобы иметь один миди вход и два выхода, пришлось купить Arduino Mega, после 10 дней ожидания посылки с Ali удалось собрать макет.

Но вернемся к теме перегрузов и их включения в цепь, в Axe FX отлично эмулируется различные варианты квакушек, но раз уж перегрузы будут стоять ПЕРЕД процессором, то значит квакушка в такой цепи будет стоять ПОСЛЕ перегруза. В таком варианте подключения квакушка звучит слишком стерильно, весь смачный рок-н-ролльный саунд Wah получается только если педаль стоит перед перегрузом.

После пары дней размышлений, удалось достать плату Cry Baby GCB-95.

Час гугления и нашлась вот такая статья (https://www.instructables.com/id/Wahduino-WahWah-by-shakingraise-the-guitar/) про Arduino квакушку, которая управляется акселерометром.

Пришлось покупать цифровой потенциометр, который заменил стандартный пот 100k в квакушке.

Ну и еще пара ссылок вам на интересные проекты DIY рековых квакушек

В этих статьях был только один минус — управление было не по MIDI.

Это была третья часть проекта — добавить квакушку, которая будет управляться по MIDI при помощи Arduino. После пары недель доехала россыпь различных цифровых потенциометров, пара часов экспериментов и я услышал первые «кваки» в наушниках, которые управлялись с мидиконтроллера.

Итак, в процессе экспериментов появился вот такой «монстр»:

Когда я собрал все в одну коробку, от цифровой части схем в квакушку шел очень сильный фон. Пришлось изолировать потенциометр через LDR (http://www.instructables.com/id/How-to-Use-a-Light-Dependent-Resistor-LDR/).

Чтобы вам проще было повторить вот несколько схем. На плате Cry Baby есть 8pin слот для подключения батарейки, кнопки и потенциометра. На схеме ниже каждый выход подписан.

Подробнее про замену потенциометра квакушки на LDR(Light Depended Resistor) можно почитать вот в этой статье http://www.geofex.com/article_folders/wahpedl/wahped.htm

Немного поковырявшись со схемой у меня получился вот такой вариант:

Для удобства я все покрасил на картинке в соответствующие цвета и подписал. Сам по себе LDR это светодиод и фоторезистор. Яркостью светодиода в моей схеме управляет цифровой потенциометр, а фоторезистор одной ногой подключен к выходу «3-ground PA0», ко второму выходу через 100k резистор подключен выход «6 — fx return PB0» и выходу «5 — wiper PW0».

Если у вас в квакушке Dunlop начал хрустеть потенциометр, можно так же не меняя пот, добавить LDR и получить квак, в котором никогда больше не надо будет менять потенциометр.

После перехода на LDR фона стало меньше, но наводок было все равно очень много, я долго игрался с разными вариантами земли, изоляции и тд. Единственный способ как удалось избавиться от фона это убрать плату квакушки в отдельный корпус. При таком раскладе пазл в площадь река у меня уже не складывался, немного поразмыслив я решил купить себе рековую Cry Baby и опять же управлять ею из Arduino. Сам рек ко мне пока только едет, поэтому проект еще не завершен.

Пока схема подключения выглядит вот так:

Аудио сигнал подается на вход Whammy, откуда идет на MidiWah и далее в свитч, который управляется Arduino. Миди сигнал идет из контроллера в Arduino оттуда разделяется на управление Whammy и Axe FX.

Ниже листинг кода для Arduino. Напомню, что при помощи этого кода вы сможете получать и отправлять MIDI команды, управлять реле, управлять Digitech Whammy 5 как переключением режимов так и педалью экспрессии, управлять цифровым потенциометром, который подключен к Cry Baby.

USB MIDI контроллер на Arduino

Большинство статей в интернете по изготовлению MIDI клавиатур, контроллеров, пультов и т.п. основываются на использовании MIDI-разъемов, подключение которых к современному компьютеру может оказаться проблематично. На старых звуковых картах был Game-порт, к которому можно было подключить джойстик или MIDI-устройство:

Однако, все новые материнские платы идут с встроенным звуковым контроллером, да и на звуковых картах зачастую отсутствует возможность подключения MIDI-устройств.
Остается либо покупать современную MIDI-клавиатуру, ди-джейский пульт и т.п. с USB выходом подключения к компьютеру, либо покупать/паять переходник, или же покупать специальную звуковую карту с возможностью подключения MIDI-устройств. Купить конечно не проблема, но мы же на этом сайте не для этого собрались, верно?

В данной статье я хочу показать, как можно на недорогом контроллере Arduino изготовить простейшую MIDI-клавиатуру с USB-подключением на 8 клавиш и колесом прокрутки.

Итак, я использовал:
контроллер Arduino UNO
8 шт. кнопок
8 резисторов 10 кОм
поворотный энкодер 25LB22-Q
макетная плата и перемычки

Схема подключения следующая:

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

Программное обеспечение Arduino

Структуру MIDI-данных я не буду рассматривать, т.к. это описано в статье: передача MIDI данных от Arduino в компьютер

Энкодер подключен к входам аппаратного прерывания, описание работы с ним я рассматривать не буду, т.к. программа проста и взята с официального сайта Arduino.

В данном проекте энкодер используется как колесо прокрутки для изменения модуляции (modulation wheel), однако его можно переназначить и для других целей (pitch bend и т.п.).

MIDI-данные от энкодера, с Arduino посылаются следующей строкой:
noteOn(0xB0, 0x01, encoder0Pos);
где 0xB0 — сообщение контроллера (control change)
0x01 — код контроллера (в нашем случае Modulation)
encoder0Pos — значение контроллера (в нашем случае 0-127).
Меняя коды контроллера вы можете использовать колесо прокрутки (энкодер) для самых разных контроллеров.

Отдельно стоит упомянуть Pitch Bend. Из спецификации MIDI следует, что необходимо послать сообщение из трех байт: 0xE0 (код Pitch Bend), MSB (старший байт), LSB (младший байт).

Читать еще:  120 Киловатт сколько ампер

Два крайних байта хранят 14-битное значение pitch которое может лежать в пределах 0. 16383 (0x3FFF). Середина находится 0x2000, все что выше этого значения — происходить изменение высоты тона вверх, если ниже, то высота тона изменяется вниз.
В коде программы я закомментировал строчки если вы вдруг вместо modulation захотите использовать Pitch Bend (середина значения, разложение на 2 байта и др.)

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

Обратите внимание, что если будет использоваться pitch bend, то encoder0Pos нужно будет возвращать не в ноль, а в 0x2000 (а лучше задать define в начале программы).

Итак, схема собрана, скетч в контроллер залит, запускаем Serial Monitor, меняем скорость передачи на 115200 и нажимая клавиши или крутя энкодер смотрим значения.
Если все нормально, то переходим к следующей части. Сразу скажу, что для меня она оказалось самой проблемной, и если бы я не нашел виртуального USB -> Midi конвертора, то этой статьи не было бы.

Программное обеспечение ПК (Windows)

Для того, чтобы принимать данные через USB виртуальный COM-порт от Arduino и передавать их в какую-либо программу MIDI-секвенсор, необходима специальная утилита: Serial MIDI Converter V2D (оф. сайт)

Программа мультиплатформенная, у меня заработала под Windows 7 x64, правда с некоторыми тормозами.

Запускаем ее, выбираем порт USB, скорость передачи (115200) и MIDI Input Port и MIDI Output Port.

Теперь, все те MIDI-данные, которые поступают на USB виртуальный СОМ-порт 12 перенаправляются на порт MIDI Yoke 6 (для создания виртуальных MIDI портов я воспользовался программой MIDI Yoke). Можно перенаправить их на Microsoft GS Wavetable Synth и др. порты.
Программа постоянно должна быть включенной. При нажатии клавиш или повороте ручки энкодера, внизу должен мигать индикатор Serial RX.

Для визуального отображения поступающих MIDI данных с порта мне очень пригодилась программа MIDI-OX (оф. сайт):

Обратите внимание, что в настройках MIDI Devices необходимо выставить порт MIDI Input.

Теперь, нажимая клавиши нот или вращая колесо, в Monitor-Output вы увидите MIDI-данные.

Т.о. при помощи программно-аппаратных средств мы получили возможность сделать на контроллере Arduino простейшую MIDI-клавиатуру с передачей данных в компьютер, для последующей их обработки, например в Cubase, в. т.ч. в реальном времени.
На основе данного проекта можно сделать DJ-пульт, полноценную MIDI-клавиатуру и т.п.

Ниже вы можете скачать скетч INO, Serial MIDI Converter V2D, MIDI-OX и MIDI Yoke

Midi клавиатура на arduino

This tutorial shows how ho use the ‘Native USB port of an Arduino or Genuino Zero, DUE or 101 board as a MIDI device using the Arduino MIDI USB library. The library can be installed using the arduino library manager

MIDI sound generation on Linux

If you use a Linux machine as the sound generating device, the test procedure described in the main page of the library on Github must be followed to make this example work in the right way. In particular it is necessary to load the correct drivers and soundbank as described in the first part of the explanation. Free soundbanks can be easily found on the web searching for free soundbanks .sf2 .

MIDI sound generation on Windows

The Windows Operating System has a software synth that works with General Standard MIDI commands since the early versions. It needs to be used by the proper MIDI software so that it gets the MIDI messages. This may be achieved with a variety of applications that route, connect or generate the streams between OUT and IN devices. The MIDI sound generator is therefore not directly driven by a MIDI device, like ours. As the routing software we suggest an open source application that allows us to route our MIDI OUT device to the MIDI IN of a software synth . Virtual MIDI Piano Keyboard allows us to configure properly the connections and it is also useful on OSX and Linux to manage the software sound generators.

Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn’t produce any sound by itself, but can be used to drive a MIDI synthesizer. It allows to use the computer’s mouse and keyboard to play MIDI notes. Virtual MIDI Piano Keyboard can be also used to display the played MIDI notes from an instrument MIDI OUT stream or MIDI file player.

The stream of notes and commands routed by VMPK may drive the built-in «Microsoft GS Wavetable Synth», but the soundbanks are not too cool. We suggest that you download and use this CoolSoft Virtual MIDI Synth that supports soundfonts and also sounds great.

Here is the full procedure to set up your Windows machine:

— Download and install CoolSoft Virtual MIDI Synth;
— Launch Configure Virtual MIDI Synth;
— In the MIDI mapper tab select CoolSoft VirtualMIDISynth as Windows Media Player Default Peripheral ;
— In the Options tab select your preferred Audio Output;
— Download and install Virtual Piano MIDI Keyboard;
— Launch VPMK and click on Edit->MIDI connections;
— In the MDI In Driver list select Windows MM;
— In the Input MIDI Connection list select Arduino Zero;
— In the MIDI Out Driver list select FluidSynth ;
— Enjoy playing your Arduio/Genuino board to generate music on your computer!

Hardware Required

  • Arduino or Genuino Board with Native USB port (e.g.: Zero, DUE, 101, Micro, Leonardo. )
  • 7 tactile push-buttons Normally Open
  • 10k ohm linear potentiometer

MIDI Messages

In this example basically two MIDI messages are sent:

  • noteOn message: to state which note must be played;
  • noteOff message: to state which note previously played must be turned off;

The noteOff message is important because the MIDI protocol is event based and the pressure of a key triggers a sound generator that stays on with the specified note until another event is sent, as note off, signaling that the same key has been released and the generator should stop. Each noteOn requires a noteOff or a «all Notes Off» message.

In the prototype of the used functions, a parameter called velocity is present. This name can be interpreted as a false friend since it indicates how loud is the note and not for how long the note is on. This is part of MIDI specs. Some musical keyboards are velocity sensitive and use the speed of the note press as a measure of the loudness that the player wants to use for that note. A piano works in this way. The velocity parameter is controlled by means of the linear potentiometer attached to the A0 input.

In the code the various pitches associated to the notes are defined in a separate header files included at the very beginning of the sketch. We suggest to go the the GitHub repository to follow this example.

Читать еще:  Arduino семисегментный индикатор 4 разрядный

The keys and the linear potentiometer are associated to the pins by means of the following numeric constants.

const uint8_t button1 = 2 ;
const uint8_t button2 = 3 ;
const uint8_t button3 = 4 ;
const uint8_t button4 = 5 ;
const uint8_t button5 = 6 ;
const uint8_t button6 = 7 ;
const uint8_t button7 = 8 ;

const int intensityPot = 0 ; //A0 input

Please note that the intensityPot is defined equal to 0 because the define A0 is associated to the respective note in this particular example.

The notes to be played (from left to right in the breadboard related image) can be changed modifying the values of the following vector:

The function void readButtons() is used to make a mask of the buttons that has been pressed and so be able to play the associated notes by means of the function void playNotes() .

Here the whole sketch:

/*
This examples shows how to make a simple seven keys MIDI keyboard with volume control

Created: 4/10/2015
Author: Arturo Guadalupi

#include «MIDIUSB.h»
#include «PitchToNote.h»
#define NUM_BUTTONS 7

const uint8_t button1 = 2 ;
const uint8_t button2 = 3 ;
const uint8_t button3 = 4 ;
const uint8_t button4 = 5 ;
const uint8_t button5 = 6 ;
const uint8_t button6 = 7 ;
const uint8_t button7 = 8 ;

const int intensityPot = 0 ; //A0 input

uint8_t notesTime [ NUM_BUTTONS ] ;
uint8_t pressedButtons = 0x00 ;
uint8_t previousButtons = 0x00 ;
uint8_t intensity ;

void setup ( ) <
for ( int i = 0 ; i < NUM_BUTTONS ; i ++ )
pinMode ( buttons [ i ] , INPUT_PULLUP ) ;
>

void loop ( ) <
readButtons ( ) ;
readIntensity ( ) ;
playNotes ( ) ;
>

// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange ( byte channel , byte control , byte value ) <
midiEventPacket_t event = < 0x0B , 0xB0 | channel , control , value >;
MidiUSB. sendMIDI ( event ) ;
>

void readButtons ( )
<
for ( int i = 0 ; i < NUM_BUTTONS ; i ++ )
<
if ( digitalRead ( buttons [ i ] ) == LOW )
<
bitWrite ( pressedButtons , i , 1 ) ;
delay ( 50 ) ;
>
else
bitWrite ( pressedButtons , i , 0 ) ;
>
>

void readIntensity ( )
<
int val = analogRead ( intensityPot ) ;
intensity = ( uint8_t ) ( map ( val , 0 , 1023 , 0 , 127 ) ) ;
>

void playNotes ( )
<
for ( int i = 0 ; i < NUM_BUTTONS ; i ++ )
<
if ( bitRead ( pressedButtons , i ) != bitRead ( previousButtons , i ) )
<
if ( bitRead ( pressedButtons , i ) )
<
bitWrite ( previousButtons , i , 1 ) ;
noteOn ( 0 , notePitches [ i ] , intensity ) ;
MidiUSB. flush ( ) ;
>
else
<
bitWrite ( previousButtons , i , 0 ) ;
noteOff ( 0 , notePitches [ i ] , 0 ) ;
MidiUSB. flush ( ) ;
>
>
>
>

// First parameter is the event type (0x09 = note on, 0x08 = note off).
// Second parameter is note-on/note-off, combined with the channel.
// Channel can be anything between 0-15. Typically reported to the user as 1-16.
// Third parameter is the note number (48 = middle C).
// Fourth parameter is the velocity (64 = normal, 127 = fastest).

void noteOn ( byte channel , byte pitch , byte velocity ) <
midiEventPacket_t noteOn = < 0x09 , 0x90 | channel , pitch , velocity >;
MidiUSB. sendMIDI ( noteOn ) ;
>

void noteOff ( byte channel , byte pitch , byte velocity ) <
midiEventPacket_t noteOff = < 0x08 , 0x80 | channel , pitch , velocity >;
MidiUSB. sendMIDI ( noteOff ) ;
>

В прошлом году я случайно увидел на ютубе видео, где Richie Hawtin показывает свой домашний сетап, крутит ручки у пульта Allen&Heath XONE и управляет тем самым популярной диджейской программой NI Traktor. Меня очень впечатлило это визуально и технически. До этого я не имел ни малейшего понятия о MIDI протоколе и контроллерах, его использующих.

В то время в ящике стола давно валялась плата Arduino и я все хотел пограться с ней, светодиодом я уже помигал, на LCD экран Hello world! вывел, а какого-нибудь применения в голову не приходило. И тут это видео. В общем я решил сделать свой миди-контроллер. Практической цели особо не было, потому как я не диджей, просто хотелось сделать какое-нибудь устройство с нуля до готового продукта.

Самым трудным оказалось найти фейдеры. Купить их в городе невозможно, в российских интернет-магазинах какое то гуано, заказывать за рубежом не хотелось из за Почты России с ее молниеносной доставкой. Я уже, в общем то, хотел сделать все вообще без единого движкового резистора, когда коллега подкинул мне пару старых японских резисторов и я все же поставил один как кроссфейдер. Вообще, я почти не тратил деньги на этот проект и большинство деталей обрели вторую жизнь в этом устройстве. Корпус я пару месяцев до этого извлек из помойки на работе, в нем был собран какой то контроллер разряда аккумулятора (вероятно электропогрузчика, вероятно японского потому что там была дюймовая резьба, которую пришлось перенарезать). Мне понравилось что он литой и основательный. По работе мне часто приходится иметь дело с промышленной электроникой, что конечно наложило свой отпечаток и я постарался сделать устройство максимально технологичным в сборке. Я ненавижу шлейфы проводов вырывающиеся из устройства когда ты откручиваешь его крышку, поэтому я решил сделать мезониную конструкцию или этакий бутерброд из плат. Это несколько сложнее чем просто насверлить дырок в корпусе, вставить в них переменных резисторов и соединить все проводами, но зато у меня в корпусе нет ни одного провода и все разбирается-собирается как АК-47.

Первая плата в «бутерброде» это стандартный макетный «шилд» (shield) арудуино, на котором я по быстрому распаял аналоговый мультиплексор 4051, который занимается тем что переключает сигнал с каждого потенциометра на один из аналоговых входов ардуино. (всего их 6, а мне надо было минимум 8, поэтому пришлось мультиплексировать).

Помимо мультиплексора на плате два светодиода, один из которых индицирует питание через USB, а другой через ключ на транзисторе висит на ноге Tx atmega и мигает при передаче MIDI сообщения.

Вторая плата несет на себе все внешние органы управления ( потенциометры и кнопки) и является фальш панелью. Плата разведена в Layout Sprint и напечатана по кустарной ЛУТ технологии.



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

Устройство в сборе выглядит так:

Вероятно это самый маленький диджейский миди контроллер).

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

Если опустить детали, то работает это примерно так: При повороте ручки потенциометра меняется напряжение на его среднем выводе ( от 0 до 5 В, что соответствует его крайним положениям), напряжение оцифровывается АЦП и мы получаем байт который преобразуем в формат MIDI сообщения и шлем в последовательный порт, который есть у микроконтроллера для связи с другими цифровыми устройствами. На плате ардуино распаян USB-UART чип FT232 который поднимает виртуальный COM порт на компе. Дальше драйвер древнего синта Rоland который как нельзя кстати создан для работы через COM порт.

И вуаля. Единственная загвоздка это то, что стандартная скорость обмена в MIDI протоколе не стандартна для COM порта, но это быстро пофиксили обитатели форума ардуино, хакнув драйвер FT232.
Необходимо отредактировать файл FTDIPORT.INF

Маководы могут воспользоваться вот этим приложением
Ну и наконец в вашем любимой музыкальной программе любые элементы интерфейса раскидываются на кнопки и крутилки.

Вот небольшое видео в общих чертах демонстрирующее работу контроллера:

Ссылка на основную публикацию
Adblock
detector