#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif


// Adjustment FREQ
#define BIAS_FREQ   130



#define voices                  4
#define nokey                 255
#define shift_tone_sector_0    0
#define shift_tone_sector_1    16
#define shift_tone_sector_2    32

#define RANGE_SEL        (RANGE << 12)
#define GATE_MODE_SEL    ((1 << GATE_MODE) << 13)GATE_MODE_SEL

#define KBD_PIN          PIND
#define KBD_PIN_B        PINB
#define KBD_DDR          DDRD
#define KBD_PORT         PORTD
#define OUT_PORT         PORTB
#define GATE_PORT        PORTB
#define SPI_PORT         PORTB

#define OUT_DCO1_SQR     OCR1A
#define OUT_DCO1_TRI     OCR1B
#define OUT_DCO2_SQR     OCR0A
#define OUT_DCO2_TRI     OCR0B

//#define LFO_1            REG_16[0]
//#define LFO_FREQ         REG_16[1]
//#define DETUNE           REG_16[2]
//#define RELEASE_VCA      REG_16[3]
//#define LFO_1            REG_16[4]
//#define LFO_2            REG_16[5]
//#define ATTACK_VCA       REG_16[6]
//#define LFO_2            REG_16[7]
#define AMP_VCA          0x0040
#define GATE_PIN         0x0005
#define GATE_ENABLE      0x0001
#define GATE_WIDTH       0x07D0
#define KBD_PIN_MASK     0x000F  //0b00001111
#define KBD_SHIFT        0x0000
#define SECTOR_0_PIN     0x0004
#define SECTOR_1_PIN     0x0007
#define SECTOR_2_PIN     0x0000
#define KEY_NOTE_ST      0x0000  // SECTOR 2:  [G#3 - F#4]
#define KEY_NOTE_END     0x000A  // SECTOR 2
#define KEY_FORM_DCO_1   0x000B
#define KEY_FORM_DCO_2   0x000C
#define KEY_FORM_LFO     0x000D
#define KEY_RANGE_DCO_1  0x000E
#define KEY_ENV_MODE     0x000F
#define SPI_DATA_PIN     0x0003
#define SPI_LATCH_PIN    0x0004

int8_t   LFO_1 = 0;
int8_t   LFO_2 = 0;
int8_t   LFO_1_pred  = 0;
int8_t   LFO_2_pred  = 0;
uint16_t   DETUNE      = 0;
uint16_t   DETUNE_pred = 0;
int8_t   FORM_1[256];
int8_t   FORM_2[256];
int8_t   FORM_LFO[256];
uint8_t  keypressed;
uint8_t  keypressed_pred;
uint8_t  keyreleased;
uint8_t  KBD;
uint8_t  RANGE;
uint8_t  GATE_MODE;
uint8_t  SPI_clk;
uint8_t  sel_1;
uint8_t  sel_2;
uint8_t  sel_lfo;
uint8_t  REG_16[8];
uint8_t  AMP_1[voices];
uint8_t  AMP_2[voices];
uint8_t  iADSR[voices];
uint8_t  amp_base[voices];
uint8_t  keych[voices];
uint8_t  tch[voices];
uint16_t KBD_state_0;
uint16_t KBD_state_1;
uint16_t KBD_state_2;
uint16_t SPI_data;
uint16_t SPI_data_pred;
uint16_t LFO_OSC;
uint16_t OSC_1;
uint16_t OSC_2;
uint16_t FREQ_1;
uint16_t FREQ_2;
uint16_t system_clk;
uint16_t clk_gate;

//                         C      C#     D      D#     E      F      F#     G      G#     A      A#     H
uint16_t tone_inc[96] = { 34,    36,    38,    41,    43,    46,    48,    51,    54,    58,    61,    65,    //  0
                          69,    73,    77,    82,    86,    92,    97,    103,   109,   115,   122,   129,   //  1
                          137,   145,   154,   163,   173,   183,   194,   206,   218,   231,   244,   259,   //  2
                          274,   291,   308,   326,   346,   366,   388,   411,   435,   461,   489,   518,   //  3
                          549,   581,   616,   652,   691,   732,   776,   822,   871,   923,   978,   1036,  //  4
                          1097,  1163,  1232,  1305,  1383,  1465,  1552,  1644,  1742,  1845,  1955,  2071,  //  5
                          2195,  2325,  2463,  2610,  2765,  2930,  3104,  3288,  3484,  3691,  3910,  4143,  //  6
                          4389,  4650,  4927,  5220,  5530,  5859,  6207,  6577,  6968,  7382,  7821,  8286,  //  7
                        };
