Вывод midi нот через разъем сг5

Тема в разделе "Arduino & Shields", создана пользователем denia85, 17 ноя 2019.

Метки:
  1. denia85

    denia85 Нуб

    Здравствуйте
    Прошу помочь в решение
    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);
        }
      }
    }
     
    Последнее редактирование: 18 ноя 2019
  2. Daniil

    Daniil Гуру

    на самой ардуине распаен переходник.
    Вам нужно только разъем припаять или нужно еще и протокол повторить?
     
  3. denia85

    denia85 Нуб

    Поясните по поводу переходника
    Я сам разъем СГ5 планирую подключить к Serial2 распаяв резистры на 220ом к 5 и 4 пину разъема СГ5 Serial2 как то надо прописать в void loop(), void setup() ? Получается протокол
     
  4. denia85

    denia85 Нуб

    Исходник
     

    Вложения:

  5. Daniil

    Daniil Гуру

    Вот картинка или вот схема. Мне удобнее говорить по схеме. Справа есть разъем usb, который подключается к атмега8u2 - это тот самый переходник usb-uart.
    Если вы хотите ардуинку подключать к какому-то другому разъему (сг5) и уверены, что со стороны ответки будет usb пк, то между разъемом и ардуиной нужно вставить преобразователь usb-uart. Вставлять его между пк и разъемом или между разъемом и ардуиной решать вам. Usb не понравится какой-то левый разъем (не предназначенный для юсб), поэтому, я бы вставлял между пк и разъемом.
    Я с "чистым" юсби не работал и не уверен, что у меги хватит сил. (у меня то точно)

    Лучше схему нарисовать.
     
  6. denia85

    denia85 Нуб

    Нет вы не правильно поняли мою цель dualmoco прошил микроконтроллер 16u2 и usb начинает передавать ноты без переходников .Это как раз просто было .А вот теперь нужен midi разъем для синтезатора .Так как midi система уже работает с андройд виндовс и звуковым модулем без переходников на чистой arduino mega. Нужно параллельно прикрутить midi разъем с использованием подключенной библиотеки midi.h. В интернете есть примеры но применить их к готовому коду не получается
     
  7. denia85

    denia85 Нуб

    Я сделал платы распаял компоненты получил результат

    https://www.youtube.com/watch?v=BS6fsSfNalE&feature=emb_title
    на win10, звуковом модуле и устройстве на андройд через usb ардуино проигрывает ноты. Но для подключения к синтезатору необходимо подключить к ардуино DIN-5/180°. Отечественные аналоги называются СШ-5 (штекер, вилка) и СГ-5 (гнездо, розетка) .Надо точку опоры и я переверну весь мир). Я не просто с утра проснулся и решил, все пора, займусь миди системой. Вот уже в течении полугода ищу инфу по крупицам уже многое сделал. Но вот в программировании не силен. И если я правильно понимаю данные передаются не уровнем напряжения, а током. А что бы получить миди сообщения необходимо подключить СГ-5 к Serial-порту управляющей платы и так как это OUT модуль, то трех проводов и двух резистров без дополнительной обвязки достаточно для работы схемы.Но как это все задать в коде незнаю
     
    Последнее редактирование: 19 ноя 2019
  8. b707

    b707 Гуру

    Уважаемый. чтож вы этот жуткий текст без запятых из форума в форум копируете - ведь непонятно же абсолютно ничего!
    Вам нужно просто вывести те же данные, что у вас на USB - через другой по форме разъем или нужно переписать всю программу для вывода Миди в новом формате?
    Если первое - достаточно присоединить разъем к Сериал, а в коде раскомментировать, например, блютуз и подставить в него нужный порт, ничего больше менять не надо.
    Но я сильно сомневаюсь. что это будет работать - все ж таки и USB и Сериал - цифровые интерфейсы. а разъем CГ5 традиционно использовался для аналога - и если у вас в синтезаторе такой вход - вряд ли он поймет выход ардуины...
     
    Последнее редактирование: 19 ноя 2019
  9. denia85

    denia85 Нуб

    Так лучше?
    Я сделал платы распаял компоненты получил результат

    https://www.youtube.com/watch?v=BS6fsSfNalE&feature=emb_title
    на win10, звуковом модуле и устройстве на андройд через usb ардуино проигрывает ноты. Но для подключения к синтезатору необходимо подключить к ардуино DIN-5/180°. Отечественные аналоги называются СШ-5 (штекер, вилка) и СГ-5 (гнездо, розетка) .Надо точку опоры и я переверну весь мир). Я не просто с утра проснулся и решил, все пора, займусь миди системой. Вот уже в течении полугода ищу инфу по крупицам уже многое сделал. Но вот в программировании не силен. И если я правильно понимаю данные передаются не уровнем напряжения, а током. А что бы получить миди сообщения необходимо подключить СГ-5 к Serial-порту управляющей платы и так как это OUT модуль, то трех проводов и двух резистров без дополнительной обвязки достаточно для работы схемы.Но как это все задать в коде не знаю
     
  10. asam

    asam Гик

    Если я правильно понимаю, то стандартный выход МИДИ это просто выход 5В UART-а через ограничительные резисторы.
    В данной схеме использутся выход UART c открытым коллектором. Если использовать PushPull то надо 4-й пин разъема к микроконтроллеру, а 5-й на землю. На не длинном кабеле должно нормально работать.


    MIDI_IN_OUT_schematic.svg.png
     
    Последнее редактирование: 19 ноя 2019
  11. b707

    b707 Гуру

    нет, это тоже я уже два или даже три раза читал
    .Если вы видите, что вас не понимают - надо не цитировать себя снова и снова, а попытаться переформулировать вопрос более понятно.
     
  12. b707

    b707 Гуру

    ну тогда ответ на первый вопрос топика - в коде ничего менять не надо, подключаем разъем к любому доступному сериалу и указываем этот сериал в строке
    Код (C++):
    MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings);
     
  13. denia85

    denia85 Нуб

    А в void setup() нужно же тоже что-то указывать?
     
  14. b707

    b707 Гуру

    скорее в loop() - в этом коде Миди expressions генерятся по показаниям датчика давления. Не уверен, что это то, что вы хотите.
     
  15. denia85

    denia85 Нуб

    Serial.begin(9600); Это скорость midi для BLUETOOTH в void setup() правильно? А не нужно ли это значение поменять на Serial.begin(31250); для передачи по проводному интерфейсу?
     
  16. b707

    b707 Гуру

    нет, неправильно.
    Это скорость для вывода сообщений отладки в консоль, для BLUETOOTH используется Serial1
    Скорость для Миди интерфейса уже задана в Settings, отдельно ее выставлять не надо
     
  17. parovoZZ

    parovoZZ Гуру

    настраиваешь порт на 31250 бод и гонишь туда миди сообщения.
     
  18. denia85

    denia85 Нуб

    Большое все спасибо за ваши советы и помощь все заработало . Midi сигнал передается паралельно и с usb и с DIN-5/180°