Advertisement
JonasParada94

Untitled

Jan 18th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.37 KB | None | 0 0
  1. #include <MIDI.h>
  2. MIDI_CREATE_DEFAULT_INSTANCE();
  3.  
  4. /////////////////////////////////////////////
  5.  
  6. const int NButtons = 1; // *coloque aqui o numero de entradas digitais utilizadas
  7. const int button[NButtons] = {22}; // *neste array coloque na ordem desejada os pinos das portas digitais utilizadas
  8. int buttonCState[NButtons] = {0}; // estado atual da porta digital
  9. int buttonPState[NButtons] = {0}; // estado previo da porta digital
  10. /////////////////////////////////////////////////////////////////////////////////
  11. const int ledVUr = 7; // *coloque aqui o numero de entradas digitais utilizadas
  12. const int VUr[ledVUr] = {2,3,4,5,6,7,8}; // *neste array coloque na ordem desejada os pinos das portas digitais utilizadas
  13. int ledCState[ledVUr] = {0}; // estado atual da porta digital
  14. int ledPState[ledVUr] = {0}; // estado previo da porta digital
  15. int green=200;
  16. int yellow=150;
  17. int red=100;
  18.  
  19. /////////////////////////////////////////////
  20.  
  21. const int NPots = 1; // *coloque aqui o numero de entradas analogicas utilizadas
  22. const int pot[NPots] = {A0}; // *neste array coloque na ordem desejada os pinos das portas analogicas utilizadas
  23. int potCState[NPots] = {0}; // estado atual da porta analogica
  24. int potPState[NPots] = {0}; // estado previo da porta analogica
  25. int potVar = 0; // variacao entre o valor do estado previo e o atual da porta analogica
  26.  
  27. /////////////////////////////////////////////
  28.  
  29. byte midiCh = 1; // *Canal midi a ser utilizado
  30. byte note = 36; // *Nota mais grave que sera utilizada
  31. byte cc = 1; // *CC mais baixo que sera utilizado
  32.  
  33. /////////////////////////////////////////////
  34.  
  35. int TIMEOUT = 300; //quantidade de tempo em que o potenciometro sera lido apos ultrapassar o varThreshold
  36. int varThreshold = 4; //threshold para a variacao no sinal do potenciometro
  37. boolean potMoving = true; // se o potenciometro esta se movendo
  38. unsigned long pTime[NPots] = {0}; // tempo armazenado anteriormente
  39. unsigned long timer[NPots] = {0}; // armazena o tempo que passou desde que o timer foi zerado
  40.  
  41. /////////////////////////////////////////////
  42.  
  43. void setup () {
  44.  
  45. //Start midi connection
  46. MIDI.begin();
  47. //Serial Connection
  48. Serial.begin(115200);
  49.  
  50. MIDI.setHandleControlChange(handleControlChange);
  51.  
  52.  
  53.  
  54.  
  55. //Inicialize os botões(ENTRADAS DIGITAIS)
  56. for (int i=0; i<NButtons; i++){
  57. pinMode(button[i], INPUT_PULLUP);
  58. }
  59. for (int i=0; i<ledVUr; i++){
  60. pinMode(VUr[i], OUTPUT );
  61. }
  62. //nicialize as entradas analogicas
  63. for (int i=0; i<NPots; i++){
  64. pinMode(pot[i], INPUT);
  65. }
  66.  
  67. }
  68.  
  69. void loop () {
  70.  
  71. //Le todos os botoes (entradas digitais) utilizadas
  72. for (int i=0; i<NButtons; i++) {
  73. buttonCState[i] = digitalRead(button[i]);
  74. }
  75.  
  76. //Le o estado dos botoes e manda NoteOns para cada um que estiver ativo
  77. for (int i=0; i<NButtons; i++) {
  78.  
  79. if (buttonCState[i] != buttonPState[i]) {
  80.  
  81. if(buttonCState[i] == LOW) {
  82. MIDI.sendNoteOn(note+i, 127, midiCh); // envia NoteOn(nota, velocity, canal midi)
  83. buttonPState[i] = buttonCState[i];
  84. }
  85. else {
  86. MIDI.sendNoteOn(note+i, 0, midiCh);
  87. buttonPState[i] = buttonCState[i];
  88. }
  89. }
  90.  
  91. }
  92. ////////////////////////////////////////////////////////////////////////////////////////
  93.  
  94. for (int i=0; i<NPots; i++) { // le todas entradas analogicas utilizadas
  95. potCState[i] = analogRead(pot[i]);
  96. }
  97. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. //"Portão"
  99. for (int i=0; i<NPots; i++) {
  100.  
  101. potVar = abs(potCState[i] - potPState[i]); // calcula a variacao da porta analogica
  102.  
  103. if (potVar >= varThreshold) { //sets a threshold for the variance in the pot state, if it varies more than x it sends the cc message
  104. pTime[i] = millis(); // armazena o tempo previo
  105. }
  106. timer[i] = millis() - pTime[i]; // reseta o timer
  107. if (timer[i] < TIMEOUT) { // se o timer for menor que o tempo maximo permitido significa que o potenciometro ainda esta se movendo
  108. potMoving = true;
  109. }
  110. else {
  111. potMoving = false;
  112. }
  113.  
  114. if (potMoving == true) { // se o potenciometro ainda esta se movendo, mande o control change
  115. MIDI.sendControlChange(cc+i, map(potCState[i], 0, 1023, 0, 127), midiCh); // envia Control Change (numero do CC, valor do CC, canal midi)
  116. potPState[i] = potCState[i]; // armazena a leitura atual do potenciometro para comparar com a proxima
  117. }
  118. }
  119.  
  120. }
  121. void handleControlChange(byte channel, byte number, byte value) {
  122.  
  123. int value_ = value;
  124. int ccLastValue = 0;
  125. if (value_ != ccLastValue) {
  126.  
  127. // Left VU
  128. if (number == 1) {
  129.  
  130. switch (value_) {
  131. case 0:
  132. for (int i = 0; i < 7; i++) {
  133. analogWrite(VUr[i], LOW);
  134. }
  135. break;
  136. case 1:
  137. for (int i = 1; i < 7; i++) {
  138. analogWrite(VUr[i], LOW);
  139. }
  140. analogWrite(VUr[0], green);
  141. break;
  142. case 2:
  143. for (int i = 2; i < 7; i++) {
  144. analogWrite(VUr[i], LOW);
  145. }
  146. for (int i = 0; i < 2; i++) {
  147. analogWrite(VUr[i], green);
  148. }
  149. break;
  150. case 3:
  151. for (int i = 3; i < 7; i++) {
  152. analogWrite(VUr[i], LOW);
  153. }
  154. for (int i = 0; i < 3; i++) {
  155. analogWrite(VUr[i], green);
  156. }
  157. break;
  158. case 4:
  159. for (int i = 4; i < 7; i++) {
  160. analogWrite(VUr[i], LOW);
  161. }
  162. for (int i = 0; i < 4; i++) {
  163. analogWrite(VUr[i], green);
  164. }
  165. break;
  166. case 5:
  167. for (int i = 5; i < 7; i++) {
  168. analogWrite(VUr[i], LOW);
  169. }
  170. for (int i = 0; i < 5; i++) {
  171. analogWrite(VUr[i], green);
  172. }
  173. break;
  174. case 6:
  175. for (int i = 6; i < 7; i++) {
  176. analogWrite(VUr[i], LOW);
  177. }
  178. for (int i = 0; i < 5; i++) {
  179. analogWrite(VUr[i], green);
  180. }
  181. analogWrite(VUr[5], yellow);
  182. break;
  183. case 7:
  184. for (int i = 6; i < 7; i++) {
  185. analogWrite(VUr[i], LOW);
  186. }
  187. for (int i = 0; i < 5; i++) {
  188. analogWrite(VUr[i], green);
  189. }
  190. analogWrite(VUr[5], yellow);
  191. analogWrite(VUr[6], red);
  192. break;
  193.  
  194. }
  195. }
  196. }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement