Files
WS-1.0-Firmwares/pluck/pluck.ino
2025-10-04 23:19:54 +03:00

966 lines
85 KiB
C++

// 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 <MozziGuts.h>
#include <mozzi_rand.h>
// 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();
}