MIDI контроллер

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

V-USB - отличный проект!

Сечас доделываю на базе него контроллер CV+GATE и еще шесть линий GATE для управления аналоговыми электронными барабанами. Еще осталось место 2/3 памяти и свободный USART для MIDI IN/OUT.

Если кому-то интересно, то тут тоже выложу, как все будет готово.
Аватара пользователя
EternalEngine
Грызет канифоль
Сообщения: 266
Зарегистрирован: Пн фев 02, 2009 08:19:53
Откуда: Москва
Контактная информация:

Re: MIDI контроллер

Сообщение EternalEngine »

Интересно, с нетерпением ждём)
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

UA3MQJ да выкладывай, интересно будет как ты реализуешь MIDI IN/OUT программно))

EternalEngine немного переделал код с учетом ваших рекомендаций, проверьте пожалуйста на наличие косяков.
Вложения
mainloop.c
only main function
(1.48 КБ) 592 скачивания
Даташит - библия моя...
Изображение
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

VenomXP писал(а): интересно будет как ты реализуешь MIDI IN/OUT программно)).


А там есть какие-то "подводные камни"? Давайте рассказывайте!
Дело в том, что мне его все равно не проверить.
Аватара пользователя
EternalEngine
Грызет канифоль
Сообщения: 266
Зарегистрирован: Пн фев 02, 2009 08:19:53
Откуда: Москва
Контактная информация:

Re: MIDI контроллер

Сообщение EternalEngine »

хз, вроде как всё правильно. попробуй прошить. хотя я бы проверку и отправление оформил в отдельные функции и побольше использовал директиву #define, ибо когда код занимает больше 100 строк разобраться потом чисто визуально уже трудно.

з.ы. и не надо обращаться ко мне на вы, я уверен что я не намного старше тебя, если вобще старше :))
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

EternalEngine писал(а):и не надо обращаться ко мне на вы, я уверен что я не намного старше тебя, если вобще старше :))


Завидуйте. Ко мне вон сразу на "ты" - "выкладывай".
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

функции чисто практически не использую, в последних вариантах прошивок почти всегда их нет за исключением маина и обработчика прерываний, поскольку вход в функцию занимает 4 такта процессора и выход столько же(или они вместе столько занимают, точно не помню) а так же заносятся кое какие данные в память, а это все лишнее, время и пр и пр. тем более если в функцию что-то передавать. а здесь еще и усб протокол пашет, сам компилятор велел воздержатся от функций, хотя это уже просто бзик)))
а ты делал обработку миди команд пришедших с компа? вообще из какой функции надо брать данные что пришли с большого брата? просто хочу сделать отображение того что с компа шлется, допустим я нажал клавишу 1, отправил событие нажатия в комп, тот в ответ послал команду подтверждения что, такой то переключатель переведен в состояние вкл или выкл, а я уже зажгу светодиод у нужной кнопки.
Даташит - библия моя...
Изображение
Аватара пользователя
EternalEngine
Грызет канифоль
Сообщения: 266
Зарегистрирован: Пн фев 02, 2009 08:19:53
Откуда: Москва
Контактная информация:

Re: MIDI контроллер

Сообщение EternalEngine »

Не раз замечал такую интересную вещь, что когда все обращаются друг к другу на вы, это сильо заряжает атмосферу и некоторые люди даже боятся задавать вопросы в сило того что их могут посчитать глупыми. у нас вроде как в стране демократия, так что давайте будем проще относиться друг к другу. извиняюсь за оффтоп :)
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

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

вот один из вариантов от автора библиотеки для MIDI Out

Код: Выделить всё

/*----------*/
/* usbFunctionWriteOut                                                      */
/* this Function is called if a MIDI Out message (from PC) arrives. */
/*----------*/
void usbFunctionWriteOut(uchar * data, uchar len)
{
    while (len--) UART_out( *data++ );
}


а для MIDI IN, ждем принятия байта и формируем пакет для отправки в маине.

возможно надо будет что-то буферизовать, это уже дело практики.

вот тут кстати сам автор отвечает на много вопросов http://forums.obdev.at/viewtopic.php?f=8&t=1352
Даташит - библия моя...
Изображение
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

пока отвечал, сам понял как принимать и обрабатывать данные с компа))
Даташит - библия моя...
Изображение
Аватара пользователя
EternalEngine
Грызет канифоль
Сообщения: 266
Зарегистрирован: Пн фев 02, 2009 08:19:53
Откуда: Москва
Контактная информация:

Re: MIDI контроллер

Сообщение EternalEngine »

ну так рассказывай :))
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

