Я делаю интерфейс барабанного секвенсора для электронной музыки .
Он использует Arduino Mega в качестве микропроцессора, и в настоящее время он взаимодействует с программой обработки, которую я написал для последовательной связи. Оттуда сообщения OSC отправляются в программу Max / MSP, которую мой партнер по сотрудничеству написал для создания потока данных midi.
Так:
Мой физический интерфейс -> Arduino Mega -> последовательный ввод / вывод -> Обработка -> OSC -> Max / MSP -> Midi (-> музыкальное приложение)
Я выбрал этот путь отчасти из-за того, что он не достаточно умен, чтобы удалить какие-либо шаги, но также и для того, чтобы иметь возможность обновлять физический интерфейс так, как мы хотим, чтобы сделать физический интерфейс многоцелевым (несколько режимов для фейдеры, регуляторы и кнопки выбора голоса), а также смогут обеспечить критическую настройку времени и изменение ритма (иначе говоря, «свинг»).
Мои серийные сообщения настроены так:
PL,1; // transport control: play
PL,0; // transport control: stop
SW,30; // swing value 30
TM,130; // tempo value 130
SD,1,8,04,0; // Step sequencer data, pattern 1, voice 8 (of 8), step 04 (of 16), off
MU,8,1; // Mute, voice 8 (of 8), on
SO,4,0; // Solo, voice 4 (of 8), off
VL,3,127; // Velocity, voice 3 (of 8), value 127
CC,1,127; // Midi CC, controller 1, value 127
NN,1,36; // Note number, voice 1 (of 8), value 36 (usually a kick drum)
Итак, вы можете видеть, что по количеству запятых на точку с запятой я могу определить, как анализировать последовательные данные из arduino в программе обработки. Из Обработки эти виды сообщений преобразуются в OSC следующим образом:
/beatseqr/play 1
/beatseqr/play 0
/beatseqr/swing 30
/beatseqr/tempo 130
/beatseqr/matrix/1/8/04 0
/beatseqr/mute/8 1
/beatseqr/solo/4 0
/beatseqr/velocity/3 127
/beatseqr/midicc/1 127
/beatseqr/midinn/1 36
И все это работает хорошо, но это неэффективно. Мне действительно нужно приложение для обработки в середине?
Теперь я попытался отделить части Обработки и OSC от уравнения, но мне не хватает некоторых знаний в отношении дизайна протокола последовательных данных.
Я знаю, что udpreceive
в Максе есть объект. И это работает хорошо, я думаю? Может быть, я использую это неправильно.
В какой-то момент я переключил весь свой код arduino так, чтобы он не отправлял символы новой строки в конце каждого последовательного сообщения, поскольку это ничего не значило для udpreceive
объекта Макса . На самом деле, если я правильно помню, он будет принимать только первое сообщение до первой новой строки, а затем прекратит обработку данных. Поэтому, чтобы обойти это, я убрал все символы новой строки, а затем он непрерывно извергался в max / msp.
Тогда следующая проблема этого метода состоит в том, что udpreceive
объект принимает только один символ за раз. Поэтому я пытался использовать js
объект javascript для объединения входящих символов, а затем анализировать их по точкам с запятой и запятым. Проблема, с которой я столкнулся, заключалась в том, что она была непредсказуемой и нестабильной. Символы будут выпадать, и сообщение будет невозможно обработать. Так что это действительно заставляет меня задуматься, стоит ли мне менять протокол последовательных данных на что-то более надежное? Или я просто делаю это неправильно?
Должен ли я просто все это очистить и начать все заново, используя прошивку Firmata? Я видел несколько руководств по использованию фирм с Max / MSP , и я думаю, что мог бы по-новому взглянуть на то, что делает код на коробке и нужно ли вообще это делать. Может ли фирма принимать строковые данные на выводе для отправки на бортовой последовательный ЖК-дисплей? если я смогу управлять ЖК-дисплеем с max / msp, это может сработать нормально.
Есть какой-нибудь совет?
OMGWTF
кнопку, но очень хорошо продуманный и подробный вопрос тоже!Ответы:
Возможно ли, что ваша проблема вызвана Arduino? Я знаю, что это звучит странно, потому что Arduino сильно полагается на последовательную связь и обычно не терпит неудачу. Но я бы посоветовал вам попробовать свой Arduino с разными скоростями, выводить данные, читаемые человеком, и осуществлять мониторинг с помощью терминальной программы. У меня была та же самая проблема, и это было вызвано земной проблемой моего arduino. Кроме того, другим решением может быть использование пользовательского дизайна Arduino с тактовой частотой, подходящей для последовательного интерфейса, например 14,7456 МГц, или с любым значением, кратным 3,6864 МГц. Надеюсь, поможет...
источник