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

denia85
Offline
Зарегистрирован: 18.11.2019
Здравствуйте
Прошу помочь в решение
dualmoco прошил микроконтроллер 16u2 и usb начинает передавать ноты без переходников .Это как раз просто было .А вот теперь нужен midi разъем СГ 5 для синтезатора .Так как midi система уже работает с андройд виндовс и звуковым модулем без переходников на чистой arduino mega через usb порт. Нужно параллельно прикрутить midi разъем СГ 5 с использованием подключенной библиотеки midi.h. В интернете есть примеры но применить их к готовому коду не получается. Необходимо реализовать возможность отправки сообщений (ноты) через разъем сг 5 с сохранением отправки через usb порт
[code=cpp][/code]
bwn
Offline
Зарегистрирован: 25.08.2014

Вставьте код по правилам форума. Описано в начале приколоченной темы.

denia85
Offline
Зарегистрирован: 18.11.2019
nclude <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
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);
  }
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);
    }
  }
}

 

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

denia85 пишет:

Необходимо реализовать возможность отправки сообщений (ноты) через разъем сг 5 с сохранением отправки через usb порт

Уважаемый Denia85! Здесь помогают, ну или пытаются помочь, тем кто делает что-то сам, но у него возникла какая-то проблема и он сам ее одолеть не может. Еслы вы хотите, что бы что-то сделали за вас, то тогда просим в раздел "Ищу исполнителя" (http://arduino.ru/forumy/ishchu-ispolnitelya) где работу вам выполнят за соответсвующее вознаграждение.

denia85
Offline
Зарегистрирован: 18.11.2019

asam пишет:

denia85 пишет:

Необходимо реализовать возможность отправки сообщений (ноты) через разъем сг 5 с сохранением отправки через usb порт

Уважаемый Denia85! Здесь помогают, ну или пытаются помочь, тем кто делает что-то сам, но у него возникла какая-то проблема и он сам ее одолеть не может. Еслы вы хотите, что бы что-то сделали за вас, то тогда просим в раздел "Ищу исполнителя" (http://arduino.ru/forumy/ishchu-ispolnitelya) где работу вам выполнят за соответсвующее вознаграждение.

Уважаемый asam я и сделал сам изготовил платы распаял компоненты получил результат 

на win10 звуковом модуле и устройстве на андройд. Но вот с чистым midi не получается .Надо точку опоры и я переверну весь мир) Я же не просто с утра проснулся и решил пора занимаюсь миди системой на протяжении полугода и сам ищу всю инфу по крупицам.Но вот в програмировании не силен 
denia85
Offline
Зарегистрирован: 18.11.2019

Понимаю что нужно распаять разъем сг 5. На 4 и 5 пине разъема сг 5 по одному резистру на 220ом второй пин подключаем к gnd 5 пин на один из выбранных серйников mega 2560 к TX, 4 пин на +5V . Но как правильно  прописать это все ?

было

#ifdef BLUETOOTH
  MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial1, MIDI, MySettings);
#else
  MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings);
#endif

Как я понимаю необходимо добавить сюда выбранный Serial например Serial2

стало 

#ifdef BLUETOOTH
  MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial1, MIDI, MySettings);
#else
  MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings);
#endif
#else
  MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, MIDI, MySettings);
#endif

Но в программировании я не силен И понимаю что этот вариант не правильный

 

 

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

То МИДИ что я имел дело использует 5/180° DIN коннектор.

Что такое сr5 и в каком электрическом стандарте там должны идти МИДИ сигналы?

denia85
Offline
Зарегистрирован: 18.11.2019

Это его отечественное название принимающая часть"мама" со стороны arduino  Советский разъем А 5/180° DIN уже подключается в него в народе папа 

denia85
Offline
Зарегистрирован: 18.11.2019

Ну если я правильно понимаю данные передаются не уровнем напряжения, а током.  Надо подключить  СГ-5 к Serial-порту управляющей платы и так как это OUT трех проводов и двух резистров без дополнительной обвязки достаточно для того ,что бы схема работала.

denia85
Offline
Зарегистрирован: 18.11.2019

asam пишет:

То МИДИ что я имел дело использует 5/180° DIN коннектор.

Что такое сr5 и в каком электрическом стандарте там должны идти МИДИ сигналы?

Вот нашел

Разъём DIN применялся для передачи аналогового звука в бобинных и кассетных магнитофонах. Позже такой же коннектор использовался для подключения клавиатуры к компьютеру. Полное название этого разъёма: DIN-5/180°; отечественные аналоги называются СШ-5 (штекер, вилка) и СГ-5 (гнездо, розетка).

denia85
Offline
Зарегистрирован: 18.11.2019

denia85]</p> <p>[quote=asam пишет:

То МИДИ что я имел дело использует 5/180° DIN коннектор.

Что такое сr5 и в каком электрическом стандарте там должны идти МИДИ сигналы?

Что касается электрического стандарта в коде как я понимаю уже прописана передача нот их необходимо передать на выбраный один из 3 возможных Serial1,Serial2 или Serial3 а стандарт отличается тем что мы хотим передать в данном случае по коду передается нота если я правильно понимаю