Arduino:Примеры/Midi

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

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


Проигрыватель 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-нот
 
 Этот скетч демонстрирует, как использовать 1-ый цифровой контакт
для передачи данных с MIDI-нотами.
 
 Если подключить эту цепь к синтезатору, она последовательно 
проиграет ноты с F#-0 (0x1E) по F#-5 (0x5A).

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

 К MIDI-разъему подсоедините MIDI-кабель, а к нему – MIDI-синтезатор, а затем проиграйте музыку. 

 Создан 13 июня 2006 года,
 модифицирован 13 августа 2012 Томом Иго (Tom Igoe)

 Этот код не защищен авторским правом.
 
 http://www.arduino.cc/en/Tutorial/Midi
 
 */

void setup() {
  //  задаем скорость передачи MIDI-данных:
  Serial.begin(31250);
}

void loop() {
  // проигрываем ноты с F#-0 (0x1E) до F#-5 (0x5A):
  for (int note = 0x1E; note < 0x5A; note ++) {
    // активируем 1-ый канал (0x90), 
    // выставляем длительность ноты (note), 
    // задаем среднюю скорость (0x45):
    noteOn(0x90, note, 0x45);
    delay(100);
    // активируем 1-ый канал (0x90),
    // выставляем длительность ноты (note),
    // задаем нулевую скорость (0x00):
    noteOn(0x90, note, 0x00);   
    delay(100);
  }
}

// проигрываем MIDI-ноту. 
// проверку на то, является ли значение командного байта больше 127,
// а значение байта данных меньше 127, не делаем.
void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

См.также

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

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