diff --git a/software/lib/MMM/Midi.cpp b/software/lib/MMM/Midi.cpp index 8cad258..6a72100 100644 --- a/software/lib/MMM/Midi.cpp +++ b/software/lib/MMM/Midi.cpp @@ -32,37 +32,44 @@ prog_uint16_t hertzTable[] PROGMEM = {8,8,9,9,10,10,11,12,12,13,14,15,16,17,18,1 MMidi Midi; +bool midiRead = false; + + void MMidi::init() { Serial.begin(115200); midiBufferIndex = 0; - //notePlayed = 0; - - + midiChannel = 0; } - void MMidi::checkMidi() { while(Serial.available() > 0) { - midiBuffer[midiBufferIndex] = Serial.read(); - if(midiBuffer[midiBufferIndex] == 0xFF) { - midiHandler(); - midiBufferIndex = 0; - } - else midiBufferIndex++; + data = Serial.read(); - } - + if(data & 0x80 && (data & 0x0F) == midiChannel) { // 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. + } 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) { + midiHandler(); + } + } + } } void MMidi::midiHandler() { - //midiTime = millis(); uint8_t midiChannel = (midiBuffer[0] & 0x0F); @@ -115,37 +122,99 @@ void MMidi::midiHandler() { void MMidi::noteOff(uint8_t channel, uint8_t note, uint8_t vel) { - if(notePlayed == note) { Music.setEnvStage(4); - //ampGain = 0; - //fltGain = 0; } - } void MMidi::noteOn(uint8_t channel, uint8_t note, uint8_t vel) { Music.setEnvStage(1); - //ampGain = 2 * vel << 8; - //fltGain = 2 * vel << 8; Music.setVelSustain(vel); + Music.setVelPeak(vel); notePlayed = note; memcpy_P(&frequency, &hertzTable[notePlayed],2); Music.setFrequency1(frequency); Music.setFrequency2(frequency); - Music.setFrequency3(frequency); - + Music.setFrequency3(frequency); } + void MMidi::aftertouch(uint8_t channel, uint8_t note, uint8_t pressure) { // Write code here for Aftertouch } + void MMidi::controller(uint8_t channel, uint8_t number, uint8_t value) { switch(number) { + case DETUNE: + Music.setDetune(value/5120.0); + break; + case PORTAMENTO: + //Music.setPortamento(value); // function to be defined, also argument + 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)/2)-24); + Music.setSemitone1(val); + } else if (value < 16) { + Music.setSemitone1(-24); + } else { + Music.setSemitone1(24); + } + break; + case SEMITONE2: + if(15 < value && value < 113) { + int8_t val = (((value-16)/2)-24); + Music.setSemitone2(val); + } else if (value < 16) { + Music.setSemitone2(-24); + } else { + Music.setSemitone2(24); + } + break; + case SEMITONE3: + if(15 < value && value < 113) { + int8_t val = (((value-16)/2)-24); + Music.setSemitone3(val); + } else if (value < 16) { + Music.setSemitone3(-24); + } else { + Music.setSemitone3(24); + } + 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: + Music.setWaveform(value / 8); + break; + case WAVEFORM1: + Music.setWaveform1(value / 8); + break; + case WAVEFORM2: + Music.setWaveform2(value / 8); + break; + case WAVEFORM3: + Music.setWaveform3(value / 8); + break; case ENV_ATTACK: Music.setAttack(value); break; @@ -158,29 +227,22 @@ void MMidi::controller(uint8_t channel, uint8_t number, uint8_t value) { case ENV_RELEASE: Music.setRelease(value); break; - case DETUNE: - Music.setDetune(value/5120.0); - break; - case WAVEFORM: - value = value / 43; - if(value == 0) Music.setSine(); - else if(value == 1) Music.setSaw(); - else if(value == 2) Music.setSquare(); - break; default: break; } - } + void MMidi::programChange(uint8_t channel, uint8_t number) { // Write code here for Program Change } + void MMidi::channelPressure(uint8_t channel, uint8_t pressure) { // Write code here for Channel Pressure } + void MMidi::pitchWheel(uint8_t channel, uint8_t highBits, uint8_t lowBits) { // Write code here for Pitch Wheel } \ No newline at end of file diff --git a/software/lib/MMM/Midi.h b/software/lib/MMM/Midi.h index 515ede2..da895ea 100644 --- a/software/lib/MMM/Midi.h +++ b/software/lib/MMM/Midi.h @@ -21,13 +21,52 @@ + contact: j.bak@ciid.dk */ +// MIDI specific constants + +#ifndef MIDI_CHANNEL +#define 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 WAVEFORM1 14 + +#define FREQUENCY2 20 +#define SEMITONE2 21 +#define DETUNE2 22 +#define GAIN2 23 +#define WAVEFORM2 24 + +#define FREQUENCY3 30 +#define SEMITONE3 31 +#define DETUNE3 32 +#define GAIN3 33 +#define WAVEFORM3 34 + +#define ENV_ATTACK 114 +#define ENV_DECAY 115 +#define ENV_SUSTAIN 116 +#define ENV_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,6 +76,7 @@ class MMidi { public: void init(); void checkMidi(); + void midiHandler(); void noteOff(uint8_t channel, uint8_t note, uint8_t vel); void noteOn(uint8_t channel, uint8_t note, uint8_t vel); @@ -45,33 +85,17 @@ 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); - - - -private: + +private: + // MIDI - uint16_t midiBuffer[4]; + uint8_t data; + uint8_t midiBuffer[SYSEX_LIMIT]; + uint8_t midiChannel; + int midiBufferIndex; uint16_t frequency; - //uint32_t midiTime; - //bool midiNotePlayed; - - //synth - //bool noteTriggered; - //bool noteReleased; - //bool envSustainReached; uint8_t notePlayed; - //uint16_t noteFrequency; - //uint8_t envGain; // maybe another name for the variable - //uint32_t envAttack; - //uint32_t envDecay; - //uint8_t envSustain; - //uint32_t envRelease; - //uint32_t envTime; - //uint32_t envTriggerTime; - //uint32_t envReleaseTime; - //uint32_t portamento; - }; extern MMidi Midi; \ No newline at end of file diff --git a/software/lib/MMM/Music.cpp b/software/lib/MMM/Music.cpp index 5cec53e..cab244d 100644 --- a/software/lib/MMM/Music.cpp +++ b/software/lib/MMM/Music.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}; + MMusic Music; // Defining which pins the SPI interface is connected to. @@ -83,10 +85,14 @@ void MMusic::init() PORTD |= (1<<6); // waveform setup - setSine(); + //setSine(); + setWaveform(0); // frequency setup - setFrequency(110); + setFrequency(440); + setSemitone1(0); + setSemitone2(0); + setSemitone3(0); setDetune(0); // gain setup @@ -122,9 +128,9 @@ void MMusic::init() void MMusic::setFrequency(float freq) { - period1 = uint16_t((freq * 65536.0) / SAMPLE_RATE); - period2 = uint16_t(((freq * (1 + detune2)) * 65536.0) / SAMPLE_RATE); - period3 = uint16_t(((freq * (1 + detune3)) * 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; @@ -134,45 +140,101 @@ void MMusic::setFrequency(float freq) void MMusic::setFrequency1(float freq) { - period1 = uint16_t((freq * 65536.0) / SAMPLE_RATE); frequency1 = freq; + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); } void MMusic::setFrequency2(float freq) { - period2 = uint16_t(((freq * (1 + detune2)) * 65536.0) / SAMPLE_RATE); frequency2 = freq; + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); } void MMusic::setFrequency3(float freq) { - period3 = uint16_t(((freq * (1 + detune3)) * 65536.0) / SAMPLE_RATE); frequency3 = freq; + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void MMusic::setSemitone1(int8_t semi) +{ + if(-25 < semi && semi < 25){ + semi1 = semitoneTable[semi+24]; + } else if (semi < -24) { + semi1 = semitoneTable[0]; + } else { + semi1 = semitoneTable[48]; + } + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void MMusic::setSemitone2(int8_t semi) +{ + if(-25 < semi && semi < 25){ + semi2 = semitoneTable[semi+24]; + } else if (semi < -24) { + semi2 = semitoneTable[0]; + } else { + semi2 = semitoneTable[48]; + } + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void MMusic::setSemitone3(int8_t semi) +{ + if(-25 < semi && semi < 25){ + semi3 = semitoneTable[semi+24]; + } else if (semi < -24) { + semi3 = semitoneTable[0]; + } else { + semi3 = semitoneTable[48]; + } + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); } void MMusic::setDetune(float detune) { + detune1 = 0.0; detune2 = detune; detune3 = -detune; - period2 = uint16_t(((frequency2 * (1 + detune2)) * 65536.0) / SAMPLE_RATE); - period3 = uint16_t(((frequency3 * (1 + detune3)) * 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 MMusic::setDetune1(float detune) +{ + detune1 = detune; + period1 = uint16_t(((frequency1 * semi1 * (1 + detune1 + bend)) * 65536.0) / SAMPLE_RATE); } void MMusic::setDetune2(float detune) { detune2 = detune; - period2 = uint16_t(((frequency2 * (1 + detune2)) * 65536.0) / SAMPLE_RATE); + period2 = uint16_t(((frequency2 * semi2 * (1 + detune2 + bend)) * 65536.0) / SAMPLE_RATE); } void MMusic::setDetune3(float detune) { detune3 = detune; - period3 = uint16_t(((frequency3 * (1 + detune3)) * 65536.0) / SAMPLE_RATE); + period3 = uint16_t(((frequency3 * semi3 * (1 + detune3 + bend)) * 65536.0) / SAMPLE_RATE); +} + + +void MMusic::pitchBend(float b) +{ + bend = b; + 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); } @@ -180,35 +242,34 @@ void MMusic::setDetune3(float detune) ///////////////////////////////////// // -// OVERALL GAIN FUNCTIONS +// WAVEFORM FUNCTIONS // ///////////////////////////////////// -void MMusic::setSine() +void MMusic::setWaveform(uint16_t waveForm) { - sine = true; - saw = false; - square = false; - waveForm = 0; + waveForm1 = waveForm * 256; + waveForm2 = waveForm * 256; + waveForm3 = waveForm * 256; } -void MMusic::setSaw() +void MMusic::setWaveform1(uint16_t waveForm) { - sine = false; - saw = true; - square = false; - waveForm = 1; + waveForm1 = waveForm * 256; } -void MMusic::setSquare() +void MMusic::setWaveform2(uint16_t waveForm) { - sine = false; - saw = false; - square = true; - waveForm = 2; + waveForm2 = waveForm * 256; +} + + +void MMusic::setWaveform3(uint16_t waveForm) +{ + waveForm3 = waveForm * 256; } @@ -438,6 +499,12 @@ void MMusic::setVelSustain(uint8_t vel) } +void MMusic::setVelPeak(uint8_t vel) +{ + velPeak = vel * (MAX_ENV_GAIN / 128); +} + + ///////////////////////////////////// @@ -447,7 +514,7 @@ void MMusic::setVelSustain(uint8_t vel) ///////////////////////////////////// -void MMusic::synthInterrupt() +void inline MMusic::synthInterrupt() { // Frame sync low for SPI (making it low here so that we can measure lenght of interrupt with scope) PORTD &= ~(1<<6); @@ -461,63 +528,44 @@ void MMusic::synthInterrupt() accumulator3 = accumulator3 + period3; // To use the accumulator position to find the right index in the - // waveform look-up table, we truncate it to 12bit. - index1 = accumulator1 >> 4; - index2 = accumulator2 >> 4; - index3 = accumulator3 >> 4; + // waveform look-up table, we truncate it to 8bit. + index1 = accumulator1 >> 8; + index2 = accumulator2 >> 8; + index3 = accumulator3 >> 8; - // SINE WAVE - // Because the waveform look-up table resides in program memory - // we most use memcpy_P to copy the data from that table to our - // oscilator variable. - if(sine) { - memcpy_P(&oscil1, &sineTable[index1],2); - memcpy_P(&oscil2, &sineTable[index2],2); - memcpy_P(&oscil3, &sineTable[index3],2); - } + oscil1 = 0; + oscil2 = 0; + oscil3 = 0; + + memcpy_P(&oscil1, &waveTable[index1 + waveForm1],1); + memcpy_P(&oscil2, &waveTable[index2 + waveForm2],1); + memcpy_P(&oscil3, &waveTable[index3 + waveForm3],1); - // SAWTOOTH WAVE - // Just using the index for the oscillator produces a sawtooth shaped waveform - else if(saw) { - oscil1 = index1; - oscil2 = index2; - oscil3 = index3; - } - // SQUARE WAVE - else if(square) { - oscil1 = index1; - oscil2 = index2; - oscil3 = index3; - oscil1 &= 0x0800; - oscil1 ^= 0x0100; - oscil2 &= 0x0800; - oscil2 ^= 0x0100; - oscil3 &= 0x0800; - oscil3 ^= 0x0100; - } // The DAC formatting routine below assumes the sample to be transmitted // is in the higher 12 bits of the 2 byte variable, so we shift the - // sample up 2 bits each which adds up to 4 bits. + // sample up 6 bits each which adds up to 4 bits. // The individual gains for each oscillator is added. - sample = (oscil1 * gain1) << 2; - sample += (oscil2 * gain2) << 2; - sample += (oscil3 * gain3) << 2; - sample >>= 16; + sample = (oscil1 * gain1); + sample += (oscil2 * gain2); + sample += (oscil3 * gain3); + sample >>= 10; // AMPLIFICATION ENVELOPE // Amplification envelope is calculated here if(envelopeOn) { + // Attack if(envStage == 1) { env += attack; - if(MAX_ENV_GAIN < env) { - env = MAX_ENV_GAIN; + if(velPeak < env) { + env = velPeak; envStage = 2; } } + // Decay else if(envStage == 2) { env -= decay; if(env < velSustain || MAX_ENV_GAIN < env) { @@ -525,9 +573,12 @@ void MMusic::synthInterrupt() envStage = 3; } } + // Sustain else if (envStage == 3) { env = velSustain; } + + // Release else if (envStage == 4) { env -= release; if(MAX_ENV_GAIN < env) { @@ -535,6 +586,8 @@ void MMusic::synthInterrupt() envStage = 0; } } + + // No gain else if (envStage == 0) { env = 0; accumulator1 = 0; diff --git a/software/lib/MMM/Music.h b/software/lib/MMM/Music.h index 71c824d..699e87c 100644 --- a/software/lib/MMM/Music.h +++ b/software/lib/MMM/Music.h @@ -45,14 +45,20 @@ public: void setFrequency1(float frequency1); void setFrequency2(float frequency2); void setFrequency3(float frequency3); + 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); void setDetune3(float detune); + void pitchBend(float b); // WAVEFORM FUNCTIONS - void setSine(); - void setSaw(); - void setSquare(); + void setWaveform(uint16_t waveForm); + void setWaveform1(uint16_t waveForm); + void setWaveform2(uint16_t waveForm); + void setWaveform3(uint16_t waveForm); // GAIN FUNCTIONS void setGainFloat(float value); // 0.0 - 1.0 @@ -73,6 +79,7 @@ public: void noteOn(uint8_t note); // 0 - 255 void noteOff(uint8_t note); // 0 - 255 void noteOff(); + uint16_t getNoteFrequency(uint8_t note); // 0 - 127 // ENVELOPE FUNCTIONS void enableEnvelope(); @@ -89,14 +96,18 @@ public: void setSustain(uint8_t sus); // 0 - 127 void setRelease(uint8_t rel); // 0 - 127 - void setVelSustain(uint8_t vel); // 0 -255 + void setVelSustain(uint8_t vel); // 0 - 127 + void setVelPeak(uint8_t vel); // 0 - 127 private: // WAVEFORM VARIABLES - uint8_t waveForm; + uint16_t waveForm1; + uint16_t waveForm2; + uint16_t waveForm3; + uint16_t waveForm; bool sine; bool saw; bool square; @@ -110,8 +121,13 @@ private: float frequency1; float frequency2; float frequency3; + float semi1; + float semi2; + float semi3; + float detune1; float detune2; float detune3; + float bend; // OSCILLATOR VARIABLES uint16_t accumulator1; @@ -138,6 +154,7 @@ private: uint16_t sustain; uint16_t release; uint16_t velSustain; + uint16_t velPeak; // NOTE VARIABLE uint8_t notePlayed; diff --git a/software/lib/MMM/Wavetable.h b/software/lib/MMM/Wavetable.h index a9dde99..6094117 100644 --- a/software/lib/MMM/Wavetable.h +++ b/software/lib/MMM/Wavetable.h @@ -286,4 +286,281 @@ prog_uint16_t sineTable[] PROGMEM ={ 0x769, 0x76C, 0x76F, 0x772, 0x775, 0x778, 0x77B, 0x77F, 0x782, 0x785, 0x788, 0x78B, 0x78E, 0x791, 0x794, 0x798, 0x79B, 0x79E, 0x7A1, 0x7A4, 0x7A7, 0x7AA, 0x7AE, 0x7B1, 0x7B4, 0x7B7, 0x7BA, 0x7BD, 0x7C0, 0x7C4, 0x7C7, 0x7CA, 0x7CD, 0x7D0, 0x7D3, 0x7D6, 0x7DA, 0x7DD, 0x7E0, 0x7E3, 0x7E6, 0x7E9, 0x7EC, 0x7F0, 0x7F3, 0x7F6, 0x7F9, 0x7FC -}; \ No newline at end of file +}; + + + +prog_uint8_t waveTable[] PROGMEM ={ + // sine + 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae, + 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8, + 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5, + 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7, + 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc, + 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3, + 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83, + 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51, + 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27, + 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a, + 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08, + 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23, + 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c, + 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c, + // square + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + // pulse + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + //triangle + 0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e, + 0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e, + 0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e, + 0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e, + 0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e, + 0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe, + 0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde, + 0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe, + 0xff,0xfd,0xfb,0xf9,0xf7,0xf5,0xf3,0xf1,0xef,0xed,0xeb,0xe9,0xe7,0xe5,0xe3,0xe1, + 0xdf,0xdd,0xdb,0xd9,0xd7,0xd5,0xd3,0xd1,0xcf,0xcd,0xcb,0xc9,0xc7,0xc5,0xc3,0xc1, + 0xbf,0xbd,0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad,0xab,0xa9,0xa7,0xa5,0xa3,0xa1, + 0x9f,0x9d,0x9b,0x99,0x97,0x95,0x93,0x91,0x8f,0x8d,0x8b,0x89,0x87,0x85,0x83,0x81, + 0x7f,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71,0x6f,0x6d,0x6b,0x69,0x67,0x65,0x63,0x61, + 0x5f,0x5d,0x5b,0x59,0x57,0x55,0x53,0x51,0x4f,0x4d,0x4b,0x49,0x47,0x45,0x43,0x41, + 0x3f,0x3d,0x3b,0x39,0x37,0x35,0x33,0x31,0x2f,0x2d,0x2b,0x29,0x27,0x25,0x23,0x21, + 0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x11,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x03,0x01, + // sawtooth + 0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0, + 0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8,0xe7,0xe6,0xe5,0xe4,0xe3,0xe2,0xe1,0xe0, + 0xdf,0xde,0xdd,0xdc,0xdb,0xda,0xd9,0xd8,0xd7,0xd6,0xd5,0xd4,0xd3,0xd2,0xd1,0xd0, + 0xcf,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,0xc7,0xc6,0xc5,0xc4,0xc3,0xc2,0xc1,0xc0, + 0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,0xb7,0xb6,0xb5,0xb4,0xb3,0xb2,0xb1,0xb0, + 0xaf,0xae,0xad,0xac,0xab,0xaa,0xa9,0xa8,0xa7,0xa6,0xa5,0xa4,0xa3,0xa2,0xa1,0xa0, + 0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,0x98,0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90, + 0x8f,0x8e,0x8d,0x8c,0x8b,0x8a,0x89,0x88,0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80, + 0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70, + 0x6f,0x6e,0x6d,0x6c,0x6b,0x6a,0x69,0x68,0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60, + 0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50, + 0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40, + 0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30, + 0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20, + 0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10, + 0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00, + // fuzzsquare + 0x7f,0x8e,0x9d,0xac,0xba,0xc6,0xd2,0xdc,0xe4,0xea,0xef,0xf2,0xf4,0xf4,0xf4,0xf2, + 0xef,0xec,0xe8,0xe5,0xe2,0xdf,0xdc,0xda,0xd9,0xd8,0xd8,0xd9,0xda,0xdb,0xdd,0xdf, + 0xe2,0xe4,0xe6,0xe7,0xe9,0xea,0xea,0xea,0xe9,0xe8,0xe7,0xe5,0xe4,0xe2,0xe0,0xdf, + 0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdf,0xe0,0xe2,0xe3,0xe5,0xe6,0xe7,0xe8,0xe8, + 0xe9,0xe8,0xe8,0xe7,0xe5,0xe4,0xe2,0xe1,0xdf,0xde,0xdd,0xdc,0xdc,0xdc,0xdc,0xdd, + 0xde,0xdf,0xe1,0xe3,0xe5,0xe6,0xe8,0xe9,0xea,0xea,0xea,0xe9,0xe8,0xe7,0xe5,0xe3, + 0xe1,0xde,0xdc,0xdb,0xd9,0xd8,0xd8,0xd8,0xd9,0xdb,0xdd,0xe0,0xe3,0xe7,0xea,0xee, + 0xf0,0xf3,0xf4,0xf4,0xf3,0xf1,0xed,0xe7,0xe0,0xd7,0xcc,0xc0,0xb3,0xa5,0x96,0x86, + 0x77,0x67,0x58,0x4a,0x3d,0x31,0x26,0x1d,0x16,0x10,0x0c,0x0a,0x09,0x09,0x0a,0x0d, + 0x0f,0x13,0x16,0x1a,0x1d,0x20,0x22,0x24,0x25,0x25,0x25,0x24,0x22,0x21,0x1f,0x1c, + 0x1a,0x18,0x16,0x15,0x14,0x13,0x13,0x13,0x14,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x1f, + 0x20,0x21,0x21,0x21,0x21,0x20,0x1f,0x1e,0x1c,0x1b,0x19,0x18,0x16,0x15,0x15,0x14, + 0x15,0x15,0x16,0x17,0x18,0x1a,0x1b,0x1d,0x1e,0x20,0x21,0x21,0x21,0x21,0x21,0x20, + 0x1e,0x1d,0x1b,0x19,0x18,0x16,0x15,0x14,0x13,0x13,0x13,0x14,0x16,0x17,0x19,0x1b, + 0x1e,0x20,0x22,0x23,0x24,0x25,0x25,0x24,0x23,0x21,0x1e,0x1b,0x18,0x15,0x11,0x0e, + 0x0b,0x09,0x09,0x09,0x0b,0x0e,0x13,0x19,0x21,0x2b,0x37,0x43,0x51,0x60,0x6f,0x7f, + // digiwave + 0x00,0x18,0x31,0x47,0x5c,0x6f,0x7e,0x8b,0x94,0x9b,0x9f,0xa1,0xa1,0x9f,0x9d,0x9a, + 0x98,0x96,0x94,0x93,0x93,0x94,0x95,0x97,0x98,0x9a,0x9b,0x9b,0x9b,0x99,0x97,0x94, + 0x90,0x8c,0x87,0x82,0x7e,0x7a,0x77,0x74,0x72,0x71,0x70,0x70,0x71,0x71,0x72,0x72, + 0x73,0x73,0x73,0x72,0x72,0x71,0x70,0x70,0x6f,0x70,0x70,0x72,0x74,0x76,0x79,0x7c, + 0x7f,0x82,0x85,0x87,0x89,0x8a,0x8a,0x89,0x88,0x87,0x85,0x82,0x80,0x7d,0x7b,0x78, + 0x76,0x74,0x72,0x70,0x6e,0x6b,0x67,0x63,0x5e,0x58,0x51,0x4a,0x42,0x39,0x30,0x28, + 0x1f,0x17,0x10,0x09,0x03,0x01,0x05,0x09,0x0d,0x10,0x14,0x19,0x1e,0x24,0x2b,0x32, + 0x3a,0x43,0x4b,0x53,0x5a,0x5f,0x62,0x63,0x61,0x5c,0x54,0x4a,0x3c,0x2d,0x1b,0x09, + 0x09,0x1b,0x2d,0x3c,0x4a,0x54,0x5c,0x61,0x63,0x62,0x5f,0x5a,0x53,0x4b,0x43,0x3a, + 0x32,0x2b,0x24,0x1e,0x19,0x14,0x10,0x0d,0x09,0x05,0x01,0x03,0x09,0x10,0x17,0x1f, + 0x28,0x30,0x39,0x42,0x4a,0x51,0x58,0x5e,0x63,0x67,0x6b,0x6e,0x70,0x72,0x74,0x76, + 0x78,0x7b,0x7d,0x80,0x82,0x85,0x87,0x88,0x89,0x8a,0x8a,0x89,0x87,0x85,0x82,0x7f, + 0x7c,0x79,0x76,0x74,0x72,0x70,0x70,0x6f,0x70,0x70,0x71,0x72,0x72,0x73,0x73,0x73, + 0x72,0x72,0x71,0x71,0x70,0x70,0x71,0x72,0x74,0x77,0x7a,0x7e,0x82,0x87,0x8c,0x90, + 0x94,0x97,0x99,0x9b,0x9b,0x9b,0x9a,0x98,0x97,0x95,0x94,0x93,0x93,0x94,0x96,0x98, + 0x9a,0x9d,0x9f,0xa1,0xa1,0x9f,0x9b,0x94,0x8b,0x7e,0x6f,0x5c,0x47,0x31,0x18,0x00, + // digiwave2 + 0x00,0x17,0x2e,0x45,0x5a,0x6e,0x80,0x90,0x9e,0xaa,0xb4,0xbb,0xc0,0xc4,0xc6,0xc6, + 0xc5,0xc3,0xc0,0xbc,0xb8,0xb4,0xb1,0xad,0xaa,0xa7,0xa4,0xa2,0xa0,0x9e,0x9c,0x9b, + 0x99,0x96,0x94,0x90,0x8c,0x88,0x83,0x7d,0x76,0x6f,0x68,0x61,0x59,0x51,0x4a,0x42, + 0x3c,0x36,0x30,0x2b,0x27,0x23,0x20,0x1e,0x1d,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a, + 0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1c,0x1d,0x1f,0x22,0x25,0x29,0x2d,0x33,0x39, + 0x3f,0x46,0x4d,0x55,0x5d,0x64,0x6c,0x73,0x7a,0x80,0x85,0x8a,0x8e,0x92,0x95,0x98, + 0x9a,0x9c,0x9d,0x9f,0xa1,0xa3,0xa5,0xa8,0xab,0xaf,0xb2,0xb6,0xba,0xbe,0xc1,0xc4, + 0xc5,0xc6,0xc5,0xc2,0xbe,0xb8,0xaf,0xa4,0x97,0x88,0x77,0x64,0x4f,0x39,0x23,0x0b, + 0x0b,0x23,0x39,0x4f,0x64,0x77,0x88,0x97,0xa4,0xaf,0xb8,0xbe,0xc2,0xc5,0xc6,0xc5, + 0xc4,0xc1,0xbe,0xba,0xb6,0xb2,0xaf,0xab,0xa8,0xa5,0xa3,0xa1,0x9f,0x9d,0x9c,0x9a, + 0x98,0x95,0x92,0x8e,0x8a,0x85,0x80,0x7a,0x73,0x6c,0x64,0x5d,0x55,0x4d,0x46,0x3f, + 0x39,0x33,0x2d,0x29,0x25,0x22,0x1f,0x1d,0x1c,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, + 0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1d,0x1e,0x20,0x23,0x27,0x2b,0x30,0x36,0x3c, + 0x42,0x4a,0x51,0x59,0x61,0x68,0x6f,0x76,0x7d,0x83,0x88,0x8c,0x90,0x94,0x96,0x99, + 0x9b,0x9c,0x9e,0xa0,0xa2,0xa4,0xa7,0xaa,0xad,0xb1,0xb4,0xb8,0xbc,0xc0,0xc3,0xc5, + 0xc6,0xc6,0xc4,0xc0,0xbb,0xb4,0xaa,0x9e,0x90,0x80,0x6e,0x5a,0x45,0x2e,0x17,0x00, + // digiwave3 + 0x00,0x24,0x48,0x6a,0x89,0xa6,0xbe,0xd3,0xe3,0xee,0xf5,0xf7,0xf4,0xed,0xe2,0xd5, + 0xc4,0xb2,0x9f,0x8b,0x77,0x65,0x53,0x44,0x37,0x2d,0x26,0x21,0x20,0x21,0x25,0x2b, + 0x33,0x3b,0x45,0x4f,0x59,0x62,0x6a,0x71,0x76,0x79,0x7a,0x79,0x77,0x72,0x6c,0x65, + 0x5d,0x54,0x4b,0x43,0x3b,0x34,0x2f,0x2b,0x28,0x27,0x28,0x2b,0x2f,0x34,0x3a,0x41, + 0x48,0x4f,0x55,0x5b,0x5f,0x62,0x63,0x63,0x60,0x5c,0x57,0x50,0x47,0x3e,0x34,0x2a, + 0x21,0x17,0x0f,0x08,0x03,0x00,0x01,0x01,0x00,0x04,0x09,0x10,0x17,0x1f,0x27,0x2e, + 0x34,0x38,0x3a,0x3a,0x37,0x32,0x29,0x1d,0x0f,0x01,0x14,0x29,0x40,0x57,0x6d,0x83, + 0x98,0xaa,0xba,0xc6,0xce,0xd2,0xd1,0xcc,0xc1,0xb3,0x9f,0x88,0x6d,0x50,0x31,0x10, + 0x10,0x31,0x50,0x6d,0x88,0x9f,0xb3,0xc1,0xcc,0xd1,0xd2,0xce,0xc6,0xba,0xaa,0x98, + 0x83,0x6d,0x57,0x40,0x29,0x14,0x01,0x0f,0x1d,0x29,0x32,0x37,0x3a,0x3a,0x38,0x34, + 0x2e,0x27,0x1f,0x17,0x10,0x09,0x04,0x00,0x01,0x01,0x00,0x03,0x08,0x0f,0x17,0x21, + 0x2a,0x34,0x3e,0x47,0x50,0x57,0x5c,0x60,0x63,0x63,0x62,0x5f,0x5b,0x55,0x4f,0x48, + 0x41,0x3a,0x34,0x2f,0x2b,0x28,0x27,0x28,0x2b,0x2f,0x34,0x3b,0x43,0x4b,0x54,0x5d, + 0x65,0x6c,0x72,0x77,0x79,0x7a,0x79,0x76,0x71,0x6a,0x62,0x59,0x4f,0x45,0x3b,0x33, + 0x2b,0x25,0x21,0x20,0x21,0x26,0x2d,0x37,0x44,0x53,0x65,0x77,0x8b,0x9f,0xb2,0xc4, + 0xd5,0xe2,0xed,0xf4,0xf7,0xf5,0xee,0xe3,0xd3,0xbe,0xa6,0x89,0x6a,0x48,0x24,0x00, + // digiwave4 + 0x7e,0x66,0x31,0x3f,0x39,0x8d,0x9c,0x4b,0xae,0x25,0x03,0xa8,0xae,0x41,0x17,0x27, + 0x06,0x4e,0x94,0xc8,0xe4,0xeb,0xe1,0xcb,0xb0,0x92,0x74,0x59,0x41,0x2d,0x1d,0x10, + 0x08,0x02,0x00,0x01,0x00,0x02,0x06,0x0a,0x10,0x15,0x1b,0x21,0x26,0x2c,0x31,0x36, + 0x3a,0x3e,0x42,0x45,0x47,0x4a,0x4b,0x4d,0x4d,0x4e,0x4e,0x4d,0x4c,0x4b,0x4a,0x48, + 0x46,0x44,0x41,0x3f,0x3c,0x39,0x36,0x33,0x30,0x2c,0x29,0x26,0x23,0x1f,0x1c,0x19, + 0x16,0x13,0x11,0x0e,0x0c,0x09,0x07,0x05,0x04,0x02,0x01,0x00,0x00,0x00,0x01,0x01, + 0x00,0x00,0x00,0x01,0x02,0x04,0x06,0x08,0x0a,0x0d,0x10,0x13,0x16,0x1a,0x1d,0x21, + 0x26,0x2a,0x2f,0x34,0x38,0x3e,0x43,0x48,0x4e,0x53,0x59,0x5f,0x64,0x6a,0x70,0x76, + 0x7c,0x82,0x88,0x8d,0x93,0x99,0x9e,0xa4,0xa9,0xae,0xb4,0xb9,0xbd,0xc2,0xc6,0xca, + 0xce,0xd2,0xd6,0xd9,0xdc,0xdf,0xe1,0xe4,0xe5,0xe7,0xe8,0xea,0xea,0xeb,0xeb,0xeb, + 0xea,0xea,0xe8,0xe7,0xe5,0xe3,0xe1,0xdf,0xdc,0xd9,0xd5,0xd1,0xce,0xc9,0xc5,0xc0, + 0xbb,0xb6,0xb1,0xac,0xa6,0xa0,0x9a,0x94,0x8e,0x88,0x81,0x7b,0x74,0x6e,0x67,0x60, + 0x5a,0x53,0x4d,0x46,0x40,0x39,0x33,0x2d,0x27,0x21,0x1b,0x15,0x10,0x0a,0x05,0x00, + 0x03,0x08,0x0c,0x10,0x14,0x17,0x1b,0x1d,0x20,0x22,0x24,0x26,0x28,0x29,0x29,0x2a, + 0x2a,0x2a,0x2a,0x29,0x28,0x27,0x25,0x23,0x21,0x1e,0x1b,0x18,0x15,0x12,0x0e,0x0a, + 0x06,0x01,0x03,0x07,0x0c,0x12,0x17,0x1c,0x22,0x28,0x2d,0x33,0x39,0x3f,0x45,0x4b, + // digiwave5 + 0x00,0x00,0x00,0x01,0x06,0x0e,0x1e,0x39,0x5f,0x93,0xcd,0xf9,0xeb,0x6d,0x76,0xfd, + 0x19,0xfd,0x75,0x43,0x91,0x79,0x1c,0xf2,0x1b,0xbc,0xc0,0x1d,0xfc,0xb0,0xda,0xb9, + 0xfd,0xeb,0x6b,0x3a,0xfa,0xca,0xe9,0xfd,0x53,0x60,0xfc,0xd2,0xf6,0x80,0xfd,0xf8, + 0xfa,0x76,0xbf,0x97,0xed,0x01,0xf2,0x71,0xef,0x33,0x48,0x1d,0xbf,0x5d,0x82,0x7c, + 0x38,0x81,0x34,0xbd,0xa2,0x7a,0x85,0xc2,0x92,0x0d,0xd1,0xe9,0x40,0x62,0x94,0x3c, + 0xca,0x16,0x0b,0xfd,0xf7,0x3d,0x0f,0xa0,0xc0,0xfa,0xd0,0xb3,0x9a,0x5a,0x4a,0xfd, + 0x6a,0x53,0xfc,0xc9,0xe3,0xef,0xb0,0xe8,0x78,0x26,0x1b,0x80,0xf7,0x54,0xe6,0xb5, + 0xcb,0xe8,0x1f,0xf0,0xfd,0xfd,0xf2,0xda,0xe6,0xf5,0x41,0x2a,0xba,0x5f,0xee,0x83, + 0x71,0x9e,0xc5,0xba,0x2b,0xf8,0xcb,0xe8,0xfc,0x54,0xfa,0xe4,0x8e,0x1f,0xf8,0x4c, + 0x66,0xe5,0xc0,0xfd,0x2a,0xfd,0x1e,0xfd,0xd2,0xf6,0x16,0x36,0x84,0xe3,0xaa,0x86, + 0xcd,0xfa,0xfb,0x4b,0xa5,0x27,0xd3,0xb6,0x60,0xda,0xae,0xbb,0xd1,0x0e,0xfd,0x3d, + 0xe8,0x0e,0x59,0x9b,0x41,0xe7,0x04,0xca,0xdd,0xab,0x6f,0xfd,0xfd,0xa7,0x83,0xf8, + 0x91,0xad,0xc8,0xb4,0xfd,0x3f,0xdf,0xe8,0xe2,0xb3,0xc8,0xec,0x4c,0xf7,0x4b,0x30, + 0xfc,0xfd,0xa4,0x66,0xf9,0xfa,0xd0,0xf9,0x70,0x40,0xc4,0xee,0xa7,0xc9,0x21,0xee, + 0xb7,0x8a,0x64,0x19,0xe6,0x23,0xe3,0xbe,0xde,0xe2,0x39,0xae,0xfb,0xb1,0xca,0xb3, + 0x99,0x4e,0xde,0xd2,0xd7,0xf4,0x6d,0xd5,0x9c,0x47,0x23,0xfd,0x8f,0x10,0xa2,0xc5, + // digiwave6 + 0x00,0x29,0x51,0x77,0x99,0xb7,0xcf,0xe1,0xed,0xf2,0xf0,0xe9,0xdc,0xca,0xb4,0x9b, + 0x81,0x65,0x4a,0x30,0x19,0x04,0x0c,0x19,0x23,0x28,0x29,0x27,0x22,0x1b,0x12,0x08, + 0x01,0x0a,0x12,0x19,0x1d,0x1f,0x1e,0x1b,0x16,0x0e,0x05,0x05,0x10,0x1b,0x26,0x2f, + 0x37,0x3d,0x41,0x43,0x42,0x3f,0x3b,0x34,0x2d,0x25,0x1c,0x14,0x0d,0x07,0x03,0x00, + 0x00,0x01,0x05,0x0a,0x11,0x18,0x21,0x29,0x31,0x38,0x3d,0x41,0x43,0x42,0x3f,0x3a, + 0x33,0x2a,0x20,0x15,0x0a,0x00,0x09,0x12,0x19,0x1d,0x1f,0x1e,0x1b,0x16,0x0e,0x06, + 0x03,0x0d,0x17,0x1f,0x25,0x29,0x29,0x26,0x1f,0x13,0x04,0x0e,0x24,0x3d,0x58,0x73, + 0x8e,0xa8,0xbf,0xd3,0xe3,0xed,0xf2,0xf0,0xe8,0xd9,0xc4,0xa9,0x89,0x65,0x3e,0x14, + 0x14,0x3e,0x65,0x89,0xa9,0xc4,0xd9,0xe8,0xf0,0xf2,0xed,0xe3,0xd3,0xbf,0xa8,0x8e, + 0x73,0x58,0x3d,0x24,0x0e,0x04,0x13,0x1f,0x26,0x29,0x29,0x25,0x1f,0x17,0x0d,0x03, + 0x06,0x0e,0x16,0x1b,0x1e,0x1f,0x1d,0x19,0x12,0x09,0x00,0x0a,0x15,0x20,0x2a,0x33, + 0x3a,0x3f,0x42,0x43,0x41,0x3d,0x38,0x31,0x29,0x21,0x18,0x11,0x0a,0x05,0x01,0x00, + 0x00,0x03,0x07,0x0d,0x14,0x1c,0x25,0x2d,0x34,0x3b,0x3f,0x42,0x43,0x41,0x3d,0x37, + 0x2f,0x26,0x1b,0x10,0x05,0x05,0x0e,0x16,0x1b,0x1e,0x1f,0x1d,0x19,0x12,0x0a,0x01, + 0x08,0x12,0x1b,0x22,0x27,0x29,0x28,0x23,0x19,0x0c,0x04,0x19,0x30,0x4a,0x65,0x81, + 0x9b,0xb4,0xca,0xdc,0xe9,0xf0,0xf2,0xed,0xe1,0xcf,0xb7,0x99,0x77,0x51,0x29,0x00, + // tanwave + 0x00,0x0c,0x19,0x25,0x32,0x3e,0x4b,0x57,0x64,0x70,0x7d,0x89,0x95,0xa2,0xae,0xb9, + 0xc5,0xd0,0xda,0xe2,0xe8,0xeb,0xe8,0xde,0xc6,0x9d,0x5e,0x14,0x0a,0xd2,0x02,0x09, + 0xeb,0xdc,0x89,0x69,0xfa,0xcf,0x82,0x44,0x1b,0x02,0x0b,0x12,0x15,0x15,0x14,0x12, + 0x10,0x0e,0x0b,0x09,0x07,0x06,0x04,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x05,0x06,0x08,0x0a,0x0d,0x0f, + 0x11,0x13,0x15,0x15,0x14,0x0f,0x05,0x0d,0x2d,0x60,0xa8,0xf0,0xd3,0x00,0x8b,0x11, + 0x2d,0xe7,0xe3,0x54,0x01,0x38,0x80,0xb4,0xd4,0xe4,0xea,0xea,0xe5,0xde,0xd5,0xca, + 0xbf,0xb4,0xa8,0x9b,0x8f,0x83,0x76,0x6a,0x5d,0x51,0x44,0x38,0x2b,0x1f,0x12,0x06, + 0x06,0x12,0x1f,0x2b,0x38,0x44,0x51,0x5d,0x6a,0x76,0x83,0x8f,0x9b,0xa8,0xb4,0xbf, + 0xca,0xd5,0xde,0xe5,0xea,0xea,0xe4,0xd4,0xb4,0x80,0x38,0x01,0x54,0xe3,0xe7,0x2d, + 0x11,0x8b,0x00,0xd3,0xf0,0xa8,0x60,0x2d,0x0d,0x05,0x0f,0x14,0x15,0x15,0x13,0x11, + 0x0f,0x0d,0x0a,0x08,0x06,0x05,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x06,0x07,0x09,0x0b,0x0e,0x10, + 0x12,0x14,0x15,0x15,0x12,0x0b,0x02,0x1b,0x44,0x82,0xcf,0xfa,0x69,0x89,0xdc,0xeb, + 0x09,0x02,0xd2,0x0a,0x14,0x5e,0x9d,0xc6,0xde,0xe8,0xeb,0xe8,0xe2,0xda,0xd0,0xc5, + 0xb9,0xae,0xa2,0x95,0x89,0x7d,0x70,0x64,0x57,0x4b,0x3e,0x32,0x25,0x19,0x0c,0x00, + // tanwave2 + 0x00,0x12,0x25,0x38,0x4c,0x5f,0x74,0x88,0x9c,0xae,0xba,0xba,0x98,0x30,0x20,0x26, + 0xc6,0x69,0xe0,0x6f,0x10,0x0d,0x0e,0x03,0x0b,0x1c,0x2c,0x3c,0x4b,0x59,0x66,0x73, + 0x80,0x8c,0x99,0xa5,0xb1,0xbd,0xca,0xd6,0xe1,0xeb,0xee,0xe2,0xb1,0x37,0x0b,0x4f, + 0xaa,0x10,0xcd,0x42,0x1a,0x3b,0x43,0x3f,0x38,0x30,0x27,0x20,0x18,0x11,0x0b,0x04, + 0x01,0x07,0x0e,0x15,0x1c,0x23,0x2c,0x34,0x3c,0x42,0x41,0x30,0x09,0x8e,0x7a,0x12, + 0xc8,0xdc,0x11,0x7e,0xd0,0xeb,0xee,0xe7,0xdc,0xd0,0xc3,0xb7,0xab,0x9f,0x93,0x86, + 0x7a,0x6d,0x60,0x52,0x43,0x34,0x24,0x14,0x04,0x09,0x0f,0x03,0x35,0xb9,0x4c,0xba, + 0x1d,0xa7,0x18,0x6f,0xaf,0xbd,0xb5,0xa5,0x92,0x7e,0x69,0x56,0x42,0x2f,0x1c,0x09, + 0x09,0x1c,0x2f,0x42,0x56,0x69,0x7e,0x92,0xa5,0xb5,0xbd,0xaf,0x6f,0x18,0xa7,0x1d, + 0xba,0x4c,0xb9,0x35,0x03,0x0f,0x09,0x04,0x14,0x24,0x34,0x43,0x52,0x60,0x6d,0x7a, + 0x86,0x93,0x9f,0xab,0xb7,0xc3,0xd0,0xdc,0xe7,0xee,0xeb,0xd0,0x7e,0x11,0xdc,0xc8, + 0x12,0x7a,0x8e,0x09,0x30,0x41,0x42,0x3c,0x34,0x2c,0x23,0x1c,0x15,0x0e,0x07,0x01, + 0x04,0x0b,0x11,0x18,0x20,0x27,0x30,0x38,0x3f,0x43,0x3b,0x1a,0x42,0xcd,0x10,0xaa, + 0x4f,0x0b,0x37,0xb1,0xe2,0xee,0xeb,0xe1,0xd6,0xca,0xbd,0xb1,0xa5,0x99,0x8c,0x80, + 0x73,0x66,0x59,0x4b,0x3c,0x2c,0x1c,0x0b,0x03,0x0e,0x0d,0x10,0x6f,0xe0,0x69,0xc6, + 0x26,0x20,0x30,0x98,0xba,0xba,0xae,0x9c,0x88,0x74,0x5f,0x4c,0x38,0x25,0x12,0x00, + //tanwave3 + 0x00,0x0f,0x1f,0x2f,0x3f,0x50,0x61,0x73,0x84,0x93,0x9d,0x9a,0x76,0x0c,0x46,0x4e, + 0x9d,0x3f,0xb4,0x42,0x1d,0x3b,0x3c,0x32,0x22,0x12,0x01,0x0f,0x1f,0x2e,0x3d,0x4c, + 0x5b,0x6a,0x79,0x88,0x97,0xa7,0xb7,0xc7,0xd6,0xe4,0xec,0xe4,0xb8,0x43,0x1c,0x66, + 0xc7,0x11,0xf5,0x70,0x19,0x01,0x02,0x07,0x14,0x23,0x32,0x40,0x4e,0x5b,0x68,0x75, + 0x82,0x8e,0x9b,0xa7,0xb4,0xc2,0xd0,0xdd,0xea,0xf5,0xf9,0xed,0xb7,0x36,0x4e,0xdf, + 0x07,0x09,0xe7,0x59,0x09,0x0f,0x10,0x08,0x02,0x0f,0x1b,0x27,0x33,0x3e,0x48,0x53, + 0x5d,0x67,0x72,0x7d,0x88,0x93,0x9f,0xaa,0xb5,0xbe,0xbe,0xac,0x6d,0x1d,0x49,0x2b, + 0xa5,0x28,0x90,0x00,0x47,0x5d,0x5e,0x57,0x4d,0x41,0x36,0x2c,0x21,0x17,0x0e,0x04, + 0x04,0x0e,0x17,0x21,0x2c,0x36,0x41,0x4d,0x57,0x5e,0x5d,0x47,0x00,0x90,0x28,0xa5, + 0x2b,0x49,0x1d,0x6d,0xac,0xbe,0xbe,0xb5,0xaa,0x9f,0x93,0x88,0x7d,0x72,0x67,0x5d, + 0x53,0x48,0x3e,0x33,0x27,0x1b,0x0f,0x02,0x08,0x10,0x0f,0x09,0x59,0xe7,0x09,0x07, + 0xdf,0x4e,0x36,0xb7,0xed,0xf9,0xf5,0xea,0xdd,0xd0,0xc2,0xb4,0xa7,0x9b,0x8e,0x82, + 0x75,0x68,0x5b,0x4e,0x40,0x32,0x23,0x14,0x07,0x02,0x01,0x19,0x70,0xf5,0x11,0xc7, + 0x66,0x1c,0x43,0xb8,0xe4,0xec,0xe4,0xd6,0xc7,0xb7,0xa7,0x97,0x88,0x79,0x6a,0x5b, + 0x4c,0x3d,0x2e,0x1f,0x0f,0x01,0x12,0x22,0x32,0x3c,0x3b,0x1d,0x42,0xb4,0x3f,0x9c, + 0x4e,0x46,0x0c,0x76,0x9a,0x9d,0x93,0x84,0x73,0x61,0x50,0x3f,0x2f,0x1f,0x0f,0x00, + //tanwave4 + 0x7f,0x81,0x84,0x86,0x88,0x8a,0x8b,0x8c,0x8d,0x8c,0x8c,0x8a,0x88,0x85,0x81,0x7b, + 0x74,0x6c,0x61,0x54,0x43,0x30,0x19,0x00,0x1a,0x2f,0x30,0x03,0x89,0xb2,0x3b,0x28, + 0x9b,0xb1,0x20,0xdd,0x74,0x06,0x18,0x0c,0x0f,0x2e,0x4c,0x66,0x7d,0x90,0xa1,0xaf, + 0xbc,0xc6,0xcf,0xd7,0xde,0xe4,0xe9,0xed,0xf1,0xf4,0xf7,0xf9,0xfb,0xfc,0xfd,0xfd, + 0xfd,0xfd,0xfd,0xfb,0xfa,0xf8,0xf6,0xf3,0xef,0xeb,0xe7,0xe1,0xdb,0xd3,0xcb,0xc1, + 0xb6,0xa8,0x99,0x87,0x72,0x59,0x3d,0x1f,0x00,0x15,0x10,0x31,0xbe,0x74,0xdb,0x9b, + 0x08,0x0f,0x07,0xca,0x3d,0x1f,0x34,0x26,0x0d,0x0d,0x25,0x3a,0x4c,0x5b,0x66,0x70, + 0x78,0x7e,0x83,0x86,0x89,0x8b,0x8c,0x8d,0x8c,0x8c,0x8b,0x89,0x88,0x85,0x83,0x80, + 0x7d,0x79,0x76,0x72,0x6d,0x68,0x63,0x5e,0x58,0x51,0x4a,0x42,0x39,0x30,0x25,0x19, + 0x0c,0x03,0x14,0x29,0x40,0x5a,0x78,0x98,0xb6,0xc9,0xb9,0x62,0x26,0xa1,0x9e,0xba, + 0x1b,0x20,0x4a,0x04,0x95,0xdb,0xe3,0xd1,0xb6,0x9b,0x82,0x6c,0x5a,0x4b,0x3e,0x33, + 0x2a,0x23,0x1c,0x17,0x12,0x0e,0x0b,0x08,0x06,0x04,0x03,0x02,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x02,0x04,0x05,0x07,0x0a,0x0d,0x10,0x14,0x19,0x1f,0x26,0x2e, + 0x38,0x44,0x52,0x63,0x77,0x8e,0xa8,0xc4,0xdc,0xe4,0xc2,0x50,0x1c,0xdc,0x06,0x17, + 0x87,0x6f,0x0b,0x18,0x99,0xc7,0xc2,0xa8,0x88,0x69,0x4d,0x34,0x1e,0x0b,0x04,0x13, + 0x1f,0x2b,0x35,0x3e,0x46,0x4e,0x55,0x5b,0x61,0x66,0x6b,0x6f,0x74,0x78,0x7b,0x7f +}; \ No newline at end of file