Added semitone control, and gain adjustment to each oscillator over MIDI.

This commit is contained in:
Jakob Bak 2012-09-02 10:24:18 +02:00
parent 6c59da5512
commit 78fcfda969
12 changed files with 478 additions and 110 deletions

View File

@ -21,13 +21,51 @@
+ contact: j.bak@ciid.dk + 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 //synth parameters as MIDI controller numbers
#define ENV_ATTACK 4 #define DETUNE 4
#define ENV_DECAY 5 #define WAVEFORM 5
#define ENV_SUSTAIN 6 #define PORTAMENTO 6
#define ENV_RELEASE 7
#define DETUNE 12 #define FREQUENCY1 10
#define WAVEFORM 13 #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 // Synth parameters used in MIDI code
#define ENV_MAX_GAIN (65536 * 4 - 1) #define ENV_MAX_GAIN (65536 * 4 - 1)
@ -37,7 +75,7 @@ class MMidi {
public: public:
void init(); void init();
void checkMidi(); void checkMidi();
void setChannel(uint8_t ID, uint8_t channel); void setChannel(uint8_t channel);
void setID(uint8_t ID); void setID(uint8_t ID);
void midiHandler(); void midiHandler();
@ -48,6 +86,8 @@ public:
void programChange(uint8_t channel, uint8_t number); void programChange(uint8_t channel, uint8_t number);
void channelPressure(uint8_t channel, uint8_t pressure); void channelPressure(uint8_t channel, uint8_t pressure);
void pitchWheel(uint8_t channel, uint8_t highBits, uint8_t lowBits); void pitchWheel(uint8_t channel, uint8_t highBits, uint8_t lowBits);
void sysexHandler(uint8_t bytes);
void sysex (uint8_t, void sysex (uint8_t,
uint8_t, uint8_t,
uint8_t, uint8_t,
@ -66,14 +106,16 @@ public:
uint8_t); uint8_t);
private: private:
// ID // ID
uint8_t cfoID; uint8_t cfoID;
// MIDI // MIDI
uint8_t data; uint8_t data;
bool sysexON;
//uint16_t midiBuffer[4]; //uint16_t midiBuffer[4];
uint8_t midiBuffer[16]; uint8_t midiBuffer[SYSEX_LIMIT];
uint8_t midiChannel; uint8_t midiChannel;
int midiBufferIndex; int midiBufferIndex;

View File

@ -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}; 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; CFOMusic Music;
// Defining which pins the SPI interface is connected to. // Defining which pins the SPI interface is connected to.
@ -88,8 +90,11 @@ void CFOMusic::init()
setSine(); setSine();
// frequency setup // frequency setup
setFrequency(110); setFrequency(110.0f);
setDetune(0); setSemitone1(0);
setSemitone2(0);
setSemitone3(0);
setDetune(0.0f);
// gain setup // gain setup
setGain(1.0f); setGain(1.0f);
@ -124,9 +129,9 @@ void CFOMusic::init()
void CFOMusic::setFrequency(float freq) void CFOMusic::setFrequency(float freq)
{ {
period1 = uint16_t(((freq * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); period1 = uint16_t(((freq * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE);
period2 = uint16_t(((freq * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); period2 = uint16_t(((freq * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE);
period3 = uint16_t(((freq * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); period3 = uint16_t(((freq * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE);
frequency = freq; frequency = freq;
frequency1 = freq; frequency1 = freq;
frequency2 = freq; frequency2 = freq;
@ -136,22 +141,61 @@ void CFOMusic::setFrequency(float freq)
void CFOMusic::setFrequency1(float freq) void CFOMusic::setFrequency1(float freq)
{ {
period1 = uint16_t(((freq * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE);
frequency1 = freq; frequency1 = freq;
period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE);
} }
void CFOMusic::setFrequency2(float freq) void CFOMusic::setFrequency2(float freq)
{ {
period2 = uint16_t(((freq * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE);
frequency2 = freq; frequency2 = freq;
period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE);
} }
void CFOMusic::setFrequency3(float freq) void CFOMusic::setFrequency3(float freq)
{ {
period3 = uint16_t(((freq * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE);
frequency3 = freq; 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; detune1 = 0.0;
detune2 = detune; detune2 = detune;
detune3 = -detune; detune3 = -detune;
period2 = uint16_t(((frequency2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE);
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::setDetune1(float detune) void CFOMusic::setDetune1(float detune)
{ {
detune1 = 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) void CFOMusic::setDetune2(float detune)
{ {
detune2 = 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) void CFOMusic::setDetune3(float detune)
{ {
detune3 = 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) void CFOMusic::pitchBend(float b)
{ {
bend = b; bend = b;
period1 = uint16_t(((frequency1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE);
period2 = uint16_t(((frequency2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE);
period3 = uint16_t(((frequency3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE);
} }

View File

@ -41,10 +41,13 @@ public:
void synthInterrupt(); void synthInterrupt();
// FREQUENCY AND DETUNE FUNCTIONS // FREQUENCY AND DETUNE FUNCTIONS
void setFrequency(float frequency); void setFrequency(float freq);
void setFrequency1(float frequency1); void setFrequency1(float freq);
void setFrequency2(float frequency2); void setFrequency2(float freq);
void setFrequency3(float frequency3); void setFrequency3(float freq);
void setSemitone1(int8_t semi);
void setSemitone2(int8_t semi);
void setSemitone3(int8_t semi);
void setDetune(float detune); void setDetune(float detune);
void setDetune1(float detune); void setDetune1(float detune);
void setDetune2(float detune); void setDetune2(float detune);
@ -113,6 +116,9 @@ private:
float frequency1; float frequency1;
float frequency2; float frequency2;
float frequency3; float frequency3;
float semi1;
float semi2;
float semi3;
float detune1; float detune1;
float detune2; float detune2;
float detune3; float detune3;

View File

@ -28,10 +28,6 @@
#include <CFOMusic.h> #include <CFOMusic.h>
#include <CFOMidi.h> #include <CFOMidi.h>
#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}; 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; MMidi Midi;
@ -42,6 +38,8 @@ void MMidi::init()
{ {
Serial.begin(115200); Serial.begin(115200);
cfoID = 0;
sysexON =false;
midiBufferIndex = 0; midiBufferIndex = 0;
midiChannel = 0; midiChannel = 0;
//notePlayed = 0; //notePlayed = 0;
@ -56,19 +54,46 @@ void MMidi::checkMidi()
while(Serial.available() > 0) { while(Serial.available() > 0) {
data = Serial.read(); 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; midiBufferIndex = 0;
midiRead = true; midiRead = true;
} else if(data &0x80) { } else if(data & 0x80) { // Automagically includes EOX (end of sysex, 0xF7)
midiRead = false; 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) { if(midiRead) {
midiBuffer[midiBufferIndex] = data; midiBuffer[midiBufferIndex] = data;
midiBufferIndex++; midiBufferIndex++;
if (midiBufferIndex > 2) { if (midiBufferIndex > 2 && !sysexON) {
midiHandler(); midiHandler();
} else if(sysexON && midiBufferIndex < SYSEX_LIMIT && data == 0xF7) {
//midiHandler();
sysexHandler(midiBufferIndex);
} else if(midiBufferIndex >= SYSEX_LIMIT) {
midiBufferIndex = 0;
} }
} }
/* /*
@ -83,13 +108,11 @@ void MMidi::checkMidi()
} }
void MMidi::setChannel(uint8_t ID, uint8_t channel) { void MMidi::setChannel(uint8_t channel) {
if(ID == cfoID) {
if(1 <= channel <= 16) { if(1 <= channel <= 16) {
midiChannel = channel-1; midiChannel = channel-1;
} }
} }
}
void MMidi::setID(uint8_t ID) { void MMidi::setID(uint8_t ID) {
cfoID = ID; cfoID = ID;
@ -102,7 +125,7 @@ void MMidi::midiHandler() {
uint8_t midiChannel = (midiBuffer[0] & 0x0F); 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: case 0x80:
noteOff (midiBuffer[0] & 0x0F, // midi channel 0-16 noteOff (midiBuffer[0] & 0x0F, // midi channel 0-16
midiBuffer[1] & 0x7F, // note value 0-127 midiBuffer[1] & 0x7F, // note value 0-127
@ -142,30 +165,32 @@ void MMidi::midiHandler() {
midiBuffer[1] & 0x7F, // higher bits 0-6 midiBuffer[1] & 0x7F, // higher bits 0-6
midiBuffer[2] & 0x7F); // lower bits 7-13 midiBuffer[2] & 0x7F); // lower bits 7-13
break; break;
case 0xF0: /* case 0xF0:
sysex (midiBuffer[0] & 0x0F, // midi channel 0-16 sysex (midiBuffer[0], // sysex start (F0)
midiBuffer[1] & 0x7F, // higher bits 0-6 midiBuffer[1] & 0x7F, // Manufacturer ID : CFO doesn't have one, but we'll use 0x44 (CASIO :D)
midiBuffer[2] & 0x7F, // lower bits 7-13 midiBuffer[2] & 0x7F, // CFO Device Group ID : 0x00 (CFO), 0x01 (miniCFO), 0x02 (mikroCFO), 0x03 (l'insect)
midiBuffer[3] & 0x7F, // higher bits 0-6 midiBuffer[3] & 0x7F, // CFO Device ID : 0-127. Default device ID is 0.
midiBuffer[4] & 0x7F, // lower bits 7-13 midiBuffer[4] & 0x7F, // Function number: 0-127. 0 is setChannel().
midiBuffer[5] & 0x7F, // higher bits 0-6 midiBuffer[5] & 0x7F, // value 0
midiBuffer[6] & 0x7F, // lower bits 7-13 midiBuffer[6] & 0x7F, // value 1
midiBuffer[7] & 0x7F, // higher bits 0-6 midiBuffer[7] & 0x7F, // value 2
midiBuffer[8] & 0x7F, // lower bits 7-13 midiBuffer[8] & 0x7F, // value 3
midiBuffer[9] & 0x7F, // higher bits 0-6 midiBuffer[9] & 0x7F, // value 4
midiBuffer[10] & 0x7F, // lower bits 7-13 midiBuffer[10] & 0x7F, // value 5
midiBuffer[11] & 0x7F, // higher bits 0-6 midiBuffer[11] & 0x7F, // value 6
midiBuffer[12] & 0x7F, // lower bits 7-13 midiBuffer[12] & 0x7F, // value 7
midiBuffer[13] & 0x7F, // higher bits 0-6 midiBuffer[13] & 0x7F, // value 8
midiBuffer[14] & 0x7F, // lower bits 7-13 midiBuffer[14] & 0x7F, // value 9
midiBuffer[15] & 0x7F);// higher bits 0-6 midiBuffer[15] & 0x7F);// sysex stop (F7)
break; break;
*/
default: default:
break; break;
} }
} }
/*
void MMidi::sysex(uint8_t val0, void MMidi::sysex(uint8_t val0,
uint8_t val1, uint8_t val1,
uint8_t val2, uint8_t val2,
@ -187,12 +212,35 @@ void MMidi::sysex(uint8_t val0,
//ADD SYSEX HANDLING HERE //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) { void MMidi::noteOff(uint8_t channel, uint8_t note, uint8_t vel) {
if(notePlayed == note) { if(notePlayed == note) {
Music.setEnvStage(4); Music.setEnvStage(4);
//ampGain = 0; //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) { void MMidi::controller(uint8_t channel, uint8_t number, uint8_t value) {
switch(number) { switch(number) {
case ENV_ATTACK: case ENV1_ATTACK:
Music.setAttack(value); Music.setAttack(value);
break; break;
case ENV_DECAY: case ENV1_DECAY:
Music.setDecay(value); Music.setDecay(value);
break; break;
case ENV_SUSTAIN: case ENV1_SUSTAIN:
Music.setSustain(value); Music.setSustain(value);
break; break;
case ENV_RELEASE: case ENV1_RELEASE:
Music.setRelease(value); Music.setRelease(value);
break; break;
case DETUNE: case DETUNE:
Music.setDetune(value/5120.0); Music.setDetune(value/5120.0);
break; 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: case WAVEFORM:
value = value / 43; value = value / 43;
if(value == 0) Music.setSine(); if(value == 0) Music.setSine();

Binary file not shown.

View File

@ -1,25 +0,0 @@
#define CFO_ID 0
#include <stdint.h>
#include <CFOMidi.h>
#include <CFOMusic.h>
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();
}

View File

@ -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);
}
}
}
}

View File

@ -0,0 +1,74 @@
#define CFO_ID 7
#define CHANNEL CFO_ID
#include <stdint.h>
#include <CFOMidi.h>
#include <CFOMusic.h>
#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);
}
}
}
*/
}

BIN
hardware/.DS_Store vendored Normal file

Binary file not shown.

BIN
hardware/eagle/insect.pdf Normal file

Binary file not shown.

View File

@ -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