Advertisement
Guest User

Fuzzytron 3000 Source Code

a guest
Jun 3rd, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.11 KB | None | 0 0
  1. #include <MIDIUSB.h>
  2. #include <ResponsiveAnalogRead.h>
  3.  
  4. /*
  5.   CC Legend: (channel / control / value)
  6.     Buttons           = Channel 0 / x / 64
  7.     Volume & EQ Knobs = Channel 1 / x / 127
  8.     VU LEDs           = Channel 2 / x / x
  9.     Sliders           = Channel 3 / x / x
  10.     Selection Knobs   = Channel 4 / x / x
  11. */
  12.  
  13. // MULTIPLEXERS
  14.   const int sigA = A0;
  15.   const int sigB = A1;
  16.   const int muxPinsA[4] = {8, 9, 10, 11};
  17.   const int muxPinsB[4] = {4, 5, 6, 7};
  18.  
  19.   ResponsiveAnalogRead mPlexA(sigA, true);
  20.   ResponsiveAnalogRead mPlexB(sigB, true);
  21.  
  22.   // Multiplexer A Connections
  23.   int gainA, highA, midA, lowA, filterA, pitchA, volA, phonesVol, masterVol, xFade, deckA;
  24.   int defaultGainA = 64, defaultHighA = 64, defaultMidA = 64, defaultLowA = 64, defaultFilterA = 64;
  25.   int defaultVolA = 0;
  26.   int defaultmasterVol = 75, defaultphonesVol = 75, defaultXFade = 64;
  27.  
  28.   // Multiplexer B Connections
  29.   int gainB, highB, midB, lowB, filterB, pitchB, volB, deckB;
  30.   int defaultVolB = 0;
  31.   int defaultGainB = 64, defaultHighB = 64, defaultMidB = 64, defaultLowB = 64, defaultFilterB = 64;
  32.  
  33. // BUTTONS
  34.   // Deck 1
  35.  
  36.   // Deck 2
  37.  
  38.   // Mixer
  39.   //const int mVol = A5;
  40.   //int defaultMasterVolume = 75;
  41.   //int masterVolume;
  42.   //ResponsiveAnalogRead masterVol(mVol, true);
  43.  
  44.   // Selection Encoder
  45.   const int selectEncA = 12;
  46.   const int selectEncB = 13;
  47.   int selectEncDir;
  48.   int selectEncState;
  49.   int selectEncLastState;
  50.  
  51.   // Loop Encoder
  52.   const int loopEncA = 14;
  53.   const int loopEncB = 15;
  54.   int loopEncDir;
  55.   int loopEncState;
  56.   int loopEncLastState;
  57.  
  58. // SLIDERS
  59.  
  60.   // Deck 1
  61.  
  62.   // Deck 2
  63.  
  64.   // Mixer
  65.  
  66. // VU LEDs
  67. int l1VU = 2;
  68. int l2VU = 3;
  69. int l3VU = 4;
  70. int l4VU = 5;
  71. int l5VU = 6;
  72.  
  73. int r1VU = 7;
  74. int r2VU = 8;
  75. int r3VU = 9;
  76. int r4VU = 10;
  77. int r5VU = 11;
  78.  
  79.  
  80. // MISC
  81. unsigned long VUTimer;
  82.  
  83. void setup() {
  84.  
  85.   Serial.begin(115200);
  86.   Serial.print("Welcome to the FuzzyTron 3000!");
  87.  
  88.   // Multiplexer
  89.   pinMode(sigA, INPUT);
  90.   pinMode(sigB, INPUT);
  91.  
  92.   for (int i=0; i<4; i++)
  93.   {
  94.     pinMode(muxPinsA[i], OUTPUT);
  95.     digitalWrite(muxPinsA[i], HIGH);
  96.     pinMode(muxPinsB[i], OUTPUT);
  97.     digitalWrite(muxPinsB[i], HIGH);
  98.   }
  99.  
  100.   // Selection knob encoder
  101.   pinMode(selectEncA, INPUT_PULLUP);
  102.   pinMode(selectEncB, INPUT_PULLUP);
  103.   selectEncLastState = digitalRead(selectEncA);
  104.  
  105.   // Loop knob encoder
  106.   pinMode(loopEncA, INPUT_PULLUP);
  107.   pinMode(loopEncB, INPUT_PULLUP);
  108.   loopEncLastState = digitalRead(loopEncA);
  109.  
  110.   // Set button and knob pins to INPUT and default HIGH
  111.   int pinMin = 0;
  112.   int pinMax = 1;
  113.   for (int i = pinMin; i <= pinMax; i++)
  114.   {
  115.     pinMode(i, INPUT);
  116.     digitalWrite(i, HIGH);
  117.   }
  118.  
  119.   // Do power on animation
  120.   //powerAnim(40);
  121. }
  122.  
  123. void loop() {
  124.   // LEDs
  125.   //readVU();
  126.  
  127.   // DECK A POTS
  128.   gainA = readPot(1, 0);
  129.   highA = readPot(1, 1);
  130.   //midA = readPot(1, 2);
  131.   //lowA = readPot(1, 3);
  132.   //filterA = readPot(1, 4);
  133.   //pitchA = readPot(1, 5);
  134.   //volA = readPot(1, 6);
  135.  
  136.   // Check for deck A pot changes
  137.   //GAIN
  138.   if (gainA != defaultGainA){
  139.     sendControl(1, 0, gainA); // Send the MIDI signal
  140.     //Serial.println(gainA);
  141.     defaultGainA = gainA;
  142.   }
  143.  
  144.   // HIGH
  145.   if (highA != defaultHighA){
  146.     sendControl(1, 1, highA); // Send the MIDI signal
  147.     //Serial.println(highA);
  148.     defaultHighA = highA;
  149.   }
  150.  
  151.  
  152.  
  153.  
  154.   // Read Track selection and loop rotary encoders
  155.   rotaryRead(selectEncA, selectEncB, selectEncState, selectEncLastState, selectEncDir, 0);
  156.   rotaryRead(loopEncA, loopEncB, loopEncState, loopEncLastState, loopEncDir, 1);
  157.  
  158.   // CUE Buttons
  159.  
  160.   // DECK ONE
  161.     // GAIN
  162.    
  163.   // DECK TWO
  164.    
  165.  
  166.   // Volume Knobs
  167.     // MASTER VOLUME
  168.     //masterVol.update();
  169.     //masterVolume = map(masterVol.getValue(), 0, 1023, 0, 127);
  170.    
  171.     //if (masterVol.hasChanged()){
  172.     //  sendControl(1, 1, masterVolume);
  173.     //  defaultMasterVolume = masterVolume;
  174.     //}
  175. }
  176.  
  177. ////////////////////
  178. //   FUNCTIONS    //
  179. ////////////////////
  180.  
  181. // Multiplexer Pin Selection
  182. void selectMuxPin(int deck, byte pin)
  183. {
  184.   for (int i=0; i<4; i++)
  185.   {
  186.     if (deck == 1){
  187.       if (pin & (1<<i))
  188.         digitalWrite(muxPinsA[i], HIGH);
  189.       else
  190.         digitalWrite(muxPinsA[i], LOW);
  191.     }
  192.  
  193.     if (deck == 2){
  194.       if (pin & (1<<i))
  195.         digitalWrite(muxPinsB[i], HIGH);
  196.       else
  197.         digitalWrite(muxPinsB[i], LOW);
  198.     }
  199.   }
  200. }
  201.  
  202. int readPot(int deck, int pin){
  203.   if (deck == 1){
  204.     selectMuxPin(1, pin);
  205.     mPlexA.update();
  206.     return map(mPlexA.getValue(), 0, 1023, 0, 127);
  207.   }
  208.   if (deck == 2){
  209.     selectMuxPin(2, pin);
  210.     mPlexB.update();
  211.     return map(mPlexB.getValue(), 0, 1023, 0, 127);
  212.   }
  213. }
  214.  
  215. // Send the actual MIDI commands
  216. void sendControl(byte channel, byte control, byte value) {
  217.   midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  218.   MidiUSB.sendMIDI(event);
  219.   MidiUSB.flush();
  220. }
  221.  
  222.  
  223. // Read the rotary encoders
  224. void rotaryRead(int pinA, int pinB, int state, int lastState, int rotaryDirection, int cc){
  225.   state = digitalRead(pinA);
  226.  
  227.   if (state != lastState){  
  228.     // Clockwise rotation
  229.     if (digitalRead(pinB) != state) {
  230.       rotaryDirection = 1;
  231.     }
  232.     // Counter-clockwise rotation
  233.     else {
  234.       rotaryDirection = 127;
  235.     }
  236.     sendControl(1, cc, rotaryDirection);
  237.   }
  238.   lastState = state;
  239. }
  240.  
  241.  
  242. // Master volume VU
  243. void readVU() {
  244.   midiEventPacket_t rx;
  245.   do {
  246.     rx = MidiUSB.read();
  247.     if (rx.header != 0) {
  248.      
  249.       // Left Lower LED
  250.       if (rx.byte1 == 178 && rx.byte2 == 0){
  251.         digitalWrite(l1VU, HIGH);
  252.         digitalWrite(r1VU, HIGH);
  253.         VUTimer = millis();
  254.       }
  255.       // Left 2nd LED
  256.       if (rx.byte1 == 178 && rx.byte2 == 1){
  257.         digitalWrite(l2VU, HIGH);
  258.         digitalWrite(r2VU, HIGH);
  259.         VUTimer = millis();
  260.       }
  261.       // Left 3rd LED
  262.       if (rx.byte1 == 178 && rx.byte2 == 2){
  263.         digitalWrite(l3VU, HIGH);
  264.         digitalWrite(r3VU, HIGH);
  265.         VUTimer = millis();
  266.       }
  267.       // Left 4th LED
  268.       if (rx.byte1 == 178 && rx.byte2 == 3){
  269.         digitalWrite(l4VU, HIGH);
  270.         digitalWrite(r4VU, HIGH);
  271.         VUTimer = millis();
  272.       }
  273.       // Left Top LED
  274.       if (rx.byte1 == 178 && rx.byte2 == 4){
  275.         digitalWrite(l5VU, HIGH);
  276.         digitalWrite(r5VU, HIGH);
  277.         VUTimer = millis();
  278.       }
  279.      
  280. /*
  281.       Serial.print("MIDI Signal Received: ");
  282.       Serial.print("HEADER: ");
  283.       Serial.println(rx.header);
  284.       Serial.print("BYTE 1: ");
  285.       Serial.println(rx.byte1);
  286.       Serial.print("BYTE 2: ");
  287.       Serial.println(rx.byte2);
  288.       Serial.print("BYTE 3: ");
  289.       Serial.println(rx.byte3);
  290.       Serial.flush();
  291. */
  292.     }
  293.  
  294.   } while (rx.header != 0);
  295.  
  296.     if (millis()-VUTimer >= 38UL){
  297.       digitalWrite(l1VU, LOW);
  298.       digitalWrite(l2VU, LOW);
  299.       digitalWrite(l3VU, LOW);
  300.       digitalWrite(l4VU, LOW);
  301.       digitalWrite(l5VU, LOW);
  302.      
  303.       digitalWrite(r1VU, LOW);
  304.       digitalWrite(r2VU, LOW);
  305.       digitalWrite(r3VU, LOW);
  306.       digitalWrite(r4VU, LOW);
  307.       digitalWrite(r5VU, LOW);
  308.     }
  309.  
  310. }
  311.  
  312.  
  313. // Bootup animation
  314. // REMOVED
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement