Drum Machine

A 1 hour experiment at making a drum sequencer driving actuators to hit real things!

Here is the program:

Import program

00001 // drum machine sequenced by text file, sford
00002 // e.g. line contains -o--, where o is a hit
00003 
00004 #include "mbed.h"
00005 
00006 class Drum {
00007 public:
00008     Drum(PinName p) : x(p) {}
00009     
00010     void off() { x = 0; }
00011     void hit() { 
00012         x = 1;
00013         t.attach(this, &Drum::off, 0.01);
00014     }
00015         
00016     DigitalOut x;
00017     Timeout t;
00018 };
00019 
00020 Drum drums[4] = {p21, p22, p23, p24};
00021 AnalogIn speed(p20);
00022 BusOut leds(LED1, LED2, LED3, LED4);
00023 
00024 LocalFileSystem local("local");
00025 
00026 int main() {
00027     int count = 0;
00028     while(1) {
00029         FILE *fp = fopen("/local/drums.txt", "r");
00030         if(!fp) {
00031             error("Couldn't open file\n");
00032         }
00033         char tracks[4];
00034         while(!feof(fp)) {
00035             fscanf(fp, "%c%c%c%c\n", &tracks[0], &tracks[1], &tracks[2], &tracks[3]);
00036             for(int i=0; i<4; i++) {
00037                 if(tracks[i] == 'o') {
00038                     drums[i].hit();
00039                 }
00040             }       
00041             leds = 1 << (count % 4);
00042             count++;
00043             wait(0.05 + speed);            
00044         }
00045         count = 0;
00046         fclose(fp);
00047     }
00048 }

and then you create a file on the mbed called "drums.txt", containing something like:

o--o
----
---o
----
-o-o
----
---o
--o-
o--o
-o--
-o--
---o
-o--
----
o--o
--o-

The outputs just drive the motors via an L293 h-bridge I had lying around (wire enables to 1, then use each half of the h-bridge as a driver), and a variable resistor to control the tempo.

Next step would be so you could control it via midi to make it playable via keyboard/sequencer/cubase etc. And perhaps use proper solenoids :)