Отлично. С обращениями определились.
По поводу приема все правильно. Там по ссылке как раз и написано:

V-USB-MIDI can send but also receive midi:

обработку принятых данных пишем в

Код: Выделить всё

void usbFunctionWriteOut(uchar * data, uchar len) {
     //if(data[0] == 11 && data[3] == 99 && data[2] == 1) {...
}


И не забываем включить

Код: Выделить всё

don't forget to:
#define USB_CFG_IMPLEMENT_FN_WRITEOUT 1
in usbconfig.h


У самого сделано так (уж не знаю, насколько правильно, т.к. совсем недавно под АВР пишу на СИ):

Код: Выделить всё

void usbFunctionWriteOut(uchar * data, uchar len)
{

   //my_printf("usbFunctionWriteOut\r\n", 21);
   //my_printf_hex( data, len );

   //usb 0x9 - note ON и МИДИ команда 9 канал не 10-й

   uchar drum_num;
   
   if ( ( ( data[0] & 0x0f ) == 0x09 ) & ( ( data[1]>>4 ) == 0x09 )  ) {

      my_printf("usbFunctionWriteOut\r\n", 21);
      my_printf_hex( data, len );   

      //если это не 10-й канал (барабаны)
      if ( (data[1] & 0x0f) != 9 ) {
         //если ноту нажали - выводим ее на CV
         set_note( data[2] );
         PORTB = 0x01; //выводим сигнал GATE
      } else {
           //для барабанов начальной нотой будет
         //0x3c - нота ДО неведомой октавы (6-я, от начала, если считать от единицы)
         drum_num = (uchar)data[2] - 0x3c; //считая с ноля;

         PORTC |= 1<<drum_num;


      }

   }

   if ( ( ( data[0] & 0x0f ) == 0x08 ) & ( ( data[1]>>4 ) == 0x08 )  ) {

      my_printf("usbFunctionWriteOut\r\n", 21);
      my_printf_hex( data, len );   

      //если это не 10-й канал (барабаны)
      if ( (data[1] & 0x0f) != 9 ) {
         //если ноту отпустили, то снимаем только GATE
         PORTB = 0x00;
      } else {
         drum_num = data[2] - 0x3c; //считая с ноля;

         PORTC &= ~(1<<drum_num);

      }

   }

}


void set_note( int note ) {

   int pwm_val = note<<3; //ноты от 0 до 127

   // pwm_val - это число от 0 до 1023

   OCR1AH = (char)(pwm_val>>8);
   OCR1AL = (char)pwm_val;

}


Но это все еще сыровато. Надо условий добавить для диапазона нот барабанов.
В железе тоже работает. my_printf - это у меня вывод через USART обратно на компьютер, чтобы посмотреть что там происходит.
Напряжения на выходе меняются (гляжу осциллографом), ШИМ для CV тоже работает. Теперь надо обвязку делать, чтобы буферизировать GATEы для барабанов и CV-GATE, потом ФНЧ для ШИМа и операционник, чтобы напряжения на выходе соответствовали 1 вольт/октава.
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

советую обработку делать так:

Код: Выделить всё

/*----------*/
/* usbFunctionWriteOut                                                      */
/* this Function is called if a MIDI Out message (from PC) arrives. */
/*----------*/
void usbFunctionWriteOut(uchar * data, uchar len)
{
    peocessing(data, len);
}

processing(uchar *data, uchar len)
{
   uchar Command = (*data) & 0x0f;
   uchar Channal= (*(data+1)) & 0x0f;
   uchar Value = *(data+2);
   uchar Value_MB= *(data+3);// это когда значение превышает 128 единиц

    //куда-то шлем на обработку или тут делаем все

   if (len > 4)
   {
        processing(data+4, len-4);
   }
}
Даташит - библия моя...
Изображение
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

Рекурсия - дело хорошее, но мы всетаки на МК. Может проще цикл?
Отладка показала, что len там всегда = 8.
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

А если почитать http://www.usb.org/developers/devclass_docs/midi10.pdf
(но я думаю, что все уже почитали)

то там на стр. 17 есть примеры. Байты не всегда являются Command, Channal, Value и Value_MB.
Т. к. мне больше Note ON и Note OFF ничего пока не надо, потому я и упростил.

Но мысль интересная, надо будет еще поотлажвать, вдруг там в 8-ми байтах могут прийти сразу две команды...
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

UA3MQJ отпишись о результатах приема данных: работает или нет, сколько команд приходит на 8 байт, какой алгоритм принятия и обработки используете?

и объясните кто-нибудь про каналы, это вообще что?
Даташит - библия моя...
Изображение
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

Работает. Код я написал выше.
Приходит обычно по 8 байт.
В первых 4-х команда, остальные нули.
Про МИДИ каналы или про какие?
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

ага. допустим я использую программу которая поддерживает внешние миди контроллеры, как мне узнать какие данные и по каким каналам она шлет, может есть какие нибудь программы которые перехватывают сообщения и отображают их?
Даташит - библия моя...
Изображение
Аватара пользователя
UA3MQJ
Грызет канифоль
Сообщения: 275
Зарегистрирован: Вт окт 30, 2007 13:53:01
Откуда: Рыбинск
Контактная информация:

Re: MIDI контроллер

Сообщение UA3MQJ »

Тут народ говорил про какие-то MIDIMON или что-то типа того.
Я их не пользовал, а просто настроил USART на передачу в сторону компьютера того, что приняла функция.
С помощью MAX232 подключил к компорту и в гипертерминале смотрю что приходит от контроллера.

Тестировал с FLStudio и нифига не работало, все перепробовал - сообщения не приходят.
Но потом поставил MIDI устройством по умолчанию USB-MIDI и запустил медиаплеером какой-то мидишный файл. Данные пошли!!! Значит передача работает, а проблема в FL. Там оказывается надо в списке устройств не просто выбрать вывод на 'устройство USB' но еще выбрать канал 0. Если будет пусто в столбце - оно не работает.

По поводу передачи данных на контроллеры - ничего не могу сказать, т. к. я их не использую, но если в usbFunctionWriteOut поставить вывод в порт, то все сообщения будет видно. Там уже можно будет выяснить по их кодам какие из них действительно для контролов. У меня сначала там и было: выводило вообще все сообщения, это я потом стал выводить только сообщения при note ON и note OFF.

По поводу каналов - не понял какой ты имеешь в виду. Наверное всетаки МИДИ канал. В стандартном миди 16 каналов. На каждый назначено по одному инструменту. Десятый канал - барабаны. Там каждой ноте соответствует не нота инструмента, а звук отдельного барабана. У меня в коде примерно так и написано. Что если команда USB - это Note On (первый байт), и команда MIDI тоже Note ON(второй байт (первый байт миди команды)). Этот байт разделен на две половины: старшая - команда - 9, то есть NoteON, а младшая как раз и есть номер канала. Второй байт миди команды Note On - это номер ноты 0..127. Третий байт - громкость. Мне на него пока пофигу, но будет время - попробую выводить его через второй ШИМ. Это позволить управлять громкостью VCO с помощью много фходового VCA, подавая на него не только сигнал с ADSR но и от сюда. То есть можно будет громкость инструмента регулировать с компьютера, а не только в железе.

Если дальше изголяться с каналами, то можно сделать 16 каналов CV+GATE для управления сразу 16 генераторами. То есть 16 разных инструментов задействовать. Хотя 16-ти ШИМОВ не найти, но как предлагает народ на diyfactory.com, можно использовать мультиплексоры и вообще одшим ШИМом формировать 16 каналов CV + 16 каналов Volume + Pitch + Pan, просто они будут запоминаться. В общем наворотить можно очень много. Я пока задаюсь целью сделать из ПК секвенсор для аналоговой барабанной установки, чтобы тестировать барабанные модули...

Мне кажется, что каналы при управлении контролами каналы не используются, а используются кикие-нибудь syxex. Ты лучше скажи как это дело в программе накрутить и в какой программе. Я отладку включу и посмотрю какие он там команды шлет. Ну а ты уже там вставишь себе в обработку. Жаль отпуск кончился...
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Re: MIDI контроллер

Сообщение VenomXP »

да я про миди каналы. я использую Guitar Rig, проверить не могу, платке не готово. на днях допилю. мне просто надо выяснить вообще шлет ли она что нибудь в миди канал, или просто тупо принимает, шас до собираю там светодиодами буду отображать. кстати с последней версией библиотеки v-usb код не компилица, ругается на выбор питания, надо в usbdrv.h убрать за комментированную строчку USBATTR_BUSPOWER, вообще не понятно по каким причинам они его исключили, по сути во всех дискрипторах идет описание того откуда идет питание. или просто использовать библиотеку постарше. там точно будет компилить. просто в новой либе прикрутили потоковое CRC для кварца 18МГц и добавили поддержку кварцев на 20Мгц. оч удобно при больших объемах данных. про FL Studio писали чуть раньше в форуме как его прикрутить. почитай.
Даташит - библия моя...
Изображение
Ответить

Вернуться в «Интеграция с ПК»