#include <TVout.h>
#include <EnableInterrupt.h>
TVout TV;
const unsigned char _8x8_ext[] PROGMEM={
8,8,0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
0x38, 0x7C, 0x38, 0xFE, 0xFE, 0xD6, 0x10, 0x38,
0x10, 0x38, 0x7C, 0xFE, 0xFE, 0x7C, 0x10, 0x38,
0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
0x18, 0xDB, 0x3C, 0xE7, 0xE7, 0x3C, 0xDB, 0x18,
0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
0x3E, 0x61, 0x3C, 0x66, 0x66, 0x3C, 0x86, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00,
0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00,
0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00,
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
0x7C, 0xC6, 0xCE, 0xD6, 0xE6, 0xC6, 0x7C, 0x00,
0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00,
0x7C, 0xC6, 0x06, 0x1C, 0x30, 0x66, 0xFE, 0x00,
0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00,
0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
0xFE, 0xC0, 0xC0, 0xFC, 0x06, 0xC6, 0x7C, 0x00,
0x38, 0x60, 0xC0, 0xFC, 0xC6, 0xC6, 0x7C, 0x00,
0xFE, 0xC6, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0x00,
0x7C, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00,
0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00,
0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
0x7C, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x78, 0x00,
0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00,
0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00,
0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xCE, 0x7C, 0x0E,
0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00,
0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x3C, 0x00,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00,
0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x3C, 0x00,
0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00,
0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00,
0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
0xE0, 0x60, 0x7C, 0x66, 0x66, 0x66, 0xDC, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x00,
0x1C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00,
0x3C, 0x66, 0x60, 0xF8, 0x60, 0x60, 0xF0, 0x00,
0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
0x06, 0x00, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xD6, 0xD6, 0x00,
0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
0x00, 0x00, 0xDC, 0x76, 0x60, 0x60, 0xF0, 0x00,
0x00, 0x00, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x00,
0x30, 0x30, 0xFC, 0x30, 0x30, 0x36, 0x1C, 0x00,
0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
0x00, 0x00, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00,
0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0xFC,
0x00, 0x00, 0x7E, 0x4C, 0x18, 0x32, 0x7E, 0x00,
0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00,
0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0x00,
0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
0x60, 0xF0, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x0C,
0xFC, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x6C, 0x00,
0x1C, 0x10, 0x00, 0x7E, 0x60, 0x60, 0x60, 0x00,
0x38, 0x20, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00,
0x6C, 0xFE, 0x62, 0x78, 0x60, 0x62, 0xFE, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xF0, 0xC6, 0x7C, 0x00,
0x3C, 0x66, 0xC0, 0xF8, 0xC0, 0x66, 0x3C, 0x00,
0x00, 0x00, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x00,
0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00,
0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
0xCC, 0x00, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x70,
0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
0x00, 0x00, 0x70, 0x50, 0x5C, 0x52, 0xDC, 0x00,
0x70, 0x50, 0x5C, 0x52, 0x52, 0x52, 0xDC, 0x00,
0x00, 0x00, 0xA0, 0xA0, 0xFC, 0xA2, 0xBC, 0x00,
0xA0, 0xA0, 0xA0, 0xFC, 0xA2, 0xA2, 0xBC, 0x00,
0x60, 0xF0, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x00,
0xF8, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00,
0x1C, 0x10, 0xC6, 0xD8, 0xF8, 0xCC, 0xC6, 0x00,
0x18, 0xD6, 0xCC, 0xF8, 0xF8, 0xCC, 0xC6, 0x00,
0x6C, 0x38, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
0x38, 0xC6, 0xC6, 0x7E, 0x06, 0xC6, 0x7C, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0x10,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0x10,
0x00, 0x00, 0xDC, 0xD6, 0xF6, 0xD6, 0xDC, 0x00,
0xDC, 0xD6, 0xD6, 0xF6, 0xD6, 0xD6, 0xDC, 0x00,
0x00, 0x00, 0xF0, 0xB0, 0x3C, 0x36, 0x3C, 0x00,
0xF0, 0xF0, 0xB0, 0x3C, 0x36, 0x36, 0x3C, 0x00,
0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
0x3E, 0x66, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
0x06, 0x7C, 0xC0, 0x7C, 0xC6, 0xC6, 0x7C, 0x00,
0xFE, 0x66, 0x60, 0x7C, 0x66, 0x66, 0xFC, 0x00,
0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0x06,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0x06,
0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x6C, 0xFE, 0xC6,
0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0xFF, 0xC3,
0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00,
0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
0x00, 0x00, 0x7C, 0xD6, 0xD6, 0x7C, 0x10, 0x38,
0x7C, 0xD6, 0xD6, 0xD6, 0x7C, 0x10, 0x38, 0x00,
0x00, 0x00, 0xFE, 0x66, 0x60, 0x60, 0xF0, 0x00,
0xFE, 0x66, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00,
0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
0xDB, 0x77, 0xDB, 0xEE, 0xDB, 0x77, 0xDB, 0xEE,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
0x00, 0x00, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0x00,
0xC6, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x00,
0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
0x00, 0x38, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0x00,
0x38, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
0x00, 0x00, 0xE6, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
0xE6, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00,
0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
0x00, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0x00,
0x00, 0x00, 0x3E, 0x66, 0x66, 0x66, 0xE6, 0x00,
0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0xC6, 0x00,
0x00, 0x00, 0xC6, 0xFE, 0xFE, 0xD6, 0xC6, 0x00,
0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00,
0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00,
0x00, 0x00, 0x7E, 0xC6, 0x7E, 0x66, 0xC6, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x66, 0xC6, 0x00,
0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x00,
0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00,
0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x3C, 0x00,
0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0xC6, 0x7C, 0x00,
0x00, 0x00, 0xD6, 0x7C, 0x38, 0x7C, 0xD6, 0x00,
0xD6, 0xD6, 0x7C, 0x38, 0x7C, 0xD6, 0xD6, 0x00,
0x00, 0x00, 0xFC, 0x66, 0x7C, 0x66, 0xFC, 0x00,
0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
0x00, 0x00, 0xF0, 0x60, 0x7C, 0x66, 0xFC, 0x00,
0xF0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00,
0x8F, 0xCD, 0xEF, 0xFC, 0xDC, 0xCC, 0xCC, 0x00,
0x00, 0x00, 0x00, 0x7C, 0x7C, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xF6, 0xDE, 0xF6, 0x00,
0xC6, 0xC6, 0xC6, 0xF6, 0xDE, 0xDE, 0xF6, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0x1C, 0xC6, 0x7C, 0x00,
0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00,
0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xFE, 0x00,
0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xFE, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0x1E, 0xC6, 0x7C, 0x00,
0x78, 0x8C, 0x06, 0x3E, 0x06, 0x8C, 0x78, 0x00,
0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xFF, 0x03,
0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xFF, 0x03,
0x00, 0x00, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x00,
0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x00,
0x3E, 0x61, 0x3C, 0x66, 0x66, 0x3C, 0x86, 0x7C,
0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int potPin = A2; // Pin connected to the potentiometer
int stereoSizeMultiplier = 0; // Variable to store the potentiometer value
// Define min and max values for the range
const int minValue = 24; // Minimum value
int maxValue = 104; // Maximum value
int zOff = 150;
int xOff = 0;
int yOff = 0;
int cSize = 50;
float angle = (PI / 60);
float cube3d[8][3] = {
{xOff - cSize, yOff + cSize, zOff - cSize},
{xOff + cSize, yOff + cSize, zOff - cSize},
{xOff - cSize, yOff - cSize, zOff - cSize},
{xOff + cSize, yOff - cSize, zOff - cSize},
{xOff - cSize, yOff + cSize, zOff + cSize},
{xOff + cSize, yOff + cSize, zOff + cSize},
{xOff - cSize, yOff - cSize, zOff + cSize},
{xOff + cSize, yOff - cSize, zOff + cSize}
};
unsigned char cube2d[8][2];
void setup() {
TV.begin(PAL, 120, 96);
TV.select_font(_8x8_ext);
//Serial.begin(9600);
}
void audioLR(int input, int sums[3]) {
int shortestClear = 20;
sums[2] = 10 * log10(analogRead(A0) + analogRead(A1)); // Calculate audio sum
sums[0] = ((sums[2]) * (input / (10 * log10(1023.0 * 2))));
sums[1] = (input + shortestClear) - sums[0];
return sums[1];
}
void loop() {
maxValue = map(analogRead(potPin), 0, 1023, 10, 198); //controlled by the pot
stereoSizeMultiplier = (analogRead(A0) + analogRead(A1))/2; // Read the value from the potentiometer
stereoSizeMultiplier = map(stereoSizeMultiplier, 0, 1023, minValue, maxValue); // Map it to the defined range
clear();
int input = 300; //ms for fade
int results[3];
audioLR(input, results);
int plane = 64; //Set the plane but it also controls size
if (analogRead(A0) < 0.1 && analogRead(A1) < 0.1) {
plane = 64;
} else {
plane = ((results[2]) * (stereoSizeMultiplier / (10 * log10(1023.0 * 2))));
}
randomSeed(analogRead(7));
unsigned long startTime = millis();
// Start the timer
if (analogRead(A0) < 0.1 && analogRead(A1) < 0.1) {
while (millis() - startTime < 500) {
vis(plane); // Pass view_plane to the vis function
TV.delay_frame(10);
delay(100);
clear();
}
} else {
while (millis() - startTime < results[1]) {
vis(plane); // Pass view_plane to the vis function
}
}
}
void clear() {
#define H1 "@_@"
#define H2 ">_<"
String headLine;
int headLength;
TV.clear_screen();
int hCenterVal;
int vCenterVal;
if (analogRead(A0) < 0.1 && analogRead(A1) < 0.1) {
String headLine = H2;
headLength = headLine.length();
hCenterVal = random(-50,50)+(128 - (headLength * (8 + 1))) / 2;
vCenterVal = random(-50,50)+(96) / 2;
TV.print(hCenterVal, vCenterVal, H2);
} else {
String headLine = H1;
headLength = headLine.length();
hCenterVal = (128 - (headLength * (8 + 1))) / 2;
vCenterVal = (96) / 2;
TV.print(hCenterVal, vCenterVal, H1);
}
}
void vis(int view_plane) { // Accept view_plane as a parameter
float turns = 500;
if (analogRead(A0) < 0.1 && analogRead(A1) < 0.1) {
turns = 10.0;
} else {
turns = 300.0;
}
// Read analog inputs on pins 0 and 1, converting to dB scale:
int audioL = 10 * log10(analogRead(A0));
int audioR = 10 * log10(analogRead(A1));
int audioSum = 10 * log10(analogRead(A0) + analogRead(A1));
// Convert audio levels to integers and scale for visualization
int aIntL = ((audioL) * (turns / (10 * log10(1023.0))));
int aIntR = ((audioR) * (turns / (10 * log10(1023.0))));
int aIntSum = ((audioSum) * (turns / (10 * log10(1023.0 * 2))));
// Invert the values for visualization
int aIntLInv = (turns + 3) - aIntL;
int aIntRInv = (turns + 3) - aIntR;
int aIntSumInv = (turns + 3) - aIntSum;
float angleX = (PI / (aIntLInv));
float angleY = (PI / (aIntRInv));
float angleZ = (PI / (aIntSumInv));
zrotate(angleZ);
xrotate(angleX);
yrotate(angleY);
printcube(view_plane); // Pass view_plane to the printcube function
}
void printcube(int view_plane) { // Accept view_plane as a parameter
// Calculate 2D projections of 3D points
for (byte i = 0; i < 8; i++) {
cube2d[i][0] = (unsigned char)((cube3d[i][0] * view_plane / cube3d[i][2]) + (TV.hres() / 2));
cube2d[i][1] = (unsigned char)((cube3d[i][1] * view_plane / cube3d[i][2]) + (TV.vres() / 2));
}
draw_cube();
}
void zrotate(float q) {
float tx, ty, temp;
for (byte i = 0; i < 8; i++) {
tx = cube3d[i][0] - xOff;
ty = cube3d[i][1] - yOff;
temp = tx * cos(q) - ty * sin(q);
ty = tx * sin(q) + ty * cos(q);
tx = temp;
cube3d[i][0] = tx + xOff;
cube3d[i][1] = ty + yOff;
}
}
void yrotate(float q) {
float tx, tz, temp;
for (byte i = 0; i < 8; i++) {
tx = cube3d[i][0] - xOff;
tz = cube3d[i][2] - zOff;
temp = tz * cos(q) - tx * sin(q);
tx = tz * sin(q) + tx * cos(q);
tz = temp;
cube3d[i][0] = tx + xOff;
cube3d[i][2] = tz + zOff;
}
}
void xrotate(float q) {
float ty, tz, temp;
for (byte i = 0; i < 8; i++) {
ty = cube3d[i][1] - yOff;
tz = cube3d[i][2] - zOff;
temp = ty * cos(q) - tz * sin(q);
tz = ty * sin(q) + tz * cos(q);
ty = temp;
cube3d[i][1] = ty + yOff;
cube3d[i][2] = tz + zOff;
}
}
void draw_cube() {
// Draw the edges of the cube
TV.draw_line(cube2d[0][0], cube2d[0][1], cube2d[1][0], cube2d[1][1], WHITE);
TV.draw_line(cube2d[0][0], cube2d[0][1], cube2d[2][0], cube2d[2][1], WHITE);
TV.draw_line(cube2d[0][0], cube2d[0][1], cube2d[4][0], cube2d[4][1], WHITE);
TV.draw_line(cube2d[1][0], cube2d[1][1], cube2d[5][0], cube2d[5][1], WHITE);
TV.draw_line(cube2d[1][0], cube2d[1][1], cube2d[3][0], cube2d[3][1], WHITE);
TV.draw_line(cube2d[2][0], cube2d[2][1], cube2d[6][0], cube2d[6][1], WHITE);
TV.draw_line(cube2d[2][0], cube2d[2][1], cube2d[3][0], cube2d[3][1], WHITE);
TV.draw_line(cube2d[4][0], cube2d[4][1], cube2d[6][0], cube2d[6][1], WHITE);
TV.draw_line(cube2d[4][0], cube2d[4][1], cube2d[5][0], cube2d[5][1], WHITE);
TV.draw_line(cube2d[7][0], cube2d[7][1], cube2d[6][0], cube2d[6][1], WHITE);
TV.draw_line(cube2d[7][0], cube2d[7][1], cube2d[3][0], cube2d[3][1], WHITE);
TV.draw_line(cube2d[5][0], cube2d[5][1], cube2d[7][0], cube2d[7][1], WHITE);
}