Нужна помощь в одной строчке кода

Тема в разделе "Закажу проект", создана пользователем Pitone3, 14 май 2021.

  1. Pitone3

    Pitone3 Нерд

    Здравствуйте!
    Есть библиотека: http://arduino.cc/playground/Main/MIDILibrary
    В данном случае она принимает миди сообщения с программы на компе по serial.
    Библиотека работает, все примеры в ней компилируются и функцианируют.

    Есть код:

    void loop(){
    if (MIDI.read() == ???) } // If we have received a message

    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000); // Wait for a second
    digitalWrite(LED_BUILTIN, LOW);
    }
    }

    И сам вопрос, что нужно написать вместо вопросов в if-е чтобы условие сработало только по одной ноте, нота состоит из 3 параметров inChannel, inNote, inVelocity).

    В примерах есть вот такая строчка:
    void handleNoteOn(byte inChannel, byte inNote, byte inVelocity)
    но как её засунуть в if я не понимаю.

    Сколько будет стоить данная услуга?
    Спасибо!
     
  2. b707

    b707 Гуру

    вы удивитесь, но вместо "???" в этой строчке не пишется ничего
    Правильная строка:
    Код (C++):
    if (MIDI.read() )
    подробнее - смотрите пример input.ino в папке examples библиотеки
     
  3. Pitone3

    Pitone3 Нерд

    Хорошо, пусть правильная, но что сделать нужно чтобы я нажал ноту "ми" 3 октавы и у меня сработало условие?
     
  4. b707

    b707 Гуру

    вы пример-то смотрели?
     
  5. Pitone3

    Pitone3 Нерд

    Да, все примеры смотрел, с отпракой там всё просто а вот с приёмом у меня затык, очень сложный для меня код, по этому и прошу помощи.
     
  6. b707

    b707 Гуру

    посмотрите еще пример Callback.ino - в функцию handleNoteOn() вписываете проверку канала, ноты и длительности и исполняемый код..

    Вы что смастерить-то пытаетесь? - вряд ли вам нужно светодиодиком мигать по ноте.
    Пишите настоящую задачу, за эту ерунду вроде денег брать стыдно, а разбираться бесплатно - лень
    Я делал человеку года два назад что-то с обработкой МИДИ. но уже все забыл. надо заново лезть...
     
  7. Pitone3

    Pitone3 Нерд

    Спасибо за ответы, но на самом деле надо моргать "светодиодом", мосфет там будет и реле, 7 каналов, просто нужно показать мне пример как это делать, а потом на этом примере я сам всё допишу. Я так понямаю там нужны 3 байта, но как их написать и сравнить с входящим сообщением не понимаю, я уже и пытался rx-tx слушать, но там квадратики на всех скоростях. Денег не много, но могу скинуть рублей 300, извините если для вас это мало.
     
  8. b707

    b707 Гуру

    примерно так:
    Код (C++):
    #include <MIDI.h>

    MIDI_CREATE_DEFAULT_INSTANCE();
    #define MY_CHANNEL 33
    #define MY_PITCH 44
    #define MY_VELOCITY 100
    bool task1 = false;

    // -----------------------------------------------------------------------------

    // This function will be automatically called when a NoteOn is received.
    void handleNoteOn(byte channel, byte pitch, byte velocity)
    {
        if ((channel == MY_CHANNEL) &&
            (pitch == MY_PITCH) &&
            (velocity == MT_VELOCITY))
        {
        task1 = true;
        }
    }

    void handleNoteOff(byte channel, byte pitch, byte velocity)
    {
        // Do something when the note is released.

    }

    // -----------------------------------------------------------------------------

    void setup()
    {
        // Connect the handleNoteOn function to the library,
        // so it is called upon reception of a NoteOn.
        MIDI.setHandleNoteOn(handleNoteOn);  // Put only the name of the function

        // Do the same for NoteOffs
        MIDI.setHandleNoteOff(handleNoteOff);

        // Initiate MIDI communications, listen to all channels
        MIDI.begin(MIDI_CHANNEL_OMNI);
    }

    void loop()
    {
        // Call MIDI.read the fastest you can for real-time performance.
        MIDI.read();

        if (task1) {
          digitalWrite(LED_BUILTIN, HIGH);
          task1 = false;
          }
    }
    В макросы
    #define MY_CHANNEL 33
    #define MY_PITCH 44
    #define MY_VELOCITY 100
    впишите свои номера каналов и нот.
    Для других каналов соответвующим образом размножите условия.

    только имейте в виду. что это не более чем набросок.
    Задача не такая простая, как кажется, если у вас задачи не однократные. а длительные... - то есть если в них есть какие-то задержки. Тогда нужно городить циклы с миллисом, оператор delay() здесь использовать нельзя.
    И еще стоит подумать. что делать, когда новая нота приходит до того, как отработалась предыдущая... В общем, нюансов тут дофига.
    И ни в коем случае не пихайте сами задачи в функции handleNoteOn() и handleNoteOff() - все повиснет.
    В этих функциях (они называются коллбеки) - можно делать только очень короткие действия - например выставить флаг. как в коде выше.
     
    Последнее редактирование: 14 май 2021
  9. Pitone3

    Pitone3 Нерд

    ЕЕЕЕЕ! Работает!
    Спасибо ОГРОМНОЕ! Вот сам бы не смог так сделать!
    Напишите пожалуйста на почту номер карты или яндекс денег (djsamlab@mail.ru). Сегодня ближе к вечеру скину.
    Еще раз спасибо!
     
  10. b707

    b707 Гуру

    ничего не надо, пользуйтесь на здоровье
    Захотите сделать из этого кода что-то посложнее - обращайтесь :)
     
  11. Pitone3

    Pitone3 Нерд

    Блин, ну вы же потатили своё время.
    Может и я вам смогу чем нибудь помочь, по дизайну или ретушь в фотошопе, или видео смонтировать. А то как то не честно получается.
    Напишите если что-то нужно, на почту. Я ваш должник, еще раз спасибо!
     
    Daniil и b707 нравится это.