/*
  int8_t FORM_SAW[256] = {
  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
  0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
  0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
  0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
  0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
  0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F
  };

  int8_t FORM_RAW[256] = {
  0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
  0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
  0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
  0x4F, 0x4E, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
  0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
  0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
  0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
  0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
  0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0,
  0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8, 0xE7, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0,
  0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8, 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0,
  0xCF, 0xCE, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC8, 0xC7, 0xC6, 0xC5, 0xC4, 0xC3, 0xC2, 0xC1, 0xC0,
  0xBF, 0xBE, 0xBD, 0xBC, 0xBB, 0xBA, 0xB9, 0xB8, 0xB7, 0xB6, 0xB5, 0xB4, 0xB3, 0xB2, 0xB1, 0xB0,
  0xAF, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9, 0xA8, 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1, 0xA0,
  0x9F, 0x9E, 0x9D, 0x9C, 0x9B, 0x9A, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
  0x8F, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80
  };

  uint8_t FORM_SQR[256] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  };

  int8_t FORM_SIN[256] = {
  0x00, 0x03, 0x06, 0x09, 0x0C, 0x10, 0x13, 0x16, 0x19, 0x1C, 0x1F, 0x22, 0x25, 0x28, 0x2B, 0x2E,
  0x31, 0x34, 0x36, 0x39, 0x3C, 0x3F, 0x42, 0x44, 0x47, 0x49, 0x4C, 0x4E, 0x51, 0x53, 0x56, 0x58,
  0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x74,
  0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7B, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F,
  0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x76,
  0x75, 0x74, 0x72, 0x71, 0x70, 0x6E, 0x6C, 0x6B, 0x69, 0x67, 0x65, 0x63, 0x61, 0x5F, 0x5D, 0x5B,
  0x59, 0x57, 0x54, 0x52, 0x50, 0x4D, 0x4B, 0x48, 0x45, 0x43, 0x40, 0x3D, 0x3B, 0x38, 0x35, 0x32,
  0x2F, 0x2C, 0x29, 0x27, 0x24, 0x20, 0x1D, 0x1A, 0x17, 0x14, 0x11, 0x0E, 0x0B, 0x08, 0x05, 0x02,
  0xFE, 0xFB, 0xF8, 0xF5, 0xF2, 0xEF, 0xEC, 0xE9, 0xE6, 0xE3, 0xE0, 0xDC, 0xD9, 0xD7, 0xD4, 0xD1,
  0xCE, 0xCB, 0xC8, 0xC5, 0xC3, 0xC0, 0xBD, 0xBB, 0xB8, 0xB5, 0xB3, 0xB0, 0xAE, 0xAC, 0xA9, 0xA7,
  0xA5, 0xA3, 0xA1, 0x9F, 0x9D, 0x9B, 0x99, 0x97, 0x95, 0x94, 0x92, 0x90, 0x8F, 0x8E, 0x8C, 0x8B,
  0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x84, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81,
  0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x84, 0x85, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A,
  0x8C, 0x8D, 0x8E, 0x90, 0x91, 0x93, 0x94, 0x96, 0x98, 0x9A, 0x9C, 0x9E, 0xA0, 0xA2, 0xA4, 0xA6,
  0xA8, 0xAA, 0xAD, 0xAF, 0xB2, 0xB4, 0xB7, 0xB9, 0xBC, 0xBE, 0xC1, 0xC4, 0xC7, 0xCA, 0xCC, 0xCF,
  0xD2, 0xD5, 0xD8, 0xDB, 0xDE, 0xE1, 0xE4, 0xE7, 0xEA, 0xED, 0xF0, 0xF4, 0xF7, 0xFA, 0xFD, 0x00
  };
*/
uint8_t  stroy8bit_32[36] = {237, 223, 211, 199, 188, 177, 167, 157, 148, 140, 132, 124,
                             118, 112, 105,  99,  94,  88,  83,  79,  74,  70,  66,  62,
                             59,  56,   52,  49,  47,  44,  41,  39,  37,  35,  33,  31
                            };

uint8_t  stroy8bit_64[12]  = {237, 223, 211, 199, 188, 177, 167, 157, 148, 140, 132, 124};

uint8_t  stroy8bit_128[12] = {237, 223, 211, 199, 188, 177, 167, 157, 148, 140, 132, 124};

uint8_t  stroy8bit_256[12] = {237, 223, 211, 199, 188, 177, 167, 157, 148, 140, 132, 124};

uint16_t stroy16bit[12] = {3822, 3608, 3405, 3214,
                           3034, 2863, 2703, 2551,
                           2408, 2273, 2145, 2025
                          };
                                //1    2      3     4     5     6     7     8     9    10    11    12    13    14    15    16
