summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CheapSynth_FM4osc2Poly_v0_6/CheapSynth_FM4osc2Poly_v0_6.ino431
-rw-r--r--PolyDrums_v0_2_0_DelayDuty/PolyDrums_v0_2_0_DelayDuty.ino480
-rw-r--r--PolyDrums_v0_2_0_DelayDuty/hihatc909.h57
-rw-r--r--PolyDrums_v0_2_0_DelayDuty/hihato909.h103
-rw-r--r--PolyDrums_v0_2_0_DelayDuty/kick909.h119
-rw-r--r--PolyDrums_v0_2_0_DelayDuty/snare909.h116
6 files changed, 1306 insertions, 0 deletions
diff --git a/CheapSynth_FM4osc2Poly_v0_6/CheapSynth_FM4osc2Poly_v0_6.ino b/CheapSynth_FM4osc2Poly_v0_6/CheapSynth_FM4osc2Poly_v0_6.ino
new file mode 100644
index 0000000..f718b32
--- /dev/null
+++ b/CheapSynth_FM4osc2Poly_v0_6/CheapSynth_FM4osc2Poly_v0_6.ino
@@ -0,0 +1,431 @@
+
+/*
+ * FM+LFO notes from Mozzi in response to MIDI input,
+ * using the standard Arduino MIDI library:
+ * http://playground.arduino.cc/Main/MIDILibrary
+ *
+ * NOW COMPATIBLE WITH MOZZI v1.0.2, MIDI library 4.2
+ * LESS COMPATIBLE WITH ARDUINO IDE 1.0.6 onwards - http://sensorium.github.io/Mozzi/blog/2015/04/08/use-arduino-1-dot-0-5/
+ *
+ * Mozzi help/discussion/announcements:
+ * https://groups.google.com/forum/#!forum/mozzi-users
+ *
+ * Massively based on examples by Tim Barrass 2013nextenv
+ * This example code is in the public domain.
+ *
+ * sgreen/dpape/dgreen - modified to bring together harmonic FM, LFO, portamento,
+ * mono note priority, & Rock Band keytar controls - http://www.cheapsynth.com/
+ *
+ * Audio output from pin 9 (pwm)
+ * Midi plug pin 2 (centre) to Arduino gnd, pin 5 to RX (0)
+ * http://www.philrees.co.uk/midiplug.htm
+ *
+ On Rock Band keytar, switch between patch modes using the big transparent button above
+the LEDs, as follows...
+
+Mode 0 - monophonic FM lead sound with variable modulation harmonics, portamento, modulation depth
+on modulation strip, low-frequency oscillator (LFO) speed on pitch bend strip (ie button held down)
+
+Mode 1 - (2-note polyphonic) Squarewave added to squared-off sinewave at variable harmonics,
+pitch bend strip adjusts "duty cycle", ie how much the squared sine is On vs Off
+
+Mode 2 - (2-note polyphonic) Actually sawtooth wave, pitch bend strip gives chorus-y effect by
+variably detuning one of the current notes
+
+Mode 3 - (2-note "polyphonic") Squarewave XOR'd with sinewaves at variable harmonics, similar fake-LFO
+detuning on pitch bend strip, massive upwards zoom on both notes when no portamento!
+
+Mode 4 - intentionally left blank so you know where you are
+
+Standard controls:
+
+Different modulation freq harmonics on the right-hand corner up and down keys between octave up
+and octave down (all modes except Mode 2).
+
+Portamento speed on Back arrow to the left of big transparent Mode button, toggles between no portamento
+(ie 2-note polyphony in modes that support it), 10ms fast glide between notes, 400ms slow glide.
+
+[updated: this note decay now doesn't do anything as I've moved everything to "slow" ADSR..!]
+Note decay length on forward arrow to the right of big transparent Mode button (currently applies
+to less computationally demanding envelopes in Mode 0 and 2), toggles between short/medium/long
+*/
+
+#include <MIDI.h>
+#include <MozziGuts.h>
+#include <Oscil.h> /oscSaw/ oscillator template
+#include <Line.h> // for envelope
+#include <tables/cos2048_int8.h> // table for Oscils to play
+#include <tables/saw1024_int8.h> // table for Oscils to play
+#include <tables/smoothsquare8192_int8.h> // NB portamento requires table > 512 size?
+#include <mozzi_midi.h>
+#include <ADSR.h>
+#include <mozzi_fixmath.h>
+#include <LowPassFilter.h>
+#include <Portamento.h>
+#include <Ead.h>
+
+ MIDI_CREATE_DEFAULT_INSTANCE();
+
+// use #define for CONTROL_RATE, not a constant
+#define CONTROL_RATE 128 // powers of 2 please
+
+// Mozzi example uses COS waves for carrier and modulator
+// DP: "gets brutal very fast" (esp in higher octaves) if you use a saw/square carrier
+// gets subtly more brutal if you use smaller wavetables (fewer samples per cycle)
+Oscil<SMOOTHSQUARE8192_NUM_CELLS, AUDIO_RATE> oscCarrier(SMOOTHSQUARE8192_DATA); // huge file :(
+Oscil<SMOOTHSQUARE8192_NUM_CELLS, AUDIO_RATE> oscSquare2(SMOOTHSQUARE8192_DATA); // huge file :(
+Oscil<COS2048_NUM_CELLS, AUDIO_RATE> oscModulator(COS2048_DATA);
+Oscil<COS2048_NUM_CELLS, AUDIO_RATE> oscModulator2(COS2048_DATA);
+Oscil<COS2048_NUM_CELLS, AUDIO_RATE> oscLFO(COS2048_DATA);
+Oscil<SAW1024_NUM_CELLS, AUDIO_RATE> oscSaw1(SAW1024_DATA);
+Oscil<SAW1024_NUM_CELLS, AUDIO_RATE> oscSaw2(SAW1024_DATA);
+
+// envelope generator
+ADSR <CONTROL_RATE,CONTROL_RATE> envelope;
+ADSR <CONTROL_RATE,CONTROL_RATE> envelope2;
+Ead kEnvelopeGuitar1(CONTROL_RATE); //left in here for future use but currently not vital?
+Ead kEnvelopeGuitar2(CONTROL_RATE);
+
+Portamento <CONTROL_RATE>aPortamento;
+//LowPassFilter lpf; // LPF left over from earlier versions of code, may reinstate!
+//int crushCtrl = 0; // ditto bitcrush
+
+#define LED 13 // to see if MIDI is being recieved
+
+long vibrato=0;
+long vibrato2=0;
+int chanGain1;
+int chanGain2;
+int LFO;
+unsigned int carrierXmodDepth1;
+unsigned int carrierXmodDepth2;
+
+// initialise globals (some eg amplitude no longer used)
+int maxmode=4;
+float carrierFreq = 10.f;
+float carrier2 = 10.f;
+float modFreq = 10.f;
+float modFreq2 = 10.f;
+float modDepth = 0;
+float amplitude = 0.f;
+float modOffset =1;
+byte lastnote1=0;
+byte lastnote2=0;
+int nextenv=1;
+byte portSpeed=0;
+byte noteLength=1;
+float shifted=0.1f;
+byte mode=0;
+unsigned long harmonic;
+int squaredsin1;
+int squaredsin2;
+int bitmask=64;
+int multiplier;
+
+float modOffsets[] = {
+4,3.5,3,2.5,2,1.5,1,0.6666666,0.5,0.4,0.3333333,0.2857,0.25,0,0,0,0,0,0,
+}; // harmonic ratios corresponding to DP's preferred intervals of 7, 12, 7, 19, 24, 0, 12, -12, etc
+
+void setup() {
+ pinMode(LED, OUTPUT);
+
+ // Initiate MIDI communications, listen to all channels
+ MIDI.begin(MIDI_CHANNEL_OMNI);
+
+ // Connect the HandleNoteOn function to the library, so it is called upon reception of a NoteOn.
+ MIDI.setHandleNoteOn(HandleNoteOn); // Put only the name of the function
+ MIDI.setHandleNoteOff(HandleNoteOff); // Put only the name of the function
+ MIDI.setHandleControlChange(HandleControlChange);
+ MIDI.setHandlePitchBend(HandlePitchBend); // Put only the name of the function
+ MIDI.setHandleProgramChange(HandleProgramChange);
+ MIDI.setHandleContinue(HandleContinue);
+ MIDI.setHandleStop(HandleStop);
+ MIDI.setHandleStart(HandleStart);
+
+ envelope.setADLevels(127,100);
+ envelope.setTimes(20,20,20000,1200); // 20000 is so the note will sustain 20 seconds unless a noteOff comes
+ envelope2.setADLevels(127,100);
+ envelope2.setTimes(20,20,20000,1200); // 20000 is so the note will sustain 20 seconds unless a noteOff comes
+
+ kEnvelopeGuitar1.set(20, 4000);
+ kEnvelopeGuitar2.set(20, 4000);
+
+ aPortamento.setTime(0u);
+// lpf.setResonance(200);
+// lpf.setCutoffFreq(255);
+ oscLFO.setFreq(10); // default LFO frequency
+
+ startMozzi(CONTROL_RATE);
+}
+
+
+void UpdateFreqs()
+{
+ oscCarrier.setFreq(carrierFreq);
+ oscSaw1.setFreq(carrierFreq);
+ carrierXmodDepth1=carrierFreq * modDepth;
+ modFreq=(carrierFreq * modOffset / (64/bitmask) );
+
+ oscSquare2.setFreq(carrier2);
+ oscSaw2.setFreq(carrier2 * (1.0f + ((shifted -0.1f) / 384)) );
+ carrierXmodDepth2=carrier2 * modDepth;
+ modFreq2=(carrier2 * modOffset / (64/bitmask) );
+
+ oscModulator.setFreq( modFreq );
+ oscModulator2.setFreq( modFreq2 );
+}
+
+void HandleProgramChange (byte channel, byte number)
+{
+ modOffset = modOffsets[number%15];
+ UpdateFreqs();
+// modFreq=(carrierFreq * modOffset / (64/bitmask) );
+//dreadful hack as ProgramChange returns absolute prog number 0-127, "gets stuck" at upper/lower ends
+}
+
+void HandleNoteOn(byte channel, byte note, byte velocity) {
+ aPortamento.start(note);
+// carrierFreq=(mtof(note)); // simple but less accurate frequency
+// osc.setFreq_Q16n16(Q16n16_mtof(Q8n0_to_Q16n16(note))); // accurate frequency
+if ( portSpeed)
+ {nextenv=1; lastnote2=999;}
+
+ if (nextenv==1)
+ {
+ lastnote1=note;
+ envelope.noteOn();
+kEnvelopeGuitar1.start();
+ digitalWrite(LED,HIGH);
+ nextenv=2; // send next note to other envelope, unless overridden in the meantime
+
+ carrierFreq = Q16n16_to_float (Q16n16_mtof(Q8n0_to_Q16n16(lastnote1)));
+ UpdateFreqs();
+ }
+ else
+ {
+ lastnote2=note;
+ envelope2.noteOn();
+kEnvelopeGuitar2.start();
+ digitalWrite(LED,HIGH);
+ nextenv=1; // send next note to other envelope, unless overridden in the meantime
+
+ carrier2 = Q16n16_to_float (Q16n16_mtof(Q8n0_to_Q16n16(lastnote2)));
+ UpdateFreqs();
+ }
+
+}
+
+void HandleStop () { //this is the Back button on the Xbox keyboard
+ portSpeed++;
+ {if (portSpeed>2) portSpeed = 0;}
+ aPortamento.setTime( (portSpeed*portSpeed*100) ); // values of 0,100,400 milliseconds? (next 900)
+}
+
+void HandleStart () { //CURRENTLY NOT USED
+ noteLength=(noteLength+1)%3; // loop from 0-2
+ kEnvelopeGuitar1.set(20, (noteLength+1)*(noteLength+1)*(noteLength+1)*500 );
+ kEnvelopeGuitar2.set(20, (noteLength+1)*(noteLength+1)*(noteLength+1)*500 );
+ //cube into values around 500, 4000, 13500
+}
+
+void HandleContinue () { // the big round button on all keytars
+ mode++;
+ {if (mode>maxmode) mode = 0;} //currently has a silent mode at the end so you know where you are : )
+}
+
+void HandleNoteOff(byte channel, byte note, byte velocity) {
+ digitalWrite(LED,LOW); // may as well switch LED off
+
+ if ( (note == lastnote1) ) //kill envelope if prev note released
+ {
+ envelope.noteOff();
+ if (chanGain2) {nextenv=1;}
+}
+
+ if ( (note == lastnote2) )
+ {envelope2.noteOff();
+ if (chanGain1) {nextenv=2;}
+ }
+
+}
+
+
+void HandlePitchBend (byte channel, int bend)
+{
+//bend value from +/-8192, translate to 0.1-8 Hz?
+shifted= float ((bend+8500) /2048.f ) +0.1f;
+if (mode==0) {oscLFO.setFreq(shifted); }
+if (mode==1)
+ {
+ bitmask= 1 << (int (shifted)); multiplier=7-(int (shifted));
+ UpdateFreqs();
+ }
+ else {bitmask=64;}
+
+if (mode==2) { oscSaw2.setFreq(carrier2 * (1.0f + ((shifted -0.1f) / 384)) ); }
+}
+
+void HandleControlChange (byte channel, byte number, byte value)
+{
+// http://www.indiana.edu/~emusic/cntrlnumb.html
+
+/*
+Serial.end(); // sample debug code to check values through (noisy) terminal interface
+Serial.begin(38400);
+Serial.print(" number:");
+Serial.print(number);
+Serial.print(" value:");
+Serial.println( value );
+Serial.println();
+Serial.end();
+Serial.begin(31250);
+*/
+
+ switch(number) {
+// case 3: // could trap different controller IDs here
+
+ case 1: // modulation wheel
+ //lpf.setResonance(value*2);
+
+ //WORKING MODDEPTH CONTROLLER
+ float divided= float (value /46.f ); // values=0-127, map to 0-2.75
+ modDepth = (divided * divided); // square to 0-8
+ if (modDepth>7.5) {modDepth=7.5;} // sanity check (prob unnecessary)
+ if (modDepth<0.2) {modDepth=0;} // easier to get pure tone
+ UpdateFreqs();
+ break;
+ }
+}
+
+void updateControl(){
+ MIDI.read();
+ envelope.update();
+ envelope2.update();
+
+ chanGain1 = envelope.next();
+ chanGain2 = envelope2.next();
+
+// chanGain1 = kEnvelopeGuitar1.next();
+// chanGain2 = kEnvelopeGuitar2.next();
+ if(chanGain1 > 120) chanGain1 = 120;
+ if(chanGain2 > 120) chanGain2 = 120;
+
+if ( portSpeed )
+ {
+ carrierFreq = Q16n16_to_float ( aPortamento.next() ); //NB presumably returns frequency as Q16n16
+ UpdateFreqs();
+ }
+
+if (mode==3)
+ {
+ modFreq *= 1.0f +(shifted / 384); // generates fake LFO via detuning mod osc
+ modFreq2*= 1.0f +(shifted / 384); // generates fake LFO via detuning mod osc
+// modFreq2*= 1 + (shifted -0.1f) / 384); // generates fake LFO via detuning mod osc
+ oscModulator.setFreq( modFreq );
+ oscModulator2.setFreq( modFreq2 );
+ }
+
+}
+
+// strip the low bits off! - not used in current implementation
+int bitCrush(int x, int a)
+{
+ return (x>>a)<<a;
+}
+
+int updateAudio(){
+
+ switch(mode)
+ {
+ case 0: // FM with LFO
+//NB this multiplication split into 2 chunks to preserve small precise values?
+LFO=oscLFO.next();
+vibrato = ( LFO * oscModulator.next() ) >>7 ;
+vibrato*= carrierXmodDepth1;
+vibrato2 = ( LFO * oscModulator2.next() ) >>7 ;
+vibrato2*= carrierXmodDepth2;
+return (int) (
+ (oscCarrier.phMod( vibrato >>3 ) * chanGain1 )
+ + (oscSquare2.phMod( vibrato2>>3 ) * chanGain2 )
+ ) >> 9;
+// >> 9 = 9 fast binary divisions by 2 = divide by 512
+ break;
+
+ case 1: // ADDING square + "converted" sine
+//squaredsin1= ( (oscModulator.next() & 0b0000000001000000)-1 ) <<1;
+squaredsin1= ( (oscModulator.next() & bitmask) ) <<multiplier;
+squaredsin2= ( (oscModulator2.next() & bitmask) ) <<multiplier;
+return (int)
+(
+ ( ( (oscCarrier.next() + squaredsin1 )>>1 )* chanGain1 )
++ ( ( (oscSquare2.next() + squaredsin2 )>>1 )* chanGain2 )
+) >> 8;
+ break;
+
+ case 2: // 2 tri poly
+return (int)(
+ ( oscSaw1.next() *chanGain1 )
+ + ( oscSaw2.next() *chanGain2 )
+ ) >> 9;
+ break;
+
+ case 3: // STARTED AS 2 sq poly XORd with respective sines, now big whoop
+return (int)(
+ ( (oscCarrier.next()^oscModulator.next()) * chanGain1 )
+ + ( (oscSquare2.next()^oscModulator2.next())* chanGain2 )
+ ) >> 8;
+//return (int) ( (oscCarrier.next() | ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+ break;
+
+ case 13: // 2 sq poly ORd with respective sines
+return (int) ( ( (oscCarrier.next()|oscModulator.next() ) * envelope.next()) + ( (oscSquare2.next()|oscLFO.next() ) * envelope2.next()) ) >> 8;
+//return (int) ( (oscCarrier.next() | ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+ break;
+
+
+ case 6: // 2 sq poly
+return (int) ( (oscCarrier.next() * envelope.next()) + (oscSquare2.next() * envelope2.next()) ) >> 8;
+//return (int) ( (oscCarrier.next() | ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+ break;
+
+//case 5 intentionally left blank
+
+/*
+ case 6: // ADDING squares
+return (int) ( (oscCarrier.next() + oscSquare2.next() ) * (envelope.next() ) ) >> 8;
+//return (int) ( (oscCarrier.next() | ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+ break;
+*/
+// case 1: // AND with fake LFO
+//all this 'harmonic' stuff a failed attempt to use the same LFO as FM, causes massive beat f/x?
+//harmonic = ( oscLFO.next() * oscModulator.next() ) >> 7;
+//harmonic = ( harmonic * int (modDepth+1) ) >>3 ;
+//return (int) ( (oscCarrier.next() ^ ( harmonic )) * (envelope.next() ) ) >> 7;
+//return (int) ( (oscCarrier.next() & ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+// break;
+
+/* case 3: // OR with fake LFO
+//int harmonic = ( oscLFO.next() * oscModulator.next() ) >>7;
+//return (int) ( (oscCarrier.next() | ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+// break;
+ case 4: // XOR with fake LFO
+//int harmonic = ( oscLFO.next() * oscModulator.next() ) >>7;
+return (int) ( (oscCarrier.next() ^ ( (oscModulator.next() * int (modDepth+1))>>3 ) ) * (envelope.next() ) ) >> 7;
+ break;
+ */
+ }
+
+// OLD CODE FROM BITCRUNCHED SINEWAVE, DIFF WAYS OF DOING THAT
+// int x = (envelope.next() * lpf.next(osc.next()))>>8;
+// x = bitCrush(x, crushCtrl>>4);
+// x = (x * crushCtrl)>>4; // simple gain
+// x = bitCrush(x, 6);
+// x = lpf.next(x);
+// return x;
+}
+
+
+void loop() {
+ audioHook(); // required here
+}
+
diff --git a/PolyDrums_v0_2_0_DelayDuty/PolyDrums_v0_2_0_DelayDuty.ino b/PolyDrums_v0_2_0_DelayDuty/PolyDrums_v0_2_0_DelayDuty.ino
new file mode 100644
index 0000000..7c06b20
--- /dev/null
+++ b/PolyDrums_v0_2_0_DelayDuty/PolyDrums_v0_2_0_DelayDuty.ino
@@ -0,0 +1,480 @@
+
+/* Example of a sound being triggered by MIDI input.
+ * NOW COMPATIBLE WITH MOZZI v1.0.2, MIDI library 4.2
+ * LESS COMPATIBLE WITH ARDUINO IDE 1.0.6 onwards - http://sensorium.github.io/Mozzi/blog/2015/04/08/use-arduino-1-dot-0-5/
+ * Demonstrates playing notes with Mozzi in response to MIDI input,
+ * using the standard Arduino MIDI library:
+ * http://playground.arduino.cc/Main/MIDILibrary
+ *
+ * Mozzi help/discussion/announcements:
+ * https://groups.google.com/forum/#!forum/mozzi-users
+ *
+ * Tim Barrass 2013.
+ * This example code is in the public domain.
+ *
+ * sgreen - modified to use standard Arduino midi library, added saw wave
+ * Audio output from pin 9 (pwm)
+ * Midi plug pin 2 (centre) to Arduino gnd, pin 5 to RX (0)
+ * http://www.philrees.co.uk/midiplug.htm
+
+D Green July 2015:
+Big transparent button cycles through different backing sequences (including an empty one at the end)
+
+Small button to its left toggles between normal envelope and fake "delay" effect on all sounds
+
+Small button to its right switches main drums on and off
+
+Different waveforms selected via the right-hand corner up and down keys between octave up
+and octave down - cycles between (I think): sawtooth, squarewave (variable duty cycle controlled by touchstrip),
+squarewave with variable duty cycle autolocked to tempo, triangle wave (sounds like electric piano)
+
+ */
+#define MAX_NOTES 3
+//Dave G: now seems to do 2+ note polyphony without clicking (higher notes are a bit grainy)
+int threshold=255/(MAX_NOTES);
+
+#include <MIDI.h>
+//#include <SPI.h>
+#include <MozziGuts.h>
+#include <Oscil.h> // oscillator template
+#include <Line.h> // for envelope
+#include <Sample.h>
+#include <mozzi_utils.h>
+#include <mozzi_analog.h>
+
+//#include <tables/square_analogue512_int8.h>
+#include <tables/saw512_int8.h>
+#include <tables/cos512_int8.h>
+
+#include <mozzi_midi.h>
+#include <ADSR.h>
+//#include <fixedMath.h>
+#include <LowPassFilter.h>
+//#include "Wave.h"
+#include <WaveShaper.h>
+#include <tables/waveshape_compress_512_to_488_int16.h>
+
+
+#define DRUM_SAMPLES 1
+
+#if DRUM_SAMPLES
+#include "kick909.h"
+#include "snare909.h"
+#include "hihatc909.h"
+#include "hihato909.h"
+#endif
+
+// use #define for CONTROL_RATE, not a constant
+#define CONTROL_RATE 128 // powers of 2 please
+
+#define ENABLE_MIDI 1
+#define DEBUG 0
+#define BPM 120
+#define STEPS_PER_BEAT 4
+
+unsigned long beatCounter = 0;
+unsigned long ticksPerStep = (60*CONTROL_RATE) / (BPM*STEPS_PER_BEAT);
+
+// audio sinewave oscillator
+//Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> oscSin(SIN2048_DATA);
+//Oscil <SAW512_NUM_CELLS, AUDIO_RATE> sawwave(SAW512_DATA);
+//Oscil <TRIANGLE2048_NUM_CELLS, AUDIO_RATE> oscTri(TRIANGLE2048_DATA);
+//Wave myosc;
+WaveShaper <int> aCompress(WAVESHAPE_COMPRESS_512_TO_488_DATA); // to compress instead of dividing by 2 after adding signals
+
+struct Channel {
+ //Wave osc;
+ Oscil <COS512_NUM_CELLS, AUDIO_RATE> osc;
+ ADSR <CONTROL_RATE,CONTROL_RATE> env;
+// ADSR <CONTROL_RATE> fxenv;
+ byte note;
+ byte gain;
+};
+Channel chan[MAX_NOTES];
+byte currentChan = 0;
+
+// envelope generator
+//ADSR <CONTROL_RATE> envelope;
+LowPassFilter lpf;
+int crushCtrl = 0;
+int gain = 32;
+float octave = 1.0f;
+
+boolean enableDrums = true;
+
+int freeChan=0;
+int beat = 0;
+int waveType = 3;
+int bitmask = 0b0000000010000000;
+
+byte delayOn=0;
+byte snareOn=1;
+byte hatsOn=1;
+byte bassOn=1;
+
+int button0_old = 0;
+int button1_old = 0;
+
+#if DRUM_SAMPLES
+// drums
+Sample <kick909_NUM_CELLS, AUDIO_RATE> kickSamp(kick909_DATA);
+Sample <snare909_NUM_CELLS, AUDIO_RATE> snareSamp(snare909_DATA);
+Sample <hihatc909_NUM_CELLS, AUDIO_RATE> hihatcSamp(hihatc909_DATA);
+Sample <hihato_NUM_CELLS, AUDIO_RATE> hihatoSamp(hihato_DATA);
+#endif
+
+#define BASSPLUS4 7 //basically how many basslines there are plus 4 for drum parts
+byte pattern[BASSPLUS4][32] = {
+ //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 hhc
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, // 1 hho
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, // 2 snare
+ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, // 3 kick
+ 12,0,24,0,12,0,24,0, 12, 0,24,0,12,0,24,0, 12,0,24,0,12,0,24,0, 12, 0,24,0,12,0,24,0, // 5 bass
+ 12,0,12,0,14,0,12,0, 15,16,12,0,17,0,16,0, 12,0,12,0,14,0,12,0, 15,16,12,0,17,0,16,0, // 6 bass
+ 24,0,12,0,24,0,12,0, 34, 0,22,0,29,0,17,0, 24,0,12,0,24,0,12,0, 34, 0,22,0,29,0,17,0, // 7 bass
+};
+//bittersweet 0,12,15,12,13,10,13,0, 18,13,18,0, 17,13,17,0,
+
+// pin defines
+#define LED 13 // to see if MIDI is being recieved
+#define BUTTON0_PIN 2
+#define BUTTON1_PIN 3
+
+// forward declarations
+void HandleNoteOn(byte channel, byte note, byte velocity);
+void HandleNoteOff(byte channel, byte note, byte velocity);
+void HandleControlChange (byte channel, byte number, byte value);
+void HandlePitchBend (byte channel, int bend);
+
+//yes surely this should go in setup but then not scoped in other functions..??
+ MIDI_CREATE_DEFAULT_INSTANCE();
+
+void setup() {
+ // init IO pins
+ pinMode(LED, OUTPUT);
+
+#if 0
+ pinMode(BUTTON0_PIN, INPUT);
+ digitalWrite(BUTTON0_PIN, HIGH); // turn on pull-up resistor
+
+ pinMode(BUTTON1_PIN, INPUT);
+ digitalWrite(BUTTON1_PIN, HIGH); // turn on pull-up resistor
+#endif
+
+#if DEBUG
+ Serial.begin(57600); // for debugging
+#endif
+
+#if ENABLE_MIDI
+ // Initiate MIDI communications, listen to all channels
+ MIDI.begin(MIDI_CHANNEL_OMNI);
+
+ // Connect the HandleNoteOn function to the library, so it is called upon reception of a NoteOn.
+ MIDI.setHandleNoteOn(HandleNoteOn); // Put only the name of the function
+ MIDI.setHandleNoteOff(HandleNoteOff); // Put only the name of the function
+ MIDI.setHandleControlChange(HandleControlChange);
+ MIDI.setHandlePitchBend(HandlePitchBend);
+ MIDI.setHandleContinue(HandleContinue);
+ MIDI.setHandleStop(HandleStop);
+ MIDI.setHandleStart(HandleStart);
+ MIDI.setHandleProgramChange(HandleProgramChange);
+
+#endif
+
+#if 0
+ //osc.setFreq(440u); // default frequency
+ //myosc.setFreq(440.0f);
+ myosc.setFreq(440.0f*4.0f);
+ myosc.setPulseWidth(32);
+
+ envelope.setADLevels(255, 200);
+ envelope.setTimes(50, 200, 65535, 5000);
+#endif
+
+ for(int i=0; i<MAX_NOTES; i++)
+ {
+ // chan[i].osc.setType(WAVE_TRI);
+ chan[i].osc.setTable(SAW512_DATA);
+ //chan[i].osc.setPulseWidth(16);
+ chan[i].note=128;
+ chan[i].env.setADLevels(127,127);
+ chan[i].env.setTimes(10, 10, 20000, 510);
+// chan[i].fxenv.setADLevels(255,255);
+// chan[i].fxenv.setTimes(10, 10, 0, 2000);
+ }
+
+ lpf.setResonance(128);
+ lpf.setCutoffFreq(190);
+
+#if DRUM_SAMPLES
+ kickSamp.setFreq((float) kick909_SAMPLERATE / (float) kick909_NUM_CELLS);
+ snareSamp.setFreq((float) snare909_SAMPLERATE / (float) snare909_NUM_CELLS);
+ hihatcSamp.setFreq((float) hihatc909_SAMPLERATE / (float) hihatc909_NUM_CELLS);
+ hihatoSamp.setFreq((float) hihato_SAMPLERATE / (float) hihato_NUM_CELLS);
+ //snareSamp.start();
+#endif
+
+ //setupFastAnalogRead(); // optional
+// adcEnableInterrupt(); // for analog reads
+
+ startMozzi(CONTROL_RATE);
+}
+
+void HandleProgramChange (byte channel, byte number)
+{
+ // change wave
+ waveType = (number) % 4;
+
+ for(int i=0; i<MAX_NOTES; i++)
+ {
+#if 1
+ switch(waveType) {
+// case 4:
+// chan[i].osc.setTable(SQUARE_ANALOGUE512_DATA);
+// break;
+ case 0:
+ chan[i].osc.setTable(SAW512_DATA);
+ break;
+ case 1:
+ chan[i].osc.setTable(COS512_DATA);
+ break;
+ case 2:
+ chan[i].osc.setTable(SAW512_DATA);
+ break;
+ case 3:
+ chan[i].osc.setTable(SAW512_DATA);
+ break;
+ }
+#else
+ for(int i=0; i<MAX_NOTES; i++)
+ {
+ chan[i].osc.setType((WaveType) waveType);
+ }
+#endif
+ }
+}
+
+
+void HandleNoteOn(byte channel, byte note, byte velocity) {
+ //osc.setFreq(mtof(note)); // simple but less accurate frequency
+ //osc.setFreq_Q16n16(Q16n16_mtof(Q8n0_to_Q16n16(note))); // accurate frequency
+ //myosc.setFreq(mtof(note)); // accurate frequency
+ //envelope.noteOn();
+
+ // start note on next channel - now with v basic "note priority"!
+int index;
+int empty=99;
+
+if (0==velocity) {empty=0;}
+else {
+ digitalWrite(LED,HIGH);
+ for(int i=0; i<MAX_NOTES; i++)
+ {
+ index=((currentChan+i)%(MAX_NOTES-hatsOn)+hatsOn);
+ if (chan[index].gain==0) {empty=index; break;}
+ }
+ }
+
+if (empty==99) // ie all no empty channels found so far?
+ {
+ for(int i=0; i<MAX_NOTES; i++)
+ {
+ index=((currentChan+i)%(MAX_NOTES-hatsOn)+hatsOn);
+ if (chan[index].note==128) {empty=index; break;}
+ }
+ }
+
+if (empty<99) {currentChan=empty;} else
+ {
+ currentChan = (currentChan + 1) % MAX_NOTES; // add 1, wrap around
+ }
+
+ chan[currentChan].note = note;
+ chan[currentChan].osc.setFreq(float(mtof(note)));
+// (float(mtof(note))); // accurate frequency?
+ if (waveType==1) {chan[currentChan].osc.setFreq(float(mtof(note+24)));} //high triangle
+ chan[currentChan].env.noteOn();
+// chan[currentChan].fxenv.noteOn();
+
+}
+
+void HandleNoteOff(byte channel, byte note, byte velocity) {
+ //envelope.noteOff();
+
+ // find which channel was playing this note
+ for(int i=0; i<MAX_NOTES; i++) {
+ if (chan[i].note == note) {
+ // kill it
+ chan[i].env.noteOff();
+ chan[i].note=128;
+ }
+ }
+
+ digitalWrite(LED,LOW);
+}
+
+void HandleControlChange (byte channel, byte number, byte value)
+{
+ // http://www.indiana.edu/~emusic/cntrlnumb.html
+ switch(number) {
+ case 1: // modulation wheel
+ int divided= constrain((value /16)+2,1,7); // values=0-127, map to 0-7
+ bitmask=((0b00000000111111111)>>divided)<<divided;
+ break;
+
+ //gain = value*2;
+/* lpf.setCutoffFreq( int(value*1.5f) ); // control messages are in [0, 127] range
+ lpf.setResonance( int(value*1.4f) );
+// for(int i=0; i<MAX_NOTES; i++) {chan[i].env.setTimes(10, 10, 0, 900+value); }
+*/
+
+ break;
+ }
+}
+
+// pitchbend = control strip + button on Keytar
+void HandlePitchBend (byte channel, int bend)
+{
+ //bend value from +/-8192
+ //lfo.setFreq((unsigned int) (bend+8192)>>7);
+ for(int i=0; i<MAX_NOTES; i++) {
+// chan[i].osc.setPulseWidth((bend+8192) >> 8);
+ }
+
+}
+
+void HandleStop () { //this is the Back button on the Xbox keyboard
+// octave *= 2.0f;
+// if (octave > 16.0f) octave = 1.0f;
+//Dave G: no longer used : )
+delayOn=(! delayOn);
+ for(int i=0; i<MAX_NOTES; i++)
+ {
+if (delayOn)
+ {
+ chan[i].env.setTimes(10, 10, 0, 1020);
+ }
+ else
+ {
+ chan[i].env.setTimes(10, 10, 20000, 510);
+ }
+ }
+}
+
+void HandleStart () { //this is the Back button on the Xbox keyboard
+// octave *= 2.0f;
+// if (octave > 16.0f) octave = 1.0f;
+//Dave G: no longer used : )
+snareOn=(! snareOn);
+}
+
+void HandleContinue () { // the big round button on all keytars
+bassOn=(bassOn+1)% ((BASSPLUS4-4)+1) ;
+if (0==bassOn) {hatsOn=0;} else {hatsOn=1;}
+}
+
+void updateControl(){
+#if ENABLE_MIDI
+ MIDI.read();
+#endif
+
+ //envelope.update();
+
+ // update playing envelopes
+ for(int i=0; i<MAX_NOTES; i++) {
+ chan[i].env.update();
+// chan[i].fxenv.update();
+ //int tremolo=( chan[i].fxenv.next() & 0b00111111 );
+ int tremolo=chan[i].env.next();
+if (delayOn)
+{chan[i].gain=(tremolo * (tremolo&0b00011111) )>>5;}
+else {chan[i].gain=tremolo;}
+//subtler effect: {chan[i].gain=(tremolo + (tremolo&0b00011111) )>>1;}
+ if (chan[i].gain>threshold) {chan[i].gain=threshold;}
+ // threshold=255/MAX_NOTES, genuinely not sure if this is best approach but stops crashes :)
+ }
+
+
+#if DRUM_SAMPLES
+ if (enableDrums) {
+ // drums
+ beatCounter++;
+ if (beatCounter > ticksPerStep) {
+ beat = (beat+1) & 0x1f;
+ beatCounter = 0;
+
+//if (beat==0 || beat==8) {HandleNoteOn(1, 48, 128); }
+
+ //semi-perceptible BPM-locked phaser
+ if (3==waveType){int slowbeat=beat>>1;
+ int divided=(slowbeat+6)>>1; if (slowbeat>7) {divided=(22-slowbeat)>>1;}
+ bitmask=((0b00000000111111111)>>divided)<<divided;
+ }
+// lpf.setCutoffFreq( (filterlevel+11) <<3 ); //maps to 72-192
+// lpf.setResonance( (filterlevel+10) <<3);
+ if (pattern[0][beat] && hatsOn) hihatcSamp.start();
+ if (pattern[1][beat] && hatsOn) hihatoSamp.start();
+ if (pattern[2][beat] && snareOn) snareSamp.start();
+ if (pattern[3][beat] && snareOn) kickSamp.start();
+ if (pattern[bassOn+3][beat] && bassOn) { HandleNoteOn(0, pattern[bassOn+3][beat]+24, 0) ;}
+ }
+ }
+#endif
+
+}
+
+// strip the low bits off!
+int bitCrush(int x, int a)
+{
+ return (x>>a)<<a;
+}
+
+int updateAudio()
+{
+ //int x = (int) (envelope.next() * osc.next())>>8;
+ //int x = (int) (envelope.next() * myosc.next())>>8;
+ //int x = (int) (envelope.next() * (lfo.next() * myosc.next())>>8)>>8;
+ //int x = (int) lfo.next();
+ //int x = (int) (lfo.next() * myosc.next())>>8;
+ //int x = (int) (envelope.next() * lpf.next(myosc.next()))>>8;
+ //int x = (envelope.next() * lpf.next(osc.next()))>>8;
+ //x = bitCrush(x, crushCtrl>>4);
+ //x = bitCrush(x, crushCtrl);
+ //x = (x * crushCtrl)>>4; // simple gain
+ //x = x>>2;
+ //x = lpf.next(x);
+
+ // sum up channels
+ int x = hihatcSamp.next() + hihatoSamp.next();
+ for(int i=0; i<MAX_NOTES; i++) {
+ int raw=chan[i].osc.next();
+ if (i==0 && 1<waveType) {int squared=((( (raw+128) & bitmask) && 1)<<8)-128; raw=squared;}
+ x += (int) (chan[i].gain * raw)>>8;
+ }
+
+//Dave G: helps crash less if goes through some sort of waveshaper here?
+ x = aCompress.next(256u + x);
+
+ //x = (x*gain)>>8;
+// x = lpf.next(x);
+
+#if DRUM_SAMPLES
+ if (enableDrums) {
+ // drums please!
+ int drums = kickSamp.next() + snareSamp.next() ;
+ //drums = (drums>>4)<<4;
+ x += drums;
+ }
+#endif
+
+ return x;
+}
+
+
+void loop() {
+ audioHook(); // required here
+}
+
+
+
diff --git a/PolyDrums_v0_2_0_DelayDuty/hihatc909.h b/PolyDrums_v0_2_0_DelayDuty/hihatc909.h
new file mode 100644
index 0000000..d2b9d76
--- /dev/null
+++ b/PolyDrums_v0_2_0_DelayDuty/hihatc909.h
@@ -0,0 +1,57 @@
+#ifndef hihatc909_H_
+#define hihatc909_H_
+
+#include "Arduino.h"
+#include <avr/pgmspace.h>
+
+#define hihatc909_NUM_CELLS 1024
+#define hihatc909_SAMPLERATE 16384
+
+const int8_t __attribute__((progmem)) hihatc909_DATA [] = {1, -2, 1, -2, 2, 0, -4,
+13, -18, 2, 3, 3, -1, 4, -9, 7, -5, -2, 4, -22, 23, -7, -8, -2, 7, -5, -8, 12,
+-4, 7, 7, -21, 12, -3, -18, 8, 1, 4, -20, 4, -5, -4, -2, 0, -2, -7, 3, -3, -3,
+-4, 3, -9, 12, -5, 20, 2, -25, 19, 0, 8, -12, -6, 4, 0, 15, -7, 8, 19, -9, -6,
+0, -1, 0, -3, 12, -12, 7, 9, -18, 2, 4, 1, -7, -4, 7, 2, -3, 0, -3, 1, -2, -4,
+-4, -11, 7, -8, -2, 11, 2, 8, -1, 4, -3, -1, -2, -9, -6, -3, 3, -9, -9, 4, 1,
+-5, 1, 5, 0, 2, 2, -3, 9, 6, -7, 3, 5, 0, -2, 0, 7, -3, -2, -2, -3, 4, -2, 2,
+-3, 2, 0, -14, 4, 3, -4, 0, -5, 3, -2, -9, 3, 0, -1, -1, -5, -1, 5, -4, -6, 7,
+1, -2, 2, 0, 4, -1, -7, 1, 3, 3, -1, -1, 6, 1, -2, 0, 3, -5, -9, 1, -1, -2, 0,
+-2, -1, 2, -1, -7, -2, -1, 1, -1, -4, 7, -5, -4, 5, 1, 1, 1, -2, 3, 2, -4, 0, 1,
+3, -3, 1, -2, 0, 2, -1, 2, -2, -2, 0, -4, -3, 3, -3, 0, -1, -3, 2, -3, -6, 6,
+-2, 0, 1, 2, 0, -2, 2, 1, 1, -5, 1, -3, -2, -4, 3, -2, -2, 0, -2, 2, -4, 1, 4,
+-4, -1, 1, -1, -1, -2, 2, 1, 1, -4, 5, -4, 0, 1, -4, 3, -2, -1, 3, 0, -3, 0, -1,
+-1, -1, 0, -4, 3, -1, -3, 2, -1, -1, 0, 0, 1, 1, -1, 1, -2, -1, -1, -4, -1, 4,
+-1, -2, 1, 0, 1, 0, 0, -1, 1, 0, 0, -1, 1, -3, 0, -1, -3, 2, -2, 1, 0, -2, -3,
+1, -1, -3, 1, -1, -2, 1, 1, -2, -1, 0, 0, -2, 0, -1, -2, 2, -1, 0, -2, 1, -2, 0,
+0, -4, 1, -1, -2, 1, 0, -2, 0, -2, 3, 0, -2, 1, 0, -1, -1, 1, -1, 0, 0, -1, 0,
+0, 0, -2, -1, 0, -1, 0, 0, -2, 0, 0, -2, -2, 0, -1, -1, 1, 0, -2, 0, 1, -1, 1,
+-1, 0, -1, 0, -1, -1, -1, -2, 1, 0, 0, 0, 0, 0, 0, -2, 0, 0, -1, -1, -1, 0, -1,
+1, -1, -1, -1, -1, 1, -3, 0, -1, -1, 0, -1, -1, -1, 0, -1, -1, 0, -2, 0, 0, 0,
+-2, -1, 1, -1, 0, 0, -1, 0, 0, 0, -1, -2, 0, -2, -1, 0, 0, -1, 0, 0, -2, 0, -1,
+-1, -1, 0, -1, 0, 0, 0, -1, -1, 0, -1, 0, 0, 0, -2, 0, -1, -1, 0, -1, -1, 0, -1,
+-1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1,
+0, -1, -1, 0, 0, -1, 0, 0, -1, 0, -1, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1,
+0, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, 0,
+-1, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0,
+-1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0,
+-1, 0, -1, 0, -1, -1, 0, -1, 0, -1, -1, 0, 0, 0, -1, -1, 0, -1, 0, 0, -1, -1, 0,
+-1, 0, 0, -1, 0, 0, 0, -1, -1, -1, -1, 0, -1, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0,
+-1, 0, -1, 0, 0, -1, -1, 0, 0, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, 0, -1, 0, 0,
+-1, -1, 0, 0, 0, -1, 0, -1, -1, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0,
+-1, 0, -1, 0, -1, 0, 0, 0, -1, -1, 0, -1, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1,
+0, -1, -1, 0, -1, -1, 0, -1, -1, 0, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1,
+-1, 0, -1, -1, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, -1, 0, -1,
+-1, 0, -1, 0, 0, -1, -1, 0, -1, 0, -1, -1, 0, -1, 0, -1, -1, 0, -1, 0, -1, 0, 0,
+-1, 0, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0,
+0, -1, 0, -1, -1, 0, -1, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, 0,
+-1, 0, 0, -1, -1, 0, -1, -1, 0, -1, 0, 0, -1, -1, -1, 0, -1, -1, 0, 0, 0, 0, 0,
+-1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, -1, -1, 0, 0, -1, -1, 0, -1, 0, -1, -1, 0,
+-1, 0, 0, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, -1, -1, 0, 0, -1, -1, 0, -1, -1,
+0, -1, 0, -1, 0, -1, -1, -1, 0, 0, -1, -1, -1, 0, -1, 0, -1, -1, -1, 0, 0, -1,
+0, 0, 0, -1, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0,
+0, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0,
+-1, 0, 0, -1, 0, -1, 0, -1, -1, 0, -1, 0, -1, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1,
+0, 0, -1, 0, -1, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, -1,
+0, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, };
+
+ #endif /* hihatc909_H_ */
diff --git a/PolyDrums_v0_2_0_DelayDuty/hihato909.h b/PolyDrums_v0_2_0_DelayDuty/hihato909.h
new file mode 100644
index 0000000..fd3a74d
--- /dev/null
+++ b/PolyDrums_v0_2_0_DelayDuty/hihato909.h
@@ -0,0 +1,103 @@
+#ifndef hihato_H_
+#define hihato_H_
+
+#include "Arduino.h"
+#include <avr/pgmspace.h>
+
+#define hihato_NUM_CELLS 2048
+#define hihato_SAMPLERATE 16384
+
+const int8_t __attribute__((progmem)) hihato_DATA [] = {0, -1, 0, -1, 0, -1, 0,
+-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -2, 4, -4, -1, 3, 1, -8, 7, -2, -9, 3, -1,
+1, -3, 0, -2, 4, -3, -4, -1, -3, 3, -2, -5, -1, 2, -1, -3, -1, 4, -2, 4, -3, -2,
+4, -1, 6, 0, 8, -5, -5, 2, -2, 2, -2, -2, 7, -4, 6, -11, -6, 11, -6, 1, 4, 0,
+-14, 11, -6, -1, -2, -8, 5, -13, 1, 0, -8, 2, 7, 3, 1, -8, 5, 2, 2, -2, -8, 11,
+-1, 0, 2, -1, -3, 2, -3, -9, 2, -4, 6, -3, 1, 9, -7, -3, 2, -2, -2, -13, 2, 9,
+-3, 4, -3, 4, -6, 3, -1, -7, 13, -5, 3, 1, 1, -5, -13, 1, -2, 8, 0, 2, -4, 6,
+-1, 2, 3, -12, 4, -16, 0, -7, 2, 0, -3, 10, -6, 6, -3, -9, -2, 11, -7, -7, 11,
+9, -3, 1, -1, -5, -6, -4, 2, -11, 8, 2, -4, 14, 0, -9, 7, -4, 6, -2, -10, -3, 1,
+4, -12, 10, -1, 1, 0, 2, -3, 0, 5, 0, 5, -6, 0, -1, 0, -8, -3, -1, -1, 1, -3, 3,
+-3, 4, 8, -12, 0, -2, -7, 9, 2, 3, -6, -1, -4, 2, -7, -5, 12, -4, 7, 0, -2, 3,
+-1, -2, -3, 1, -3, -1, 2, -1, 2, -8, 1, 7, -8, -3, 1, 5, 4, -3, -3, 1, -3, -13,
+2, 0, 1, 2, -13, 4, 4, 4, 0, 6, 2, -6, -9, -5, 12, -3, 1, -10, 10, -1, -7, 3,
+-2, 9, -18, 0, -5, 11, -4, 0, 6, -13, 3, -13, 14, 3, -5, 0, -3, 3, 1, -2, 1, 7,
+5, -8, 6, 0, -8, 2, -3, 4, -6, 1, -14, 7, 8, -10, 7, -11, 10, -8, -13, 13, -3,
+1, -2, 4, -4, -2, 0, 0, 8, -8, 2, 3, 5, -2, -1, -1, 4, 1, -13, 2, 2, -3, -5, 2,
+-1, 2, -2, 0, 0, 4, -6, -5, 6, -1, 2, -5, 1, 10, -8, -7, 8, -6, 6, 3, -15, 2, 0,
+-8, 6, 5, -4, 2, 0, -6, 5, -2, -4, 2, -3, -1, 5, -2, -2, 0, 1, 4, -8, 2, 4, 0,
+0, -2, -1, -3, -1, -5, -3, 6, -18, 5, 10, -6, 10, -3, -4, 3, 1, -11, 4, -3, 5,
+-2, -7, 7, -5, 3, -4, 4, -3, 3, -3, -2, 6, -2, 4, -5, 5, -3, -9, -3, -4, 1, -2,
+5, 2, -2, 7, -4, -5, 3, 0, 2, 2, -5, -2, 6, 5, -11, 3, -6, 2, 0, -3, 5, -4, 5,
+-6, 7, -11, 4, -3, -5, 1, -8, 4, -11, 17, 1, -3, -6, -2, 7, -2, -1, -5, 13, -5,
+-8, 1, 5, 3, -10, 5, -5, -4, 7, -7, 8, 5, 1, -2, -8, 7, -8, -2, 2, 1, 4, -5, -5,
+-2, 10, -10, -2, 1, -8, 0, -2, 5, 8, -4, -2, -4, 0, 4, -4, 1, -2, 5, 0, 8, -2,
+1, -2, -4, 3, -6, 3, 0, -2, 2, 2, -5, -1, -7, -3, 1, 2, -6, 3, 0, -5, 6, -6, -1,
+4, -2, -9, 4, 1, 3, 3, -2, 2, -1, -5, -2, 8, -1, -4, -6, 7, 2, 0, -3, 1, 2, -2,
+1, -7, 5, -9, -2, 3, -4, 3, -1, -8, -3, 1, 0, -7, 5, 3, -3, -7, 2, 6, -2, 3, -7,
+8, -7, 2, 1, 3, 7, -6, -1, -1, -2, -3, 5, -6, 3, 1, 0, -2, -1, -6, -5, 1, 3, 2,
+-4, 2, -2, -1, 0, -1, -3, -2, -5, -3, 3, 4, -1, 8, 0, -2, 0, -5, 1, 2, -3, -2,
+8, -4, 0, -5, -2, -1, -3, 0, 5, 3, -8, 0, 0, 7, -7, -2, -1, -3, -3, -1, 1, 7, 5,
+-7, 1, 1, 4, -4, -3, 2, 5, -2, -6, 1, 1, -3, -7, -1, 3, -8, 3, -1, 2, 6, -11, 4,
+1, -2, 0, -2, -3, 6, 6, -6, -1, 1, 2, 1, -1, -2, -1, -1, -5, 3, 0, -1, -1, -7,
+0, -5, -1, 4, 0, 6, 0, -3, 1, 6, -5, 0, -3, -7, 6, -2, -2, 1, 5, -4, 4, -7, -4,
+6, -3, 1, 0, -1, -4, -5, 2, -2, -5, 3, 1, 4, -1, 0, 1, 4, -1, -5, -1, -6, 2, -4,
+-1, 2, -1, 1, -4, -2, 0, 1, 2, -1, 0, 2, -2, 0, 4, 0, -4, 1, -5, 1, -2, 1, 4, 0,
+2, 1, -3, -9, 0, -1, 2, -6, -2, 4, 1, -1, -4, 1, -1, 0, -3, 1, 1, 1, 0, 0, 6,
+-1, -8, -2, 1, 0, -2, -2, 5, 1, -3, -2, 5, 0, -3, -5, -8, 2, 1, 1, 0, 2, 2, -4,
+-1, -2, 2, -5, 0, 6, -4, 5, 0, -4, 1, -4, -8, 6, -3, -4, 4, -3, 3, 0, -1, -2, 1,
+-2, -2, 1, -2, -1, 0, 3, 1, 2, -1, -2, 0, -5, -1, 0, 7, 2, -4, 0, -2, -1, -2,
+-1, 0, 1, -4, -3, 5, 2, -2, 2, -4, 2, -6, -6, 6, -1, 4, -2, 0, 1, -1, -1, -1, 2,
+-3, 2, -5, -1, 4, -2, -1, -2, 2, -4, -5, 1, 2, 3, -1, 4, 1, -3, -2, -2, -2, 0,
+2, -5, -2, 2, -1, 4, -4, -5, 3, -7, 2, 3, -3, 1, 2, 1, 1, -2, -3, 2, -4, 1, 0,
+-1, 4, 1, -4, 2, -3, -3, 2, -7, 0, 4, -1, -2, 1, 1, -7, 4, -1, -1, -1, -6, 3, 4,
+0, -1, 1, -4, 3, -5, -3, 4, -2, 1, 0, 0, 1, 0, -2, -2, -2, -3, -2, -1, 0, 3, -1,
+0, 0, -1, -1, -4, 1, 1, 1, 2, -2, 2, 0, -2, 0, -3, -2, -2, 0, 2, 1, -1, 0, -1,
+-2, 0, -3, 1, 1, -2, -3, 1, 0, 0, 1, -1, 1, -4, -1, 1, 3, 0, -1, 0, -1, -1, -4,
+1, -1, 1, -1, -1, 3, -3, 0, -1, 2, -3, -2, 1, -3, 2, 2, -2, 0, 1, -6, 1, -1, 0,
+3, -2, 0, 2, -2, -4, 1, -2, -2, -2, 2, -2, 2, 0, 0, 3, -2, 1, -2, 0, -3, 0, 1,
+-1, 0, -1, 2, -4, -2, 1, -4, 2, 0, -2, 1, 3, -2, 0, -1, -2, -3, -2, 1, -1, 0, 1,
+4, -2, 2, -2, -4, 1, -3, -2, 1, 0, -2, 0, 0, -1, 0, -2, -2, 1, 0, 1, 0, 2, 1,
+-4, -2, 0, 0, -4, 1, -2, 1, 1, -4, 5, -1, -1, -2, -3, -1, 0, -3, -1, 4, -2, 0,
+1, -1, 0, -2, -1, 2, -2, 1, 2, -1, 2, -1, -2, -1, -2, -5, -1, 1, 0, 0, 1, -2, 0,
+-1, -2, -1, 1, 0, -4, 1, 0, 1, -1, 2, -2, -4, -1, -1, 4, 0, -2, 0, -1, 0, 0, -5,
+1, 1, -3, 0, 0, -2, 3, -1, -2, 3, -5, 0, 2, 0, 0, -2, -2, 1, 2, -6, 0, 1, -1, 1,
+-3, -1, 3, -2, -3, 2, 0, -3, 0, -2, 2, 1, -4, 2, 1, -2, -2, 1, -1, 4, -4, -4, 2,
+2, -1, -1, -1, -4, 2, -3, 2, 2, -2, 0, -1, 0, 2, -3, -2, 2, 0, -4, -1, 1, -2, 2,
+-2, -1, 0, -2, -1, 1, -1, -1, 3, 0, -1, -1, 0, -1, -2, 1, -1, 1, -1, 2, 1, -1,
+-2, -1, 0, -5, 1, 0, -1, 2, 0, -2, -3, -1, 1, -2, -1, 1, 0, 1, 1, -2, 2, 0, -3,
+-1, 0, -2, -1, 2, -1, -1, 2, -3, -1, 2, -3, -2, -1, -1, -1, 1, -2, 1, 1, -1, 0,
+-2, 0, -2, 1, -1, 1, 1, 0, 0, -2, 0, -2, -1, -4, 0, 1, 0, 1, -1, 0, -1, -4, -2,
+-1, -1, -1, 0, 1, 2, -1, -3, 1, 0, 0, -1, -1, 0, 1, -3, 0, 2, 0, -2, -4, -1, 1,
+-1, -2, 2, 2, -1, -1, 0, -2, 1, -3, -3, 2, 0, -1, -1, 2, 1, -1, -2, -1, 0, -1,
+-2, 0, 1, -1, -2, 0, 2, -3, -1, 0, -2, 1, -1, 0, 3, -1, 0, -1, 0, -1, -1, -2,
+-1, 1, -1, 1, -3, -1, -1, -1, -1, -1, -1, -3, 2, -2, -1, 1, -1, 1, -2, -2, 1, 1,
+0, -1, 1, -1, 0, -2, 1, 2, -3, 0, 0, -1, 0, -1, -2, 1, 0, -4, -1, 1, 0, 2, -3,
+-1, 1, -1, -2, 1, -1, 2, -1, -2, 1, -2, 0, -2, 0, 1, -2, -1, 0, 2, 0, -2, -1, 0,
+-1, -2, -1, 1, 3, -3, -2, 0, 0, -1, 0, 0, -1, -1, -3, -1, 1, 0, -2, 0, -1, 0,
+-2, 0, 0, 1, -1, 0, 1, -1, 3, -2, 0, 0, -3, 0, 2, -2, -1, 2, -1, -1, -1, -2, 0,
+-2, -2, 0, -1, -3, 0, 0, 0, 0, -3, 0, -1, 0, 0, 0, 1, 1, -1, -3, 0, 0, 0, -1,
+-3, 0, 1, -2, -1, 2, -2, -1, 0, -4, 1, 0, -2, 1, -1, 1, -1, 0, 0, 0, -1, -1, 0,
+-1, 1, -1, -1, 1, -1, -1, -2, -1, -1, -2, 0, 1, 0, -1, 1, -1, 0, 1, -1, -2, 1,
+0, -2, 3, 0, 0, 0, -2, 0, -1, -1, -1, 0, -1, -1, -2, -1, 0, -2, -1, 0, -1, 0, 0,
+0, 1, -1, 0, 0, -3, 0, 0, -1, 0, -1, 1, -1, 0, -1, -1, 0, -2, -1, 0, -1, -2, -1,
+2, -1, -1, -1, -1, 1, -2, 1, -1, 0, 1, 0, -2, 0, 0, -3, 2, -2, -1, 0, -1, 0, 1,
+1, -3, 1, -1, -2, 1, -3, 0, 1, -1, 0, 0, -2, 1, 0, -2, 0, -1, -1, 0, -2, -1, -1,
+-1, 0, -1, -1, 0, 0, -2, 1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, -3, 1, -1, 0,
+-1, 0, 0, 0, 0, -2, -1, -1, 1, -3, -1, 2, -1, 0, -1, 0, 0, -2, -1, 1, -1, 0, -1,
+-2, 1, -1, -2, 0, 0, -1, -2, -2, 1, 1, -1, -2, 1, 0, -2, 0, 0, 0, 0, -2, 0, 1,
+-1, 0, -1, 0, -2, -1, -1, 1, 0, -1, 0, -1, 0, -1, -2, 1, -1, -2, 1, 0, 1, 0, -1,
+0, 0, -2, -1, 1, -1, 0, -1, 0, 0, -1, -1, -1, 1, -3, -1, 0, 0, 0, -1, 1, 1, 0,
+-3, 0, 0, -1, 0, -1, 1, -1, 0, -1, 1, 1, -3, -2, 0, 0, 0, -1, 0, 1, -2, -2, -1,
+0, -1, -1, -1, 1, 0, -1, 1, -1, 0, -1, -1, -2, 1, -2, 0, 1, -1, 1, -1, 0, -1, 0,
+-1, 0, 0, -1, 1, -1, 1, 0, -1, -2, 0, 0, -3, 0, -1, 1, -1, -2, 0, -1, 0, -1, -1,
+0, -1, 0, 0, 1, -1, 1, -1, -2, 1, -2, 0, 0, -1, 0, 0, -1, -1, 1, -2, -2, 0, -1,
+0, -1, 0, -1, 0, -1, -1, -1, -1, 0, -1, 1, 0, 0, 0, -1, -1, 0, 1, -1, 0, 0, -1,
+0, -1, 0, 0, -1, -2, 0, -1, -1, 0, -1, 1, 0, -1, 0, -1, -2, 0, 0, -1, 0, -1, -1,
+0, -1, -1, -2, 0, 1, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, -1, 0, -1, -1, -1,
+-1, 0, 1, -1, -2, 1, -1, 0, -1, -1, -1, 0, -1, -1, 0, -1, 1, 0, 0, 0, -1, -1, 0,
+-2, 0, -1, 0, 1, -2, -1, -1, 0, 0, -3, 1, 0, -1, 0, 0, 0, -2, 0, -2, 1, -1, -2,
+1, 0, 0, -2, 0, 1, -2, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 0, -1, 0, -1, 0, 0,
+1, -1, 0, 0, -1, 0, -2, 0, -1, 0, -1, 1, 0, -2, -2, 0, 0, -3, -1, 0, -1, 0, 0,
+-1, 0, };
+
+ #endif /* hihato_H_ */
diff --git a/PolyDrums_v0_2_0_DelayDuty/kick909.h b/PolyDrums_v0_2_0_DelayDuty/kick909.h
new file mode 100644
index 0000000..8dc2b21
--- /dev/null
+++ b/PolyDrums_v0_2_0_DelayDuty/kick909.h
@@ -0,0 +1,119 @@
+#ifndef kick909_H_
+#define kick909_H_
+
+#include "Arduino.h"
+#include <avr/pgmspace.h>
+
+#define kick909_NUM_CELLS 2048
+#define kick909_SAMPLERATE 16384
+
+const int8_t __attribute__((progmem)) kick909_DATA [] = {-1, 0, -1, 0, -1, 0, 0,
+0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, -1,
+0, -1, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, -1, -2, -2, -3, -3, -2, -2, -2, -1, -1,
+-1, -1, 0, 0, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 8, 9, 9, 10, 14, 17,
+20, 24, 29, 50, 57, 49, 53, 54, 53, 53, 54, 53, 53, 53, 52, 51, 50, 48, 46, 45,
+44, 42, 40, 38, 35, 33, 30, 26, 23, 19, 15, 12, 8, 5, 1, -2, -6, -9, -11, -13,
+-16, -17, -18, -20, -22, -23, -24, -24, -25, -26, -27, -27, -27, -27, -28, -28,
+-28, -28, -27, -27, -27, -26, -25, -24, -24, -23, -21, -20, -19, -17, -15, -13,
+-12, -10, -8, -5, -3, -1, 1, 3, 6, 8, 10, 12, 14, 17, 19, 21, 24, 25, 28, 30,
+32, 33, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+40, 40, 39, 38, 38, 37, 37, 36, 36, 35, 34, 33, 32, 32, 30, 29, 28, 26, 24, 22,
+20, 18, 17, 15, 13, 11, 9, 8, 6, 5, 3, 1, -1, -2, -4, -5, -7, -8, -9, -11, -13,
+-14, -16, -17, -18, -19, -20, -21, -22, -24, -25, -25, -26, -27, -27, -28, -29,
+-29, -30, -30, -30, -30, -31, -31, -31, -31, -31, -32, -31, -32, -32, -32, -32,
+-32, -32, -32, -32, -32, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -28,
+-28, -27, -27, -26, -26, -25, -25, -24, -23, -22, -21, -20, -20, -19, -18, -17,
+-16, -15, -14, -13, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, 0, 1, 2, 3, 4, 6,
+6, 8, 9, 10, 11, 12, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 27,
+28, 29, 30, 30, 31, 32, 33, 33, 34, 34, 34, 34, 35, 35, 35, 36, 36, 36, 36, 36,
+36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36,
+36, 35, 35, 35, 34, 34, 34, 33, 33, 32, 32, 32, 32, 31, 31, 30, 30, 29, 29, 28,
+28, 27, 27, 26, 25, 25, 24, 23, 23, 21, 21, 20, 19, 18, 17, 16, 15, 14, 12, 11,
+10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0, -2, -3, -4, -4, -5, -6, -7, -8, -8, -9,
+-10, -11, -12, -12, -13, -14, -15, -16, -16, -17, -18, -19, -20, -20, -21, -22,
+-23, -23, -24, -25, -25, -26, -26, -27, -27, -28, -29, -29, -29, -30, -30, -31,
+-31, -32, -32, -32, -32, -33, -33, -33, -33, -33, -33, -34, -34, -34, -34, -34,
+-34, -34, -34, -34, -34, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35,
+-35, -35, -35, -35, -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32,
+-32, -31, -31, -31, -31, -31, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27,
+-27, -26, -26, -25, -25, -24, -24, -23, -23, -22, -21, -21, -20, -19, -19, -18,
+-17, -17, -16, -15, -14, -14, -13, -12, -12, -11, -10, -9, -9, -8, -7, -6, -5,
+-5, -4, -3, -2, -1, -1, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 12, 13,
+14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28,
+29, 29, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 32, 33, 33, 34, 34, 34, 34,
+34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 33, 33, 32, 33, 33, 32, 32,
+32, 31, 31, 31, 31, 30, 30, 30, 29, 29, 29, 28, 28, 28, 27, 27, 26, 26, 26, 25,
+25, 24, 24, 23, 22, 22, 21, 20, 20, 19, 18, 17, 17, 16, 15, 14, 13, 12, 11, 11,
+10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 0, -1, -1, -2, -3, -4, -5, -5, -6, -7, -8, -9,
+-9, -10, -11, -12, -12, -13, -14, -14, -15, -16, -17, -17, -18, -19, -19, -20,
+-21, -21, -22, -23, -23, -24, -24, -25, -26, -26, -27, -27, -28, -28, -29, -30,
+-30, -30, -31, -31, -32, -32, -32, -33, -33, -33, -34, -34, -34, -34, -34, -35,
+-35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, -36, -36,
+-36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36,
+-35, -35, -35, -35, -35, -34, -34, -34, -34, -34, -33, -33, -33, -33, -32, -32,
+-32, -32, -31, -31, -31, -31, -30, -30, -30, -29, -29, -29, -28, -28, -27, -27,
+-26, -26, -26, -25, -24, -24, -23, -23, -22, -21, -21, -20, -19, -19, -18, -17,
+-17, -16, -15, -15, -14, -13, -12, -12, -11, -10, -9, -9, -8, -7, -6, -6, -5,
+-4, -3, -3, -2, -1, 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 12, 13,
+14, 15, 15, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 25, 26, 26, 27, 28,
+28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 32,
+33, 33, 34, 33, 33, 32, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 32, 33, 33, 32, 32, 32, 32, 31,
+31, 31, 31, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 27, 27, 26, 26, 26, 25, 25,
+24, 24, 23, 23, 22, 22, 21, 20, 20, 19, 18, 18, 17, 16, 15, 14, 13, 12, 12, 11,
+10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 0, -1, -2, -3, -3, -4, -5, -6, -7, -7, -8, -9,
+-10, -10, -11, -12, -12, -13, -14, -14, -15, -15, -16, -17, -17, -18, -18, -19,
+-19, -20, -20, -21, -21, -22, -22, -23, -23, -24, -24, -25, -25, -25, -26, -26,
+-27, -27, -27, -27, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29,
+-29, -29, -29, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29,
+-29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28,
+-28, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -25, -25, -25, -25, -25,
+-24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -21, -21, -21, -21,
+-20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -15, -15,
+-15, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -10, -10, -10, -9, -9,
+-8, -8, -8, -7, -7, -7, -6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -1,
+-1, -1, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6,
+6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2,
+2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -2, -3, -3, -3, -3,
+-4, -4, -4, -4, -4, -5, -5, -5, -5, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7,
+-8, -8, -8, -8, -8, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -10, -10, -10, -10,
+-10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+-11, -11, -11, -11, -11, -11, -11, -11, -12, -11, -11, -11, -11, -11, -11, -11,
+-11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+-11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10,
+-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9,
+-9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8,
+-8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6,
+-6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
+-3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
+-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
+-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
+-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
+-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
+-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2,
+-3, -2, -3, -2, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, };
+
+ #endif /* kick909_H_ */
diff --git a/PolyDrums_v0_2_0_DelayDuty/snare909.h b/PolyDrums_v0_2_0_DelayDuty/snare909.h
new file mode 100644
index 0000000..7ed733c
--- /dev/null
+++ b/PolyDrums_v0_2_0_DelayDuty/snare909.h
@@ -0,0 +1,116 @@
+#ifndef snare909_H_
+#define snare909_H_
+
+#include "Arduino.h"
+#include <avr/pgmspace.h>
+
+#define snare909_NUM_CELLS 2048
+#define snare909_SAMPLERATE 16384
+
+const int8_t __attribute__((progmem)) snare909_DATA [] = {0, -1, 0, -1, 0, -1, 0,
+-1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0,
+-1, 0, 0, -2, -2, 0, -2, -1, -3, -2, 4, -3, -7, -2, 1, -7, 6, -3, -2, -6, -8, 8,
+-6, 0, -3, -1, -7, 0, -4, -11, -2, 3, -7, -9, 19, -1, 33, 43, 22, 60, 57, 49,
+58, 55, 68, 65, 62, 60, 60, 69, 64, 61, 57, 58, 43, 50, 39, 37, 27, 17, 21, 15,
+11, -2, -6, -12, -6, -23, -7, -22, -30, -22, -25, -27, -26, -31, -31, -21, -18,
+-8, -18, -4, 3, 1, 8, 12, 12, 19, 14, 42, 28, 21, 43, 45, 49, 46, 46, 43, 55,
+44, 47, 44, 30, 46, 34, 38, 42, 24, 34, 27, 45, 23, 28, 38, 35, 36, 23, 30, 28,
+40, 23, 32, 35, 29, 31, 31, 30, 28, 30, 30, 12, 13, 18, 8, 7, -2, 5, 6, -1, -7,
+-5, -9, -10, -11, -13, -17, -22, -25, -24, -24, -33, -28, -24, -30, -20, -28,
+-41, -28, -29, -26, -27, -37, -26, -29, -32, -20, -31, -26, -15, -20, -9, -14,
+-15, -12, -6, -7, -3, 8, 6, 15, 16, 12, 21, 30, 25, 35, 35, 29, 46, 44, 38, 49,
+34, 48, 44, 44, 55, 38, 50, 41, 52, 43, 43, 53, 44, 56, 46, 39, 41, 44, 42, 42,
+44, 41, 43, 35, 38, 39, 26, 30, 36, 31, 27, 26, 21, 20, 15, 9, 8, -2, 0, 10,
+-10, -13, -3, -17, -14, -14, -18, -7, -30, -24, -32, -26, -28, -37, -23, -35,
+-25, -40, -31, -34, -46, -30, -42, -38, -26, -37, -33, -32, -27, -32, -23, -23,
+-20, -13, -11, -10, -18, 0, -13, -3, -8, 3, -6, 4, 19, -1, 12, 14, 19, 10, 13,
+9, 20, 19, 21, 23, 21, 34, 21, 24, 34, 20, 31, 28, 31, 36, 24, 33, 23, 31, 27,
+30, 35, 37, 26, 17, 21, 19, 27, 21, 24, 17, 23, 19, 24, 19, 4, 23, 7, 15, 17,
+14, 24, 8, 15, 10, 5, 6, 11, 12, -5, 9, 9, 10, 9, 1, 5, 0, -2, -2, 1, 1, -7, 0,
+3, -2, -2, -8, -8, -19, -4, -18, -6, -4, -11, -5, -15, -1, -28, -12, -19, -10,
+-15, -23, -19, -23, -9, -25, -22, -21, -22, -18, -23, -18, -16, -31, -28, -23,
+-20, -27, -15, -26, -23, -22, -23, -16, -22, -29, -20, -11, -29, -12, -17, -14,
+-15, -12, -16, -22, -21, -8, -11, -16, -8, -13, -12, -8, -15, -14, -9, -14, -2,
+-13, 3, -9, -12, 9, 3, 0, 7, -3, 0, 9, 2, 9, 7, 5, 4, 18, 12, 3, 14, 17, 16, 19,
+14, 6, 21, 24, 23, 18, 24, 18, 11, 25, 25, 20, 24, 22, 5, 27, 20, 13, 25, 28,
+17, 19, 11, 14, 24, 10, 23, 10, 23, 19, 16, 9, 14, 9, 14, 17, 6, 13, 8, 11, -1,
+17, 9, 0, 6, 4, -1, 3, -12, -10, -4, -12, -9, -14, -5, -24, -11, -14, -21, -16,
+-13, -18, -30, -17, -29, -25, -21, -21, -29, -30, -15, -34, -30, -21, -29, -25,
+-26, -28, -36, -27, -30, -28, -25, -21, -11, -31, -18, -21, -12, -12, -12, -13,
+-17, -15, -17, 0, -21, -9, 3, -3, -1, -7, 2, -3, 3, 3, -9, 13, 8, 5, -3, 9, 13,
+3, 18, 6, 13, 13, 15, 12, 7, 10, 14, 12, 11, 3, 12, 15, 17, 6, 7, 26, -1, 16,
+19, 8, 16, 12, 15, 1, 10, 20, 7, 7, 8, 17, 1, 3, 12, 8, 7, 10, 9, -4, 1, -3, 5,
+1, 0, 1, 4, 3, -6, 1, -2, -2, -10, -7, -1, -3, -4, -19, 0, -10, -13, -4, -15,
+-8, -4, -13, -24, -10, -8, -13, -10, -11, -24, -14, -18, -6, -9, -24, -20, -10,
+-12, -18, -11, -14, -13, -18, -17, -28, -8, -27, -20, -14, -15, -11, -18, -9,
+-16, -15, -17, -16, -6, -13, -17, 3, -25, -1, -11, -4, -6, -8, -5, -14, 0, -11,
+5, -3, 0, 0, -1, -12, 0, -2, -5, 6, 5, 4, 4, -11, 2, 3, -4, 12, 1, 5, -2, 3, -3,
+0, 2, 6, 7, -7, 2, 1, 6, 5, -2, 0, 2, 1, 9, 1, 9, -5, -6, 7, -2, 5, -3, 16, -1,
+1, 2, 4, 10, -3, 17, -2, 6, 7, 2, 9, -2, 1, -6, 10, -5, -1, 3, -8, 11, -6, 7,
+-1, -7, 2, -3, -6, 1, -3, -11, -3, -3, -7, -12, -4, -7, -10, -9, -18, -6, -11,
+-20, -3, -12, -6, -10, -24, -9, -16, -18, -9, -18, -20, -11, -9, -15, -24, -10,
+-20, -27, -13, -14, -13, -19, -18, -23, -21, -17, -14, -22, -15, -21, -19, -14,
+-19, -11, -15, -15, -17, -17, -18, -12, -12, -12, -8, -10, -17, -9, -14, -3, -5,
+-10, -9, -10, -8, -10, 7, -5, -3, 0, -2, 3, -3, 6, -6, -7, -1, 3, 5, 1, 4, -12,
+8, 5, -1, 11, 6, -4, 3, 6, -1, 10, 1, 7, 2, 7, 6, -6, 2, 3, 3, 1, 6, 0, -3, 5,
+5, 7, 1, -3, -2, -2, 6, 2, -3, 0, 3, 4, -4, 2, -5, -1, -2, -4, 0, -8, -8, -5, 2,
+-9, -6, -1, -2, -9, -6, -12, 1, -10, -14, -9, -13, -10, -10, -9, -10, -7, -17,
+-3, -13, -7, -12, -15, -16, -10, -9, -16, -7, -11, -11, -13, -14, -9, -11, -16,
+-17, -12, -10, -16, -10, -11, -14, -4, -14, -17, -7, -12, -6, -16, -2, -7, -9,
+-10, -9, -5, -18, 1, -8, 0, 1, -9, -16, -4, -3, -6, 4, -9, -2, -10, 0, 1, -10,
+3, -1, -3, -2, -4, 0, 3, -3, 0, -1, 0, 2, -4, 2, -3, -8, 0, -5, 5, -7, -4, 3,
+-9, 6, -10, 5, 1, -4, 2, -8, 2, -6, 2, -1, 2, -2, -6, 1, -6, -5, -3, 7, -8, -5,
+2, -7, -1, -8, 3, 0, 0, 1, -6, -3, -5, -3, -3, -9, -6, 1, -7, -5, -3, -3, -6,
+-11, -5, -1, -8, -15, -1, -8, -8, 0, -13, -9, 0, -14, -10, -9, -9, -11, -3, -11,
+-14, -7, -5, -4, -12, -18, -16, -2, -19, -7, -13, -5, -12, -10, -6, -23, -4,
+-10, -11, -8, -10, -14, -12, -5, -14, -13, -3, -8, -16, -10, -8, -15, -6, -13,
+-10, -11, -8, -6, -12, -9, -8, -10, -10, -8, -4, -13, -5, -6, -11, 2, -14, -2,
+-6, -7, -1, -11, 1, -4, -9, 3, -3, 2, -8, -1, -2, -7, -1, 0, 4, -3, 3, -7, 2,
+-3, -1, 1, -3, -2, -1, 7, -4, 1, -2, -2, -4, -3, 8, -9, 1, -1, -3, 4, -6, 3, 3,
+0, -1, -5, -7, -2, 1, -4, 3, 0, -9, 0, -4, 4, -5, -4, 1, -3, -4, -5, -3, -7, -8,
+-7, 2, -9, -8, -2, -7, -3, -10, -6, -4, -12, -6, -10, -7, -10, -10, -5, -11, -3,
+-7, -13, -10, -8, -6, -15, -7, -7, -11, -9, -11, -8, -10, -11, -8, -6, -12, -8,
+-10, -8, -6, -10, -7, -8, -7, -8, -11, -3, -4, -5, -6, -12, -8, -6, -6, -3, -6,
+-6, -6, -2, 1, -12, -5, -4, -6, -1, -1, -7, -5, -4, -3, 1, -6, 2, -6, 0, -5, -9,
+4, -7, -2, 2, -3, 1, -3, -4, -4, -1, -2, -4, 3, -5, -2, -3, -4, -1, -4, 1, -1,
+-10, 1, 0, -9, 2, -3, -6, -2, 6, -5, -6, -2, -3, -3, -4, -4, -6, -1, -5, -6, -1,
+-2, -9, -1, -2, -5, -3, 0, -5, -7, -5, -8, -1, -7, -6, -4, -2, -6, -7, -7, -8,
+-5, 0, -4, -12, -4, -10, -3, -4, -11, -3, -6, -6, -6, -9, -7, -9, -7, -5, -7,
+-2, -10, -10, -3, -10, -5, -7, -10, -6, -12, -6, -9, -4, -7, -8, -5, -12, -6,
+-5, -4, -9, -4, -7, -5, -5, -8, -7, -7, -9, -7, -5, -11, -3, -6, -3, -5, -8, -4,
+-3, -6, -8, -6, -5, -4, -5, -6, -2, -6, -6, -2, -5, -3, -4, -5, -7, -3, -2, -2,
+-2, -9, 1, -3, -8, 0, -3, 0, -5, -3, -2, -1, 0, -3, -3, -4, 1, -2, -8, 3, -1,
+-5, 1, 0, -3, -4, -4, -1, 0, -3, 2, -6, -1, -3, -6, 2, -4, -3, -3, -1, -1, -5,
+-3, 0, 0, -6, -1, -4, -5, -3, 0, -1, -4, -8, -4, 0, -9, 0, -4, -5, -4, -1, -5,
+-6, -4, -6, -3, -6, -6, -9, -4, -4, -7, -4, -3, -10, -6, -6, -5, -5, -8, -5, -9,
+-5, -6, -5, -6, -9, -8, -4, -5, -10, -3, -7, -6, -6, -4, -6, -9, -4, -6, -2, -7,
+-2, -3, -7, -4, -7, -3, -5, -3, -4, -7, -4, -3, -3, -2, -1, -5, -4, -3, -4, -3,
+-3, -2, -3, -1, -3, -7, 0, -3, 2, -1, -5, -3, -1, -3, -5, 1, -8, 2, -5, 0, -1,
+-6, -1, -2, 2, -5, -1, -1, -2, -2, -1, -6, 0, -5, -2, 0, -5, -2, -4, 1, -5, -4,
+-2, 0, -5, -3, 0, -5, -1, -2, -3, -3, -4, -2, -3, -3, -5, -4, -2, -6, -3, -6,
+-4, -3, -6, -3, -2, -5, -5, -5, -4, -5, -3, -3, -8, -2, -6, -3, -4, -9, -1, -8,
+-4, -4, -7, -2, -6, -3, -5, -4, -3, -5, -3, -8, -4, -8, -5, -3, -8, -1, -7, -2,
+-4, -6, -5, -3, -4, -3, -4, -4, -1, -5, -2, -5, -2, -3, -4, -3, -5, -2, -4, -1,
+-4, -4, -1, -3, -1, -4, -4, -3, -2, -3, -1, -3, -5, -2, -1, -3, -2, 0, -4, -2,
+-3, -4, -2, -3, -2, -2, -1, -3, -4, -2, -3, -2, -3, 0, -5, -2, -1, -3, -1, -2,
+-1, -5, -2, -1, -2, -2, -2, -1, -2, -2, -3, -2, -4, -2, -1, -3, -2, -2, -2, -2,
+-1, -4, -4, -1, -3, -2, -1, -6, -1, -4, -4, -2, -5, -1, -4, -1, -4, -4, -2, -3,
+-4, -2, -4, -4, -3, -4, -1, -5, -5, -3, -3, -4, -4, -5, -3, -3, -6, -4, -4, -3,
+-4, -4, -3, -4, -3, -5, -5, -4, -6, -2, -6, -3, -4, -4, -3, -5, -2, -5, -5, -3,
+-3, -4, -4, -4, -2, -3, -4, -4, -4, -2, -3, -3, -3, -3, -3, -2, -2, -4, -1, -2,
+-3, -1, -3, -1, -2, -3, -3, -1, -4, -3, -1, -2, -2, -1, -2, -2, -2, -3, -1, -2,
+-1, -1, -3, -2, -1, -2, -2, -2, -1, -1, -1, -2, -2, -1, -2, -1, -2, -2, -1, -2,
+-2, -2, -1, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -1, -2, -3, -2, -2, -2, -2,
+-2, -2, -2, -2, -3, -3, -2, -2, -3, -2, -3, -3, -3, -3, -2, -3, -2, -3, -3, -3,
+-3, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -3, -3, -3,
+-3, -3, -3, -3, -3, -3, -2, -3, -3, -2, -3, -2, -2, -2, -2, -2, -3, -2, -2, -3,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-1, -2, -2, -2, -2, -1, -2, -1, -1, -2, -2, -1, -2, -1, -2, -2, -2, -2, -1, -2,
+-2, -2, -2, -1, -1, -2, -1, -2, -1, -2, -2, -1, -1, -1, -2, -1, -2, -1, -2, -1,
+-1, -2, -1, -1, -1, -1, -1, -1, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+-2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, };
+
+ #endif /* snare909_H_ */