// Copyright 2023 Sean Luke // (sean@cs.gmu.edu) // // Released under the Apache 2.0 License /// PLUCK /// /// Pluck is a Karplus-Strong string plucking thing. You pluck a string by providing a PITCH /// and then triggering the TRIGGER. Pluck maintains up to 4 voices of strings being plucked at /// one time. No two plucks will sound exactly alike, nor will they have the same decay nor volume. /// /// SET GRAINS TO MOZZI MODE. Sorry, no Grains mode. /// /// You will need to install the Mozzi Library. You can do this from the Library Manager /// in your Arduino IDE. /// /// There are three options for plucking. First, you can set the DECAY of the pluck. Note that higher /// note plucks will decay much faster regardless, but you can stretch them out this way. Second, you /// can set the GAIN (the volume). Second, you can set the ATONALITY of the pluck: how much /// it will sound like a string versus an atonal drum or crash sound. Basically more atonality rapidly /// adds more and more noise to the sound. Third, you can set the DECAY of the pluck. Longer decays /// will sound increasingly metallic and when they pile up you'll need to reduce the GAIN. /// /// You can't have both ATONALITY and DECAY on the IN 2 knob and input: one is relegated to CV via IN 3. /// By default ATONALITY is on IN 3 and DECAY gets the IN2 knob/input. But if you'd like to swap that, /// just uncomment the following #define below (that is, remove the // ): // #define ATONALITY_ON_POT_2 /// Note that if you change the atonality, pitch, gain, or decay, it will not affect the currently plucked /// notes: it only affects later notes. This trick helps the computational efficiency of the program and /// thus the quality of the note sound: but in fact changing any of these four elements in real time adds /// weird and undesirable artifacts in Mozzi, so you wouldn't want it anyway. /// TUNING /// /// Unlike other Mozzi projects, Pluck has to compute the wave array size immediately in order to play it. This means /// it that has to make a snap judgment about the current pitch, and sometimes it's wrong because GRAINS / Mozzi /// are very sloppy and noisy in providing proper pitch information. So occasionally it'll be off when you play it. /// I will try to work on it, but expect Pluck to not be exactly on pitch every time you do a pluck. I can make it /// more accurate, but at the expense of much more latency (and Pluck has plenty of latency already). /// /// One thing you can do is ask Pluck to always round to the nearest semitone. You'll have to get your pitch tracking /// right. To do this, you want to uncomment the following #define: //#define ROUND_TO_SEMITONE /// /// Also, you can adjust tuning, but note that Karplus-Strong is limited in its ability precisely match /// a given pitch. High plucks will be far, far less pitch accurate than low plucks. The lowest /// pluck you can do is 64 Hz (roughly a C two octaves below middle C). /// /// /// ADJUSTING TUNING AND TRACKING /// /// Grains's Inputs track 1.3V/octave, not 1V/octave: we'll need to scale them to track properly. /// To do this, you can adjust the Pitch CV Scaling on Pot 1. This GRAINS program is set up to play /// the C three octaves below Middle C when it receives 0V. You should be able to use Pot 1 to scale /// the pitch such that high Cs play in tune as well. Once you have things tracking well, you can /// then use the Pitch Tune (Audio In) to tune 0V to some other note. Note that as GRAINS resistors /// warm up, the scaling will change and you will need to adjust the tracking again, at least until /// they are fully warmed up. /// /// By default the note corresponding to 0V is C0, three octaves below middle C, that is MIDI note 24, /// or 32.7 Hz. You can customize the tuning for this Grains program. This can be done /// in two ways. First, you can add pitch to the tuning with a CV value to Audio In. Second, you /// can transpose the pitch up by changing the TRANSPOSE_OCTAVES and/or TRANSPOSE_SEMITONES #defines /// in the code to positive integers. You can also change TRANSPOSE_BITS: a "bit" is the minimum possible /// change Grains can do, equal to 1/17 of a semitone. /// CONFIGURATION /// /// IN 1 Pitch CV /// IN 2 Decay (or Atonality) CV /// IN 3 Atonality (or Decay) /// AUDIO IN (A) Pitch Tune /// AUDIO OUT Out /// DIGITAL OUT (D) Trigger /// /// POT 1 Pitch Scaling [Set the switch to In1] /// /// POT 2 Decay (or Atonality) /// [Set the switch to In2] /// /// POT 3 Gain // this is literally just a deterministic random number table, stolen from arp.ino PROGMEM const uint8_t NOISE[8192] = { 0xF1, 0xD2, 0xAC, 0x49, 0x3C, 0xC9, 0xF2, 0xA2, 0x09, 0x18, 0x98, 0x22, 0x64, 0xEA, 0xEA, 0x49, 0x3A, 0x7B, 0x56, 0xA5, 0x18, 0x9D, 0xBD, 0x38, 0xFE, 0x6D, 0x21, 0xE8, 0x4B, 0x33, 0xBC, 0xA2, 0x06, 0xFB, 0x41, 0xB6, 0xBA, 0xAC, 0x6E, 0x2C, 0x1E, 0x9D, 0xFB, 0x96, 0x6D, 0x9D, 0xDA, 0xE1, 0x6C, 0x04, 0xD4, 0xEC, 0x7E, 0x3C, 0xC1, 0x69, 0xE8, 0x74, 0x38, 0x8A, 0x2E, 0x1B, 0x72, 0xE6, 0xA3, 0xA1, 0x41, 0x03, 0xC4, 0xCD, 0x0C, 0xBB, 0x8D, 0xC7, 0xF9, 0xC0, 0x54, 0xE8, 0x29, 0x2A, 0x02, 0x2A, 0xFB, 0x13, 0x19, 0x9D, 0xDA, 0x2B, 0xC7, 0x7E, 0x0B, 0xD5, 0xC6, 0x17, 0x41, 0x52, 0x9B, 0xAB, 0x3B, 0x92, 0xA0, 0x67, 0x9D, 0x18, 0xF3, 0xA2, 0x05, 0x15, 0x13, 0xC2, 0x7D, 0xDB, 0xC2, 0xBB, 0x3A, 0x9B, 0xCD, 0x41, 0xAD, 0xE8, 0xF6, 0xF6, 0xB0, 0x39, 0xFC, 0x3E, 0x78, 0xAD, 0xF3, 0xE7, 0x6B, 0x98, 0x24, 0xA3, 0x17, 0xBA, 0xA5, 0xFF, 0xBC, 0xBB, 0x25, 0x9F, 0x44, 0x33, 0xCD, 0xC5, 0x89, 0x74, 0x17, 0x11, 0xAC, 0x59, 0x35, 0x71, 0x72, 0xC0, 0x93, 0xBD, 0x5E, 0x0B, 0x89, 0x97, 0xA1, 0x15, 0xB0, 0x4A, 0xC3, 0x84, 0x21, 0x21, 0x1F, 0x54, 0x32, 0x95, 0xFF, 0x24, 0x7A, 0xD3, 0x4F, 0xDB, 0x04, 0x71, 0x00, 0xEB, 0x24, 0xA1, 0x61, 0x8B, 0xC1, 0xC9, 0xBC, 0x15, 0x35, 0xB9, 0x09, 0xB9, 0xCE, 0x5B, 0xD8, 0x04, 0xB2, 0xA3, 0x22, 0x39, 0x59, 0x02, 0x62, 0x1F, 0xE4, 0x25, 0x6B, 0x34, 0xE2, 0xF5, 0xE3, 0x81, 0x55, 0x1D, 0x78, 0xAC, 0xA4, 0x3C, 0xFE, 0x9E, 0xB1, 0xD8, 0xD7, 0xCE, 0xB6, 0xBD, 0xB6, 0xE9, 0x09, 0xD4, 0xC8, 0xC0, 0xF0, 0xBE, 0x3F, 0x30, 0xF9, 0xF3, 0x5E, 0x4C, 0x80, 0xCD, 0x8E, 0x59, 0x10, 0xC6, 0x37, 0x7D, 0x1E, 0x6D, 0x28, 0xA9, 0x30, 0x60, 0xA9, 0x52, 0x92, 0x4D, 0x2C, 0xA2, 0x1D, 0x69, 0x04, 0x51, 0x50, 0xCA, 0x87, 0x9F, 0x90, 0xCF, 0xD3, 0x3C, 0x8B, 0x93, 0x82, 0xED, 0x19, 0xD1, 0x34, 0xEB, 0xFE, 0x2E, 0x84, 0x3C, 0x6F, 0xD4, 0xED, 0xCA, 0x58, 0x9F, 0xD5, 0x69, 0x73, 0xBC, 0x69, 0xA4, 0x51, 0x74, 0x40, 0xAA, 0x8E, 0xB6, 0xA3, 0xA8, 0xCE, 0x2D, 0x7F, 0x78, 0x69, 0x52, 0x25, 0x6B, 0x44, 0xDA, 0x03, 0x1E, 0x43, 0x8C, 0x5E, 0xC6, 0x16, 0xBF, 0x86, 0xE1, 0x99, 0x59, 0xBD, 0xB9, 0x57, 0xB7, 0x54, 0xE3, 0x89, 0x3B, 0x99, 0x86, 0x61, 0xE2, 0xDD, 0x09, 0x12, 0xED, 0x44, 0x81, 0x99, 0x76, 0x2A, 0x80, 0xBD, 0xA4, 0x74, 0xF6, 0xF6, 0x46, 0x50, 0xE9, 0x00, 0xFA, 0x56, 0x4D, 0xBA, 0x0B, 0xD4, 0x72, 0x15, 0xB4, 0xC0, 0xE6, 0x5D, 0xDC, 0x83, 0xC7, 0x80, 0x16, 0x01, 0x4C, 0x6C, 0x99, 0x36, 0x1B, 0xD0, 0xE0, 0xAB, 0xDF, 0x7A, 0xEB, 0xF5, 0x1A, 0xC7, 0x4C, 0xC7, 0xFF, 0x62, 0x75, 0x9B, 0x2C, 0x38, 0x9A, 0xB0, 0x17, 0xAB, 0xC0, 0xAA, 0xAA, 0xAE, 0xD8, 0xE6, 0x0A, 0xFC, 0x24, 0x43, 0x63, 0x09, 0x22, 0xE6, 0xEA, 0x09, 0x20, 0x76, 0xA6, 0x53, 0x17, 0x6C, 0x7A, 0x0A, 0x4A, 0xFE, 0x8F, 0x46, 0xF6, 0x8F, 0xC9, 0x33, 0x1E, 0x33, 0xEA, 0xF4, 0x12, 0x6A, 0x78, 0x9C, 0x06, 0x40, 0x6B, 0xC1, 0x3E, 0x5F, 0xDB, 0xEB, 0x30, 0x76, 0x38, 0x55, 0x24, 0x95, 0xEC, 0xA5, 0x0F, 0x96, 0x72, 0x7D, 0x07, 0xB9, 0xBC, 0x5D, 0x15, 0x12, 0x1E, 0x62, 0xB9, 0x39, 0x12, 0x1E, 0x09, 0x3F, 0x9F, 0xBC, 0x45, 0x8C, 0xB3, 0x42, 0x81, 0xFE, 0x7A, 0xFF, 0xF8, 0xDF, 0xBF, 0xF9, 0xE7, 0x69, 0x87, 0x55, 0x94, 0xA3, 0x1C, 0xB1, 0x88, 0x20, 0x24, 0xDD, 0x84, 0xF5, 0x4A, 0x1B, 0x22, 0x6C, 0x12, 0xE3, 0x84, 0xA8, 0xB7, 0x2E, 0xEE, 0x0D, 0x8F, 0xFC, 0x99, 0x9A, 0x2A, 0xA2, 0x4E, 0x79, 0x33, 0x47, 0xE4, 0x3C, 0x51, 0x6C, 0xE5, 0xE8, 0xE2, 0x03, 0xD7, 0x99, 0x9D, 0xD1, 0xAA, 0x78, 0x2C, 0xEB, 0xE0, 0xC5, 0xD7, 0x9B, 0x3B, 0xFC, 0x47, 0xE0, 0xBB, 0x03, 0x80, 0x87, 0x3C, 0x4F, 0x69, 0x61, 0x1B, 0x80, 0x9D, 0xEB, 0x4B, 0x00, 0xCB, 0xAA, 0xA0, 0xFB, 0x31, 0xA0, 0x68, 0x81, 0x64, 0x4C, 0x4E, 0xAB, 0x5F, 0x92, 0x5F, 0x3A, 0x3F, 0x22, 0xDD, 0xB3, 0x41, 0x53, 0xAA, 0x98, 0x17, 0x3F, 0x59, 0xF7, 0x73, 0xA3, 0x37, 0x56, 0x31, 0x48, 0xCE, 0xB7, 0x1A, 0x82, 0x41, 0x7C, 0xE6, 0xDC, 0x1F, 0x5A, 0x19, 0x00, 0x91, 0x6D, 0x20, 0xE6, 0x89, 0x3F, 0x57, 0xB0, 0x88, 0xC1, 0x74, 0x72, 0xE9, 0x2F, 0x17, 0x5E, 0x38, 0xC1, 0x6A, 0x10, 0x90, 0xF1, 0xE0, 0xB7, 0x0C, 0xE5, 0x35, 0x5B, 0xED, 0xBC, 0x91, 0xEC, 0x75, 0x7A, 0x96, 0xB1, 0x3D, 0xD7, 0xAB, 0x1C, 0xE7, 0x3E, 0x3B, 0x92, 0x3B, 0x53, 0x69, 0xD3, 0x71, 0x00, 0x52, 0x04, 0x5C, 0x7D, 0x69, 0xFD, 0xD7, 0xC3, 0x8B, 0xC1, 0xD4, 0xDD, 0x8D, 0xE6, 0x9E, 0x44, 0x2C, 0x82, 0xB2, 0x68, 0x17, 0x06, 0x2D, 0xEF, 0x7E, 0x81, 0x8E, 0xBB, 0x07, 0xA1, 0x9E, 0x50, 0xFC, 0x29, 0x06, 0x4F, 0x44, 0x7F, 0xAB, 0xFB, 0x4A, 0xDC, 0xDD, 0x22, 0xA4, 0x59, 0x26, 0x67, 0x39, 0x73, 0x42, 0x3E, 0xA7, 0xE8, 0x15, 0x38, 0x4B, 0x4D, 0x94, 0xF1, 0x00, 0x08, 0x95, 0xA3, 0x1F, 0x9B, 0x54, 0x02, 0xE6, 0x1F, 0x95, 0xA3, 0x40, 0xF7, 0xA8, 0x28, 0xCC, 0x25, 0x3D, 0xB6, 0xF9, 0x0E, 0xD2, 0xBB, 0x93, 0x80, 0xE5, 0x80, 0x18, 0xA6, 0x13, 0x3B, 0xE3, 0xDD, 0xE4, 0x24, 0x69, 0xCD, 0x0E, 0xFF, 0x82, 0xCC, 0x65, 0x63, 0xC2, 0x1C, 0x47, 0xB9, 0x70, 0x34, 0x63, 0xFE, 0x77, 0xEC, 0xD7, 0xF4, 0xCB, 0xEF, 0xFC, 0x9B, 0xC0, 0xFE, 0x4F, 0x79, 0xEC, 0x1E, 0xCE, 0xEF, 0xFA, 0x91, 0xDE, 0x6C, 0x2A, 0xF9, 0x66, 0xFD, 0xC3, 0xD8, 0xB0, 0x1C, 0xA3, 0x24, 0xD9, 0x4B, 0x88, 0xF2, 0xB1, 0xF0, 0x1F, 0x05, 0x1C, 0x4C, 0x66, 0x8D, 0x04, 0x39, 0xBE, 0x14, 0x2F, 0x97, 0x12, 0xA4, 0xE8, 0x68, 0xD0, 0x10, 0xC1, 0xD3, 0x2D, 0xBB, 0x42, 0x5F, 0x45, 0x8E, 0x70, 0x33, 0x1E, 0xDE, 0xEC, 0xFB, 0x0D, 0xA3, 0x99, 0xF6, 0x80, 0x29, 0x5D, 0x5F, 0x0E, 0x58, 0x4B, 0xF1, 0xFA, 0x55, 0x5D, 0x45, 0x33, 0xB3, 0xDC, 0x5F, 0x82, 0x37, 0xF6, 0xE8, 0xCF, 0xE7, 0x70, 0xD4, 0x95, 0x13, 0x86, 0x13, 0xCD, 0x71, 0x30, 0x72, 0x42, 0x55, 0x4E, 0x68, 0x1F, 0xCB, 0x74, 0x91, 0x29, 0xAA, 0x5A, 0x8B, 0x1D, 0x44, 0x90, 0xF8, 0xD9, 0xB4, 0x33, 0x7B, 0x6E, 0xD0, 0xC9, 0x7B, 0x15, 0x3F, 0x0B, 0x0F, 0xFC, 0xD7, 0x6B, 0x16, 0x4F, 0x4D, 0x1B, 0xB5, 0xA8, 0xE7, 0xD2, 0xFF, 0xF3, 0x34, 0x81, 0x85, 0xAD, 0x63, 0x31, 0x01, 0x0D, 0xA9, 0x8E, 0x88, 0x7A, 0x0F, 0x70, 0x99, 0xF0, 0x0C, 0x04, 0x06, 0x8E, 0x5B, 0x0E, 0x87, 0x29, 0xB5, 0x04, 0x87, 0x34, 0x8C, 0x9C, 0x6B, 0x84, 0x9B, 0xDD, 0xE2, 0x0A, 0x00, 0x01, 0x67, 0xAA, 0x39, 0x2D, 0x87, 0x96, 0x61, 0xEB, 0x1E, 0x3A, 0x20, 0x40, 0x72, 0x72, 0x62, 0x33, 0xF1, 0xCD, 0x11, 0x4C, 0x33, 0x19, 0xF3, 0xC4, 0xC2, 0x7E, 0xC1, 0xF4, 0x21, 0x95, 0x47, 0x8B, 0x6E, 0x55, 0x23, 0x48, 0xE1, 0x47, 0xD6, 0x91, 0xD4, 0xEE, 0xE0, 0xC4, 0xF3, 0xEC, 0x3C, 0xDF, 0x94, 0x93, 0x64, 0xD3, 0xB6, 0x3D, 0x42, 0x28, 0xF0, 0x6E, 0xC3, 0x17, 0xCC, 0x04, 0x4B, 0xA7, 0x7E, 0x8D, 0x2A, 0x02, 0xD6, 0x84, 0x35, 0xBB, 0x68, 0x9E, 0xC0, 0xE2, 0x10, 0x7C, 0xAC, 0xF1, 0x5A, 0xD6, 0x16, 0x06, 0xC6, 0x8F, 0x7A, 0x1F, 0xD4, 0xD6, 0x83, 0x1F, 0x33, 0xE4, 0x9B, 0x94, 0xA0, 0xD7, 0xD6, 0xD9, 0xA2, 0xDD, 0x28, 0xF3, 0xD5, 0xD7, 0xD5, 0x45, 0xBB, 0x0A, 0x08, 0x53, 0x02, 0x6A, 0x13, 0xCA, 0x12, 0x6C, 0xA2, 0x4D, 0x81, 0xBB, 0xF4, 0xBF, 0x85, 0xDE, 0x7C, 0x64, 0xF9, 0xF3, 0x9A, 0xF7, 0xEB, 0x8F, 0x26, 0x87, 0x81, 0x97, 0x77, 0xC1, 0x22, 0xFC, 0xEF, 0xAE, 0x19, 0xB7, 0x92, 0x30, 0x7A, 0x13, 0x13, 0xDE, 0x24, 0xF6, 0xFD, 0xE6, 0x46, 0xC2, 0xB8, 0x94, 0xA3, 0x1E, 0x3C, 0xDC, 0x63, 0x0D, 0x8D, 0x77, 0x98, 0xC7, 0x12, 0x11, 0x0D, 0xCD, 0x76, 0x01, 0xEE, 0xEA, 0x90, 0xC7, 0xA2, 0xD9, 0x9C, 0xCA, 0x6D, 0xF3, 0xDE, 0xFE, 0x96, 0x58, 0x84, 0xA5, 0xE2, 0x5D, 0x70, 0x01, 0xD4, 0x6C, 0x63, 0x42, 0x27, 0xF8, 0xDF, 0x0D, 0x8D, 0x37, 0x44, 0x2A, 0x97, 0xF6, 0x6F, 0xD1, 0x2B, 0xAD, 0xA3, 0x5E, 0x5D, 0xD0, 0x19, 0xFA, 0xDB, 0xF8, 0x48, 0x04, 0x05, 0x1C, 0xE7, 0x9F, 0x59, 0xBC, 0x10, 0x89, 0x2F, 0x92, 0x1F, 0xD6, 0x59, 0xEF, 0x7D, 0xD6, 0x32, 0xCD, 0x91, 0xD2, 0x31, 0x6A, 0x35, 0x6C, 0x4F, 0x26, 0x20, 0x8B, 0x13, 0x4C, 0x5F, 0x52, 0x47, 0x59, 0x8C, 0x90, 0xD6, 0x54, 0x22, 0x21, 0x8D, 0x9C, 0x58, 0x97, 0xF1, 0xC1, 0x3F, 0x46, 0x88, 0x91, 0xEB, 0x7F, 0x52, 0x85, 0x04, 0x81, 0x49, 0xA5, 0xFD, 0x8A, 0xE6, 0xD8, 0xE5, 0xB8, 0xCB, 0x10, 0xFD, 0x1B, 0x14, 0x46, 0x97, 0x8A, 0x21, 0x7B, 0x54, 0x21, 0x76, 0x14, 0x9E, 0xD0, 0xCF, 0xF1, 0x3C, 0xD4, 0x58, 0xAF, 0x70, 0x1C, 0x55, 0xA6, 0x4E, 0x5D, 0x21, 0x1C, 0xF8, 0x8E, 0xAB, 0x4F, 0xE1, 0x38, 0x78, 0x1C, 0x3C, 0xFA, 0x77, 0x21, 0xF9, 0x56, 0x6F, 0xF0, 0x27, 0xD3, 0xD8, 0x28, 0xC0, 0x9C, 0xF7, 0x1B, 0xA5, 0x5D, 0x05, 0x86, 0x8A, 0x0D, 0xDC, 0xA9, 0xA3, 0x40, 0x11, 0x6C, 0x87, 0xAE, 0x2E, 0x7D, 0xD2, 0x23, 0x0A, 0x03, 0x59, 0xDF, 0xDB, 0x5B, 0x3D, 0x01, 0xDB, 0x19, 0xF6, 0xAC, 0x52, 0x2A, 0x8C, 0x6C, 0x74, 0x25, 0x21, 0xCA, 0xA1, 0x68, 0xBA, 0xA4, 0x33, 0x31, 0xBD, 0xA2, 0x6B, 0x92, 0x3A, 0xAA, 0xEA, 0xEE, 0x37, 0xEF, 0xA2, 0xF3, 0x0B, 0xA2, 0xD0, 0x2F, 0xEC, 0xE6, 0xAD, 0x34, 0xF6, 0xCC, 0x01, 0x20, 0x34, 0xD0, 0xA2, 0xC3, 0x34, 0x45, 0x60, 0xC4, 0x69, 0xE1, 0xD1, 0x8E, 0x50, 0x9C, 0xC9, 0xA4, 0x55, 0x25, 0xA8, 0x16, 0x4C, 0xFC, 0x41, 0xEF, 0x56, 0x3A, 0x74, 0xB1, 0xB4, 0x5B, 0x70, 0x41, 0xB8, 0xB0, 0x61, 0x86, 0x67, 0x84, 0x83, 0x0C, 0x8D, 0x3B, 0xD8, 0xDA, 0x42, 0xEA, 0xA3, 0x1B, 0xCE, 0x95, 0xE7, 0xC8, 0x5B, 0x37, 0x18, 0x7E, 0x50, 0x92, 0x98, 0x03, 0x79, 0x0C, 0xDE, 0xCD, 0x7A, 0xC4, 0x00, 0x6F, 0xD9, 0xBC, 0x54, 0xDD, 0xAA, 0x7F, 0x64, 0xCA, 0xF0, 0xD5, 0x19, 0xE6, 0x5B, 0xCA, 0xB5, 0xA5, 0x44, 0xF5, 0x3E, 0x33, 0xAC, 0xD4, 0x60, 0x7E, 0x45, 0xE3, 0x7C, 0x73, 0x9F, 0x25, 0x78, 0x19, 0x59, 0x76, 0x71, 0xFA, 0xAC, 0x94, 0x67, 0x84, 0xFE, 0x04, 0xD0, 0xDD, 0xE8, 0x7F, 0x81, 0xD2, 0xB4, 0xC9, 0x67, 0x02, 0xB3, 0x88, 0xB6, 0x5F, 0xB0, 0xF7, 0x12, 0x76, 0x76, 0x62, 0x15, 0x80, 0xB4, 0xE4, 0xAD, 0x93, 0xC7, 0x15, 0x93, 0x6F, 0x95, 0x08, 0x5A, 0x74, 0x3A, 0x16, 0x77, 0x6F, 0x9E, 0xF0, 0xC1, 0xAB, 0x76, 0xB2, 0x32, 0xF7, 0xC4, 0x9D, 0xF1, 0x54, 0xC3, 0x6B, 0x3B, 0xBB, 0x97, 0xCF, 0x10, 0xE9, 0x56, 0x1D, 0xD8, 0x9C, 0x5B, 0x72, 0x71, 0xFF, 0x93, 0xFB, 0x95, 0x02, 0x72, 0x17, 0xCD, 0x33, 0x2C, 0xC8, 0x70, 0x31, 0x0F, 0x50, 0x48, 0x1E, 0x4D, 0xD5, 0x74, 0x8D, 0x46, 0x0D, 0x41, 0xB5, 0xD1, 0x3F, 0x80, 0x37, 0x99, 0x81, 0x7A, 0x3D, 0xC9, 0x75, 0xC7, 0x6E, 0xEC, 0x79, 0x1C, 0x4B, 0x01, 0x90, 0xFC, 0xEF, 0xCC, 0xAB, 0xA6, 0x97, 0xA5, 0xF5, 0xF7, 0xB3, 0xBF, 0xBB, 0x8E, 0x98, 0x01, 0x64, 0xC0, 0xF0, 0xE3, 0xDB, 0x3D, 0x3C, 0x65, 0x36, 0x8E, 0x76, 0xC0, 0xD6, 0x65, 0xCF, 0xE1, 0x05, 0x2B, 0x72, 0xD9, 0x5E, 0xE7, 0x9A, 0x6C, 0xF3, 0x21, 0x6C, 0xCB, 0x39, 0xAA, 0x42, 0xF4, 0xDF, 0x04, 0x18, 0xFE, 0xD7, 0x96, 0x11, 0xAB, 0x51, 0x00, 0x40, 0x6F, 0x63, 0x15, 0x88, 0x63, 0x1A, 0x22, 0x93, 0xEE, 0xDF, 0xE4, 0xE3, 0x92, 0x80, 0x6D, 0x51, 0xF9, 0x19, 0x07, 0xF8, 0x2C, 0x6C, 0x15, 0x48, 0xFF, 0x13, 0x7B, 0x85, 0x6D, 0x16, 0x63, 0xAD, 0xAA, 0xCC, 0x63, 0x3A, 0x69, 0x3D, 0x99, 0x16, 0x9B, 0xB5, 0xAA, 0xAE, 0x99, 0xD3, 0x47, 0x3A, 0x37, 0x89, 0xD8, 0x6B, 0x65, 0x79, 0xE0, 0x7E, 0xEA, 0xD1, 0x0A, 0xD3, 0xCC, 0x5E, 0xDE, 0x9C, 0x42, 0xE5, 0x55, 0x17, 0x97, 0x16, 0x90, 0xD6, 0x67, 0x3D, 0x36, 0x03, 0x40, 0x93, 0xB8, 0x05, 0x17, 0xA4, 0x62, 0x5D, 0x56, 0xE4, 0xA6, 0x45, 0xE7, 0xC1, 0x89, 0xAC, 0xAC, 0x63, 0xA7, 0x62, 0x75, 0xC5, 0x57, 0x93, 0xCA, 0xCA, 0xDA, 0x53, 0xE9, 0x0F, 0x7F, 0xA3, 0x77, 0xBA, 0x4E, 0xF9, 0x8F, 0xB7, 0xA7, 0x81, 0x9C, 0xE2, 0xDC, 0x2C, 0xC5, 0x99, 0x11, 0x87, 0x1B, 0xE7, 0xE3, 0x2C, 0x34, 0xD2, 0x1F, 0xB8, 0xE8, 0xC4, 0x04, 0x68, 0xEE, 0x8F, 0x20, 0x19, 0xAA, 0x53, 0x73, 0xC1, 0x28, 0xF4, 0x33, 0x0C, 0x00, 0xEB, 0x54, 0xD8, 0xF5, 0x22, 0xB1, 0xC4, 0x4F, 0xB8, 0x2A, 0xDA, 0x8D, 0x4F, 0x36, 0xC3, 0xB2, 0xFD, 0xB0, 0x9F, 0x08, 0x14, 0xD8, 0x51, 0xC3, 0xCD, 0xB3, 0xE7, 0xDC, 0x0E, 0x6F, 0x47, 0x3E, 0xA0, 0xB3, 0x5E, 0xA4, 0x37, 0x13, 0xF6, 0x1A, 0x74, 0xBB, 0xE2, 0xFE, 0xDC, 0x51, 0xCF, 0x24, 0x8E, 0x1B, 0xB9, 0x7E, 0xF0, 0x20, 0xEE, 0x6D, 0x44, 0x41, 0xBC, 0x35, 0xBB, 0xD8, 0xA3, 0xD2, 0x9D, 0x6C, 0x5A, 0x3B, 0xED, 0x34, 0x0A, 0x90, 0x85, 0xE1, 0x18, 0x3D, 0x20, 0x28, 0x02, 0x74, 0x83, 0xC8, 0xB2, 0x54, 0x8E, 0x9E, 0xFB, 0x35, 0x95, 0x27, 0xC0, 0xD3, 0xD9, 0x87, 0x5A, 0x1B, 0xAB, 0xCD, 0x95, 0x83, 0x19, 0x35, 0x49, 0x34, 0x1C, 0x43, 0xE7, 0xBF, 0xCB, 0x2B, 0xE6, 0x0E, 0x40, 0x3C, 0x3E, 0x17, 0x17, 0x33, 0x3F, 0x82, 0x34, 0x48, 0x0F, 0xFF, 0xCA, 0xFA, 0xC7, 0x79, 0x26, 0x4D, 0xFE, 0x6D, 0xF9, 0x34, 0x3F, 0x8E, 0x48, 0x71, 0x6A, 0xFE, 0xBE, 0x1F, 0x72, 0xBC, 0x8A, 0xC9, 0x52, 0x64, 0x2A, 0x64, 0xCA, 0xCB, 0xB2, 0x13, 0xC6, 0x22, 0xE6, 0xE6, 0x1D, 0x55, 0xAA, 0x31, 0x3B, 0x58, 0x89, 0xD3, 0xF2, 0x77, 0x24, 0x35, 0xDD, 0x3B, 0x56, 0x34, 0xAD, 0xCC, 0x2E, 0x0A, 0x61, 0x77, 0x9B, 0x04, 0xD9, 0x83, 0x06, 0x04, 0x67, 0x2F, 0x9F, 0x06, 0x28, 0x95, 0x07, 0x55, 0xB9, 0x9A, 0xF1, 0x2A, 0xD7, 0x37, 0x65, 0x66, 0xC3, 0x55, 0x08, 0xA1, 0x0C, 0x55, 0x7A, 0xC6, 0x2B, 0x32, 0x35, 0x30, 0x96, 0x97, 0x83, 0x51, 0x3C, 0xEC, 0x15, 0x09, 0x96, 0x20, 0x80, 0xF4, 0x89, 0xA2, 0x6A, 0x74, 0xC0, 0x75, 0x12, 0x41, 0x83, 0x2F, 0xF1, 0xF5, 0x0F, 0xBB, 0xDE, 0xE9, 0x33, 0x1C, 0xF4, 0x89, 0xBB, 0xD0, 0x71, 0x8D, 0x5B, 0xE3, 0x15, 0xC9, 0x7C, 0x8C, 0x81, 0x20, 0x4F, 0x8F, 0x5C, 0x3C, 0xEE, 0xAF, 0xED, 0x28, 0xB6, 0x8B, 0xFA, 0x50, 0xA2, 0xD4, 0x99, 0xF0, 0x68, 0x8F, 0xD6, 0xDB, 0x76, 0x52, 0x01, 0xC3, 0xCB, 0x9B, 0xB9, 0x7F, 0x01, 0xE6, 0x97, 0xB4, 0xCA, 0x16, 0xF5, 0x56, 0xD4, 0x95, 0x42, 0x49, 0x48, 0x98, 0xB8, 0x81, 0x1D, 0xF8, 0xE5, 0x90, 0x05, 0x3B, 0x7B, 0x9D, 0xCD, 0x81, 0x84, 0xD7, 0x53, 0x20, 0x53, 0x58, 0x6B, 0xCB, 0xEE, 0x8A, 0x58, 0x4C, 0x93, 0x53, 0xFA, 0x34, 0x56, 0x1D, 0xE9, 0xFF, 0xB5, 0x7A, 0x85, 0xF3, 0x36, 0x22, 0x0B, 0x20, 0x24, 0x27, 0x0F, 0x44, 0x9C, 0x70, 0x99, 0x58, 0x4B, 0x3C, 0x71, 0x70, 0x6C, 0x9D, 0x94, 0xE5, 0xFC, 0xF8, 0x18, 0xEE, 0x6D, 0x58, 0x8C, 0x47, 0x30, 0xA6, 0x83, 0x26, 0x8B, 0x4B, 0x53, 0xFB, 0x3F, 0xA4, 0xF4, 0xB5, 0x85, 0x6B, 0x50, 0x5B, 0x05, 0x9E, 0xEB, 0x30, 0xD3, 0xD3, 0x06, 0x97, 0x6F, 0xFE, 0x61, 0xDE, 0x73, 0xF4, 0xBE, 0x5B, 0x38, 0xEA, 0xD2, 0x63, 0xC8, 0x2A, 0x46, 0x68, 0x8F, 0x85, 0x17, 0xAD, 0xB7, 0xBE, 0xF0, 0x86, 0xBD, 0xF2, 0x1D, 0x7E, 0xE0, 0xD8, 0x06, 0x1D, 0x69, 0x47, 0x66, 0xF9, 0xEF, 0x63, 0xF7, 0x39, 0xA7, 0x39, 0x14, 0xDB, 0x0E, 0x63, 0x1C, 0xE4, 0x3B, 0xD5, 0xD7, 0x5F, 0x3E, 0x2A, 0x03, 0xE9, 0x63, 0x7F, 0xAC, 0x04, 0x36, 0x7A, 0xF2, 0xF7, 0xB2, 0x72, 0x55, 0x2B, 0x61, 0x41, 0x94, 0x4E, 0x6B, 0xE3, 0x7A, 0x6D, 0x9E, 0x69, 0xEA, 0x08, 0x5F, 0x74, 0x2A, 0xC3, 0xB1, 0x18, 0xB7, 0x1E, 0xC6, 0xE6, 0x08, 0x7B, 0xB2, 0xAE, 0x4B, 0xFA, 0xBA, 0xC1, 0x6B, 0x06, 0xEA, 0xCC, 0xBD, 0x07, 0x2A, 0x9D, 0x25, 0xAE, 0xDA, 0x5B, 0x69, 0x35, 0x58, 0x9E, 0xC2, 0x52, 0x1E, 0xF7, 0xC0, 0xC6, 0x12, 0x4C, 0xDA, 0xB1, 0x8C, 0x5F, 0x89, 0x9D, 0x04, 0x39, 0x93, 0x46, 0xE0, 0x2E, 0xB1, 0x24, 0x59, 0x96, 0xB3, 0x48, 0x5B, 0xA9, 0x0F, 0x30, 0x8C, 0x6F, 0xFF, 0x2E, 0x60, 0x4F, 0xB0, 0x46, 0xC3, 0x4E, 0x8B, 0xD9, 0x6B, 0x7B, 0x5F, 0xDC, 0x21, 0xC1, 0x85, 0x5C, 0xA4, 0x97, 0x2D, 0x66, 0x93, 0x1F, 0x6D, 0x16, 0xCE, 0xE7, 0x37, 0xB0, 0xCE, 0xAA, 0x03, 0x7F, 0x87, 0xD0, 0xFB, 0xE9, 0xEB, 0x15, 0x59, 0x90, 0x31, 0x95, 0xF2, 0x8A, 0xCA, 0x92, 0x1A, 0x8E, 0xDF, 0x5A, 0x63, 0x24, 0xD3, 0x36, 0x39, 0x57, 0x9A, 0x2E, 0x7C, 0x11, 0x0D, 0x9B, 0x81, 0xD6, 0x41, 0x01, 0x95, 0xFA, 0x03, 0xAC, 0x93, 0x11, 0x80, 0x46, 0x92, 0xC0, 0x8C, 0x51, 0x33, 0x43, 0xBA, 0x5E, 0xD8, 0x79, 0xA7, 0xC1, 0xE8, 0x10, 0x80, 0x3C, 0xA0, 0x2E, 0x91, 0x22, 0xB2, 0xAE, 0xD8, 0xC8, 0x00, 0x02, 0xDE, 0x81, 0xF9, 0x86, 0x67, 0x96, 0x1A, 0x7D, 0xAA, 0xAB, 0xCE, 0x53, 0x93, 0xE4, 0xE8, 0x29, 0x89, 0x3D, 0xCA, 0x2F, 0x45, 0x7A, 0x6D, 0xC7, 0xB7, 0xCC, 0x08, 0x8C, 0x61, 0x62, 0xDC, 0xB5, 0x16, 0xC0, 0x41, 0x93, 0xE6, 0x6E, 0x8A, 0xD1, 0xA3, 0xAE, 0xEA, 0x5A, 0x9C, 0xDF, 0x83, 0xE0, 0x60, 0x03, 0x2F, 0x9A, 0x2B, 0x4C, 0xA5, 0x39, 0xB3, 0xA0, 0x3B, 0xE1, 0xCA, 0x6D, 0x85, 0xD3, 0xC0, 0xB8, 0x07, 0x15, 0x37, 0x07, 0xE5, 0x80, 0x88, 0xDA, 0x63, 0x98, 0xE0, 0x49, 0x5E, 0x52, 0x5F, 0x0A, 0xF2, 0x20, 0x69, 0x89, 0x6B, 0xBF, 0xAE, 0xB6, 0xE4, 0xC4, 0x21, 0x68, 0xE0, 0x1D, 0x0D, 0x7C, 0x17, 0xF4, 0x95, 0xEC, 0xF3, 0x8F, 0xB4, 0xE9, 0xE2, 0x88, 0xCB, 0x2C, 0xE7, 0x53, 0x56, 0x74, 0x60, 0xF7, 0x8E, 0x35, 0x6E, 0x06, 0xE3, 0xCD, 0x5C, 0x4E, 0x2D, 0x9E, 0xB5, 0x62, 0xFB, 0x94, 0x3E, 0x6A, 0x0E, 0x51, 0x10, 0x7A, 0x5D, 0x45, 0x32, 0xC6, 0x10, 0xEC, 0x30, 0x23, 0xF8, 0xD9, 0xB8, 0x93, 0x0F, 0x7E, 0xF6, 0x6B, 0xA1, 0x42, 0xAA, 0x44, 0xFE, 0x6E, 0x43, 0xA5, 0xD8, 0xE0, 0xB7, 0x52, 0x23, 0x9C, 0xD5, 0x9A, 0x1A, 0x45, 0xCF, 0x97, 0x1B, 0x31, 0x3C, 0x99, 0x1C, 0x5C, 0x8C, 0x5D, 0x8D, 0x5B, 0x8D, 0xD5, 0x7A, 0xD7, 0xC3, 0x6A, 0x6F, 0xE6, 0x00, 0xE7, 0x2E, 0x56, 0x71, 0x06, 0x10, 0x33, 0xFB, 0xE3, 0xCF, 0x55, 0x9A, 0x49, 0xA9, 0x0C, 0x3F, 0x5A, 0xDC, 0xE9, 0x6B, 0xC7, 0x88, 0xAC, 0x58, 0x16, 0x45, 0xED, 0x12, 0x1B, 0xCE, 0x32, 0x9F, 0xFB, 0x1F, 0x31, 0x7C, 0x22, 0x50, 0x7D, 0x59, 0xA2, 0xFF, 0xD1, 0xA4, 0x55, 0x51, 0x74, 0x70, 0x86, 0x8E, 0xC3, 0xEA, 0xEE, 0x6F, 0xCA, 0x63, 0xA3, 0x06, 0xF2, 0x1B, 0x18, 0x51, 0xCA, 0xEC, 0xB2, 0x20, 0x5B, 0x2B, 0xC2, 0x3A, 0xD4, 0xE5, 0x5E, 0x6D, 0x21, 0xE4, 0x40, 0xE2, 0x68, 0x29, 0xDC, 0xEA, 0x60, 0xB2, 0x9B, 0xF3, 0x63, 0xF7, 0x8F, 0xC7, 0x27, 0x97, 0xBC, 0x7A, 0x97, 0x78, 0x6A, 0x2F, 0x9C, 0x9D, 0x9C, 0xDC, 0xCE, 0x2B, 0x70, 0x5B, 0xEE, 0x13, 0x30, 0xD5, 0x5D, 0x38, 0xB6, 0x49, 0x55, 0x17, 0xA5, 0x1F, 0xD7, 0x4E, 0x24, 0x94, 0xAB, 0xBC, 0x6A, 0x47, 0x07, 0xED, 0x5A, 0x24, 0x76, 0x8C, 0x87, 0x4F, 0xB9, 0x13, 0xE1, 0xF2, 0x9B, 0xB3, 0x55, 0x84, 0x1A, 0x52, 0x7D, 0x83, 0x18, 0xEF, 0xFD, 0x38, 0xA1, 0xE1, 0x72, 0x74, 0x2C, 0x4A, 0xD9, 0x1F, 0x09, 0xF3, 0x5B, 0xC8, 0x00, 0xB9, 0xD4, 0x1D, 0x8F, 0x4B, 0xEE, 0x13, 0xB3, 0xC8, 0xFD, 0xF3, 0x9E, 0xCA, 0x79, 0x2B, 0xCF, 0x0B, 0xF7, 0xEF, 0x88, 0xD4, 0x8E, 0x88, 0x78, 0xA9, 0xB0, 0xFA, 0x34, 0xAC, 0xA8, 0x75, 0x60, 0xC8, 0x6A, 0xE9, 0x87, 0xE2, 0xA0, 0x5A, 0x4F, 0xE7, 0x58, 0xC7, 0x76, 0xFA, 0x8A, 0x49, 0x52, 0xFE, 0x64, 0xD8, 0x87, 0x04, 0xFF, 0x48, 0x82, 0xBB, 0x30, 0xF0, 0xC7, 0xBF, 0x44, 0x72, 0x22, 0xCD, 0x5F, 0xEE, 0x04, 0xF1, 0xB4, 0x92, 0xEF, 0x35, 0xC8, 0xF4, 0x30, 0xD2, 0x44, 0xE7, 0x37, 0xD4, 0x02, 0x98, 0x7A, 0xD1, 0x9B, 0x19, 0x0D, 0xF2, 0xFA, 0x18, 0x28, 0x91, 0x6E, 0x31, 0xC9, 0x2C, 0x9B, 0x8F, 0x52, 0xA5, 0xA4, 0xF2, 0xD2, 0x09, 0xB0, 0x23, 0x75, 0x62, 0x98, 0x03, 0x97, 0x75, 0x27, 0x45, 0xCB, 0x68, 0xD0, 0x6C, 0x58, 0xC4, 0xB9, 0x31, 0xBD, 0x42, 0xD5, 0x4C, 0x76, 0x8C, 0x18, 0x63, 0x64, 0x48, 0x71, 0xDC, 0xCF, 0xD6, 0xE4, 0x93, 0xFF, 0xAC, 0xCC, 0xB5, 0x7A, 0xDB, 0xB0, 0x3A, 0x97, 0x9E, 0xD9, 0xFC, 0xD6, 0x32, 0xBA, 0x27, 0x45, 0x5F, 0xB8, 0xC5, 0x78, 0xA2, 0x1E, 0x56, 0xEB, 0x7E, 0x0B, 0x9D, 0x1C, 0x90, 0x1C, 0xD2, 0x83, 0x81, 0x83, 0x9F, 0x62, 0x05, 0x13, 0x25, 0x45, 0x52, 0xDE, 0x0F, 0x2C, 0x2D, 0x38, 0x82, 0x34, 0xD4, 0x93, 0xA1, 0xC0, 0x7E, 0xA7, 0xAF, 0xC4, 0xEA, 0x15, 0xCD, 0x4C, 0x02, 0xAF, 0x73, 0xEF, 0xFD, 0x47, 0xF2, 0xA4, 0x90, 0xE3, 0x10, 0x11, 0x2C, 0xDD, 0xC5, 0xFF, 0xB5, 0x34, 0xCB, 0x02, 0x5A, 0xAD, 0xDA, 0xB9, 0x2C, 0xB5, 0x4E, 0x46, 0xF8, 0xA2, 0x84, 0xA2, 0xB1, 0x10, 0x87, 0xBA, 0x9A, 0xA3, 0xC7, 0x31, 0x51, 0x9F, 0xE9, 0xB2, 0x5B, 0x9C, 0x46, 0xFB, 0x53, 0x66, 0xA0, 0xAA, 0x54, 0x4E, 0x8B, 0x9A, 0xF3, 0xCF, 0xFC, 0x5E, 0xC4, 0x43, 0xD5, 0xD3, 0xFB, 0x4E, 0xB6, 0xCD, 0x03, 0x7B, 0xC7, 0xAA, 0xEB, 0x3E, 0x44, 0xF5, 0x8E, 0x6E, 0x10, 0x64, 0x9D, 0xE6, 0xC1, 0xA1, 0xCB, 0x3B, 0x10, 0x3B, 0x28, 0x78, 0x9F, 0x06, 0xAC, 0x82, 0xDB, 0x08, 0x36, 0x04, 0x70, 0x56, 0x66, 0x00, 0x7D, 0x3A, 0xAC, 0x3B, 0x24, 0x1E, 0x04, 0xAC, 0xCF, 0x7A, 0x2F, 0xCE, 0x71, 0xB1, 0x8F, 0x6B, 0xB0, 0x34, 0x3A, 0xF8, 0x6A, 0x42, 0x2E, 0x9B, 0xF9, 0xC8, 0xE0, 0x61, 0x57, 0x61, 0xC8, 0xE8, 0x8D, 0xDF, 0xE5, 0x9F, 0x67, 0x58, 0x15, 0xBB, 0x6C, 0x06, 0x38, 0x39, 0x9C, 0xB6, 0x2A, 0x08, 0x25, 0xAF, 0x3B, 0x1F, 0xED, 0xA2, 0xAE, 0xDD, 0xC2, 0x38, 0xA2, 0xC0, 0xD0, 0xDF, 0x2D, 0xCA, 0xDC, 0xCD, 0xE9, 0xF6, 0x09, 0x5D, 0xC0, 0x2D, 0x9B, 0xB5, 0x5E, 0xA1, 0xDD, 0x90, 0x1E, 0xEA, 0xC7, 0xA4, 0x72, 0x2E, 0x80, 0xA6, 0x72, 0x47, 0x18, 0x82, 0x64, 0x1B, 0x17, 0x10, 0xD5, 0x5A, 0x9E, 0x44, 0xE0, 0x53, 0x49, 0x61, 0xAB, 0x72, 0xF3, 0x28, 0x5E, 0xC3, 0x6A, 0x0E, 0xEC, 0x83, 0x98, 0x52, 0x6E, 0x0A, 0x02, 0xF1, 0x12, 0x85, 0xFF, 0x60, 0x50, 0x8E, 0x64, 0xE0, 0x74, 0x4F, 0xB4, 0x1A, 0xFB, 0x44, 0x30, 0x8E, 0x48, 0x49, 0xF3, 0x9F, 0xEF, 0x4F, 0x58, 0xB9, 0xE4, 0xAE, 0x46, 0x68, 0x8E, 0xBD, 0x61, 0x9F, 0xA5, 0x88, 0xC9, 0x76, 0xDA, 0xA9, 0x37, 0x8D, 0x48, 0x84, 0xD8, 0xC3, 0x52, 0x6B, 0x6D, 0xF2, 0x1A, 0xFC, 0xF2, 0x7E, 0x90, 0x48, 0xED, 0x2A, 0x88, 0x9B, 0x9E, 0x8A, 0xE9, 0x2B, 0x49, 0x04, 0x85, 0xAE, 0x52, 0x4E, 0xD7, 0x51, 0xED, 0x4C, 0x87, 0xDE, 0x2D, 0x49, 0xF3, 0x6A, 0xBF, 0x52, 0xF4, 0xF1, 0xD3, 0xC7, 0x99, 0xF8, 0x1D, 0x22, 0x9D, 0xD7, 0x21, 0xCE, 0x1D, 0x34, 0x1F, 0xA5, 0x8F, 0xA5, 0xD7, 0x1B, 0x7B, 0x03, 0x40, 0xFE, 0x5F, 0x78, 0x69, 0xC4, 0xCA, 0xAB, 0xCE, 0x7C, 0x58, 0xC3, 0x0C, 0xAA, 0x45, 0x9C, 0x96, 0xCD, 0x4A, 0xBA, 0xF9, 0x39, 0x04, 0xDD, 0x39, 0x2B, 0x7A, 0xBA, 0xBB, 0xDE, 0x25, 0xEF, 0x14, 0xA4, 0x4E, 0x39, 0x9D, 0x7C, 0x79, 0x85, 0x0B, 0xBF, 0x28, 0x0A, 0x9E, 0x15, 0x85, 0xFB, 0x19, 0x75, 0x36, 0x64, 0x86, 0x4F, 0x76, 0xAD, 0x2E, 0xA6, 0xAF, 0x8F, 0xD4, 0xDA, 0x22, 0xC0, 0x5E, 0x6E, 0xD0, 0x98, 0xBF, 0x60, 0x43, 0x9B, 0xF9, 0xCA, 0x7A, 0x60, 0xD2, 0x8A, 0xD8, 0xDC, 0x3C, 0x82, 0x26, 0x20, 0x65, 0x60, 0x5C, 0x03, 0x62, 0x75, 0x88, 0x60, 0x05, 0x7C, 0x3B, 0x88, 0x85, 0xF9, 0x6C, 0xDF, 0xE3, 0xAD, 0xCA, 0x40, 0x5F, 0xCD, 0x68, 0x3C, 0xC9, 0x9E, 0xA4, 0x73, 0x77, 0xCB, 0x62, 0xA2, 0xB1, 0x72, 0x9D, 0x52, 0xF0, 0x01, 0x5D, 0xF3, 0x28, 0x33, 0xBA, 0xC0, 0x08, 0xA1, 0xB0, 0xB0, 0x81, 0xCC, 0x7C, 0xC5, 0x09, 0x38, 0xA0, 0xB1, 0x08, 0x3C, 0x3C, 0x84, 0x79, 0xB6, 0x40, 0x57, 0x79, 0xAE, 0x7C, 0x54, 0xA3, 0x12, 0xFF, 0x8E, 0xF3, 0x4D, 0xDD, 0x05, 0xE1, 0x26, 0x0D, 0x30, 0xEB, 0xC5, 0x96, 0x2A, 0x9B, 0xAA, 0xAA, 0x05, 0x58, 0x12, 0x1D, 0x9F, 0x7C, 0x03, 0x82, 0xF5, 0xA3, 0xF2, 0x63, 0x7E, 0x5A, 0x7E, 0x6D, 0x5B, 0xAA, 0xF9, 0x84, 0x9F, 0xB1, 0x0A, 0xA1, 0x3F, 0xCD, 0x0C, 0xCA, 0x4A, 0xBF, 0x93, 0xE3, 0xBC, 0x1F, 0xB4, 0xC9, 0x53, 0xA7, 0x29, 0x53, 0x5B, 0x8E, 0x2E, 0x3D, 0x2C, 0x90, 0x2B, 0x77, 0x8A, 0xC5, 0x73, 0xC4, 0x18, 0x85, 0xA2, 0xC1, 0x9C, 0xAC, 0x58, 0xF7, 0x70, 0x92, 0x64, 0x4E, 0xA9, 0x2F, 0x82, 0xA2, 0xA7, 0xAE, 0x7D, 0x4E, 0x04, 0x6E, 0x2C, 0x20, 0xF1, 0x89, 0x9D, 0xDB, 0x67, 0x79, 0xA9, 0x35, 0x15, 0x24, 0x94, 0xF6, 0x28, 0xBC, 0x2F, 0x09, 0x0E, 0xDF, 0x12, 0x64, 0x94, 0x25, 0xB1, 0x1E, 0x8F, 0x56, 0x9A, 0x34, 0x6A, 0xC8, 0x4C, 0xDC, 0x86, 0xD3, 0x87, 0xC7, 0x1D, 0x86, 0xE4, 0xD7, 0x85, 0xD8, 0x3A, 0x30, 0xF9, 0xA4, 0xE0, 0x6C, 0x57, 0xC4, 0x30, 0x15, 0xB3, 0x40, 0x44, 0xF4, 0xAB, 0x7A, 0xA7, 0x79, 0xD3, 0xBA, 0x6A, 0x0A, 0x65, 0xB8, 0x06, 0x16, 0xF8, 0x8C, 0x17, 0x46, 0x57, 0xC2, 0x14, 0x33, 0xD6, 0xDB, 0xC5, 0x4B, 0xBF, 0x3A, 0x9C, 0x47, 0xD8, 0xDC, 0xA2, 0x30, 0x53, 0xC1, 0xED, 0xD4, 0xA4, 0x6D, 0x55, 0x46, 0x7E, 0x18, 0x11, 0xCB, 0x6C, 0x0E, 0x29, 0x03, 0xF6, 0x50, 0x1B, 0x39, 0x10, 0x03, 0xE0, 0x82, 0x85, 0x5B, 0x88, 0x85, 0x9E, 0x4D, 0x88, 0xBB, 0x64, 0xB5, 0xEE, 0xE5, 0x9E, 0x7D, 0x53, 0xFB, 0xA3, 0x24, 0xA9, 0xCD, 0x67, 0x70, 0xA2, 0xEE, 0xEF, 0xFF, 0xCF, 0x75, 0x68, 0xEC, 0x38, 0x49, 0x01, 0x1F, 0x05, 0x01, 0x2E, 0x8B, 0xA8, 0xD3, 0x37, 0xAF, 0xAC, 0xC6, 0x30, 0x96, 0x35, 0x9A, 0x34, 0x5C, 0x1F, 0xAA, 0x93, 0x9C, 0xB6, 0x3D, 0x8E, 0x4B, 0xE6, 0xDF, 0xC4, 0x53, 0x72, 0x90, 0xFC, 0x63, 0x31, 0xD8, 0x4E, 0xE0, 0x85, 0x14, 0xD1, 0xD6, 0x38, 0xB9, 0xB3, 0xAF, 0x7E, 0x08, 0x8B, 0xC8, 0x4B, 0x47, 0xC9, 0x2D, 0x46, 0x51, 0xB4, 0x1F, 0x79, 0x42, 0xBB, 0xD6, 0xC1, 0x06, 0xDB, 0x8E, 0x86, 0xBE, 0xA4, 0x59, 0xFD, 0x72, 0x26, 0x6F, 0x9D, 0xC5, 0x18, 0x05, 0xD8, 0x0F, 0x09, 0x02, 0xB6, 0x5F, 0xF6, 0xEA, 0x22, 0xD8, 0x66, 0x1A, 0xC5, 0xAE, 0x7A, 0xD5, 0xB1, 0x24, 0x6F, 0x76, 0x81, 0x23, 0x03, 0xFB, 0x5B, 0x9E, 0x72, 0x0D, 0x74, 0xE0, 0x9C, 0x79, 0x5B, 0xE4, 0x58, 0x5A, 0x3B, 0x3E, 0x12, 0xBA, 0xEF, 0x13, 0x8F, 0xA9, 0x0F, 0x56, 0x89, 0xFF, 0x65, 0x8E, 0x6E, 0x62, 0x3C, 0x48, 0xD1, 0x79, 0x10, 0x4A, 0xF1, 0x0F, 0x40, 0xC2, 0x8A, 0x53, 0x19, 0xED, 0x2B, 0x21, 0xEA, 0x9F, 0xF4, 0xFF, 0xE9, 0x44, 0x96, 0xE9, 0xA7, 0x54, 0x13, 0xF1, 0xF5, 0x7E, 0x50, 0xAD, 0x90, 0x6A, 0xC9, 0x05, 0x42, 0x97, 0x11, 0x2D, 0x68, 0x69, 0xB1, 0x03, 0x82, 0xE7, 0xCE, 0xC0, 0x7D, 0xDE, 0x23, 0x8D, 0xD0, 0xD5, 0x71, 0xAE, 0xFE, 0xD4, 0x0B, 0x08, 0xE8, 0x8D, 0xAB, 0x76, 0x65, 0x58, 0xE7, 0xFE, 0x23, 0x08, 0x6A, 0xCE, 0xFB, 0x58, 0x40, 0x4A, 0xF0, 0xD9, 0x92, 0xC4, 0x53, 0xE7, 0x3C, 0x1E, 0x40, 0xC7, 0x51, 0x98, 0xF8, 0xA5, 0xED, 0x3A, 0x83, 0xB4, 0xA7, 0xE0, 0xB8, 0x02, 0x8A, 0x43, 0x50, 0x9A, 0x5F, 0xE2, 0xF7, 0x83, 0x3A, 0x47, 0xCD, 0x21, 0xCB, 0xBE, 0xAC, 0xDB, 0x61, 0x9E, 0xE4, 0xAF, 0xF2, 0xD9, 0xC2, 0x84, 0xDD, 0x1C, 0xCF, 0x1B, 0x03, 0x42, 0xC3, 0xDC, 0x9C, 0x0D, 0x3D, 0xD1, 0x3A, 0xCB, 0x8F, 0xC0, 0x82, 0x3C, 0xEA, 0xB1, 0xF1, 0x46, 0x76, 0x4A, 0x63, 0xF3, 0x4E, 0xA5, 0x37, 0x17, 0x61, 0xCB, 0xF1, 0x75, 0xBB, 0xBD, 0xED, 0x76, 0x05, 0x6E, 0xB8, 0xF6, 0x2F, 0x84, 0xC8, 0xA6, 0x9A, 0x2B, 0xCA, 0x0C, 0x50, 0x69, 0xA3, 0x8E, 0x70, 0x7E, 0x2B, 0x24, 0xD0, 0xEE, 0x35, 0x4D, 0xB8, 0xF6, 0x67, 0xBD, 0xC4, 0x4B, 0x94, 0x47, 0x77, 0xCC, 0x86, 0xAF, 0xEC, 0xD3, 0x38, 0x7D, 0x2C, 0x67, 0xBE, 0x10, 0x3D, 0xB4, 0x37, 0x41, 0x18, 0x28, 0x47, 0xB2, 0xA7, 0x7D, 0x83, 0x34, 0x07, 0x8C, 0x74, 0x9C, 0xF1, 0x0F, 0x56, 0xBB, 0xAB, 0xAC, 0x64, 0x5D, 0x28, 0x6B, 0x1B, 0x36, 0xBE, 0xF9, 0x19, 0xA5, 0x3D, 0x97, 0x84, 0xE7, 0xE3, 0xD9, 0x03, 0xA8, 0x75, 0xA5, 0xFE, 0x42, 0x64, 0xD8, 0x48, 0x9C, 0x0B, 0x4B, 0x83, 0xC9, 0xF6, 0xA8, 0x46, 0x16, 0x87, 0x90, 0x91, 0xC8, 0x90, 0xEB, 0x93, 0x2B, 0x45, 0x8F, 0xB5, 0x37, 0x89, 0xE3, 0x42, 0x4B, 0x73, 0xF1, 0x98, 0x5B, 0xA5, 0x96, 0x09, 0xB0, 0xF7, 0xDC, 0xE1, 0xC1, 0x4A, 0x6F, 0x04, 0x1D, 0xB0, 0x76, 0x18, 0x50, 0x64, 0x27, 0x9C, 0x31, 0xEF, 0xA1, 0x62, 0x43, 0x2A, 0x3B, 0xC4, 0xDD, 0x7C, 0x46, 0x34, 0xCE, 0xFD, 0xA0, 0x21, 0xC2, 0x6C, 0x96, 0x9A, 0xA5, 0x56, 0x90, 0x83, 0xE4, 0x73, 0xCF, 0x2B, 0x2D, 0x5F, 0x8E, 0x09, 0x77, 0x73, 0xC7, 0x8C, 0x7F, 0x85, 0x8E, 0xDE, 0x8C, 0x05, 0x1F, 0x95, 0xC7, 0x29, 0x30, 0xF0, 0x9A, 0x1C, 0x21, 0xBC, 0x2D, 0x1B, 0x4C, 0xE6, 0xF3, 0x06, 0x63, 0xC5, 0x10, 0x7F, 0xFE, 0xD2, 0x80, 0x2C, 0xC4, 0xF4, 0x7C, 0xFC, 0xD5, 0x74, 0x74, 0x97, 0x7A, 0x83, 0x7B, 0x89, 0xF9, 0x6D, 0xD5, 0xCA, 0xB6, 0x25, 0xEC, 0xA1, 0x09, 0x8D, 0x34, 0xBD, 0xD0, 0x14, 0xE3, 0x84, 0x99, 0x2A, 0x25, 0x8C, 0x04, 0x17, 0xED, 0xB7, 0xD2, 0xB9, 0xD1, 0xB6, 0x0A, 0xBB, 0x5C, 0x3D, 0x27, 0x82, 0xFD, 0xC9, 0x55, 0x74, 0x5B, 0xB2, 0x82, 0xB7, 0x2E, 0x22, 0xFA, 0x2D, 0x45, 0xF7, 0xF1, 0xA9, 0x49, 0x75, 0xE2, 0xE7, 0xC6, 0x2C, 0x8F, 0x1E, 0x6C, 0x32, 0x75, 0x59, 0x0E, 0x0E, 0xCA, 0xB7, 0x77, 0x49, 0xF2, 0x64, 0xC0, 0xD5, 0xD4, 0x63, 0x28, 0xA9, 0x92, 0x5B, 0x49, 0x6D, 0xF7, 0xEB, 0xCC, 0x6D, 0x4B, 0xA7, 0x4E, 0xBB, 0xF1, 0x61, 0xAE, 0x69, 0x15, 0xA5, 0x6D, 0x69, 0x56, 0x05, 0x90, 0x22, 0x9A, 0x3E, 0x82, 0x1E, 0x28, 0x10, 0x04, 0x9A, 0xF0, 0xDD, 0xB9, 0x49, 0x18, 0x16, 0x82, 0x48, 0x37, 0xF4, 0x38, 0x90, 0x75, 0xD3, 0x34, 0x11, 0x09, 0xC6, 0xB3, 0x37, 0x15, 0x87, 0x48, 0x02, 0x10, 0x69, 0x6B, 0xEC, 0x54, 0xB4, 0x42, 0xD3, 0xDE, 0x10, 0x22, 0x01, 0xA8, 0xF9, 0x92, 0x70, 0x2F, 0x1D, 0xAE, 0xD5, 0x43, 0xB9, 0xB5, 0xB3, 0xD4, 0x42, 0xBA, 0xAA, 0x2F, 0x13, 0x41, 0x19, 0x1B, 0x9F, 0x7D, 0xF4, 0x10, 0x38, 0xEB, 0xC7, 0x7C, 0x45, 0xA6, 0x28, 0xD9, 0xC9, 0xEB, 0xCF, 0x02, 0x9E, 0x06, 0xC9, 0x68, 0x97, 0x56, 0xB3, 0x0D, 0xD8, 0x7F, 0xDD, 0x73, 0x45, 0x3D, 0xEA, 0x33, 0x25, 0x70, 0xB3, 0x75, 0x1F, 0xBE, 0xB3, 0x35, 0x31, 0x92, 0x55, 0x8B, 0xCC, 0x2C, 0x29, 0xA1, 0xF6, 0x73, 0x34, 0xF2, 0x89, 0x42, 0x05, 0xB9, 0x5E, 0x03, 0xAC, 0xD0, 0xA6, 0x12, 0x92, 0x11, 0x56, 0xFF, 0xF6, 0x09, 0xB7, 0x02, 0xBC, 0xF5, 0xA0, 0x2D, 0xF0, 0x84, 0xAC, 0xD3, 0x91, 0x11, 0x93, 0xD8, 0xDE, 0x53, 0x25, 0x91, 0xB2, 0x43, 0x4E, 0x8D, 0x5F, 0x5A, 0x2F, 0x15, 0x15, 0x61, 0x70, 0x7A, 0x8E, 0x0A, 0x13, 0xE0, 0xE4, 0x6D, 0x56, 0xBC, 0xBD, 0xFC, 0xA3, 0x98, 0xE0, 0xBB, 0x6A, 0x1B, 0x70, 0xEB, 0x14, 0x81, 0x55, 0x51, 0xD2, 0x49, 0xEB, 0x10, 0xB3, 0xCE, 0x77, 0x05, 0xA3, 0xE9, 0xF2, 0x4A, 0x19, 0x77, 0x1A, 0xE4, 0x59, 0xCF, 0x64, 0xCE, 0xBB, 0xE4, 0x67, 0xA4, 0x72, 0xB0, 0x5D, 0x78, 0x21, 0xA6, 0x09, 0x09, 0x25, 0xDA, 0xCA, 0x4B, 0xA1, 0x20, 0x44, 0xA3, 0x64, 0xC7, 0x2F, 0x04, 0xB3, 0xF9, 0x6C, 0xA9, 0x9E, 0x03, 0xEB, 0xA3, 0xCE, 0xCF, 0x72, 0xC8, 0xE5, 0xBC, 0xD0, 0x1E, 0xB3, 0x98, 0xB1, 0x65, 0x19, 0x4A, 0x17, 0xE5, 0x01, 0xE9, 0x81, 0x23, 0x83, 0xF1, 0x37, 0x8A, 0x0F, 0xD1, 0xC2, 0xFD, 0x28, 0xB3, 0xDF, 0x0A, 0x1E, 0xC3, 0x27, 0x4D, 0xE2, 0x03, 0x67, 0x77, 0xD2, 0x64, 0x26, 0x5C, 0xAA, 0x3E, 0x70, 0xC3, 0xB3, 0x79, 0xA0, 0x1D, 0xEF, 0xCA, 0x31, 0x16, 0x59, 0x92, 0xC0, 0xFF, 0x77, 0x30, 0x11, 0xB2, 0xFB, 0x48, 0xDD, 0x70, 0x74, 0x06, 0x03, 0x1B, 0xFB, 0x6B, 0xD0, 0x6B, 0x7C, 0x92, 0x71, 0x38, 0xF0, 0xC6, 0x89, 0x4E, 0x58, 0x64, 0x3B, 0xF0, 0x97, 0x46, 0xD5, 0x4C, 0xB6, 0x9A, 0x8A, 0x0F, 0xEF, 0x3A, 0x47, 0x35, 0x2E, 0xE8, 0xBC, 0xFF, 0x12, 0xA8, 0xC9, 0x22, 0x2C, 0xAC, 0x1D, 0x53, 0xFB, 0x74, 0x3F, 0xC9, 0x46, 0x47, 0x59, 0xC2, 0x39, 0xA7, 0xB6, 0x62, 0xD6, 0x29, 0x0D, 0x71, 0x26, 0xFE, 0x08, 0x24, 0xAD, 0xDA, 0xD2, 0x6A, 0x2E, 0xD8, 0xC4, 0x5E, 0xD9, 0x1B, 0x4B, 0xAC, 0x9A, 0xD2, 0xE3, 0x4D, 0x5A, 0xC1, 0xF1, 0x42, 0xE2, 0xDC, 0x8D, 0x33, 0x8C, 0x64, 0xDE, 0x86, 0xC5, 0x21, 0xC8, 0x5A, 0xF8, 0x03, 0xD5, 0xF5, 0x15, 0x41, 0x49, 0x96, 0xA3, 0xC4, 0x02, 0x4F, 0x14, 0xF8, 0xF9, 0x19, 0x5F, 0xC6, 0xA4, 0x86, 0x21, 0x4F, 0xD4, 0x9C, 0xC4, 0x71, 0x63, 0xE5, 0xFC, 0x78, 0x38, 0xDB, 0xE6, 0x24, 0x24, 0x22, 0x92, 0x7C, 0xA6, 0x1A, 0x9F, 0xE4, 0xF7, 0x8A, 0x81, 0xB9, 0xD2, 0x64, 0x83, 0xBF, 0xF2, 0xB3, 0x74, 0xCC, 0xE0, 0x55, 0x77, 0xBD, 0x1B, 0x1A, 0x84, 0x82, 0x6C, 0x6D, 0x6A, 0x00, 0x4D, 0x80, 0x5F, 0x23, 0x36, 0x24, 0xB9, 0x15, 0xB6, 0x7E, 0x93, 0x71, 0xB3, 0xE3, 0x96, 0x57, 0xD8, 0xED, 0x9A, 0x02, 0x70, 0x2D, 0xED, 0x1C, 0xC3, 0x76, 0x2D, 0x48, 0xDB, 0xA5, 0x8B, 0x23, 0x44, 0x17, 0x7D, 0x75, 0x32, 0x3A, 0xA5, 0x6C, 0xA3, 0x01, 0x4F, 0xD3, 0xCE, 0x15, 0x28, 0x1C, 0xE2, 0x47, 0x9E, 0x56, 0xC6, 0x0F, 0xDD, 0xCA, 0x66, 0x52, 0x91, 0x9F, 0x4E, 0xA4, 0x12, 0x30, 0x0D, 0x33, 0xC2, 0xC9, 0xFA, 0xD9, 0x2D, 0xEC, 0x6E, 0x91, 0x23, 0xD3, 0xC6, 0x55, 0x3B, 0xA9, 0xC1, 0x99, 0x77, 0xD2, 0x9F, 0x59, 0x6D, 0x04, 0x21, 0x64, 0x6F, 0xDF, 0x2B, 0x6E, 0x17, 0x00, 0xF4, 0x09, 0xB4, 0x2A, 0xFC, 0xA2, 0xA4, 0x39, 0xE0, 0x77, 0x2F, 0xB9, 0x33, 0x2B, 0x76, 0xFB, 0x5F, 0xAA, 0x73, 0xBE, 0x10, 0xEA, 0x57, 0xC0, 0xAD, 0x40, 0x24, 0x19, 0x83, 0xD7, 0x9D, 0x93, 0xC6, 0x07, 0x05, 0xF4, 0xBD, 0xC6, 0xA7, 0x8F, 0xE9, 0xC6, 0x24, 0x9C, 0x10, 0x5E, 0x81, 0x6A, 0x87, 0x94, 0xAF, 0x0C, 0xA0, 0x61, 0x68, 0xBA, 0x63, 0x69, 0xFA, 0x04, 0x31, 0x3A, 0x45, 0xCE, 0xC4, 0x90, 0x3B, 0xFA, 0x72, 0x18, 0x8F, 0xDA, 0x0C, 0xBA, 0xAB, 0x40, 0xB1, 0xEF, 0x61, 0xC0, 0x04, 0x2A, 0x95, 0x79, 0xF7, 0xB8, 0x2B, 0xBB, 0x19, 0xD4, 0x5E, 0xA9, 0x2D, 0x22, 0xF1, 0x4E, 0xAA, 0xCA, 0xE8, 0x95, 0x3A, 0xF4, 0x8B, 0xC6, 0x88, 0xEA, 0x98, 0x22, 0xF1, 0x43, 0x0B, 0x46, 0xC1, 0xAB, 0x0A, 0x5D, 0xB6, 0x3B, 0x99, 0x78, 0x59, 0x1F, 0x15, 0xB8, 0x5D, 0xC0, 0xFC, 0x86, 0xD2, 0x3F, 0x94, 0xC0, 0x8E, 0x13, 0xEF, 0xF8, 0x2E, 0x69, 0xED, 0xD0, 0x31, 0x8E, 0xFD, 0x9D, 0xE1, 0x6A, 0x58, 0x08, 0x58, 0x7E, 0xC5, 0x64, 0xB7, 0x43, 0x81, 0xF5, 0xBE, 0xBF, 0x77, 0xB4, 0xC3, 0x6C, 0xAC, 0xC7, 0x67, 0x88, 0xC6, 0x5A, 0xCA, 0xFA, 0xAC, 0xC6, 0x36, 0xBA, 0x5E, 0x43, 0x1F, 0xB5, 0x87, 0x38, 0x6F, 0x9D, 0x71, 0xA2, 0x57, 0xF0, 0xCD, 0x17, 0xA4, 0xA4, 0x81, 0xDD, 0x17, 0x5D, 0xCA, 0xAF, 0xF4, 0xFF, 0x48, 0xBA, 0x4B, 0x12, 0xBD, 0x6E, 0xAE, 0xD0, 0x76, 0x35, 0x94, 0x79, 0x7E, 0x97, 0xCB, 0x43, 0xA0, 0xCE, 0xFF, 0x95, 0x12, 0x88, 0x3D, 0xC3, 0x43, 0xDF, 0x0B, 0x2D, 0xF1, 0x2E, 0x02, 0x64, 0x23, 0xC4, 0xAA, 0x6A, 0x9A, 0x3F, 0xD7, 0x8D, 0xAA, 0x66, 0x86, 0xBC, 0xC8, 0x9A, 0xBC, 0xE8, 0xD7, 0x89, 0x21, 0xC6, 0x55, 0xFF, 0x8F, 0x4C, 0x47, 0x68, 0x20, 0x21, 0xAA, 0x1E, 0x0F, 0x96, 0xD6, 0x7D, 0x75, 0xC3, 0xEA, 0xED, 0x2B, 0xA4, 0x59, 0xF3, 0xC8, 0x89, 0x9D, 0xA6, 0xD4, 0x8A, 0x64, 0x91, 0x93, 0x19, 0x40, 0x9E, 0xC8, 0x14, 0x0D, 0x75, 0x78, 0x66, 0x7B, 0x5E, 0x18, 0x1A, 0x29, 0x03, 0xCC, 0xF7, 0x88, 0x12, 0x38, 0x3A, 0x07, 0x70, 0xEB, 0xB2, 0xA2, 0xE5, 0x08, 0x62, 0x85, 0x00, 0x44, 0xBF, 0x89, 0x2C, 0x79, 0x11, 0x8F, 0xD2, 0x85, 0xE6, 0xB7, 0x88, 0xF0, 0xA1, 0x08, 0x07, 0x70, 0xFD, 0xC3, 0xB2, 0x31, 0x54, 0xA2, 0x84, 0xE7, 0x5D, 0x90, 0x79, 0x26, 0xEB, 0xD4, 0xC5, 0xA5, 0xC5, 0x40, 0x23, 0xA3, 0xE7, 0x13, 0x01, 0x9E, 0xA3, 0xEE, 0x9B, 0xB8, 0xF6, 0xDE, 0x3E, 0x5B, 0x7D, 0x92, 0xA5, 0xDD, 0x2A, 0x3D, 0x0B, 0x31, 0xAB, 0x19, 0x65, 0xD2, 0xD1, 0x52, 0xED, 0xD3, 0x0B, 0x20, 0xF6, 0xC9, 0x25, 0x55, 0xB6, 0xFC, 0x02, 0x6E, 0xC4, 0x7C, 0xB5, 0x66, 0xB3, 0xF1, 0xE8, 0x27, 0x4A, 0xD1, 0x69, 0xB4, 0x61, 0x5D, 0x0F, 0x1E, 0x4A, 0xEE, 0xC9, 0xBC, 0x46, 0xF6, 0x1B, 0xA9, 0xC9, 0x41, 0x82, 0xF4, 0x89, 0x2D, 0xB0, 0x12, 0xAC, 0x53, 0xF5, 0x7A, 0xA1, 0x0F, 0x45, 0x3A, 0x49, 0x74, 0xA2, 0xB1, 0x0F, 0xFE, 0xC1, 0xAE, 0xDD, 0xCC, 0x96, 0x06, 0xDE, 0x8E, 0x8E, 0x8E, 0x4C, 0xE4, 0xD6, 0xF2, 0x4F, 0x96, 0x32, 0x6F, 0xC4, 0x44, 0xCC, 0xC0, 0x69, 0x58, 0xDE, 0x9D, 0x2F, 0x2E, 0xC4, 0x86, 0x36, 0xC3, 0xE4, 0xE7, 0xE8, 0x34, 0xB7, 0x8C, 0xDF, 0xC9, 0x5F, 0x98, 0x94, 0x9B, 0x93, 0x4F, 0xFB, 0xF4, 0xD6, 0x57, 0xFB, 0x05, 0xA3, 0x73, 0x78, 0xF8, 0xD6, 0xD0, 0x6F, 0x3E, 0x1A, 0x7F, 0x0F, 0x59, 0x89, 0xF0, 0xCD, 0x57, 0xA9, 0xE0, 0xB5, 0x68, 0x4A, 0x3B, 0xEE, 0x46, 0x49, 0x00, 0xD4, 0x4D, 0x0C, 0xA8, 0xE3, 0xFE, 0xCC, 0x4A, 0x94, 0x34, 0x90, 0xAE, 0x99, 0x71, 0x7F, 0xA6, 0x19, 0x72, 0x03, 0xE6, 0x96, 0x61, 0x50, 0x23, 0x18, 0xC6, 0x61, 0x1D, 0x26, 0x46, 0x1D, 0x27, 0x53, 0x67, 0xED, 0x5F, 0x66, 0xDB, 0xA5, 0x18, 0xE4, 0xDE, 0xC9, 0x5F, 0xC0, 0xED, 0xF9, 0xAF, 0x9B, 0xE0, 0x02, 0x73, 0x50, 0x0D, 0xFA, 0x1C, 0xC3, 0xE8, 0xE5, 0x94, 0x4C, 0x55, 0xFE, 0x11, 0xA5, 0x12, 0xBB, 0xC0, 0x47, 0x5C, 0xCB, 0x86, 0xE4, 0x2F, 0x37, 0x43, 0x18, 0x3D, 0xB6, 0x54, 0x85, 0xAD, 0x9C, 0x76, 0xD5, 0x16, 0x8F, 0x9B, 0xC8, 0x8A, 0xB9, 0xB6, 0xF8, 0x13, 0x2B, 0xD2, 0x25, 0xDB, 0xD6, 0xDF, 0x9D, 0xF2, 0x6A, 0xD7, 0xA5, 0xF2, 0x66, 0x2D, 0x75, 0x58, 0xC9, 0x9D, 0x8F, 0x8F, 0xD9, 0x12, 0x04, 0xA9, 0x78, 0xBB, 0x48, 0x22, 0xE4, 0xC5, 0xB0, 0x9F, 0xD6, 0xC4, 0x3C, 0x63, 0xD0, 0xF5, 0xDC, 0x37, 0x7C, 0xA2, 0xAA, 0x40, 0x61, 0x59, 0x2E, 0x63, 0x49, 0x3E, 0x3C, 0xDE, 0x00, 0x44, 0x99, 0xFC, 0x13, 0x65, 0x0A, 0x3A, 0xA0, 0x2F, 0x35, 0xBE, 0x27, 0x98, 0x14, 0x1C, 0x4E, 0x20, 0x96, 0x43, 0x21, 0xE2, 0xC7, 0x11, 0x41, 0x9E, 0x22, 0xF0, 0xCC, 0x41, 0x85, 0xC3, 0x47, 0x85, 0x0F, 0x5E, 0x86, 0x5A, 0xE5, 0x0F, 0xB2, 0xEC, 0x05, 0x40, 0x16, 0xDE, 0xC5, 0x59, 0x6A, 0xAA, 0x4A, 0x09, 0xB1, 0xA5, 0x06, 0x30, 0x51, 0xD2, 0x87, 0x21, 0xD9, 0x95, 0x32, 0x55, 0x62, 0x68, 0x4C, 0xD0, 0x00, 0x36, 0x04, 0x7F, 0x59, 0xAA, 0x86, 0xAC, 0x74, 0x0B, 0xE3, 0x0C, 0x83, 0x14, 0xF8, 0xDB, 0x05, 0x6C, 0x75, 0x07, 0x92, 0x43, 0x15, 0x93, 0xEE, 0x51, 0x6C, 0x10, 0x55, 0x14, 0xEA, 0xB6, 0x37, 0x73, 0x27, 0x5B, 0x02, 0x8A, 0x51, 0xB6, 0x08, 0xA7, 0x42, 0x03, 0x0B, 0x53, 0xC7, 0x71, 0xCB, 0xDE, 0xFC, 0x80, 0x86, 0xBE, 0xB9, 0x49, 0x1B, 0x3F, 0x33, 0x4E, 0x0B, 0xD8, 0xFB, 0xBF, 0xAD, 0xFA, 0x0C, 0x3A, 0xC8, 0x8C, 0x0D, 0xB6, 0x7D, 0xB4, 0xDD, 0xCA, 0x69, 0x51, 0xF3, 0x4E, 0xE2, 0x81, 0x6B, 0x8D, 0x13, 0x9F, 0x45, 0x69, 0x53, 0xED, 0xBC, 0x74, 0x86, 0xD7, 0xB8, 0x9C, 0x35, 0x73, 0x5F, 0x76, 0x17, 0x07, 0x67, 0x37, 0x4C, 0x86, 0xAA, 0xC4, 0x24, 0x79, 0x9D, 0x10, 0x98, 0xC6, 0xCE, 0x56, 0x7C, 0x09, 0xE5, 0x0E, 0x98, 0x36, 0x37, 0x84, 0xA1, 0xB7, 0x4E, 0xDF, 0xC5, 0x51, 0x26, 0xD7, 0x61, 0x98, 0xE1, 0xE3, 0x9A, 0xB0, 0xF2, 0xFD, 0xEB, 0x32, 0xC1, 0x6F, 0x4F, 0xB6, 0xDF, 0x5C, 0xA1, 0x47, 0xC9, 0xBF, 0x23, 0x0D, 0x37, 0x1D, 0x39, 0x28, 0xE5, 0xC6, 0x9C, 0x9A, 0xFE, 0x7F, 0xC0, 0xF5, 0xDE, 0x1A, 0x6A, 0x08, 0xD8, 0x22, 0x9E, 0x0C, 0x03, 0xE5, 0xED, 0x6D, 0x49, 0x24, 0x05, 0x80, 0x13, 0x54, 0xD7, 0xE7, 0x40, 0xF5, 0x5D, 0x0D, 0xA6, 0x16, 0x85, 0xD6, 0x85, 0x7C, 0xD7, 0x05, 0xE7, 0xA0, 0x62, 0x45, 0xAE, 0xDA, 0x3E, 0x68, 0x87, 0x7A, 0xF6, 0x48, 0x5E, 0xE0, 0x14, 0x54, 0x93, 0x98, 0x83, 0x64, 0x7E, 0x84, 0xEB, 0x3F, 0xCD, 0x7F, 0x26, 0x75, 0x86, 0x98, 0xA7, 0xF5, 0x5A, 0x7F, 0x94, 0x47, 0xF5, 0x02, 0xF0, 0xA5, 0x7D, 0xDD, 0xF6, 0xCE, 0x16, 0x6B, 0x36, 0xBF, 0xC6, 0xD8, 0x15, 0x93, 0xC2, 0x3A, 0x93, 0x82, 0x9F, 0xAF, 0x72, 0x12, 0xA2, 0xF8, 0x5D, 0xCC, 0x5E, 0x4D, 0xFB, 0x12, 0x66, 0x2E, 0x9E, 0x3C, 0x7A, 0x04, 0xEC, 0xE2, 0x32, 0xFC, 0x2F, 0xAF, 0xF9, 0x2E, 0x96, 0x63, 0x96, 0xEF, 0xE6, 0x7F, 0x57, 0x19, 0x54, 0x0C, 0x8B, 0x31, 0x63, 0x97, 0xB1, 0x6A, 0x84, 0xEC, 0x3A, 0xA2, 0x7A, 0xC0, 0x78, 0x4F, 0x2A, 0x78, 0x94, 0xDB, 0x76, 0x7D, 0xBE, 0xE6, 0xBF, 0xB9, 0x0E, 0xFC, 0x38, 0x1C, 0x5F, 0x90, 0x71, 0xC8, 0xC4, 0x77, 0xE9, 0x12, 0x8E, 0x29, 0xAC, 0x6F, 0x78, 0xEA, 0x43, 0xF6, 0xC4, 0x98, 0xBB, 0x79, 0xEE, 0x90, 0xD7, 0x80, 0x6A, 0x80, 0x0A, 0x7D, 0xC9, 0xF6, 0xA6, 0x99, 0xD8, 0xB5, 0xEA, 0x5C, 0x24, 0x05, 0xF2, 0x36, 0xCF, 0x59, 0xC9, 0x3E, 0xC6, 0x1F, 0x53, 0x38, 0x3E, 0x46, 0x13, 0x5F, 0x78, 0x5C, 0xC1, 0x92, 0x47, 0xFD, 0xE9, 0x95, 0x90, 0xCC, 0xD6, 0xB0, 0xB9, 0x9B, 0x3E, 0xEE, 0xCE, 0xE3, 0x70, 0x28, 0x55, 0x57, 0xE3, 0x25, 0xA3, 0x06, 0x81, 0x98, 0xAC, 0x16, 0x33, 0xE7, 0x69, 0x2F, 0x2A, 0xD1, 0xB9, 0x1D, 0x15, 0xA8, 0x5E, 0xD2, 0xB2, 0x17, 0xA6, 0xFC, 0xEB, 0x7F, 0xA9, 0x28, 0xC1, 0x6D, 0x47, 0x7F, 0x1F, 0x71, 0x8E, 0x4E, 0xD6, 0x08, 0xA2, 0x22, 0x58, 0x97, 0xB9, 0xD0, 0x12, 0xFA, 0xF6, 0x42, 0x21, 0x75, 0xA1, 0x63, 0xF3, 0x6B, 0x6B, 0x84, 0x7F, 0xAE, 0xA6, 0x50, 0xEC, 0x5B, 0x9E, 0x88, 0xB2, 0x58, 0x3E, 0x0D, 0x2C, 0x10, 0xBD, 0x53, 0xB0, 0xF2, 0x0E, 0x1D, 0xA0, 0x31, 0x66, 0x39, 0x90, 0x0A, 0x9D, 0x27, 0xB1, 0xFC, 0x4F, 0xA6, 0xB6, 0x17, 0x75, 0x9B, 0xDD, 0x18, 0xBC, 0x4A, 0x08, 0xF0, 0x84, 0xCE, 0x06, 0x6F, 0x9C, 0xFC, 0x16, 0xE1, 0xD0, 0xC9, 0x55, 0xB8, 0xF5, 0xA5, 0x9F, 0xB5, 0x2F, 0x76, 0xBF, 0xA6, 0x9A, 0x49, 0x51, 0x55, 0x9D, 0x91, 0x2A, 0x9C, 0x61, 0x93, 0x7A, 0xEF, 0x8D, 0x4C, 0x28, 0xF9, 0xCE, 0x9D, 0xD9, 0x49, 0x55, 0x88, 0x56, 0x43, 0x4D, 0xC4, 0x85, 0x6C, 0x2F, 0x16, 0xA1, 0xB4, 0xDC, 0x7E, 0xF2, 0xF5, 0x76, 0x60, 0xED, 0xD5, 0x24, 0x69, 0xFD, 0xE1, 0x4A, 0x81, 0x5F, 0x3C, 0x18, 0x03, 0xE7, 0x2E, 0x2C, 0x6F, 0x89, 0xB7, 0x41, 0x2B, 0x46, 0xEE, 0xEF, 0xE6, 0x2B, 0xFD, 0x1A, 0x9D, 0x37, 0xB9, 0x9D, 0x9E, 0x20, 0xFD, 0x31, 0x5C, 0xA2, 0x9F, 0x63, 0x69, 0xA9, 0xCA, 0x58, 0x97, 0xF3, 0x43, 0x29, 0x88, 0x4C, 0x18, 0xE0, 0xDF, 0x76, 0x40, 0x91, 0x6F, 0x10, 0x42, 0x29, 0xE7, 0xA5, 0xF1, 0xDE, 0x14, 0x5C, 0x80, 0x25, 0x2C, 0x65, 0x62, 0xCB, 0x80, 0x92, 0x2F, 0x5C, 0x7F, 0xF7, 0xEF, 0x79, 0xBF, 0x31, 0xD9, 0x8B, 0x79, 0x13, 0x43, 0x54, 0xCF, 0x2B, 0x12, 0x32, 0x99, 0xF8, 0x88, 0x8F, 0xCC, 0xA6, 0x12, 0xFA, 0xB2, 0xF7, 0x50, 0xB3, 0x86, 0x1A, 0x1E, 0x1F, 0x76, 0x89, 0x31, 0x3C, 0xED, 0xD1, 0x3E, 0xC5, 0xCA, 0x5A, 0xA0, 0x5B, 0x91, 0x58, 0x49, 0xD4, 0x46, 0x2F, 0xFF, 0x60, 0xA8, 0x62, 0xF9, 0xCF, 0x5E, 0x46, 0x24, 0x86, 0x03, 0x72, 0x9A, 0xD8, 0x72, 0x6F, 0x8B, 0x04, 0x6D, 0xC4, 0xCC, 0x24, 0x9A, 0x3E, 0x6F, 0x8E, 0x10, 0xB0, 0xC3, 0x13, 0xC0, 0xFA, 0xD4, 0x07, 0x07, 0xBF, 0xBD, 0xD1, 0x87, 0xFA, 0x6B, 0xD3, 0x27, 0xB5, 0xBE, 0xAB, 0xC4, 0xCA, 0x83, 0x4C, 0x93, 0x11, 0x1D, 0xEB, 0x2E, 0x0C, 0xB1, 0x27, 0xE9, 0x24, 0x5B, 0x48, 0x92, 0x83, 0xD6, 0x7C, 0x7F, 0x33, 0x44, 0xAC, 0x14, 0x0C, 0x8B, 0x82, 0xF4, 0xF7, 0x3B, 0xA8, 0x31, 0xE8, 0x72, 0x6B, 0x89, 0x7B, 0x36, 0xE5, 0xB2, 0x4B, 0x46, 0xAF, 0x8B, 0x6B, 0x7F, 0xE0, 0x13, 0x96, 0x7D, 0xED, 0x7F, 0x71, 0x67, 0xAD, 0x52, 0x2C, 0x6B, 0xD4, 0x8B, 0x2C, 0xD6, 0xA2, 0x51, 0x6E, 0x4C, 0x34, 0x68, 0x73, 0x0D, 0x0E, 0xE1, 0xB9, 0x71, 0x96, 0xA5, 0x63, 0x45, 0x9B, 0x82, 0x0D, 0xC5, 0xE1, 0x7E, 0x84, 0x25, 0xC2, 0x22, 0x94, 0xED, 0x4E, 0x94, 0x97, 0x4F, 0xFB, 0x40, 0x0D, 0x48, 0x4F, 0x42, 0xF3, 0x11, 0xF6, 0x1B, 0x38, 0x1E, 0x9D, 0x8D, 0xA8, 0xDD, 0xA7, 0x1F, 0x65, 0xCD, 0xC1, 0x11, 0x84, 0x4E, 0x4F, 0x0A, 0x45, 0x53, 0x73, 0xBB, 0x96, 0x21, 0x17, 0x56, 0xC4, 0x6C, 0x37, 0xF2, 0x30, 0x56, 0x36, 0x45, 0x9E, 0x2C, 0xCB, 0xF7, 0x54, 0xA4, 0x53, 0x9F, 0xBF, 0x9D, 0x9B, 0xE9, 0x55, 0xB4, 0x1A, 0xA4, 0xC8, 0x0D, 0x84, 0xD6, 0x48, 0x25, 0xB7, 0x3E, 0xD4, 0xD3, 0x60, 0x80, 0x51, 0xDA, 0xBA, 0x12, 0xAE, 0x7B, 0x01, 0x78, 0x4E, 0x9C, 0xFD, 0xDC, 0xED, 0x24, 0x22, 0xDC, 0xD0, 0x9B, 0x9B, 0x12, 0x62, 0xA5, 0x4A, 0xB3, 0xAD, 0x74, 0xEA, 0x6D, 0xF6, 0x2D, 0x45, 0xAE, 0x10, 0xCA, 0x32, 0x81, 0x7F, 0x1F, 0xE4, 0xC1, 0x31, 0xC3, 0x2E, 0x4C, 0xD6, 0x14, 0x16, 0x67, 0x68, 0x6A, 0x92, 0xC8, 0xFC, 0x02, 0x53, 0xB7, 0x9E, 0xB0, 0xF6, 0xB0, 0x55, 0x08, 0xEC, 0xCC, 0xE1, 0x51, 0x72, 0x7E, 0xAD, 0x9A, 0x7D, 0xB7, 0xA9, 0x37, 0xAE, 0x5C, 0x22, 0xEF, 0xB2, 0xA8, 0x49, 0xFC, 0xE7, 0x48, 0x24, 0x77, 0xA2, 0xA8, 0xC9, 0xF2, 0x02, 0x06, 0x10, 0x3B, 0xA8, 0xEA, 0xE5, 0x32, 0x43, 0xE0, 0x1F, 0x84, 0x42, 0xEC, 0x84, 0x7A, 0x10, 0x76, 0xEB, 0x53, 0xA8, 0x05, 0x91, 0x88, 0x40, 0x20, 0xBF, 0x64, 0xBE, 0x02, 0xFD, 0xF1, 0x58, 0xDA, 0x8A, 0x97, 0x0E, 0x7F, 0xF7, 0xA0, 0xF0, 0x69, 0x51, 0x15, 0x56, 0xE7, 0x30, 0x5C, 0xD9, 0x4E, 0x04, 0x15, 0xF8, 0x5D, 0x27, 0xD8, 0x3A, 0x3F, 0x34, 0x8F, 0x29, 0xF3, 0x61, 0x38, 0x54, 0xF6, 0xEF, 0xC0, 0x68, 0x27, 0xDF, 0x22, 0x90, 0xBF, 0x49, 0x57, 0x2F, 0x8B, 0x1C, 0xEC, 0x74, 0xCF, 0x06, 0x30, 0x92, 0x68, 0xF2, 0x7F, 0x87, 0xE9, 0xC9, 0x75, 0x62, 0xA9, 0x69, 0x31, 0xC7, 0xA7, 0x83, 0x6B, 0x63, 0xB4, 0x24, 0xBB, 0xF8, 0x02, 0x67, 0x53, 0x1F, 0x4F, 0xDE, 0xD5, 0x3B, 0xE8, 0x45, 0x44, 0x85, 0x45, 0xE3, 0x5C, 0x58, 0x04, 0x62, 0x1E, 0xC9, 0x57, 0x76, 0xF4, 0x67, 0x51, 0x7E, 0x6A, 0x72, 0x88, 0x29, 0x3A, 0xB4, 0xF0, 0xEB, 0xE8, 0xFE, 0x76, 0xD4, 0x19, 0x7B, 0x7B, 0x57, 0xCC, 0xE4, 0x33, 0x78, 0x75, 0xF7, 0xAF, 0x76, 0x6B, 0xF8, 0x55, 0xE6, 0x28, 0xCD, 0x4A, 0x40, 0xBC, 0x25, 0xF6, 0x57, 0x18, 0x3D, 0xBE, 0xD0, 0x6F, 0xD5, 0x61, 0x11, 0xB5, 0x26, 0x90, 0x16, 0x8D, 0x42, 0x61, 0x1B, 0x83, 0x8F, 0x54, 0x40, 0xC9, 0xF5, 0x88, 0x7A, 0x55, 0xE6, 0xFF, 0x45, 0xFE, 0xFD, 0x48, 0x4B, 0x8E, 0xAC, 0x8E, 0x97, 0xA7, 0x33, 0x0C, 0x05, 0xF6, 0x54, 0x3C, 0xC4, 0x9F, 0x2D, 0x5D, 0xF9, 0x93, 0x3B, 0x9B, 0xBA, 0x69, 0xA3, 0x67, 0x6D, 0x72, 0x3D, 0xB9, 0xFC, 0x70, 0xC4, 0x1D, 0x8B, 0x6D, 0x08, 0x36, 0xF7, 0x18, 0x41, 0xAB, 0x9C, 0xEE, 0x58, 0xDA, 0xA6, 0xDC, 0x2C, 0x02, 0x50, 0xAF, 0xBC, 0x85, 0xD5, 0x3C, 0xF0, 0x49, 0x7E, 0x31, 0xEF, 0xF5, 0xE2, 0xE7, 0xB9, 0xC6, 0xB0, 0x7A, 0x07, 0x33, 0x64, 0x3E, 0x1A, 0x07, 0x9D, 0xF0, 0x64, 0xD8, 0x03, 0x3C, 0x7C, 0xB7, 0x7C, 0x2E, 0x67, 0x0F, 0x38, 0x47, 0x9A, 0x35, 0xBA, 0x0D, 0xDB, 0xBE, 0x74, 0x75, 0x25, 0x8A, 0xDA, 0x2B, 0x3F, 0x79, 0xED, 0xAD, 0x65, 0x33, 0x6D, 0x57, 0xC3, 0xB0, 0xAC, 0x11, 0x3A, 0x6D, 0x7B, 0x7C, 0x2D, 0xDF, 0xCC, 0x2F, 0x4B, 0x35, 0xD9, 0xD6, 0xEC, 0xFC, 0x98, 0xA9, 0x32, 0x05, 0xC8, 0x5F, 0xF4, 0xA8, 0xD7, 0x20, 0xF9, 0x87, 0x11, 0xD5, 0x05, 0xA8, 0x8C, 0x71, 0x14, 0x51, 0x2F, 0x3F, 0xEB, 0x8B, 0x60, 0xCE, 0x26, 0xD3, 0x38, 0x05, 0x0D, 0x1E, 0xF1, 0xC5, 0x7C, 0x99, 0x0F, 0x08, 0x19, 0x8A, 0xF1, 0x4B, 0xF2, 0xCC, 0x28, 0xF3, 0x54, 0xEB, 0xA7, 0xE7, 0x50, 0x4A, 0x65, 0xC3, 0x1E, 0x95, 0xC1, 0xA6, 0x4C, 0xEC, 0x3C, 0xD0, 0xCE, 0x6C, 0xA6, 0xC3, 0x58, 0xA0, 0xEC, 0x45, 0xA1, 0x34, 0x9A, 0xFD, 0x56, 0x49, 0x5B, 0x4D, 0xED, 0xAD, 0x91, 0xA7, 0xB0, 0xB6, 0x9A, 0xAC, 0xFF, 0xC5, 0xED, 0x77, 0xBA, 0x9A, 0xC5, 0xBF, 0xDB, 0xA3, 0x5F, 0xE5, 0x21, 0x08, 0x76, 0xC5, 0xF9, 0x90, 0x4C, 0x3E, 0x27, 0x0B, 0x16, 0xCF, 0x1E, 0x04, 0xDB, 0x08, 0xAC, 0x2A, 0x56, 0x31, 0x34, 0xE5, 0x49, 0x30, 0x58, 0xAA, 0xDC, 0x71, 0x9F, 0x98, 0xFA, 0x00, 0xD0, 0x27, 0xCC, 0xDC, 0xB0, 0x80, 0x63, 0xC7, 0xF0, 0x85, 0xB8, 0xA6, 0xDE, 0xBC, 0x71, 0x1D, 0x8F, 0x14, 0xBB, 0x4B, 0x95, 0x53, 0x24, 0x71, 0xDB, 0x60, 0xD9, 0xD3, 0x3C, 0xE6, 0x8F, 0xBF, 0xA4, 0xB0, 0xD7, 0x88, 0x50, 0xEA, 0x63, 0x9E, 0x15, 0xCE, 0x2A, 0x8A, 0x94, 0x5E, 0xDD, 0xE8, 0x5D, 0xC1, 0x3A, 0x3B, 0xDC, 0x10, 0x85, 0xBA, 0x6A, 0xDC, 0x48, 0xC5, 0xC1, 0x0C, 0x29, 0xBB, 0xC6, 0x03, 0xD6, 0x0A, 0xDA, 0xC8, 0x71, 0xAD, 0x0C, 0x50, 0xC0, 0xED, 0x93, 0x08, 0x58, 0x17, 0xA8, 0x0E, 0xDC, 0x25, 0x5C, 0xD9, 0x97, 0x41, 0x17, 0x6E, 0x2C, 0xA9, 0x87, 0xD5, 0x47, 0x72, 0xB3, 0xA1, 0xB2, 0x06, 0xB1, 0x52, 0xB9, 0xC7, 0xA9, 0xDB, 0x37, 0x5E, 0x43, 0x30, 0xB0, 0x96, 0x0C, 0xAB, 0x87, 0xC4, 0x60, 0xEF, 0x5C, 0x6C, 0x05, 0xCF, 0x82, 0x0B, 0xAA, 0x9B, 0x9B, 0x65, 0xBB, 0x0E, 0x8B, 0x2F, 0x00, 0x58, 0x94, 0xD2, 0x43, 0x24, 0xF3, 0x7E, 0x52, 0xE5, 0x61, 0xA2, 0x1C, 0xB8, 0x9D, 0x23, 0x61, 0x48, 0xEF, 0xD0, 0xEC, 0xC1, 0x45, 0x62, 0x3E, 0x51, 0x0A, 0x85, 0x43, 0x95, 0xDD, 0x31, 0x56, 0x96, 0xA4, 0x78, 0xB4, 0x86, 0xE6, 0x98, 0x26, 0x5E, 0x9E, 0xBF, 0xB1, 0xD4, 0x30, 0xDC, 0x19, 0x1D, 0xE5, 0x00, 0x3E, 0xDB, 0x9D, 0xCC, 0xE2, 0x7B, 0x29, 0x15, 0xBB, 0xC2, 0xFF, 0x81, 0x68, 0xEC, 0xCC, 0x00, 0x44, 0x55, 0x3B, 0x57, 0x33, 0xAE, 0x2E, 0xA9, 0xF4, 0x50, 0x31, 0x76, 0x63, 0x5A, 0x21, 0xFE, 0xDC, 0x35, 0xCB, 0x8B, 0xB8, 0x9C, 0xBE, 0x1E, 0xBC, 0x3D, 0x4E, 0x28, 0xA8, 0x84, 0x8E, 0x1F, 0x14, 0x29, 0x01, 0xDB, 0xA7, 0x06, 0x8F, 0xB9, 0xE6, 0x37, 0x2C, 0x98, 0xE4, 0xF9, 0x7D, 0xC1, 0x43, 0x2F, 0xF5, 0x07, 0x43, 0xFC, 0x5E, 0xD3, 0xDB, 0x2C, 0xBD, 0xF3, 0x9A, 0xC8, 0x54, 0xA6, 0x6D, 0x89, 0x19, 0x3E, 0xC2, 0x6D, 0xB9, 0x6E, 0xF5, 0x35, 0xC4, 0xF3, 0x2A, 0x81, 0xAD, 0xEA, 0x8D, 0x9D, 0xED, 0x76, 0xC8, 0x02, 0x0C, 0x90, 0xDC, 0x80, 0xFB, 0xF5, 0xEC, 0x24, 0x02, 0x67, 0x2B, 0xCF, 0x69, 0x90, 0x60, 0xA1, 0xE3, 0xD1, 0x89, 0x0C, 0x99, 0x31, 0xCD, 0x52, 0xAD, 0x04, 0xD4, 0xE4, 0x88, 0xB4, 0x4B, 0x01, 0xE2, 0x51, 0x39, 0xCB, 0xE6, 0xA0, 0x06, 0xBA, 0x65, 0xAF, 0xC9, 0x93, 0xD5, 0xC3, 0xC3, 0xEF, 0x95, 0xD5, 0x0A, 0x17, 0x0F, 0x45, 0x4A, 0xBE, 0x59, 0x3D, 0x8A, 0x45, 0x11, 0xAB, 0xDC, 0x18, 0xBB, 0xF8, 0x3F, 0x8F, 0x5C, 0x8A, 0x93, 0x3D, 0xAE, 0xAF, 0x43, 0x84, 0x9F, 0xD1, 0x17, 0xC3, 0xE1, 0xBE, 0x4F, 0x9A, 0x69, 0x5F, 0x60, 0x15, 0xC3, 0x34, 0x87, 0x6D, 0x5E, 0xF2, 0xAC, 0xDA, 0x6B, 0x45, 0x6E, 0x8B, 0x21, 0xCF, 0x70, 0x91, 0x7A, 0x32, 0xA8, 0xD9, 0x8C, 0xFC, 0xE1, 0xF7, 0x7A, 0xBE, 0x91, 0xC5, 0xEF, 0x0E, 0x9F, 0x9E, 0x02, 0x51, 0xA4, 0xF8, 0xF2, 0x2A, 0xAB, 0x0C, 0x08, 0x18, 0x8E, 0xC3, 0x34, 0xA0, 0x78, 0x62, 0x4C, 0xE3, 0x62, 0xF3, 0xA8, 0xF3, 0x1B, 0x4F, 0xD7, 0x5C, 0x5E, 0x8E, 0x5F, 0x52, 0xD5, 0x75, 0x30, 0x17, 0x85, 0xBD, 0x79, 0xD1, 0x19, 0x23, 0xFB, 0x2D, 0xBE, 0x77, 0x68, 0x1E, 0x41, 0xB1, 0x6A, 0x84, 0xBD, 0x00, 0x1E, 0xF5, 0xD6, 0x0C, 0xD8, 0x08, 0xBA, 0x21, 0x37, 0x24, 0x43, 0x2F, 0xCA, 0x6F, 0x3E, 0x6C, 0xEC, 0x3F, 0x19, 0x1B, 0x94, 0xFF, 0x81, 0x65, 0x36, 0xC5, 0x6B, 0xD8, 0xD7, 0xAB, 0x5B, 0x7D, 0xC6, 0x60, 0x58, 0x2B, 0xF1, 0x6A, 0x97, 0x22, 0x6E, 0xE5, 0x09, 0x1E, 0x66, 0x63, 0x7F, 0x1E, 0x59, 0x70, 0xAF, 0xD8, 0x8E, 0x5D, 0x39, 0x2F, 0xB8, 0x01, 0xEA, 0x65, 0x2D, 0xD9, 0x21, 0x9F, 0x5F, 0xD7, 0x01, 0x76, 0x8D, 0x55, 0x52, 0x93, 0x90, 0x90, 0xFE, 0xC7, 0xB5, 0x87, 0x76, 0xC9, 0xB7, 0x10, 0xCE, 0x9E, 0xDA, 0x63, 0x32, 0x4B, 0xD9, 0xD0, 0xC3, 0xCB, 0x42, 0xAC, 0xD0, 0x06, 0x7F, 0x11, 0x1F, 0xD4, 0xCE, 0xB2, 0x5A, 0xA5, 0x4C, 0xE0, 0xF6, 0x73, 0x3C, 0xC7, 0x48, 0xF2, 0xCF, 0x45, 0x85, 0x41, 0xC3, 0xF0, 0xAC, 0xAB, 0x50, 0x36, 0x02, 0x59, 0x7D, 0x98, 0x23, 0x85, 0xFF, 0x67, 0x84, 0xA7, 0x4D, 0xB3, 0xCE, 0xC4, 0xEA, 0xA4, 0x11, 0x17, 0x47, 0x06, 0x76, 0x00, 0x54, 0x76, 0xC2, 0xD8, 0x11, 0x23, 0xF2, 0x75, 0x28, 0xA0, 0xCF, 0x9F, 0x8E, 0x33, 0xAD, 0xD5, 0xFE, 0x02, 0x76, 0x48, 0x6A, 0x58, 0x1C, 0xDC, 0xE9, 0x8B, 0xD7, 0x9A, 0x60, 0x5D, 0x46, 0xCE, 0x6A, 0x8D, 0x90, 0x7E, 0xB6, 0x48, 0xAD, 0x1D, 0x82, 0x88, 0xEB, 0x1D, 0x12, 0xBE, 0x66, 0x1F, 0xDB, 0x1C, 0x46, 0x25, 0xE2, 0x29, 0xC5, 0x11, 0xED, 0x71, 0x86, 0x04, 0x2D, 0xC3, 0xB8, 0xB4, 0x22, 0xBD, 0xD4, 0x50, 0xD3, 0x92, 0x73, 0xB9, 0x46, 0x93, 0xA4, 0x18, 0x9F, 0x39, 0xB7, 0x48, 0x72, 0x67, 0xC3, 0xC0, 0x8D, 0x70, 0xFC, 0xF8, 0x0E, 0xFF, 0xFC, 0x1A, 0x91, 0x08, 0x0A, 0xD6, 0x21, 0x67, 0xD2, 0xB1, 0xC0, 0xE1, 0x3D, 0x58, 0x74, 0x00, 0x41, 0x83, 0x6F, 0xA4, 0xB3, 0xCA, 0x4F, 0x87, 0x76, 0xB2, 0x6C, 0x4E, 0x7B, 0xA8, 0x30, 0x4B, 0xCE, 0x76, 0xBD, 0xD4, 0x63, 0xD1, 0xB0, 0x05, 0x0E, 0x52, 0x30, 0x26, 0x25, 0x7E, 0x23, 0xCA, 0xF9, 0x3E, 0x9D, 0xDC, 0x70, 0xC8, 0xDA, 0xEE, 0x60, 0x19, 0x06, 0x71, 0x20, 0x8D, 0x43, 0x54, 0xF4, 0x49, 0x50, 0x6F, 0x4C, 0x83, 0x0E, 0x13, 0xEE, 0x8C, 0x43, 0x46, 0x0C, 0x35, 0xDE, 0x98, 0xC9, 0x65, 0x3D, 0x4F, 0x63, 0x70, 0xD3, 0x8C, 0x54, 0xA7, 0xCB, 0xDC, 0x9A, 0xBC, 0x9E, 0xEA, 0xB0, 0xDD, 0xFF, 0xC3, 0x61, 0xD7, 0x99, 0x3C, 0xFC, 0xEA, 0x6E, 0x98, 0xC8, 0xEF, 0x4D, 0x29, 0x9B, 0x12, 0x84, 0xCC, 0x86, 0xAB, 0x3F, 0x2E, 0x2D, 0x13, 0x6B, 0x46, 0xB8, 0xF2, 0x12, 0xDF, 0xE6, 0x50, 0x7F, 0x64, 0x1C, 0xA9, 0x57, 0xB7, 0x69, 0x9B, 0x74, 0x8A, 0x52, 0xF7, 0x2E, 0x09, 0x09, 0xF7, 0x3D, 0xE1, 0x66, 0x8A, 0x01, 0xB9, 0xBD, 0xD9, 0xD2, 0xD2, 0x86, 0xF4, 0x9D, 0xA8, 0x22, 0x2F, 0x65, 0xA5, 0x9C, 0x99, 0x3E, 0x1F, 0xB0, 0xE4, 0x44, 0xCB, 0xAA, 0x38, 0xE9, 0x45, 0xFF, 0x50, 0x82, 0x71, 0xC4, 0x63, 0x85, 0xD9, 0x4F, 0xB5, 0x64, 0xF5, 0xAA, 0x84, 0x27, 0x9E, 0x25, 0x86, 0x99, 0x35, 0x92, 0x14, 0x7E, 0xF5, 0xAF, 0xA6, 0x45, 0x8B, 0x8B, 0x31, 0x85, 0xFB, 0xE4, 0x89, 0xFD, 0x70, 0xA2, 0xE8, 0xF9, 0xAD, 0x9F, 0x79, 0xFC, 0x27, 0xEE, 0xBC, 0xDA, 0x32, 0xC5, 0x76, 0x78, 0x16, 0xAC, 0xFF, 0xA0, 0xD2, 0x98, 0xBE, 0x91, 0x7C, 0x8C, 0x42, 0xBA, 0xD8, 0x12, 0xE2, 0x28, 0x84, 0x3F, 0xF3, 0xF8, 0x64, 0xED, 0x3D, 0x79, 0x79, 0xD3, 0xBF, 0x4E, 0x51, 0x95, 0x88, 0xC3, 0x8D, 0xFD, 0xC6, 0xC5, 0x6E, 0x4C, 0xAE, 0x1B, 0x87, 0x51, 0x0D, 0xB7, 0x4F, 0xC0, 0x29, 0x13, 0x07, 0x74, 0xEE, 0xD7, 0x2A, 0x03, 0xB1, 0xDB, 0x6F, 0x2C, 0xEC, 0x34, 0x37, 0xD6, 0x4A, 0x1B, 0xA4, 0xDE, 0x09, 0x73, 0x1F, 0x6D, 0x7D, 0xE8, 0x5E, 0x8D, 0xF9, 0x34, 0xD3, 0xE2, 0xA0, 0xF9, 0x14, 0xB6, 0xFC, 0x8A, 0x56, 0x7F, 0xFE, 0xF0, 0xFA, 0x5D, 0x1B, 0xC7, 0x71, 0x32, 0x27, 0x56, 0x8C, 0xD3, 0x61, 0xA9, 0x69, 0x3A, 0x70, 0xA7, 0xF6, 0xA8, 0x7D, 0xAF, 0x83, 0x29, 0x20, 0x9A, 0xB2, 0x88, 0x37, 0x46, 0x01, 0x4D, 0x25, 0x52, 0x39, 0xD1, 0xF0, 0xCA, 0xB8, 0xDE, 0x8B, 0x7C, 0x29, 0x78, 0xE5, 0x2A, 0xA3, 0x4E, 0x44, 0x1B, 0xDB, 0x7F, 0x3B, 0xB8, 0xF1, 0x4B, 0x6E, 0x51, 0x5A, 0xA2, 0xFF, 0x2A, 0x48, 0xF2, 0xA2, 0xF7, 0x26, 0xF9, 0x43, 0x4A, 0x41, 0x0C, 0x09, 0xBC, 0xF4, 0x7F, 0x97, 0x75, 0xA0, 0x18, 0x5D, 0xA9, 0x04, 0x40, 0xD5, 0x0B, 0xB7, 0x11, 0xF8, 0x60, 0xD9, 0x7C, 0x90, 0x04, 0x2E, 0x16, 0x15, 0x0D, 0xD9, 0xEE, 0x49, 0xAF, 0xC2, 0x3A, 0x3B, 0x02, 0xBC, 0xDA, 0xEA, 0x78, 0xDC, 0x25, 0x9F, 0xC5, 0x98, 0x64, 0x7C, 0xC5, 0xDC, 0x11, 0x73, 0x91, 0x5D, 0xE9, 0xA9, 0x60, 0x04, 0x93, 0x5F, 0x09, 0xD9, 0x96, 0x0E, 0x56, 0x95, 0x63, 0x34, 0xB5, 0xCC, 0xB2, 0x5A, 0xAA, 0xC1, 0xA0, 0xE7, 0x70, 0x93, 0xB1, 0xA7, 0xCD, 0x4D, 0x46, 0x3E, 0xEE, 0x85, 0xCE, 0x77, 0xE6, 0x7A, 0x3B, 0x1D, 0xF3, 0x11, 0x17, 0x82, 0x94, 0x6C, 0x8E, 0x63, 0x7E, }; // This table tells us how to round (floor really) to the nearest semitone. // It's just computed as (DOTIMES (X (+ 1024 512)) (PRINT (FLOOR (* 17.05 (FLOOR (/ X 17.05)))))) // and is just an elaborate way of avoiding a division and a little floating-point. It's lazy. PROGMEM const uint16_t semitones[1024 + 512] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1534 }; #define SEMITONES(idx) pgm_read_word_near(&semitones[idx]) // This lookup table prevents us from having to do pow() to convert pitch/CV to frequency // and thus to a wave length. These values correspond with 0V being 32.7Hz. We only allow // frequencies of 64 or greater, which corresponds to wave lengths of 16384 / 64 = 256 or // smaller. We then continue another 512 for some headroom when pitch-shifting. PROGMEM const uint8_t wavetableSizes[1024 + 512] = /* { 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 254, 253, 252, 251, 251, 250, 249, 248, 247, 246, 245, 245, 244, 243, 242, 241, 241, 240, 239, 238, 237, 236, 236, 235, 234, 233, 233, 232, 231, 230, 229, 229, 228, 227, 226, 226, 225, 224, 223, 222, 222, 221, 220, 219, 219, 218, 217, 216, 216, 215, 214, 214, 213, 212, 211, 211, 210, 209, 209, 208, 207, 206, 206, 205, 204, 204, 203, 202, 202, 201, 200, 200, 199, 198, 198, 197, 196, 196, 195, 194, 194, 193, 192, 192, 191, 190, 190, 189, 188, 188, 187, 186, 186, 185, 185, 184, 183, 183, 182, 181, 181, 180, 180, 179, 178, 178, 177, 177, 176, 175, 175, 174, 174, 173, 172, 172, 171, 171, 170, 170, 169, 168, 168, 167, 167, 166, 166, 165, 164, 164, 163, 163, 162, 162, 161, 161, 160, 159, 159, 158, 158, 157, 157, 156, 156, 155, 155, 154, 154, 153, 153, 152, 152, 151, 151, 150, 149, 149, 148, 148, 147, 147, 146, 146, 145, 145, 145, 144, 144, 143, 143, 142, 142, 141, 141, 140, 140, 139, 139, 138, 138, 137, 137, 136, 136, 135, 135, 135, 134, 134, 133, 133, 132, 132, 131, 131, 130, 130, 130, 129, 129, 128, 128, 127, 127, 127, 126, 126, 125, 125, 124, 124, 124, 123, 123, 122, 122, 121, 121, 121, 120, 120, 119, 119, 119, 118, 118, 117, 117, 117, 116, 116, 115, 115, 115, 114, 114, 114, 113, 113, 112, 112, 112, 111, 111, 110, 110, 110, 109, 109, 109, 108, 108, 107, 107, 107, 106, 106, 106, 105, 105, 105, 104, 104, 104, 103, 103, 102, 102, 102, 101, 101, 101, 100, 100, 100, 99, 99, 99, 98, 98, 98, 97, 97, 97, 96, 96, 96, 95, 95, 95, 94, 94, 94, 93, 93, 93, 93, 92, 92, 92, 91, 91, 91, 90, 90, 90, 89, 89, 89, 89, 88, 88, 88, 87, 87, 87, 86, 86, 86, 86, 85, 85, 85, 84, 84, 84, 84, 83, 83, 83, 82, 82, 82, 82, 81, 81, 81, 80, 80, 80, 80, 79, 79, 79, 79, 78, 78, 78, 78, 77, 77, 77, 76, 76, 76, 76, 75, 75, 75, 75, 74, 74, 74, 74, 73, 73, 73, 73, 72, 72, 72, 72, 71, 71, 71, 71, 70, 70, 70, 70, 69, 69, 69, 69, 69, 68, 68, 68, 68, 67, 67, 67, 67, 66, 66, 66, 66, 66, 65, 65, 65, 65, 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, 62, 62, 62, 62, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 58, 58, 58, 58, 58, 57, 57, 57, 57, 57, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; */ { 251, 250, 249, 248, 247, 246, 245, 245, 244, 243, 242, 241, 241, 240, 239, 238, 237, 236, 236, 235, 234, 233, 233, 232, 231, 230, 229, 229, 228, 227, 226, 226, 225, 224, 223, 223, 222, 221, 220, 220, 219, 218, 217, 217, 216, 215, 214, 214, 213, 212, 211, 211, 210, 209, 209, 208, 207, 207, 206, 205, 204, 204, 203, 202, 202, 201, 200, 200, 199, 198, 198, 197, 196, 196, 195, 194, 194, 193, 192, 192, 191, 190, 190, 189, 188, 188, 187, 187, 186, 185, 185, 184, 183, 183, 182, 182, 181, 180, 180, 179, 179, 178, 177, 177, 176, 176, 175, 174, 174, 173, 173, 172, 171, 171, 170, 170, 169, 169, 168, 167, 167, 166, 166, 165, 165, 164, 163, 163, 162, 162, 161, 161, 160, 160, 159, 159, 158, 157, 157, 156, 156, 155, 155, 154, 154, 153, 153, 152, 152, 151, 151, 150, 150, 149, 149, 148, 148, 147, 147, 146, 146, 145, 145, 144, 144, 143, 143, 142, 142, 141, 141, 140, 140, 139, 139, 138, 138, 138, 137, 137, 136, 136, 135, 135, 134, 134, 133, 133, 133, 132, 132, 131, 131, 130, 130, 129, 129, 129, 128, 128, 127, 127, 126, 126, 126, 125, 125, 124, 124, 123, 123, 123, 122, 122, 121, 121, 121, 120, 120, 119, 119, 118, 118, 118, 117, 117, 117, 116, 116, 115, 115, 115, 114, 114, 113, 113, 113, 112, 112, 111, 111, 111, 110, 110, 110, 109, 109, 108, 108, 108, 107, 107, 107, 106, 106, 106, 105, 105, 105, 104, 104, 103, 103, 103, 102, 102, 102, 101, 101, 101, 100, 100, 100, 99, 99, 99, 98, 98, 98, 97, 97, 97, 96, 96, 96, 95, 95, 95, 94, 94, 94, 93, 93, 93, 93, 92, 92, 92, 91, 91, 91, 90, 90, 90, 89, 89, 89, 89, 88, 88, 88, 87, 87, 87, 86, 86, 86, 86, 85, 85, 85, 84, 84, 84, 84, 83, 83, 83, 82, 82, 82, 82, 81, 81, 81, 81, 80, 80, 80, 79, 79, 79, 79, 78, 78, 78, 78, 77, 77, 77, 77, 76, 76, 76, 76, 75, 75, 75, 74, 74, 74, 74, 73, 73, 73, 73, 73, 72, 72, 72, 72, 71, 71, 71, 71, 70, 70, 70, 70, 69, 69, 69, 69, 68, 68, 68, 68, 68, 67, 67, 67, 67, 66, 66, 66, 66, 65, 65, 65, 65, 65, 64, 64, 64, 64, 64, 63, 63, 63, 63, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 58, 58, 58, 58, 58, 57, 57, 57, 57, 57, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; #define WAVETABLE_SIZE(pitch) pgm_read_byte_near(&wavetableSizes[pitch]) #define CONTROL_RATE 256 #include #include // The WAVE LENGTH is the SAMPLING FREQUENCY (16384) divided by the NOTE FREQUENCY. // If our lowest frequency is 32, then we have to have tables of size 512. // But we have about 2K of space maximum. Let's say that our minimum frequency is 64 (about a very low C) // Then we have tables of size 256 each, and 6 of them would be 1.5K, which is probably enough? #define MAX_WAVELENGTH 251 #define NUM_WAVES 4 int8_t wave[NUM_WAVES][MAX_WAVELENGTH]; // probably doesn't need to be signed? uint8_t currentWave = 0; uint8_t wavePos[NUM_WAVES]; uint8_t waveLength[NUM_WAVES]; #define CV_POT_IN1 A7 // Note In, Pitch Scaling #define CV_POT_IN2 A6 // Atonality #define CV_POT3 A4 // Volume #define CV_IN3 A2 #define CV_AUDIO_IN A0 // Pitch Tune #define CV_AUDIO_OUT 9 // Out #define CV_GATE_OUT 10 // Trigger #define RANDOM_PIN A5 void setup() { // some reasonable initial defaults pinMode(CV_GATE_OUT, INPUT_PULLUP); initializeFrequency(CV_POT_IN1, CV_AUDIO_IN); randomSeed(RANDOM_PIN); startMozzi(); readPots(); // read them at least once } #define MEDIAN_OF_THREE(a,b,c) (((a) <= (b)) ? (((b) <= (c)) ? (b) : (((a) < (c)) ? (c) : (a))) : (((a) <= (c)) ? (a) : (((b) < (c)) ? (c) : (b)))) uint16_t pitchCV; uint16_t tuneCV; uint16_t pA; uint16_t pB; //uint16_t pC; //uint16_t pD; void initializeFrequency(uint8_t pitch, uint8_t tune) { pitchCV = mozziAnalogRead(pitch); tuneCV = mozziAnalogRead(tune); } // NOTE: Presently not using this, using MEDIAN_OF_THREE instead // From https://stackoverflow.com/questions/480960/how-do-i-calculate-the-median-of-five-in-c static uint16_t medianOfFive(uint16_t a, uint16_t b, uint16_t c, uint16_t d, uint16_t e) { return b < a ? d < c ? b < d ? a < e ? a < d ? e < d ? e : d : c < a ? c : a : e < d ? a < d ? a : d : c < e ? c : e : c < e ? b < c ? a < c ? a : c : e < b ? e : b : b < e ? a < e ? a : e : c < b ? c : b : b < c ? a < e ? a < c ? e < c ? e : c : d < a ? d : a : e < c ? a < c ? a : c : d < e ? d : e : d < e ? b < d ? a < d ? a : d : e < b ? e : b : b < e ? a < e ? a : e : d < b ? d : b : d < c ? a < d ? b < e ? b < d ? e < d ? e : d : c < b ? c : b : e < d ? b < d ? b : d : c < e ? c : e : c < e ? a < c ? b < c ? b : c : e < a ? e : a : a < e ? b < e ? b : e : c < a ? c : a : a < c ? b < e ? b < c ? e < c ? e : c : d < b ? d : b : e < c ? b < c ? b : c : d < e ? d : e : d < e ? a < d ? b < d ? b : d : e < a ? e : a : a < e ? b < e ? b : e : d < a ? d : a; } #define TRANSPOSE_BITS 0 #define TRANSPOSE_SEMITONES 0 #define TRANSPOSE_OCTAVES 0 #define LARGE_JUMP 32 #define SEMITONE 17 #define FREQ_COUNTER_MAX 4 uint8_t freqCounter = 0; inline uint16_t getPitchPos(uint8_t pitch, uint8_t tune) { tuneCV = (tuneCV * 15 + mozziAnalogRead(tune)) >> 4; uint16_t p = mozziAnalogRead(pitch); uint16_t p1 = MEDIAN_OF_THREE(p, pA, pB); //medianOfFive(p, pA, pB, pC, pD); //pD = pC; // pC = pB; pB = pA; pA = p; pitchCV = p1; //pitchCV = (pitchCV + p1) >> 1; int16_t finalPitch = pitchCV + (tuneCV >> 1) + TRANSPOSE_SEMITONES * 17 + TRANSPOSE_OCTAVES * 205 + TRANSPOSE_BITS; //return FREQUENCY(finalPitch < 0 ? 0 : (finalPitch > 1535 ? 1535 : finalPitch)); return finalPitch; } #define GET_NOISE(pos) pgm_read_byte_near(&NOISE[pos]) void load(uint16_t pitchPos) { #ifdef ROUND_TO_SEMITONE uint16_t idx = SEMITONES(pitchPos > 1535 ? 1535 : pitchPos); waveLength[currentWave] = WAVETABLE_SIZE(idx); // Max WAVETABLE SIZE is 251 #else waveLength[currentWave] = WAVETABLE_SIZE(pitchPos > 1535 ? 1535 : pitchPos); // Max WAVETABLE SIZE is 251 #endif uint8_t start = rand(7936); // 8192 - 256, so we have enough space without wrapping for(uint8_t i = 0; i < waveLength[currentWave]; i++) { // We are using the noise array rather than just the random number generator on // the assumption that it's faster. Fingers crossed. wave[currentWave][i] = (int8_t)GET_NOISE(start + i); } currentWave++; if (currentWave >= NUM_WAVES) currentWave = 0; } // Rises as a Cube, with some tweaks at the end for the electric sounds const PROGMEM uint8_t ATONALITY[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 72, 74, 75, 76, 78, 79, 81, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100, 102, 103, 105, 107, 108, 110, 112, 114, 115, 117, 119, 121, 123, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 157, 159, 161, 163, 165, 168, 170, 172, 175, 177, 179, 182, 184, 187, 189, 192, 194, 197, 199, 202, 204, 207, 209, 212, 215, 217, 220, 223, 226, 228, 231, 234, 237, 240, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 255, 255}; /* // Rises as a Square const PROGMEM uint8_t ATONALITY[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 93, 94, 95, 96, 97, 99, 100, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 116, 117, 118, 120, 121, 122, 124, 125, 127, 128, 129, 131, 132, 134, 135, 137, 138, 140, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 160, 161, 163, 164, 166, 168, 169, 171, 172, 174, 176, 177, 179, 181, 182, 184, 186, 188, 189, 191, 193, 195, 196, 198, 200, 202, 203, 205, 207, 209, 211, 212, 214, 216, 218, 220, 222, 224, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255}; */ /* // Rises as a Cube const PROGMEM uint8_t ATONALITY[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 72, 74, 75, 76, 78, 79, 81, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100, 102, 103, 105, 107, 108, 110, 112, 114, 115, 117, 119, 121, 123, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 157, 159, 161, 163, 165, 168, 170, 172, 175, 177, 179, 182, 184, 187, 189, 192, 194, 197, 199, 202, 204, 207, 209, 212, 215, 217, 220, 223, 226, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255}; */ /* // Rises as x^4 const PROGMEM uint8_t ATONALITY[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 59, 60, 61, 63, 64, 66, 67, 69, 70, 72, 73, 75, 76, 78, 80, 81, 83, 85, 87, 89, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 115, 117, 119, 121, 124, 126, 128, 131, 133, 136, 138, 141, 143, 146, 149, 151, 154, 157, 160, 162, 165, 168, 171, 174, 177, 180, 183, 187, 190, 193, 196, 200, 203, 206, 210, 213, 217, 220, 224, 228, 231, 235, 239, 243, 247, 251, 255}; */ #define ATONALITY_VAL(i) pgm_read_byte_near(&ATONALITY[i]) // SCALE AND SHIFT // This is just a way of increasing the decay. Instead of doing (a + b) / 2 // we do (a + b * (x - 1)) / x for values of x from 2 to 256, x is a power of 2. // To do this we do (a + b * scale) >> shift // We have 8 options for x: 2, 4, ... 256, as described below. // NOTE: if this is too extreme maybe we could change it to // (a * (max - x) + b * x) / MAX const uint8_t scales[8] = { 1, 3, 7, 15, 31, 63, 127, 255 }; // 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 }; const uint8_t shifts[8] = { 1, 2, 3, 4, 5, 6, 7, 8, }; // 9, 10, 11, 12, 13, 14, 15, 16 }; uint16_t scale; // one of scales[]. uint16_t to make multiplication easier later. uint8_t shift; // one of shifts[] // ATONALITY // This is the probability that after doing (a + b) / 2 we multiply the whole thing by -1. // It was suggested by Karplus and Strong as a way to increase the "atonality" of the sound, // which really just makes it noisier. uint8_t atonality = 0; // 0...255 // GAIN // This is just the volume knob at the end. uint8_t gain; // 0...15 uint8_t triggered = false; uint8_t waitCount = 0; inline void readPots() { #ifdef ATONALITY_ON_POT_2 atonality = ATONALITY_VAL(mozziAnalogRead(CV_POT_IN2) >> 2); uint8_t s = mozziAnalogRead(CV_IN3) >> 7; #else atonality = ATONALITY_VAL(mozziAnalogRead(CV_IN3) >> 2); uint8_t s = mozziAnalogRead(CV_POT_IN2) >> 7; #endif scale = scales[s]; shift = shifts[s]; gain = mozziAnalogRead(CV_POT3) >> 6; } void updateControl() { uint16_t pitchPos = getPitchPos(CV_POT_IN1, CV_AUDIO_IN); // we have to call this each time //readPots(); // Check for a trigger uint8_t tr = !digitalRead(CV_GATE_OUT); if (!triggered && tr) { waitCount = 4; triggered = 1; } else if (!tr) { triggered = 0; } if (waitCount) { if (waitCount == 1) { readPots(); load(pitchPos); } waitCount--; } } int updateAudio() { int16_t multiply = atonality > 0 ? ((rand(256) < atonality) ? -1 : 1) : 1; int16_t total = 0; for(uint8_t i = 0; i < NUM_WAVES; i++) { int8_t a = wave[i][wavePos[i]]; wavePos[i]++; if (wavePos[i] >= waveLength[i]) wavePos[i] = 0; int8_t b = wave[i][wavePos[i]]; if (a != b) { int8_t c = (int8_t)((multiply * (a + b * scale)) >> shift); wave[i][wavePos[i]] = c; total += c; } else total += a; } // We only have 4 voices, which can sum to +/- 512. We can automatically scale to -192 ... +192 // by multiplying by 3 and dividing by 8. A single voice we'd divide by 2. // FIXME: for one voice, this would effectively divide by 2, we don't want that, right? Maybe >> 4 or >> 3? return (total * gain) >> 2; // or >> 1 ? } void loop() { audioHook(); }