uint16_t stroy16bit_pre[192] = {3822, 3820, 3806, 3792, 3778, 3764, 3750, 3736, 3722, 3708, 3694, 3680, 3666, 3652, 3638, 3624,
                                3608, 3606, 3593, 3580, 3567, 3554, 3541, 3528, 3515, 3502, 3489, 3476, 3463, 3450, 3437, 3424,
                                3405, 3403, 3391, 3379, 3367, 3355, 3343, 3331, 3319, 3307, 3295, 3283, 3271, 3259, 3247, 3235,
                                3214, 3212, 3201, 3190, 3179, 3168, 3157, 3146, 3135, 3124, 3113, 3102, 3091, 3080, 3069, 3058,

                                3034, 3032, 3021, 3010, 2999, 2988, 2977, 2966, 2955, 2944, 2933, 2922, 2911, 2800, 2889, 2878,
                                2863, 2861, 2851, 2841, 2831, 2821, 2811, 2801, 2791, 2781, 2771, 2761, 2751, 2741, 2731, 2721,
                                2703, 2701, 2691, 2681, 2671, 2661, 2651, 2641, 2631, 2621, 2611, 2601, 2591, 2581, 2571, 2561,
                                2551, 2549, 2540, 2531, 2522, 2513, 2504, 2495, 2486, 2477, 2468, 2459, 2450, 2441, 2432, 2423,

                                2408, 2406, 2397, 2388, 2379, 2370, 2361, 2352, 2343, 2334, 2325, 2316, 2307, 2298, 2289, 2280,
                                2273, 2271, 2263, 2255, 2247, 2239, 2231, 2223, 2215, 2207, 2199, 2191, 2183, 2175, 2167, 2159,
                                2145, 2143, 2134, 2125, 2116, 2107, 2098, 2089, 2080, 2071, 2062, 2053, 2044, 2035, 2026, 2017,
                                2025, 2023, 2015, 2007, 1999, 1991, 1983, 1975, 1967, 1959, 1951, 1943, 1935, 1927, 1919, 1911
                               };


inline void KEY_ON_SECTOR_0();
inline void KEY_OFF_SECTOR_0();
inline void KEY_ON_SECTOR_1();
inline void KEY_OFF_SECTOR_1();
inline void KEY_ON_SECTOR_2();
inline void KEY_OFF_SECTOR_2();

inline void setPWM() __attribute__((always_inline));
//inline void setPWM();
inline void setPWM() {
  while ((TIFR1 & 0x01) == 0);
  TIFR1 |= 0x01;

  OSC_1 += FREQ_1;
  OSC_2 += FREQ_2;

//  OUT_DCO1_SQR = FORM_SQR[OSC_1 >> 8] ;
//  OUT_DCO1_TRI = FORM_SAW[OSC_1 >> 8] + 127;
//  OUT_DCO2_SQR = FORM_SQR[OSC_2 >> 8] ;
//  OUT_DCO2_TRI = FORM_SAW[OSC_2 >> 8] + 127;
  //system_clk ++;
}

int main() {
  cli();
  DDRB  = B00111110;

  PMW_init();
  KBD_init();
  ADC_init();

  DDRD &= ~(1 << 4);
  DDRD &= ~(1 << 7);
  DDRB &= ~(1 << 0);
  DDRB |=  (1 << 1);
  DDRB |=  (1 << 2);
  DDRD |=  (1 << 5);
  DDRD |=  (1 << 6);

  TIMSK1 |= _BV(OCIE1A);

  keypressed  = 0;
  keypressed_pred = 1;
  LFO_1 = 0;
  ADMUX = 0x61;

  uint32_t tim = 0;
  //sei();
  while (1) {

    KBD_SCAN();
   /* 
    while(tim != 0) tim--; 
    tim = 0x001FFFFF;
    GATE_PORT ^=  (GATE_ENABLE << GATE_PIN);
*/
    ADCSRA |= (1 << ADSC);
    while (((ADCSRA >> ADSC) & 0x01) != 0);
    ADMUX = 0x63;
    DETUNE = ADCH;

    ADCSRA |= (1 << ADSC);
    while (((ADCSRA >> ADSC) & 0x01) != 0);
    ADMUX = 0x64;
    LFO_1 = ADCH - 127;
    LFO_1 >>= 2;

/*
    ADCSRA |= (1 << ADSC);
    while (((ADCSRA >> ADSC) & 0x01) != 0);*/
    ADMUX = 0x61;/*
    LFO_2 = ADCH - 127;
    LFO_2 >>= 2;
*/
    //DETUNE = DETUNE + LFO_1;
       
    Set_Generator();
    //keypressed++; if (keypressed > 47) keypressed = 0;
  }
  return 0;
}

