Program Change Befehl in midiusb

Hier sollen nur die Werte übergeben werden...

  if (flanger_switch.update() == Button::Falling)
  { midi.sendControlChange(24, 127, 4); }
  if (OD_switch.update() == Button::Falling)
  { midi.sendControlChange(26, 127, 4); }
}

Ich habe diese 4 Zeilen mal mit den Deinigen ersetzt, gibt leider auch ne Fehlermeldung. Müsste ich weiter oben was ändern?

Sketch:


```cpp
#include <Control_Surface.h>

USBMIDI_Interface midi;

#define ATMEGA32U4 1

Button pc_buttons[] {
  2, 3, 4, 5, 6, 7, 8, 9, 10,
};
Button bank_switch = 16;
uint8_t offset = 0;
Button flanger_switch = 14;
Button OD_switch = 15;


void setup() {
  midi.begin();
  for (auto &b : pc_buttons)
    b.begin();
  bank_switch.begin();
  flanger_switch.begin();
  OD_switch.begin();

}

void loop() {
  midi.update();
  if (bank_switch.update() == Button::Falling)
    offset = 9;


  for (auto &b : pc_buttons) {
    if (b.update() == Button::Falling) {
      uint8_t index = &b - pc_buttons;
      midi.sendProgramChange(index + 1 + offset);
      offset = 0;
    }
  }

  if (flanger_switch.update() == Button::Falling)
  { midi.sendControlChange(24, 127, 4); }
  if (OD_switch.update() == Button::Falling)
  { midi.sendControlChange(26, 127, 4); }
 
}



Fehlermeldung:

D:\hg-hg\Documents\Arduino\Arduino_guitar_2_add_flanger_ODr\Arduino_guitar_2_add_flanger_ODr.ino: In function 'void loop()':
D:\hg-hg\Documents\Arduino\Arduino_guitar_2_add_flanger_ODr\Arduino_guitar_2_add_flanger_ODr.ino:41:38: error: no matching function for call to 'cs::USBMIDI_Interface::sendControlChange(int, int, int)'
   midiEventPacket_t controlChange = {0x0B, 0xB0, 24, 4};
                                      ^
In file included from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Sender.hpp:183:0,
                 from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Interface.hpp:4,
                 from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/Control_Surface/Control_Surface_Class.hpp:10,
                 from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/Control_Surface.h:16,
                 from D:\hg-hg\Documents\Arduino\Arduino_guitar_2_add_flanger_ODr\Arduino_guitar_2_add_flanger_ODr.ino:1:
D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Sender.ipp:54:6: note: candidate: void cs::MIDI_Sender<Derived>::sendControlChange(cs::MIDIAddress, uint8_t) [with Derived = cs::MIDI_Interface; uint8_t = unsigned char]
 void MIDI_Sender<Derived>::sendControlChange(MIDIAddress address,
      ^~~~~~~~~~~~~~~~~~~~
D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Sender.ipp:54:6: note:   candidate expects 2 arguments, 3 provided
D:\hg-hg\Documents\Arduino\Arduino_guitar_2_add_flanger_ODr\Arduino_guitar_2_add_flanger_ODr.ino:43:38: error: no matching function for call to 'cs::USBMIDI_Interface::sendControlChange(int, int, int)'
 
                                      ^
In file included from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Sender.hpp:183:0,
                 from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Interface.hpp:4,
                 from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/Control_Surface/Control_Surface_Class.hpp:10,
                 from D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/Control_Surface.h:16,
                 from D:\hg-hg\Documents\Arduino\Arduino_guitar_2_add_flanger_ODr\Arduino_guitar_2_add_flanger_ODr.ino:1:
D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Sender.ipp:54:6: note: candidate: void cs::MIDI_Sender<Derived>::sendControlChange(cs::MIDIAddress, uint8_t) [with Derived = cs::MIDI_Interface; uint8_t = unsigned char]
 void MIDI_Sender<Derived>::sendControlChange(MIDIAddress address,
      ^~~~~~~~~~~~~~~~~~~~
D:\hg-hg\Documents\Arduino\libraries\Control_Surface\src/MIDI_Interfaces/MIDI_Sender.ipp:54:6: note:   candidate expects 2 arguments, 3 provided

exit status 1

Compilation error: no matching function for call to 'cs::USBMIDI_Interface::sendControlChange(int, int, int)'

Hier stimmt was nicht.
Es werden drei Parameter erwartet, Du übergibst aber 4.

So, es hat geklappt!

Die genaue Beschreibung und der letzte Code:

Hallo nochmal!

So, der Controller ist nun gebaut, nicht perfekt, aber ich finde ihn ECHT SCHÖN! Vor allem, weil er funktioniert! :slight_smile:

Bilder siehe nächsten Post.

Ich habe noch einige Fragen zum Sketch, den ich ja vor allem von PieterP bekommen habe.

Ich verstehe den Begriff "auto" nicht und dieses einzelne "b". Sind das "Begriffe" aus CC++ oder aus der surface-Bibliothek?

Hier der Ausschnitt aus dem Sketch - ich habe die Zeilen mit Fragezeichen markiert.

void setup() {
  midi.begin();
  for (auto &b : pc_buttons)    // ???
    b.begin();                  // ???
  bank_switch.begin();
  flanger_switch.begin();
  OD_switch.begin();

}

void loop() {
  midi.update();
  if (bank_switch.update() == Button::Falling)   // Button::Falling = Button ist gedrueckt
    offset = 10;


  for (auto &b : pc_buttons) {                   // ???
    if (b.update() == Button::Falling) {         // ???
      uint8_t index = &b - pc_buttons;           // ???
      midi.sendProgramChange(index + 1 + offset);  // sendet PC mit Nummer um 1 und evtl. um 10 erhoeht 
      offset = 0;                                  // der offset wird zurueckgesetzt -> nur 1x angewandt
    }
  }

Hier noch Fotos von der "Scheibe", vom Test in GigPerformer (ein vst-rack Programm) und wie das Teil auf der Gitarre aussieht (es kann ohne Rückstände wieder entfernt werden).

das ist c++
https://www.learncpp.com/cpp-tutorial/range-based-for-loops-for-each/
https://de.cppreference.com/w/cpp/language/range-for

nettes Teil :wink:

Unabhängig vom "range based" for ist auto ein Datentyp. Geht, vorausgesetzt der Compiler kann ihn wissen. In diesem Fall der Datentyp eines Element von pc_buttons.

auto& ist dann eine normale C++ Referenz auf solch ein Element. Spart das Umkopieren und erlaubt bei Bedarf, das referenzierte Element zu verändern.

Damit ist dann die Variable b definiert.