Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Midi

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Проигрыватель MIDI-нот [1]

Этот урок показывает, как проигрывать MIDI-ноты, передаваемые от Arduino.

MIDI (Musical Instrument Digital Interface, т.е. цифровой интерфейс музыкальных инструментов) – это удобный протокол для управления синтезаторами, секвенсорами и другими музыкальными устройствами. MIDI-устройства, как правило, делятся на два широких подкласса: контроллеры (т.е. девайсы, которые генерируют MIDI-сигналы на основе определенных человеческих действий вроде нажатия на клавишу или поворота ручки громкости) и синтезаторы (включая семплеры, секвенсоры и т.д.). Последняя подгруппа при помощи MIDI-данных может создавать звуковые, световые и некоторые другие эффекты.

MIDI – это протокол последовательной передачи данных, который оперирует 31250 битами в секунду. Впрочем, возможностей последовательного порта Arduino (а также всех последовательных портов, имеющихся на Arduino Mega) хватает для того, чтобы справиться с такой нагрузкой.

MIDI-байты делятся на два типа: командные байты и байты данных. Командные байты – это всегда байты со значением 128 или выше (или от 0x80 до 0xFF в шестнадцатеричном виде), а байты данных – это всегда байты со значением 127 и меньше (от 0х00 до 0х7F). Командные байты – это сообщения вроде Note On (начало активации ноты), Note Off (конец активации ноты), Pitch Bend (модуляция звука) и т.д. Байты данных – это сообщения о высоте ноты, скорости, громкости, уровне модуляции и т.д. Более подробно о характеристиках протокола MIDI можно почитать, например, здесь. Данные MIDI записываются, как правило, в шестнадцатеричном виде, поскольку «банки» и инструменты MIDI часто группируются по 16. Более подробную информацию можно прочесть в этом введении в MIDI или в этом примере.

Необходимое оборудование

  • Плата Arduino UNO;
  • Один разъем MIDI;
  • Один 220-омовый резистор;
  • Провода-перемычки;
  • MIDI-устройство (опционально, для тестирования);

Внимание!

В этом примере используется класс Serial. Поэтому, если в основе вашей платы лежит микроконтроллер 32u4 (то есть, допустим, у вас плата вроде Leonardo), замените Serial на Serial1.

Цепь

Тип MIDI-разъема – «мама». Он подключается к Arduino следующим образом:

  • 5-ый контакт MIDI-разъема подключаем к 1-ому цифровому контакту Arduino
  • 2-ой контакт MIDI-разъема подключаем к «земле»
  • 4-ый контакт MIDI-разъема подключаем к 5-вольтовому напряжению (через 220-омовый резистор)

MIDI bb.png

Схема

MIDI schem.png

Код

  1. /*
  2.  Проигрыватель MIDI-нот
  3.  
  4.  Этот скетч демонстрирует, как использовать 1-ый цифровой контакт
  5. для передачи данных с MIDI-нотами.
  6.  
  7.  Если подключить эту цепь к синтезатору, она последовательно
  8. проиграет ноты с F#-0 (0x1E) по F#-5 (0x5A).
  9.  
  10.  
  11.  Цепь:
  12.  * 5-ый контакт MIDI-разъема подключен к 1-ому цифровому контакту
  13.  * 2-ой контакт MIDI-разъема подключен к «земле»
  14.  * 4-ый контакт MIDI-разъема подключен к 5-вольтовому контакту (через 220-омовый резистор)
  15.  
  16.  К MIDI-разъему подсоедините MIDI-кабель, а к нему – MIDI-синтезатор, а затем проиграйте музыку.
  17.  
  18.  Создан 13 июня 2006 года,
  19.  модифицирован 13 августа 2012 Томом Иго (Tom Igoe)
  20.  
  21.  Этот код не защищен авторским правом.
  22.  
  23.  http://www.arduino.cc/en/Tutorial/Midi
  24.  
  25.  */
  26.  
  27. void setup() {
  28.   //  задаем скорость передачи MIDI-данных:
  29.   Serial.begin(31250);
  30. }
  31.  
  32. void loop() {
  33.   // проигрываем ноты с F#-0 (0x1E) до F#-5 (0x5A):
  34.   for (int note = 0x1E; note < 0x5A; note ++) {
  35.     // активируем 1-ый канал (0x90),
  36.     // выставляем длительность ноты (note),
  37.     // задаем среднюю скорость (0x45):
  38.     noteOn(0x90, note, 0x45);
  39.     delay(100);
  40.     // активируем 1-ый канал (0x90),
  41.     // выставляем длительность ноты (note),
  42.     // задаем нулевую скорость (0x00):
  43.     noteOn(0x90, note, 0x00);  
  44.     delay(100);
  45.   }
  46. }
  47.  
  48. // проигрываем MIDI-ноту.
  49. // проверку на то, является ли значение командного байта больше 127,
  50. // а значение байта данных меньше 127, не делаем.
  51. void noteOn(int cmd, int pitch, int velocity) {
  52.   Serial.write(cmd);
  53.   Serial.write(pitch);
  54.   Serial.write(velocity);
  55. }

См.также

  1. serial.begin()
  2. for() loop
  3. Serial Call Response
  4. For Loop
  5. ASCII Table

Внешние ссылки

  1. Arduino - MIDI Note Player