inline void KEY_ON_SECTOR_0() {
  keypressed  = KBD + shift_tone_sector_0;
  GATE_ON();
}

inline void KEY_ON_SECTOR_1() {
  keypressed  = KBD + shift_tone_sector_1;
  GATE_ON();
}

inline void KEY_ON_SECTOR_2() {
  keypressed  = KBD + shift_tone_sector_2;
  GATE_ON();
}

inline void KEY_OFF_SECTOR_0() {
  keyreleased = KBD + shift_tone_sector_0;
  GATE_OFF();
}

inline void KEY_OFF_SECTOR_1() {
  keyreleased = KBD + shift_tone_sector_1;
  GATE_OFF();
}

inline void KEY_OFF_SECTOR_2() {
  keyreleased = KBD + shift_tone_sector_2;
  GATE_OFF();
}

inline void ADC_init() {
  ADCSRA |=  (1 << ADEN);
  ADCSRA |=  (1 << ADPS0);
  ADCSRA |=  (1 << ADPS1);
  ADCSRA &= ~(1 << ADPS2);
}

uint8_t ADC_scan() {
  /*ADMUX = 0x61;
    ADCSRA |= (1 << ADSC);
    while ((ADCSRA >> ADSC) & 0x01 != 1);
    DETUNE = ADCH;*/
}

inline void Set_Generator() {
  //FREQ_1 = ((uint32_t)tone_inc[keypressed] * (BIAS_FREQ +          LFO_1)) >> 4;
  //FREQ_2 = ((uint32_t)tone_inc[keypressed] * (BIAS_FREQ + DETUNE + LFO_2)) >> 4;
  if ( keypressed < 36)                       TCCR0B = 0b00000011; //64
  if ((keypressed > 35) && (keypressed < 48)) TCCR0B = 0b00000010; //8

  if (keypressed > 35) OCR0A = stroy8bit_32[keypressed - 36] >> 1;
  else                 OCR0A = stroy8bit_32[keypressed] >> 1;

  OCR1A = stroy16bit_pre[( ( (keypressed % 12) << 4) + DETUNE ) % 192] >>
                           (((keypressed       << 4) + DETUNE ) / 192) + 2;
}

inline void GATE_ON()  {
  GATE_PORT |=  (GATE_ENABLE << GATE_PIN);
}
inline void GATE_OFF() {
  GATE_PORT &= ~(GATE_ENABLE << GATE_PIN);
}
inline void KBD_init() {
  KBD_DDR  = KBD_PIN_MASK;
}

inline void KBD_SCAN() {
  KBD_PORT = (KBD << KBD_SHIFT) & KBD_PIN_MASK;

  if (((KBD_PIN >> SECTOR_0_PIN) & 0x01) == 0) {
    if (((KBD_state_0 >> KBD) & 0x01) == 0) {
      KEY_ON_SECTOR_0();
      KBD_state_0 |= (1 << KBD);
    }
  } else {
    if (((KBD_state_0 >> KBD) & 0x01) == 1) {
      KEY_OFF_SECTOR_0();
      KBD_state_0 &= ~(1 << KBD);
    }
  }

  if (((KBD_PIN >> SECTOR_1_PIN) & 0x01) == 0) {
    if (((KBD_state_1 >> KBD) & 0x01) == 0) {
      KEY_ON_SECTOR_1();
      KBD_state_1 |= (1 << KBD);
    }
  } else {
    if (((KBD_state_1 >> KBD) & 0x01) == 1) {
      KEY_OFF_SECTOR_1();
      KBD_state_1 &= ~(1 << KBD);
    }
  }

  if (((KBD_PIN_B >> SECTOR_2_PIN) & 0x01) == 0) {
    if (((KBD_state_2 >> KBD) & 0x01) == 0) {
      KEY_ON_SECTOR_2();
      KBD_state_2 |= (1 << KBD);
    }
  } else {
    if (((KBD_state_2 >> KBD) & 0x01) == 1) {
      KEY_OFF_SECTOR_2();
      KBD_state_2 &= ~(1 << KBD);
    }
  }

  KBD++;
  if (KBD > 15) KBD = 0;
}


inline void PMW_init() {
  TCNT0  = 0;
  OCR0A  = 0;
  OCR0B  = 0;
  TIMSK0 = 0;
  TCCR0A = 0;
  TCCR0B = 0;
  ASSR   = 0;
  
  TCCR1A = 0b01000000;
  TCCR1B = 0b00001010;

  TCCR0A = 0b01010010;
  TCCR0B = 0b00000011;

  //TCCR1A = 0B10100001; //8-bit fast PWM
  //TCCR1B = 0B00001001;
  //TCCR0A = 0B10100011; //8-bit fast PWM
  //TCCR0B = 0B00000001;
}
