/ MIDI_Solenoid_Drummer / MIDI_Solenoid_Drummer.ino
MIDI_Solenoid_Drummer.ino
 1  // SPDX-FileCopyrightText: 2018 Collin Cunningham for Adafruit Industries
 2  //
 3  // SPDX-License-Identifier: MIT
 4  
 5  /*  MIDI Solenoid Drummer
 6   *  for use with Adafruit Feather + Crickit Featherwing
 7   *  assumes a 5V solenoid connected to each of Crickit's four Drive ports
 8   */
 9  
10  #include "Adafruit_Crickit.h"
11  #include "MIDIUSB.h"
12  
13  Adafruit_Crickit crickit;
14  
15  #define NUM_DRIVES 4
16  int drives[] = {CRICKIT_DRIVE1, CRICKIT_DRIVE2, CRICKIT_DRIVE3, CRICKIT_DRIVE4};
17  int cym = CRICKIT_DRIVE4;
18  int kick = CRICKIT_DRIVE3;
19  int snare = CRICKIT_DRIVE2;
20  int shake = CRICKIT_DRIVE1;
21  int hitDur = 8; //solenoid on duration for each hit (in milliseconds)
22  
23  void setup() {
24  
25    if (!crickit.begin()) {
26      while (1);
27    }
28  
29    for (int i = 0; i < NUM_DRIVES; i++)
30      crickit.setPWMFreq(drives[i], 1000);  //default frequency is 1khz
31  
32    test(); //test solenoids at start
33  }
34  
35  void loop() {
36  
37    midiEventPacket_t rx = MidiUSB.read();  //listen for new MIDI messages
38  
39    switch (rx.header) {
40      case 0x9:            //Note On message
41        handleNoteOn(
42          rx.byte1 & 0xF,  //channel
43          rx.byte2,        //pitch
44          rx.byte3         //velocity
45        );
46        break;
47      default:
48        break;
49    }
50  }
51  
52  void handleNoteOn(byte channel, byte pitch, byte velocity) {
53  
54    switch (pitch) {
55      case 24:      //kick = C1/24
56        hit(kick);
57        break;
58      case 25:      //snare = C#1/25
59        hit(snare);
60        break;
61      case 26:      //shake = D1/26
62        hit(shake);
63        break;
64      case 27:      //cymbal = D#1/27
65        hit(cym);
66        break;
67      default:
68        break;
69    }
70  }
71  
72  void hit(int drum) {
73    crickit.analogWrite(drum, CRICKIT_DUTY_CYCLE_MAX);  //turn solenoid all the way on
74    delay(hitDur);                                      // wait
75    crickit.analogWrite(drum, CRICKIT_DUTY_CYCLE_OFF);  //turn solenoid all the way off
76  }
77  
78  void test() {   //for debugging
79    hit(cym);
80    delay(400);
81    hit(kick);
82    delay(400);
83    hit(snare);
84    delay(400);
85    hit(shake);
86    delay(400);
87  }