Здравствуйте Прошу помочь в решение dualmoco прошил микроконтроллер 16u2 и usb начинает передавать ноты без переходников .Это как раз просто было .А вот теперь нужен midi разъем СГ 5 для синтезатора .Так как midi система уже работает с андройд виндовс и звуковым модулем без переходников на чистой arduino mega через usb порт. Нужно параллельно прикрутить midi разъем СГ 5 с использованием подключенной библиотеки midi.h. В интернете есть примеры но применить их к готовому коду не получается. Необходимо реализовать возможность отправки сообщений (ноты) через разъем сг 5 с сохранением отправки через usb порт Код (C++): #include <MIDI.h> #include <midi_Defs.h> #include <midi_Message.h> #include <midi_Namespace.h> #include <midi_Settings.h> struct MySettings : public midi::DefaultSettings { //By default, the Arduino MIDI Library tries to be smart by //excluding the CC byte if it doesn't change (to save bandwidth). //This is a problem when starting up Serial<->MIDI software //after starting up the Arduino because we miss the first CC byte. //Setting UseRunningStatus to false removes this "feature." //See https://github.com/projectgus/hairless-midiserial/issues/16 for details. static const bool UseRunningStatus = false; // Set MIDI baud rate. MIDI has a default baud rate of 31250, // but we're setting our baud rate higher so that the Serial<->MIDI software // can properly decode and read outgoing MIDI data on the computer. static const long BaudRate = 31250; }; //#define DEBUG//uncomment this line to print serial messages, comment to send MIDI data //#define BLUETOOTH//uncomment this line to send MIDI data via bluetooth instead of USB //#define BMP//uncomment this line to use the BMP180 to add dynamics via bellows //#define JOYSTICK//uncomment this line to use a joystick as a pitch-bend controller #ifdef BLUETOOTH MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial1, MIDI, MySettings); #else MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings); #endif Код (C++): void setup() { #ifdef DEBUG Serial.begin(9600); #else MIDI.begin(); //If we're sending MIDI over Serial1, open Serial for additional debugging #ifdef BLUETOOTH Serial.begin(9600); #endif #endif //Digital pins start turned off for (int i=0; i<sizeof(left_hand_pins);i++){ pinMode(left_hand_pins[i],OUTPUT); digitalWrite(left_hand_pins[i], LOW); } for (int i=0; i<sizeof(right_hand_pins);i++){ pinMode(right_hand_pins[i],OUTPUT); digitalWrite(right_hand_pins[i], LOW); } Код (C++): void loop() { #ifdef BMP //Read pressure from the BMP_180 and convert it to MIDI expression int expression = get_expression(prev_expression); //Ignore it if it didn't change if(expression != prev_expression) { expression_avg[e] = expression; //Only send MIDI CC every bmp_sample_rate times, //but send the average of the last bmp_sample_rate deltas if (e == bmp_sample_rate - 1){ expression = 0; for (int i=0; i<bmp_sample_rate; i++){ expression += expression_avg[i]; } expression = expression/bmp_sample_rate; #ifdef DEBUG Serial.print("Expression Change: "); Serial.println(expression); #else MIDI.sendControlChange(CC_Expression,expression,1); //Don't let bass overpower melody MIDI.sendControlChange(CC_Expression,constrain(expression-6,0,127),2); //Don't let chords overpower melody MIDI.sendControlChange(CC_Expression,constrain(expression-12,0,127),3); #endif prev_expression = expression; e = 0; } else { e = e + 1; } } #endif #ifdef JOYSTICK int pitch_bend_val = scan_joystick(); if(pitch_bend_val != joystick_prev_val) { //Comment and uncomment to select which channels you want pitch bend to affect. MIDI.sendPitchBend(pitch_bend_val, 1); //MIDI.sendPitchBend(pitch_bend_val, 2); //MIDI.sendPitchBend(pitch_bend_val, 3); joystick_prev_val = pitch_bend_val; } #endif //Alternate between scanning the left and right hand pins //to reduce necessary delay between reads for (int i=0; i<9;i++){ scan_pin(right_hand_pins[i], i, RightKeysStatus[i], false); scan_pin(left_hand_pins[i%3], i%3, LeftKeysStatus[i%3], true); } } byte reg_values = 0; //Read the analog port value for the given pin //If something changed, trigger MIDI signal void scan_pin(int pin, int index, byte PinStatus, bool left) { //TODO - I wonder if we can replace this with direct port write for even better performance? digitalWrite(pin, HIGH); //A slight delay is needed here or else we'll be reading the previous pin delayMicroseconds(300);//was able to cut this in half by alternating between left and right if (left) { reg_values = ~PINL; } else { reg_values = ~PINC; } digitalWrite(pin, LOW); //check if something changed if (reg_values != PinStatus){ //if the byte value is greater, we're turning the note on; else, turning it off. if (reg_values > PinStatus){ //using bit-wise OR to send modified bits only check_key(reg_values ^ PinStatus, index, true, left); } else { check_key(reg_values ^ PinStatus, index, false, left); } } }
на самой ардуине распаен переходник. Вам нужно только разъем припаять или нужно еще и протокол повторить?
Поясните по поводу переходника Я сам разъем СГ5 планирую подключить к Serial2 распаяв резистры на 220ом к 5 и 4 пину разъема СГ5 Serial2 как то надо прописать в void loop(), void setup() ? Получается протокол
Вот картинка или вот схема. Мне удобнее говорить по схеме. Справа есть разъем usb, который подключается к атмега8u2 - это тот самый переходник usb-uart. Если вы хотите ардуинку подключать к какому-то другому разъему (сг5) и уверены, что со стороны ответки будет usb пк, то между разъемом и ардуиной нужно вставить преобразователь usb-uart. Вставлять его между пк и разъемом или между разъемом и ардуиной решать вам. Usb не понравится какой-то левый разъем (не предназначенный для юсб), поэтому, я бы вставлял между пк и разъемом. Я с "чистым" юсби не работал и не уверен, что у меги хватит сил. (у меня то точно) Лучше схему нарисовать.
Нет вы не правильно поняли мою цель dualmoco прошил микроконтроллер 16u2 и usb начинает передавать ноты без переходников .Это как раз просто было .А вот теперь нужен midi разъем для синтезатора .Так как midi система уже работает с андройд виндовс и звуковым модулем без переходников на чистой arduino mega. Нужно параллельно прикрутить midi разъем с использованием подключенной библиотеки midi.h. В интернете есть примеры но применить их к готовому коду не получается
Я сделал платы распаял компоненты получил результат https://www.youtube.com/watch?v=BS6fsSfNalE&feature=emb_title на win10, звуковом модуле и устройстве на андройд через usb ардуино проигрывает ноты. Но для подключения к синтезатору необходимо подключить к ардуино DIN-5/180°. Отечественные аналоги называются СШ-5 (штекер, вилка) и СГ-5 (гнездо, розетка) .Надо точку опоры и я переверну весь мир). Я не просто с утра проснулся и решил, все пора, займусь миди системой. Вот уже в течении полугода ищу инфу по крупицам уже многое сделал. Но вот в программировании не силен. И если я правильно понимаю данные передаются не уровнем напряжения, а током. А что бы получить миди сообщения необходимо подключить СГ-5 к Serial-порту управляющей платы и так как это OUT модуль, то трех проводов и двух резистров без дополнительной обвязки достаточно для работы схемы.Но как это все задать в коде незнаю
Уважаемый. чтож вы этот жуткий текст без запятых из форума в форум копируете - ведь непонятно же абсолютно ничего! Вам нужно просто вывести те же данные, что у вас на USB - через другой по форме разъем или нужно переписать всю программу для вывода Миди в новом формате? Если первое - достаточно присоединить разъем к Сериал, а в коде раскомментировать, например, блютуз и подставить в него нужный порт, ничего больше менять не надо. Но я сильно сомневаюсь. что это будет работать - все ж таки и USB и Сериал - цифровые интерфейсы. а разъем CГ5 традиционно использовался для аналога - и если у вас в синтезаторе такой вход - вряд ли он поймет выход ардуины...
Так лучше? Я сделал платы распаял компоненты получил результат https://www.youtube.com/watch?v=BS6fsSfNalE&feature=emb_title на win10, звуковом модуле и устройстве на андройд через usb ардуино проигрывает ноты. Но для подключения к синтезатору необходимо подключить к ардуино DIN-5/180°. Отечественные аналоги называются СШ-5 (штекер, вилка) и СГ-5 (гнездо, розетка) .Надо точку опоры и я переверну весь мир). Я не просто с утра проснулся и решил, все пора, займусь миди системой. Вот уже в течении полугода ищу инфу по крупицам уже многое сделал. Но вот в программировании не силен. И если я правильно понимаю данные передаются не уровнем напряжения, а током. А что бы получить миди сообщения необходимо подключить СГ-5 к Serial-порту управляющей платы и так как это OUT модуль, то трех проводов и двух резистров без дополнительной обвязки достаточно для работы схемы.Но как это все задать в коде не знаю
Если я правильно понимаю, то стандартный выход МИДИ это просто выход 5В UART-а через ограничительные резисторы. В данной схеме использутся выход UART c открытым коллектором. Если использовать PushPull то надо 4-й пин разъема к микроконтроллеру, а 5-й на землю. На не длинном кабеле должно нормально работать.
нет, это тоже я уже два или даже три раза читал .Если вы видите, что вас не понимают - надо не цитировать себя снова и снова, а попытаться переформулировать вопрос более понятно.
ну тогда ответ на первый вопрос топика - в коде ничего менять не надо, подключаем разъем к любому доступному сериалу и указываем этот сериал в строке Код (C++): MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings);
скорее в loop() - в этом коде Миди expressions генерятся по показаниям датчика давления. Не уверен, что это то, что вы хотите.
Serial.begin(9600); Это скорость midi для BLUETOOTH в void setup() правильно? А не нужно ли это значение поменять на Serial.begin(31250); для передачи по проводному интерфейсу?
нет, неправильно. Это скорость для вывода сообщений отладки в консоль, для BLUETOOTH используется Serial1 Скорость для Миди интерфейса уже задана в Settings, отдельно ее выставлять не надо
Большое все спасибо за ваши советы и помощь все заработало . Midi сигнал передается паралельно и с usb и с DIN-5/180°