Controllers.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #include "Controllers.h"
  2. // MIDI
  3. // First parameter is the event type (0x09 = note on, 0x08 = note off).
  4. // Second parameter is note-on/note-off, combined with the channel.
  5. // Channel can be anything between 0-15. Typically reported to the user as 1-16.
  6. // Third parameter is the note number (48 = middle C).
  7. // Fourth parameter is the velocity (64 = normal, 127 = fastest).
  8. // First parameter is the event type (0x0B = control change).
  9. // Second parameter is the event type, combined with the channel.
  10. // Third parameter is the control number number (0-119).
  11. // Fourth parameter is the control value (0-127).
  12. void noteOn(byte channel, byte pitch, byte velocity) {
  13. #ifndef DUMMY
  14. midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  15. MidiUSB.sendMIDI(noteOn);
  16. #endif
  17. #ifdef DEBUG
  18. Serial.print("Note on:");
  19. Serial.print(channel);
  20. Serial.print(",");
  21. Serial.print(pitch);
  22. Serial.print(",");
  23. Serial.println(velocity);
  24. #endif
  25. }
  26. void noteOff(byte channel, byte pitch, byte velocity) {
  27. #ifndef DUMMY
  28. midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  29. MidiUSB.sendMIDI(noteOff);
  30. #endif
  31. #ifdef DEBUG
  32. Serial.print("Note off:");
  33. Serial.print(channel);
  34. Serial.print(",");
  35. Serial.print(pitch);
  36. Serial.print(",");
  37. Serial.println(velocity);
  38. #endif
  39. }
  40. void controlChange(byte channel, byte control, byte value) {
  41. #ifndef DUMMY
  42. midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  43. MidiUSB.sendMIDI(event);
  44. #endif
  45. #ifdef DEBUG
  46. Serial.print("Control change:");
  47. Serial.print(channel);
  48. Serial.print(",");
  49. Serial.print(control);
  50. Serial.print(",");
  51. Serial.println(value);
  52. #endif
  53. }
  54. // Constructor and methods for analog controls and buttons (encoders use a different library)
  55. AnalogControl::AnalogControl(int pin, byte effect, int middle) {
  56. this->pin = pin;
  57. this->effect = effect;
  58. this->middle = middle;
  59. }
  60. void AnalogControl::init() {
  61. pinMode(pin,INPUT);
  62. }
  63. void AnalogControl::checkStatus() {
  64. value = analogRead(pin);
  65. if (value < 0+STICKYNESS){
  66. value = 0;
  67. } else if (value > 1023-STICKYNESS) {
  68. value = 1023;
  69. } else if (value > middle-STICKYNESS && value < middle+STICKYNESS) {
  70. value = middle;
  71. }
  72. if ( abs(value - prev_value) > DEAD_ZONE ){
  73. controlChange(1,effect, map(value,0,1023,0,127) );
  74. prev_value = value;
  75. #ifndef DUMMY
  76. MidiUSB.flush();
  77. #endif
  78. }
  79. }
  80. DigitalButton::DigitalButton(int pin, byte effect, byte effect_toggle, byte effect_long, byte effect_long_toggle) {
  81. this->effect = effect;
  82. this->effect_toggle = effect_toggle;
  83. this->effect_long = effect_long;
  84. this->effect_long_toggle = effect_long_toggle;
  85. this->pin = pin;
  86. }
  87. void DigitalButton::init() {
  88. pinMode(pin,INPUT_PULLUP);
  89. pressed = false;
  90. toggled = false;
  91. long_pressed = false;
  92. long_toggled = false;
  93. }
  94. void DigitalButton::checkStatus() {
  95. bool status = digitalRead(pin);
  96. if (status == LOW && pressed == false) {
  97. pressed = true;
  98. long_pressed = false;
  99. debounce = millis();
  100. }
  101. if (pressed && (millis() - debounce <= 10) && status == HIGH) {
  102. pressed = false;
  103. return;
  104. }
  105. if (pressed && (millis() - debounce > 10) && status == HIGH) {
  106. if (long_pressed == true) {
  107. long_pressed = false;
  108. } else if (effect_toggle == 0) {
  109. controlChange(1,effect,1);
  110. } else if (toggled) {
  111. controlChange(1,effect,1);
  112. toggled = false;
  113. } else {
  114. controlChange(1,effect_toggle,1);
  115. toggled = true;
  116. }
  117. #ifndef DUMMY
  118. MidiUSB.flush();
  119. #endif
  120. pressed = false;
  121. }
  122. if (pressed && (millis() - debounce > LONG_INTERVAL) && (status == LOW) && (long_pressed == false)) {
  123. long_pressed = true;
  124. if (effect_long_toggle == 0) {
  125. controlChange(1,effect_long,1);
  126. } else if (long_toggled) {
  127. controlChange(1,effect_long,1);
  128. long_toggled = false;
  129. } else {
  130. controlChange(1,effect_long_toggle,1);
  131. long_toggled = true;
  132. }
  133. #ifndef DUMMY
  134. MidiUSB.flush();
  135. #endif
  136. }
  137. }
  138. MCP23017_Expander::MCP23017_Expander(int address, int effects[16], int effects_toggle[16], int effects_long[16], int effects_long_toggle[16]) {
  139. this->address = address;
  140. for (int i = 0; i < 16; i++) {
  141. this->effects[i] = effects[i];
  142. this->effects_toggle[i] = effects_toggle[i];
  143. this->effects_long[i] = effects_long[i];
  144. this->effects_long_toggle[i] = effects_long_toggle[i];
  145. }
  146. }
  147. void MCP23017_Expander::init() {
  148. Adafruit_MCP23X17 mcp;
  149. if (!mcp.begin_I2C(address)) {
  150. #ifdef DEBUG
  151. Serial.print("MCP23017 not found at address ");
  152. Serial.println(address,HEX);
  153. #endif
  154. while(true);
  155. }
  156. for (int i = 0; i < 16; i++) {
  157. mcp.pinMode(i,INPUT_PULLUP);
  158. pressed[i] = false;
  159. toggled[i] = false;
  160. long_pressed[i] = false;
  161. long_toggled[i] = false;
  162. }
  163. this->mcp = mcp;
  164. }
  165. void MCP23017_Expander::checkStatus() {
  166. for (int i = 0; i < 16; i++){
  167. if (effects[i] == 0 && effects_toggle[i] == 0 && effects_long[i] == 0 && effects_long_toggle[i] == 0) {
  168. return;
  169. }
  170. bool status = mcp.digitalRead(i);
  171. if (status == LOW && pressed[i] == false){
  172. Serial.println("button pressed");
  173. pressed[i] = true;
  174. long_pressed[i] = false;
  175. debounce[i] = millis();
  176. }
  177. if (pressed[i] && (millis() - debounce[i] <= 10) && status == HIGH) {
  178. pressed[i] = false;
  179. return;
  180. }
  181. if (pressed[i] && (millis() - debounce[i] > 10) && status == HIGH) {
  182. if (long_pressed[i] == true) {
  183. long_pressed[i] = false;
  184. } else if (effects_toggle[i] == 0) {
  185. controlChange(1,effects[i],1);
  186. } else if (toggled[i]) {
  187. controlChange(1,effects[i],1);
  188. toggled[i] = false;
  189. } else {
  190. controlChange(1,effects_toggle[i],1);
  191. toggled[i] = true;
  192. }
  193. #ifndef DUMMY
  194. MidiUSB.flush();
  195. #endif
  196. pressed[i] = false;
  197. }
  198. if (pressed[i] && (millis() - debounce[i] > LONG_INTERVAL) && (status == LOW) && (long_pressed[i] == false)) {
  199. long_pressed[i] = true;
  200. if (effects_long_toggle == 0) {
  201. controlChange(1,effects_long[i],1);
  202. } else if (long_toggled[i]) {
  203. controlChange(1,effects_long[i],1);
  204. long_toggled[i] = false;
  205. } else {
  206. controlChange(1,effects_long_toggle[i],1);
  207. long_toggled[i] = true;
  208. }
  209. #ifndef DUMMY
  210. MidiUSB.flush();
  211. #endif
  212. }
  213. }
  214. }
  215. Mux::Mux(int pinSIG, int effects[16], int mid_deadzone[16]) {
  216. this->pinSIG = pinSIG;
  217. for (int i = 0; i < 16; i++) {
  218. this->effects[i] = effects[i];
  219. this->mid_deadzone[i] = effects[i];
  220. }
  221. }
  222. void Mux::init() {
  223. pinMode(pinSIG,INPUT);
  224. pinMode(pinS0,OUTPUT);
  225. pinMode(pinS1,OUTPUT);
  226. pinMode(pinS2,OUTPUT);
  227. pinMode(pinS3,OUTPUT);
  228. }
  229. void Mux::checkStatus(byte selector){
  230. if (effects[selector] == 0) {
  231. return;
  232. }
  233. digitalWrite(pinS0, bitRead(selector,0));
  234. digitalWrite(pinS1, bitRead(selector,1));
  235. digitalWrite(pinS2, bitRead(selector,2));
  236. digitalWrite(pinS3, bitRead(selector,3));
  237. int value = analogRead(pinSIG);
  238. if (value < STICKYNESS) {
  239. value = 0;
  240. } else if (value > 1023-STICKYNESS) {
  241. value = 1023;
  242. } else if (value > mid_deadzone[selector]-STICKYNESS && value < mid_deadzone[selector]+STICKYNESS) {
  243. value = mid_deadzone[selector];
  244. }
  245. if (abs(value - prev_value[selector]) > DEAD_ZONE ) {
  246. byte midi_value = map(value,0,1023,0,127);
  247. controlChange(1,effects[selector],midi_value);
  248. #ifdef DEBUG
  249. Serial.print("Mux effect:");
  250. Serial.print(effects[selector]);
  251. Serial.print(", address:");
  252. Serial.print(selector);
  253. Serial.print(":");
  254. Serial.print(bitRead(selector,0));
  255. Serial.print(bitRead(selector,1));
  256. Serial.print(bitRead(selector,2));
  257. Serial.print(bitRead(selector,3));
  258. Serial.print(", prev.value:");
  259. Serial.print(prev_value[selector]);
  260. Serial.print(", value:");
  261. Serial.println(value);
  262. #endif
  263. prev_value[selector] = value;
  264. #ifndef DUMMY
  265. MidiUSB.flush();
  266. #endif
  267. }
  268. }
  269. //Callback function for the encoders
  270. void eb_Encoder(EncoderButton& eb) {
  271. int inc = eb.increment();
  272. if (inc > 0) {
  273. controlChange(1,eb.userId()+1,1);
  274. } else {
  275. controlChange(1,eb.userId(),1);
  276. }
  277. #ifndef DUMMY
  278. MidiUSB.flush();
  279. #endif
  280. }