Вывод midi нот через разъем сг5
- Войдите на сайт для отправки комментариев
Пнд, 18/11/2019 - 10:21
Здравствуйте
Прошу помочь в решение
dualmoco прошил микроконтроллер 16u2 и usb начинает передавать ноты без переходников .Это как раз просто было .А вот теперь нужен midi разъем СГ 5 для синтезатора .Так как midi система уже работает с андройд виндовс и звуковым модулем без переходников на чистой arduino mega через usb порт. Нужно параллельно прикрутить midi разъем СГ 5 с использованием подключенной библиотеки midi.h. В интернете есть примеры но применить их к готовому коду не получается. Необходимо реализовать возможность отправки сообщений (ноты) через разъем сг 5 с сохранением отправки через usb порт
[code=cpp][/code]
Вставьте код по правилам форума. Описано в начале приколоченной темы.
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); #endifvoid 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); } } }Уважаемый Denia85! Здесь помогают, ну или пытаются помочь, тем кто делает что-то сам, но у него возникла какая-то проблема и он сам ее одолеть не может. Еслы вы хотите, что бы что-то сделали за вас, то тогда просим в раздел "Ищу исполнителя" (http://arduino.ru/forumy/ishchu-ispolnitelya) где работу вам выполнят за соответсвующее вознаграждение.
Уважаемый Denia85! Здесь помогают, ну или пытаются помочь, тем кто делает что-то сам, но у него возникла какая-то проблема и он сам ее одолеть не может. Еслы вы хотите, что бы что-то сделали за вас, то тогда просим в раздел "Ищу исполнителя" (http://arduino.ru/forumy/ishchu-ispolnitelya) где работу вам выполнят за соответсвующее вознаграждение.
Уважаемый asam я и сделал сам изготовил платы распаял компоненты получил результат
https://www.youtube.com/watch?v=BS6fsSfNalE&feature=emb_title
Понимаю что нужно распаять разъем сг 5. На 4 и 5 пине разъема сг 5 по одному резистру на 220ом второй пин подключаем к gnd 5 пин на один из выбранных серйников mega 2560 к TX, 4 пин на +5V . Но как правильно прописать это все ?
было
Как я понимаю необходимо добавить сюда выбранный Serial например Serial2
стало
Но в программировании я не силен И понимаю что этот вариант не правильный
То МИДИ что я имел дело использует 5/180° DIN коннектор.
Что такое сr5 и в каком электрическом стандарте там должны идти МИДИ сигналы?
Это его отечественное название принимающая часть"мама" со стороны arduino Советский разъем А 5/180° DIN уже подключается в него в народе папа
Ну если я правильно понимаю данные передаются не уровнем напряжения, а током. Надо подключить СГ-5 к Serial-порту управляющей платы и так как это OUT трех проводов и двух резистров без дополнительной обвязки достаточно для того ,что бы схема работала.
То МИДИ что я имел дело использует 5/180° DIN коннектор.
Что такое сr5 и в каком электрическом стандарте там должны идти МИДИ сигналы?
Вот нашел
Разъём DIN применялся для передачи аналогового звука в бобинных и кассетных магнитофонах. Позже такой же коннектор использовался для подключения клавиатуры к компьютеру. Полное название этого разъёма: DIN-5/180°; отечественные аналоги называются СШ-5 (штекер, вилка) и СГ-5 (гнездо, розетка).
То МИДИ что я имел дело использует 5/180° DIN коннектор.
Что такое сr5 и в каком электрическом стандарте там должны идти МИДИ сигналы?
Что касается электрического стандарта в коде как я понимаю уже прописана передача нот их необходимо передать на выбраный один из 3 возможных Serial1,Serial2 или Serial3 а стандарт отличается тем что мы хотим передать в данном случае по коду передается нота если я правильно понимаю