Advertisement
TolentinoCotesta

USB MIDI

Mar 27th, 2020
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.37 KB | None | 0 0
  1. // Include the Control Surface library
  2. #include <Control_Surface.h>        
  3. USBMIDI_Interface midi;
  4.  
  5. // logarithmic correction table
  6. unsigned int linearized[513] = {
  7.     0, 1, 1, 2, 3, 3, 4, 4, 5, 6,
  8.     6, 7, 8, 8, 9, 9, 10, 11, 11, 12,
  9.     12, 13, 14, 14, 15, 15, 16, 17, 17, 18,
  10.     18, 19, 19, 20, 21, 21, 22, 22, 23, 23,
  11.     24, 25, 25, 26, 26, 27, 27, 28, 28, 29,
  12.     29, 30, 31, 31, 32, 32, 33, 33, 34, 34,
  13.     35, 35, 36, 36, 37, 37, 38, 38, 39, 39,
  14.     40, 40, 41, 41, 42, 42, 43, 43, 44, 44,
  15.     45, 45, 46, 46, 47, 47, 48, 48, 49, 49,
  16.     49, 50, 50, 51, 51, 52, 52, 53, 53, 54,
  17.     54, 54, 55, 55, 56, 56, 57, 57, 57, 58,
  18.     58, 59, 59, 60, 60, 60, 61, 61, 62, 62,
  19.     62, 63, 63, 64, 64, 64, 65, 65, 66, 66,
  20.     66, 67, 67, 68, 68, 68, 69, 69, 70, 70,
  21.     70, 71, 71, 71, 72, 72, 73, 73, 73, 74,
  22.     74, 74, 75, 75, 75, 76, 76, 76, 77, 77,
  23.     77, 78, 78, 78, 79, 79, 79, 80, 80, 80,
  24.     81, 81, 81, 82, 82, 82, 83, 83, 83, 84,
  25.     84, 84, 85, 85, 85, 86, 86, 86, 86, 87,
  26.     87, 87, 88, 88, 88, 89, 89, 89, 89, 90,
  27.     90, 90, 91, 91, 91, 91, 92, 92, 92, 92,
  28.     93, 93, 93, 93, 94, 94, 94, 95, 95, 95,
  29.     95, 96, 96, 96, 96, 97, 97, 97, 97, 98,
  30.     98, 98, 98, 98, 99, 99, 99, 99, 100, 100,
  31.     100, 100, 101, 101, 101, 101, 101, 102, 102, 102,
  32.     102, 103, 103, 103, 103, 103, 104, 104, 104, 104,
  33.     104, 105, 105, 105, 105, 105, 106, 106, 106, 106,
  34.     106, 107, 107, 107, 107, 107, 108, 108, 108, 108,
  35.     108, 108, 109, 109, 109, 109, 109, 109, 110, 110,
  36.     110, 110, 110, 110, 111, 111, 111, 111, 111, 111,
  37.     112, 112, 112, 112, 112, 112, 113, 113, 113, 113,
  38.     113, 113, 113, 114, 114, 114, 114, 114, 114, 114,
  39.     115, 115, 115, 115, 115, 115, 115, 115, 116, 116,
  40.     116, 116, 116, 116, 116, 116, 117, 117, 117, 117,
  41.     117, 117, 117, 117, 118, 118, 118, 118, 118, 118,
  42.     118, 118, 118, 119, 119, 119, 119, 119, 119, 119,
  43.     119, 119, 119, 120, 120, 120, 120, 120, 120, 120,
  44.     120, 120, 120, 120, 121, 121, 121, 121, 121, 121,
  45.     121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
  46.     122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
  47.     123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
  48.     123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
  49.     124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
  50.     124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
  51.     125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
  52.     125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
  53.     126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
  54.     126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
  55.     126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
  56.     126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
  57.     127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  58.     127, 127, 127
  59. };
  60.  
  61.  
  62. #define TOLERANCE 25
  63. typedef struct {
  64.   MIDIAddress note;
  65.   uint8_t analogIn;
  66.   uint8_t tolerance = TOLERANCE;
  67.   bool playing = false;
  68. } JoyNote;
  69.  
  70.  
  71. typedef struct {
  72.   MIDIAddress controller;
  73.   uint8_t analogIn;
  74.   uint8_t tolerance = TOLERANCE;
  75.   uint16_t lastSent;
  76. } JoyController;
  77.  
  78.  
  79. #define NUM_NOTES 7
  80. #define NUM_CONTROLLERS 3
  81. JoyNote joyNotes[NUM_NOTES];
  82. JoyController joyControl[NUM_CONTROLLERS];
  83.  
  84. using namespace MIDI_Notes;
  85.  
  86. // The velocity of the note events
  87. const uint8_t velocity = 0x7F;
  88.  
  89. void setup() {
  90.   /*
  91.   Serial.begin(115200);
  92.   while (!Serial) ;
  93.   Serial.println();
  94.   */
  95.   initNotesAndControllers();
  96. }
  97.  
  98. // ---------------------------------- Loop ---------------------------------- //
  99. // ========================================================================== //
  100.  
  101. void loop() {
  102.   midi.update(); // read and handle or discard MIDI input
  103.  
  104.   // Inviamo il messaggio per le note, se necessario
  105.  
  106.   // for(uint8_t i=0; i<NUM_NOTES; i++){
  107.  
  108.   for(uint8_t i=0; i<3; i++){  // SOLO PER TEST
  109.     uint16_t analogVal = abs(512 - analogRead(joyNotes[i].analogIn));
  110.     uint8_t tolValue = joyNotes[i].tolerance;
  111.  
  112.     // Joypad azionato e la nota deve essere ancora riprodotta
  113.     if(analogVal >= tolValue && !joyNotes[i].playing ){
  114.       midi.sendNoteOn(joyNotes[i].note, velocity);  
  115.       joyNotes[i].playing = true;
  116.     }
  117.    
  118.     // Joypad in posizione di riposo e la nota non deve essere più riprodotta
  119.     if(analogVal < tolValue && joyNotes[i].playing) {
  120.       midi.sendNoteOff(joyNotes[i].note, velocity);
  121.       joyNotes[i].playing = false;
  122.     }
  123.   }
  124.  
  125.   // Inviamo il messaggio per i controller, se necessario
  126.   //for(uint8_t i=0; i<NUM_CONTROLLERS; i++){
  127.  
  128.   for(uint8_t i=0; i<1; i++){   // SOLO PER TEST
  129.     uint16_t analogVal = abs(512 - analogRead(joyControl[i].analogIn));
  130.     uint8_t tolValue = joyControl[i].tolerance;
  131.  
  132.     // Joypad azionato, inviamo il messaggio MIDI (una sola volta)
  133.     if(analogVal >= tolValue && joyControl[i].lastSent != analogVal ){
  134.       uint8_t midiValue = 127 - linearized[512 - analogVal];
  135.       midi.sendCC(joyControl[i].controller, midiValue );  
  136.       joyControl[i].lastSent = analogVal;
  137.     }
  138.    
  139.  
  140.   }
  141.  
  142. }
  143.  
  144.  
  145. /*
  146. static const uint8_t A6 = 24; // D4
  147. static const uint8_t A7 = 25; // D6
  148. static const uint8_t A8 = 26; // D8
  149. static const uint8_t A9 = 27; // D9
  150. static const uint8_t A10 = 28; // D10
  151. static const uint8_t A11 = 29; // D12
  152. */
  153.  
  154. void initNotesAndControllers(){
  155. //     {0,   1,   2,    3,   4,   5,   6  }
  156.   enum {Do3, Mi3, Sol3, Fa3, Si4, Re4, La4};    
  157.  
  158.   joyNotes[Do3].note = {note(C, 3), CHANNEL_1};
  159.   joyNotes[Do3].analogIn = A0;
  160.   // E' necessario assegnare solo se diversa da quella di default
  161.   // Es. per correggere singolo joypad "sfasato"
  162.   joyNotes[Do3].tolerance = TOLERANCE + 1; // +- single adjustment
  163.  
  164.   joyNotes[Mi3].note = {note(E, 3), CHANNEL_1};
  165.   joyNotes[Mi3].analogIn = A1;  
  166.   joyNotes[Sol3].note = {note(G, 3), CHANNEL_1};
  167.   joyNotes[Sol3].analogIn = A2;
  168.   joyNotes[Fa3].note = {note(F, 3), CHANNEL_1};
  169.   joyNotes[Fa3].analogIn = A3;
  170.   joyNotes[Si4].note = {note(B, 4), CHANNEL_1};
  171.   joyNotes[Si4].analogIn = A4;
  172.   joyNotes[Re4].note = {note(D, 4), CHANNEL_1};
  173.   joyNotes[Re4].analogIn = A5;
  174.   joyNotes[La4].note = {note(A, 4), CHANNEL_1};
  175.   joyNotes[La4].analogIn = A6;
  176.  
  177.   joyControl[0].controller = {MIDI_CC::Bank_Select, CHANNEL_1};
  178.   joyControl[0].analogIn = A7;  
  179.   joyControl[1].controller = {MIDI_CC::General_Purpose_Controller_1, CHANNEL_1};
  180.   joyControl[1].analogIn = A8;  
  181.   joyControl[2].controller = {MIDI_CC::General_Purpose_Controller_2, CHANNEL_1};
  182.   joyControl[2].analogIn = A9;    
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement