MIDI клавиатура управляемая светодиодная лента
Моя цель - зажечь светодиод на полоске, соответствующей нотке клавиатуры. У меня есть Arduino Uno с модулем MIDI in, подключенным к последовательному порту. Пианино подключено к стандартному midi-кабелю, светодиодная лента питается от Arduino 5v (решил, что больше мне не нужно, потому что максимум 10 светодиодов будут активны одновременно).
Моя установка работает, но не точно. Все прекрасно, когда одновременно воспроизводится только 1 нота, но чем плотнее становится музыка (быстрее или больше нот воспроизводится одновременно), тем больше появляется неточностей - больше светодиодов не гаснет и не включается, или загораются ноты, которые я не играл.
Сначала я использовал программное обеспечение serial, и ошибок было еще больше, но когда я переключился на аппаратное обеспечение, оно стало лучше. Может быть, Arduino UNO просто недостаточно мощен и не может идти в ногу с входящим midi-входом или есть еще одна проблема?
Вот код:
#include <MIDI.h>
#include <Adafruit_NeoPixel.h>
MIDI_CREATE_DEFAULT_INSTANCE();
#define STRIP_PIN 11
#define STRIP_NUM_PIXELS 88
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_NUM_PIXELS, STRIP_PIN, NEO_GRB + NEO_KHZ800);
void handleNoteOn(byte channel, byte pitch, byte velocity)
{
strip.setPixelColor(pitch - 21, strip.Color(50, 50, 50));
strip.show();
}
void handleNoteOff(byte channel, byte pitch, byte velocity)
{
strip.setPixelColor(pitch - 21, strip.Color(0, 0, 0));
strip.show();
}
// -----------------------------------------------------------------------------
void setup()
{
MIDI.setHandleNoteOn(handleNoteOn);
MIDI.setHandleNoteOff(handleNoteOff);
MIDI.begin(MIDI_CHANNEL_OMNI);
strip.begin();
}
void loop()
{
MIDI.read();
}
@Alex G, 👍-1
Обсуждение1 ответ
Самая большая проблема заключается в том, что обновление светодиодов является трудоемкой задачей.
- Сборка ручной работы написана для того, чтобы правильно выбрать время
- Прерывания отключены во время выполнения обновления
- Обновление 88 светодиодов занимает (относительно) много времени.
При примерно 1,2 Мкс на светодиод плюс 50 Мкс для импульса сброса вы смотрите примерно на 155 Мкс, которые Arduino не может делать вообще ничего другого. Это включает в себя получение чего-либо через последовательный. И поскольку вы обновляете каждую полученную заметку, если поступит вторая заметка с 155 мкс этой заметки, она будет пропущена.
Вы можете получить лучшие результаты с помощью библиотеки FastLED вместо библиотеки Adafruit Neopixel, но в идеале вы хотите работать с достаточно быстрой платой, чтобы не нужно было выполнять такую жесткую переброску битов для протокола, чтобы прерывания все еще могли быть включены для приема данных.
Спасибо за эти знания! Мне нужно, чтобы он работал идеально, не пропуская ни одного удара... как вы думаете, Arduino DUE справится с этой задачей?, @Alex G
Только в том случае, если используемая вами библиотека светодиодов позволяет ей работать без отключения прерываний. Библиотека FastLED может иметь режим DMA, который работает полностью асинхронно, но я не знаю, работает ли он в Due. Потребуются еще некоторые исследования., @Majenko
- Лента Dotstar сходит с ума при подключении к MIDI-пианино
- Быстродействующий массив fill_solid
- RGB светодиодная лента 100м.
- Как подключить две светодиодные ленты (APA102/SK9822) к Arduino UNO?
- игнорирование изменений значения потенциометра
- Светодиод, управляемый Midi через USB
- Как загрузить и сохранить настройки/переменные с компьютера на Arduino?
- Помощь с ускорением ПИД-двигателя постоянного тока
Я бы собирал события до разрыва в потоке событий note и показывал их сразу, @Juraj
Отсутствующие ноты или релизы могут быть вызваны временем, но уведомления о нотах, которые вы не играли, более тревожны. Попробуйте удалить материал neopixel и просто записать ноты - надежно ли работает midi-материал сам по себе? (Возможно, вам придется придумать какой-нибудь хитроумный способ получения данных, поскольку вы используете последовательный порт.), @Mark Smith
Да, я действительно не знаю, как правильно отлаживать. Я думаю, что ноты, которые я не играл, были написаны потому, что midi-пакет был прочитан неправильно, поэтому некоторые другие параметры были каким-то образом прочитаны как ноты. Когда я тестировал через SoftwareSerial, казалось, что все работает нормально на входе, когда я просто читаю midi-данные., @Alex G
Также учтите, что проблема не внутри вашего скетча, а внутри вашей схемы; Сначала попробуйте просто распечатать значения и проверить, получены ли все MIDI-сообщения включения/выключения. Если вы уверены, что схема (и скетч относительно MIDI-входа в порядке) в порядке, добавьте код светодиодной ленты еще раз., @Michel Keijzers