Added semitone control, and gain adjustment to each oscillator over MIDI.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -28,10 +28,6 @@
|
||||
#include <CFOMusic.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};
|
||||
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user