diff --git a/Software/Arduino/CFO/CFOMidi.h b/Software/Arduino/CFO/CFOMidi.h index d43d911..58ea560 100755 --- a/Software/Arduino/CFO/CFOMidi.h +++ b/Software/Arduino/CFO/CFOMidi.h @@ -21,13 +21,51 @@ + contact: j.bak@ciid.dk */ +// MIDI specific constants + +#ifndef CFO_MIDI_CHANNEL +#define CFO_MIDI_CHANNEL 1 +#endif + +// SYSEX constants +#define SYSEX_LIMIT 16 +#define CFO_MANUFACTURER_ID 44 +#define CFO_DEVICE_GROUP_ID 3 +#define SET_CHANNEL 0 + + + //synth parameters as MIDI controller numbers -#define ENV_ATTACK 4 -#define ENV_DECAY 5 -#define ENV_SUSTAIN 6 -#define ENV_RELEASE 7 -#define DETUNE 12 -#define WAVEFORM 13 +#define DETUNE 4 +#define WAVEFORM 5 +#define PORTAMENTO 6 + +#define FREQUENCY1 10 +#define SEMITONE1 11 +#define DETUNE1 12 +#define GAIN1 13 + +#define FREQUENCY2 20 +#define SEMITONE2 21 +#define DETUNE2 22 +#define GAIN2 23 + +#define FREQUENCY3 30 +#define SEMITONE3 31 +#define DETUNE3 32 +#define GAIN3 33 + +#define ENV1_ATTACK 114 +#define ENV1_DECAY 115 +#define ENV1_SUSTAIN 116 +#define ENV1_RELEASE 117 + +#define ENV2_ATTACK 124 +#define ENV2_DECAY 125 +#define ENV2_SUSTAIN 126 +#define ENV2_RELEASE 127 + + // Synth parameters used in MIDI code #define ENV_MAX_GAIN (65536 * 4 - 1) @@ -37,7 +75,7 @@ class MMidi { public: void init(); void checkMidi(); - void setChannel(uint8_t ID, uint8_t channel); + void setChannel(uint8_t channel); void setID(uint8_t ID); void midiHandler(); @@ -48,6 +86,8 @@ public: void programChange(uint8_t channel, uint8_t number); void channelPressure(uint8_t channel, uint8_t pressure); void pitchWheel(uint8_t channel, uint8_t highBits, uint8_t lowBits); + + void sysexHandler(uint8_t bytes); void sysex (uint8_t, uint8_t, uint8_t, @@ -66,14 +106,16 @@ public: uint8_t); + private: // ID uint8_t cfoID; // MIDI uint8_t data; + bool sysexON; //uint16_t midiBuffer[4]; - uint8_t midiBuffer[16]; + uint8_t midiBuffer[SYSEX_LIMIT]; uint8_t midiChannel; int midiBufferIndex; diff --git a/Software/Arduino/CFO/CFOMusic.cpp b/Software/Arduino/CFO/CFOMusic.cpp index 810a64d..9f970db 100755 --- a/Software/Arduino/CFO/CFOMusic.cpp +++ b/Software/Arduino/CFO/CFOMusic.cpp @@ -33,6 +33,8 @@ prog_uint16_t hertsTable[] PROGMEM = {8,8,9,9,10,10,11,12,12,13,14,15,16,17,18,1 prog_uint32_t envTimeTable[] PROGMEM = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,33,34,35,36,37,38,39,41,42,43,45,46,48,49,51,53,55,57,59,61,63,65,67,70,73,75,78,81,85,88,92,96,100,104,109,114,119,125,131,138,146,154,163,172,183,195,209,225,242,261,284,310,341,379,425,482,556,654,792,998,1342,2030,4095}; +float semitoneTable[] = {0.25,0.2648658,0.2806155,0.29730177,0.31498027,0.33370996,0.35355338,0.37457678,0.39685026,0.4204482,0.44544938,0.47193715,0.5,0.5297315,0.561231,0.59460354,0.62996054,0.6674199,0.70710677,0.74915355,0.7937005,0.8408964,0.8908987,0.9438743,1.0,1.0594631,1.122462,1.1892071,1.2599211,1.3348398,1.4142135,1.4983071,1.587401,1.6817929,1.7817974,1.8877486,2.0,2.1189263,2.244924,2.3784142,2.5198421,2.6696796,2.828427,2.9966142,3.174802,3.3635857,3.563595,3.7754972,4.0}; + CFOMusic Music; // Defining which pins the SPI interface is connected to. @@ -88,8 +90,11 @@ void CFOMusic::init() setSine(); // frequency setup - setFrequency(110); - setDetune(0); + setFrequency(110.0f); + setSemitone1(0); + setSemitone2(0); + setSemitone3(0); + setDetune(0.0f); // gain setup setGain(1.0f); @@ -124,9 +129,9 @@ void CFOMusic::init() void CFOMusic::setFrequency(float freq) { - period1 = uint16_t(((freq * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); - period2 = uint16_t(((freq * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); - period3 = uint16_t(((freq * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); + period1 = uint16_t(((freq * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); + period2 = uint16_t(((freq * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); + period3 = uint16_t(((freq * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); frequency = freq; frequency1 = freq; frequency2 = freq; @@ -136,22 +141,61 @@ void CFOMusic::setFrequency(float freq) void CFOMusic::setFrequency1(float freq) { - period1 = uint16_t(((freq * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); frequency1 = freq; + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); } void CFOMusic::setFrequency2(float freq) { - period2 = uint16_t(((freq * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); frequency2 = freq; + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); } void CFOMusic::setFrequency3(float freq) { - period3 = uint16_t(((freq * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); frequency3 = freq; + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void CFOMusic::setSemitone1(int8_t semi) +{ + if(-13 < semi && semi < 13){ + semi1 = semitoneTable[semi+12]; + } else if (semi < -12) { + semi1 = semitoneTable[0]; + } else { + semi1 = semitoneTable[24]; + } + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void CFOMusic::setSemitone2(int8_t semi) +{ + if(-13 < semi && semi < 13){ + semi2 = semitoneTable[semi+12]; + } else if (semi < -12) { + semi2 = semitoneTable[0]; + } else { + semi2 = semitoneTable[24]; + } + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void CFOMusic::setSemitone3(int8_t semi) +{ + if(-13 < semi && semi < 13){ + semi3 = semitoneTable[semi+12]; + } else if (semi < -12) { + semi3 = semitoneTable[0]; + } else { + semi3 = semitoneTable[24]; + } + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); } @@ -160,37 +204,37 @@ void CFOMusic::setDetune(float detune) detune1 = 0.0; detune2 = detune; detune3 = -detune; - period2 = uint16_t(((frequency2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); - period3 = uint16_t(((frequency3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); } void CFOMusic::setDetune1(float detune) { detune1 = detune; - period1 = uint16_t(((frequency1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); } void CFOMusic::setDetune2(float detune) { detune2 = detune; - period2 = uint16_t(((frequency2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); } void CFOMusic::setDetune3(float detune) { detune3 = detune; - period3 = uint16_t(((frequency3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); } void CFOMusic::pitchBend(float b) { bend = b; - period1 = uint16_t(((frequency1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); - period2 = uint16_t(((frequency2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); - period3 = uint16_t(((frequency3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); } diff --git a/Software/Arduino/CFO/CFOMusic.h b/Software/Arduino/CFO/CFOMusic.h index 2f91eee..98a20e8 100755 --- a/Software/Arduino/CFO/CFOMusic.h +++ b/Software/Arduino/CFO/CFOMusic.h @@ -41,10 +41,13 @@ public: void synthInterrupt(); // FREQUENCY AND DETUNE FUNCTIONS - void setFrequency(float frequency); - void setFrequency1(float frequency1); - void setFrequency2(float frequency2); - void setFrequency3(float frequency3); + void setFrequency(float freq); + void setFrequency1(float freq); + void setFrequency2(float freq); + void setFrequency3(float freq); + void setSemitone1(int8_t semi); + void setSemitone2(int8_t semi); + void setSemitone3(int8_t semi); void setDetune(float detune); void setDetune1(float detune); void setDetune2(float detune); @@ -113,6 +116,9 @@ private: float frequency1; float frequency2; float frequency3; + float semi1; + float semi2; + float semi3; float detune1; float detune2; float detune3; diff --git a/Software/Arduino/CFO/CFOmidi.cpp b/Software/Arduino/CFO/CFOmidi.cpp index 94fe9ae..22904f3 100755 --- a/Software/Arduino/CFO/CFOmidi.cpp +++ b/Software/Arduino/CFO/CFOmidi.cpp @@ -28,10 +28,6 @@ #include #include -#ifndef CFO_MIDI_CHANNEL -#define CFO_MIDI_CHANNEL 1 -#endif - prog_uint16_t hertzTable[] PROGMEM = {8,8,9,9,10,10,11,12,12,13,14,15,16,17,18,19,20,21,23,24,25,27,29,30,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73,77,82,87,92,97,103,109,116,123,130,138,146,155,164,174,184,195,207,219,233,246,261,277,293,311,329,349,369,391,415,440,466,493,523,554,587,622,659,698,739,783,830,880,932,987,1046,1108,1174,1244,1318,1396,1479,1567,1661,1760,1864,1975,2093,2217,2349,2489,2637,2793,2959,3135,3322,3520,3729,3951,4186,4434,4698,4978,5274,5587,5919,6271,6644,7040,7458,7902,8372,8869,9397,9956,10548,11175,11839,12543}; MMidi Midi; @@ -42,6 +38,8 @@ void MMidi::init() { Serial.begin(115200); + cfoID = 0; + sysexON =false; midiBufferIndex = 0; midiChannel = 0; //notePlayed = 0; @@ -56,19 +54,46 @@ void MMidi::checkMidi() while(Serial.available() > 0) { data = Serial.read(); - //if((data & 0x0F) == CFO_MIDI_CHANNEL) { - if(data & 0x80 && (data & 0x0F) == midiChannel) { // bitmask with 10000000 to see if byte is over 127 | data & 0x80 + if(data == 0xF0) { // Start of SYSEX + sysexON = true; midiBufferIndex = 0; midiRead = true; - } else if(data &0x80) { - midiRead = false; + } else if(data & 0x80) { // Automagically includes EOX (end of sysex, 0xF7) + sysexON = false; } +// if(data == 0xF7) { +// sysexON = false; +// sysexHandler(midiBufferIndex); +// } + + + if(data & 0x80 && (data & 0x0F) == midiChannel && !sysexON) { // bitmask with 10000000 to see if byte is over 127 (data&0x80) + midiBufferIndex = 0; // and check if the midi channel corresponds to the midiChannel + midiRead = true; // the device is set to listen to. + //if((data & 0xF0) == 0xF0) { +/* if(data == 0xF0) { + sysexON = true; + } else { + sysexON = false; + } + */ +// } else if(sysexON) { +// midiRead = true; + } else if(data & 0x80) { // Else if the byte is over 127 (but not on the device's + midiRead = false; // midiChannel, don't read this or any following bytes. + } + if(midiRead) { midiBuffer[midiBufferIndex] = data; midiBufferIndex++; - if (midiBufferIndex > 2) { + if (midiBufferIndex > 2 && !sysexON) { midiHandler(); + } else if(sysexON && midiBufferIndex < SYSEX_LIMIT && data == 0xF7) { + //midiHandler(); + sysexHandler(midiBufferIndex); + } else if(midiBufferIndex >= SYSEX_LIMIT) { + midiBufferIndex = 0; } } /* @@ -83,11 +108,9 @@ void MMidi::checkMidi() } -void MMidi::setChannel(uint8_t ID, uint8_t channel) { - if(ID == cfoID) { - if(1 <= channel <= 16) { - midiChannel = channel-1; - } +void MMidi::setChannel(uint8_t channel) { + if(1 <= channel <= 16) { + midiChannel = channel-1; } } @@ -102,70 +125,72 @@ void MMidi::midiHandler() { uint8_t midiChannel = (midiBuffer[0] & 0x0F); - switch(midiBuffer[0] & 0xF0) { // bit mask with &0xF0 ? + switch(midiBuffer[0] & 0xF0) { // bit mask with 11110000 gives us the MIDI command for channel 0 case 0x80: - noteOff (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F, // note value 0-127 - midiBuffer[2] & 0x7F); // note velocity 0-127 + noteOff (midiBuffer[0] & 0x0F, // midi channel 0-16 + midiBuffer[1] & 0x7F, // note value 0-127 + midiBuffer[2] & 0x7F); // note velocity 0-127 break; case 0x90: - noteOn (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F, // note value 0-127 - midiBuffer[2] & 0x7F); // note velocity 0-127 + noteOn (midiBuffer[0] & 0x0F, // midi channel 0-16 + midiBuffer[1] & 0x7F, // note value 0-127 + midiBuffer[2] & 0x7F); // note velocity 0-127 break; case 0xA0: - aftertouch (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F, // note value 0-127 - midiBuffer[2] & 0x7F);// note velocity 0-127 + aftertouch (midiBuffer[0] & 0x0F, // midi channel 0-16 + midiBuffer[1] & 0x7F, // note value 0-127 + midiBuffer[2] & 0x7F); // note velocity 0-127 break; case 0xB0: - controller (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F, // controller number 0-127 - midiBuffer[2] & 0x7F);// controller value 0-127 + controller (midiBuffer[0] & 0x0F, // midi channel 0-16 + midiBuffer[1] & 0x7F, // controller number 0-127 + midiBuffer[2] & 0x7F); // controller value 0-127 break; case 0xC0: - programChange (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F); // program number 0-127 + programChange (midiBuffer[0] & 0x0F, // midi channel 0-16 + midiBuffer[1] & 0x7F); // program number 0-127 break; case 0xD0: - channelPressure (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F); // pressure amount 0-127 + channelPressure (midiBuffer[0] & 0x0F, // midi channel 0-16 + midiBuffer[1] & 0x7F); // pressure amount 0-127 break; case 0xE0: - pitchWheel (midiBuffer[0] & 0x0F, // midi channel 0-16 - midiBuffer[1] & 0x7F, // higher bits 0-6 - midiBuffer[2] & 0x7F);// lower bits 7-13 - break; - case 0xF0: - sysex (midiBuffer[0] & 0x0F, // midi channel 0-16 + pitchWheel (midiBuffer[0] & 0x0F, // midi channel 0-16 midiBuffer[1] & 0x7F, // higher bits 0-6 - midiBuffer[2] & 0x7F, // lower bits 7-13 - midiBuffer[3] & 0x7F, // higher bits 0-6 - midiBuffer[4] & 0x7F, // lower bits 7-13 - midiBuffer[5] & 0x7F, // higher bits 0-6 - midiBuffer[6] & 0x7F, // lower bits 7-13 - midiBuffer[7] & 0x7F, // higher bits 0-6 - midiBuffer[8] & 0x7F, // lower bits 7-13 - midiBuffer[9] & 0x7F, // higher bits 0-6 - midiBuffer[10] & 0x7F, // lower bits 7-13 - midiBuffer[11] & 0x7F, // higher bits 0-6 - midiBuffer[12] & 0x7F, // lower bits 7-13 - midiBuffer[13] & 0x7F, // higher bits 0-6 - midiBuffer[14] & 0x7F, // lower bits 7-13 - midiBuffer[15] & 0x7F);// higher bits 0-6 + midiBuffer[2] & 0x7F); // lower bits 7-13 break; - +/* case 0xF0: + sysex (midiBuffer[0], // sysex start (F0) + midiBuffer[1] & 0x7F, // Manufacturer ID : CFO doesn't have one, but we'll use 0x44 (CASIO :D) + midiBuffer[2] & 0x7F, // CFO Device Group ID : 0x00 (CFO), 0x01 (miniCFO), 0x02 (mikroCFO), 0x03 (l'insect) + midiBuffer[3] & 0x7F, // CFO Device ID : 0-127. Default device ID is 0. + midiBuffer[4] & 0x7F, // Function number: 0-127. 0 is setChannel(). + midiBuffer[5] & 0x7F, // value 0 + midiBuffer[6] & 0x7F, // value 1 + midiBuffer[7] & 0x7F, // value 2 + midiBuffer[8] & 0x7F, // value 3 + midiBuffer[9] & 0x7F, // value 4 + midiBuffer[10] & 0x7F, // value 5 + midiBuffer[11] & 0x7F, // value 6 + midiBuffer[12] & 0x7F, // value 7 + midiBuffer[13] & 0x7F, // value 8 + midiBuffer[14] & 0x7F, // value 9 + midiBuffer[15] & 0x7F);// sysex stop (F7) + break; +*/ default: break; } } + +/* void MMidi::sysex(uint8_t val0, uint8_t val1, uint8_t val2, @@ -187,12 +212,35 @@ void MMidi::sysex(uint8_t val0, //ADD SYSEX HANDLING HERE } +*/ + +void MMidi::sysexHandler(uint8_t bytes) { + if(midiBuffer[1] == CFO_MANUFACTURER_ID) { + if(midiBuffer[2] == CFO_DEVICE_GROUP_ID) { + if(midiBuffer[3] == cfoID) { + switch (midiBuffer[4]) { + case SET_CHANNEL: + setChannel(midiBuffer[5]); + break; + + default: + break; + } + + + } + } + } + + +} + + void MMidi::noteOff(uint8_t channel, uint8_t note, uint8_t vel) { - if(notePlayed == note) { Music.setEnvStage(4); //ampGain = 0; @@ -223,21 +271,69 @@ void MMidi::aftertouch(uint8_t channel, uint8_t note, uint8_t pressure) { void MMidi::controller(uint8_t channel, uint8_t number, uint8_t value) { switch(number) { - case ENV_ATTACK: + case ENV1_ATTACK: Music.setAttack(value); break; - case ENV_DECAY: + case ENV1_DECAY: Music.setDecay(value); break; - case ENV_SUSTAIN: + case ENV1_SUSTAIN: Music.setSustain(value); break; - case ENV_RELEASE: + case ENV1_RELEASE: Music.setRelease(value); break; case DETUNE: Music.setDetune(value/5120.0); break; + case DETUNE1: + Music.setDetune1(value/5120.0); + break; + case DETUNE2: + Music.setDetune2(value/5120.0); + break; + case DETUNE3: + Music.setDetune3(value/5120.0); + break; + case SEMITONE1: + if(15 < value && value < 113) { + int8_t val = (((value-16)/4)-12); + Music.setSemitone1(val); + } else if (value < 16) { + Music.setSemitone1(-12); + } else { + Music.setSemitone1(12); + } + break; + case SEMITONE2: + if(15 < value && value < 113) { + int8_t val = (((value-16)/4)-12); + Music.setSemitone2(val); + } else if (value < 16) { + Music.setSemitone2(-12); + } else { + Music.setSemitone2(12); + } + break; + case SEMITONE3: + if(15 < value && value < 113) { + int8_t val = (((value-16)/4)-12); + Music.setSemitone3(val); + } else if (value < 16) { + Music.setSemitone3(-12); + } else { + Music.setSemitone3(12); + } + break; + case GAIN1: + Music.setGain1(uint16_t(value * 512)); + break; + case GAIN2: + Music.setGain2(uint16_t(value * 512)); + break; + case GAIN3: + Music.setGain3(uint16_t(value * 512)); + break; case WAVEFORM: value = value / 43; if(value == 0) Music.setSine(); diff --git a/Software/Arduino/Example code/.DS_Store b/Software/Arduino/Example code/.DS_Store index d3e3099..5008ddf 100644 Binary files a/Software/Arduino/Example code/.DS_Store and b/Software/Arduino/Example code/.DS_Store differ diff --git a/Software/Arduino/Example code/_insect_live/_insect_live.ino b/Software/Arduino/Example code/_insect_live/_insect_live.ino deleted file mode 100644 index d17e727..0000000 --- a/Software/Arduino/Example code/_insect_live/_insect_live.ino +++ /dev/null @@ -1,25 +0,0 @@ -#define CFO_ID 0 - -#include -#include -#include - - -void setup() { - - Music.init(); - Midi.init(); - Midi.setID(CFO_ID); - Midi.setChannel(1); // channel number is 1-16 - Music.setSaw(); - Music.setDetune(0.02); - Music.enableEnvelope(); - -} - -void loop() { - - Midi.checkMidi(); - -} - diff --git a/Software/Arduino/Example code/insect_test_LEDs/insect_test_LEDs.ino b/Software/Arduino/Example code/insect_test_LEDs/insect_test_LEDs.ino new file mode 100644 index 0000000..ded8053 --- /dev/null +++ b/Software/Arduino/Example code/insect_test_LEDs/insect_test_LEDs.ino @@ -0,0 +1,52 @@ + + +#define R 8 +#define G A5 +#define B 7 +#define M 4 + +#define MASTER 0 + + + +void setup() { + + pinMode(R, OUTPUT); + pinMode(G, OUTPUT); + pinMode(B, OUTPUT); + pinMode(M, OUTPUT); + + digitalWrite(R, LOW); + digitalWrite(G, LOW); + digitalWrite(B, LOW); + digitalWrite(M, LOW); + + Serial.begin(9600); + +} + +void loop() { + + if(MASTER==1) { + Serial.print('1'); + digitalWrite(G, HIGH); + digitalWrite(B, HIGH); + delay(1000); + Serial.print('c'); + digitalWrite(G, LOW); + digitalWrite(B, LOW); + delay(1000); + } else { + while(Serial.available()) { + char c = (char)Serial.read(); + if(c == '1') { + digitalWrite(G, HIGH); + digitalWrite(B, HIGH); + } else { + digitalWrite(G, LOW); + digitalWrite(B, LOW); + } + } + } + +} diff --git a/Software/Arduino/Example code/insect_test_live/insect_test_live.ino b/Software/Arduino/Example code/insect_test_live/insect_test_live.ino new file mode 100644 index 0000000..75cb555 --- /dev/null +++ b/Software/Arduino/Example code/insect_test_live/insect_test_live.ino @@ -0,0 +1,74 @@ +#define CFO_ID 7 +#define CHANNEL CFO_ID + +#include +#include +#include + +#define R 8 +#define G A5 +#define B 7 +#define M 4 + +#define MASTER 0 + + + +void setup() { + + pinMode(R, OUTPUT); + pinMode(G, OUTPUT); + pinMode(B, OUTPUT); + pinMode(M, OUTPUT); + + digitalWrite(R, LOW); + digitalWrite(G, LOW); + digitalWrite(B, LOW); + digitalWrite(M, MASTER); + + + Music.init(); + Midi.init(); + Midi.setID(CFO_ID); + Midi.setChannel(CHANNEL); // channel number is 1-16 + Music.setSaw(); + Music.setDetune(0.02); + Music.enableEnvelope(); + + + + //Serial.begin(9600); + +} + +void loop() { + + Midi.checkMidi(); + + + +/* + if(MASTER==1) { + Serial.print('1'); + digitalWrite(G, HIGH); + digitalWrite(B, HIGH); + delay(1000); + Serial.print('c'); + digitalWrite(G, LOW); + digitalWrite(B, LOW); + delay(1000); + } else { + while(Serial.available()) { + char c = (char)Serial.read(); + if(c == '1') { + digitalWrite(G, HIGH); + digitalWrite(B, HIGH); + } else { + digitalWrite(G, LOW); + digitalWrite(B, LOW); + } + } + } +*/ + +} diff --git a/Software/Arduino/Example code/_insect_test/_insect_test.ino b/Software/Arduino/Example code/insect_test_tone/insect_test_tone.ino similarity index 100% rename from Software/Arduino/Example code/_insect_test/_insect_test.ino rename to Software/Arduino/Example code/insect_test_tone/insect_test_tone.ino diff --git a/hardware/.DS_Store b/hardware/.DS_Store new file mode 100644 index 0000000..51308d2 Binary files /dev/null and b/hardware/.DS_Store differ diff --git a/hardware/eagle/insect.pdf b/hardware/eagle/insect.pdf new file mode 100644 index 0000000..dec2dc9 Binary files /dev/null and b/hardware/eagle/insect.pdf differ diff --git a/hardware/eagle/partslist.txt b/hardware/eagle/partslist.txt new file mode 100644 index 0000000..1cc8305 --- /dev/null +++ b/hardware/eagle/partslist.txt @@ -0,0 +1,79 @@ +Partlist + +Exported from noch10.rev2.sch at 8/31/12 4:05 PM + +EAGLE Version 6.1.0 Copyright (c) 1988-2012 CadSoft + +Assembly variant: + +Part Value Device Package Library Sheet + +A0 MCS10B MCS10B MCS10B solpad 1 +A1 MCS10B MCS10B MCS10B solpad 1 +A2 MCS10B MCS10B MCS10B solpad 1 +A3 MCS10B MCS10B MCS10B solpad 1 +A4 MCS10B MCS10B MCS10B solpad 1 +AIN PG203J PG203J PG203J con-hirschmann 1 +AMP LM380N-8 LM380N-8 DIL08 dviiid 1 +AOUT PG203J PG203J PG203J con-hirschmann 1 +C1 100nF C-US025-025X050 C025-025X050 rcl 1 +C2 100nF C-US025-025X050 C025-025X050 rcl 1 +C3 4.7uF CPOL-USE2.5-5 E2,5-5 rcl 1 +C4 220uF CPOL-USE2.5-6 E2,5-6 rcl 1 +C5 10uF CPOL-USE2.5-5 E2,5-5 rcl 1 +C6 0.33uF C-US025-025X050 C025-025X050 rcl 1 +C7 18pF C-US025-025X050 C025-025X050 rcl 1 +C8 18pF C-US025-025X050 C025-025X050 rcl 1 +C9 100nF C-US025-025X050 C025-025X050 rcl 1 +C10 100nF C-US025-025X050 C025-025X050 rcl 1 +C11 100nF C-US025-025X050 C025-025X050 rcl 1 +C12 100nF C-US025-025X050 C025-025X050 rcl 1 +C13 220uF CPOL-USE2.5-6 E2,5-6 rcl 1 +C14 220uF CPOL-USE2.5-6 E2,5-6 rcl 1 +C15 100nF C-US025-025X050 C025-025X050 rcl 1 +C16 220uF CPOL-USE2.5-6 E2,5-6 rcl 1 +D1 15KEXX 15KEXX CB429-17 diode 1 +DAC MCP4921 MCP4921 DIL08 dviiid 1 +GATE 74HCT32N 74HCT32N DIL14 dviiid 1 +HAHA! ATMEGA48/88/168-PU ATMEGA48/88/168-PU DIL28-3 atmega8 1 +ISP AVR-ISP-6 AVR-ISP-6 AVR-ISP-6 atmel-1 1 +JP1 PINHD-1X6 1X06 pinhead 1 +JP2 PINHD-1X3 1X03 pinhead 1 +LED LED_RGB_7.6MM LED_RGB_7.6MM LED_TH_7.6MM dviiid 1 +P0 MCS10B MCS10B MCS10B solpad 1 +P1 MCS10B MCS10B MCS10B solpad 1 +P2 MCS10B MCS10B MCS10B solpad 1 +Q1 CRYSTALHC49S HC49/S crystal 1 +R1 10k R-US_0204/7 0204/7 rcl 1 +R2 10k R-US_0204/7 0204/7 rcl 1 +R3 10k R-US_0204/7 0204/7 rcl 1 +R4 120 R-US_0204/7 0204/7 rcl 1 +R5 10k R-US_0204/7 0204/7 rcl 1 +R6 10k R-US_0204/7 0204/7 rcl 1 +R7 120 R-US_0204/7 0204/7 rcl 1 +R8 R-US_0204/7 0204/7 rcl 1 +R9 100k R-US_0204/7 0204/7 rcl 1 +R10 120 R-US_0204/7 0204/7 rcl 1 +R11 47 R-US_0204/7 0204/7 rcl 1 +R12 47 R-US_0204/7 0204/7 rcl 1 +R13 120 R-US_0204/7 0204/7 rcl 1 +R14 220 R-US_0204/7 0204/7 rcl 1 +R15 390 R-US_0204/7 0204/7 rcl 1 +R16 10k R-US_0204/7 0204/7 rcl 1 +R17 100k R-US_0204/7 0204/7 rcl 1 +R18 TRIM_EU-B64Y B64Y pot 1 +R19 10k R-US_0204/7 0204/7 rcl 1 +R20 10k R-US_0204/7 0204/7 rcl 1 +RJ45 557570-1 557570-1 con-amp 1 +RSUP MCP120TO92-D MCP120TO92-D TO92 dviiid 1 +S1 TAC_SWITCHPTH TACTILE-PTH SparkFun 1 +S2 TAC_SWITCHPTH TACTILE-PTH SparkFun 1 +S3 TAC_SWITCHPTH TACTILE-PTH SparkFun 1 +SJ1 SJ SJ jumper 1 +SJ2 SJ SJ jumper 1 +SJ3 SJ SJ jumper 1 +SJ4 SJ SJ jumper 1 +SJ5 SJ2W SJ_2 jumper 1 +SJ6 SJ SJ jumper 1 +TR485 SN75176BP SN75176BP DIP08 dviiid 1 +VREG 78XXL 78XXL v-reg 1