Merge branch 'audio' of https://github.com/jackhumbert/tmk_keyboard into smarkefile
	
		
	
				
					
				
			
						commit
						5143c59bdf
					
				| @ -0,0 +1,78 @@ | ||||
| #include "ergodox_ez.h" | ||||
| #include "debug.h" | ||||
| #include "action_layer.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| 
 | ||||
| // If it accepts an argument (i.e, is a function), it doesn't need KC_.
 | ||||
| // Otherwise, it needs KC_*
 | ||||
| 
 | ||||
| #define SYMB 0 | ||||
| 
 | ||||
| [0] = KEYMAP( \ | ||||
| \ | ||||
| KC_KP_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DELETE, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1), KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TAB, KC_LEFT, KC_RIGHT, KC_TRANSPARENT, KC_LGUI, KC_HOME, KC_SPACE, KC_BSPACE, KC_END, KC_RIGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_TRANSPARENT, KC_N, KC_M, KC_COMMA, KC_DOT, KC_LCTRL, KC_LSHIFT, KC_UP, KC_DOWN, KC_LBRACKET, KC_RBRACKET, KC_TRANSPARENT, KC_LALT, KC_ESCAPE, KC_PGUP, KC_PGDOWN, KC_TAB, KC_ENTER \ | ||||
| \ | ||||
| ), | ||||
| 
 | ||||
| [1] = KEYMAP( \ | ||||
| \ | ||||
| KC_TRANSPARENT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRANSPARENT, KC_UP, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_ASTERISK, KC_F12, KC_DOWN, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRANSPARENT, KC_TRANSPARENT, , KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, KC_TRANSPARENT, KC_TRANSPARENT, KC_KP_DOT, KC_KP_0, KC_KP_EQUAL, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \ | ||||
| \ | ||||
| ), | ||||
| 
 | ||||
| [2] = KEYMAP( \ | ||||
| \ | ||||
| KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_UP, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN3, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PLAY_PAUSE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_UP, KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \ | ||||
| \ | ||||
| ), | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| const uint16_t PROGMEM fn_actions[] = { | ||||
|     [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
 | ||||
| }; | ||||
| 
 | ||||
| const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
|   // MACRODOWN only works in this function
 | ||||
|       switch(id) { | ||||
|         case 0: | ||||
|         if (record->event.pressed) { | ||||
|           register_code(KC_RSFT); | ||||
|         } else { | ||||
|           unregister_code(KC_RSFT); | ||||
|         } | ||||
|         break; | ||||
|       } | ||||
|     return MACRO_NONE; | ||||
| }; | ||||
| 
 | ||||
| // Runs just one time when the keyboard initializes.
 | ||||
| void * matrix_init_user(void) { | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| // Runs constantly in the background, in a loop.
 | ||||
| void * matrix_scan_user(void) { | ||||
| 
 | ||||
|     uint8_t layer = biton32(layer_state); | ||||
| 
 | ||||
|     ergodox_board_led_off(); | ||||
|     ergodox_right_led_1_off(); | ||||
|     ergodox_right_led_2_off(); | ||||
|     ergodox_right_led_3_off(); | ||||
|     switch (layer) { | ||||
|       // TODO: Make this relevant to the ErgoDox EZ.
 | ||||
|         case 1: | ||||
|             ergodox_right_led_1_on(); | ||||
|             break; | ||||
|         case 2: | ||||
|             ergodox_right_led_2_on(); | ||||
|             break; | ||||
|         default: | ||||
|             // none
 | ||||
|             break; | ||||
|     } | ||||
| 
 | ||||
| }; | ||||
| @ -0,0 +1,42 @@ | ||||
| #include "planck.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|  [0] = { | ||||
|     {KC_BSLS, S(KC_SLSH), KC_COMM,       KC_DOT,   KC_P,   KC_Y,   KC_F,    KC_G,         KC_C,    KC_R,    KC_L, KC_SLSH},  | ||||
|     {TG(1),         KC_A,    KC_O,         KC_E,   KC_U,   KC_I,   KC_D,    KC_H,         KC_T,    KC_N,    KC_S, KC_MINS}, | ||||
|     {KC_LGUI,    KC_QUOT,    KC_Q,         KC_J,   KC_K,   KC_X,   KC_B,    KC_M,         KC_W,    KC_V,    KC_Z, KC_RGUI}, | ||||
|     {KC_LCBR,    KC_LCTL, KC_LALT, LT(1, TG(2)), KC_SPC, KC_TAB, KC_ENT, KC_BSPC, LT(1, TG(3)), KC_RALT, KC_RCTL, KC_RCBR} | ||||
|   }, | ||||
| 
 | ||||
|  [1] = { | ||||
|     {KC_PIPE,    KC_COLN, KC_LBRC,  KC_RBRC, S(KC_P), S(KC_Y), S(KC_F), S(KC_G), S(KC_C), S(KC_R), S(KC_L), KC_AMPR},  | ||||
|     {KC_TRNS,    S(KC_A), S(KC_O),  S(KC_E), S(KC_U), S(KC_I), S(KC_D), S(KC_H), S(KC_T), S(KC_N), S(KC_S), KC_GRV}, | ||||
|     {KC_TRNS,    KC_SCLN, S(KC_Q),  S(KC_J), S(KC_K), S(KC_X), S(KC_B), S(KC_M), S(KC_W), S(KC_V), S(KC_Z), KC_TRNS}, | ||||
|     {S(KC_COMM), KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_DOT)} | ||||
|   }, | ||||
| 
 | ||||
|  [2] = { | ||||
|     {KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,  KC_F10, KC_NO},  | ||||
|     {KC_NO,  KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, KC_NO}, | ||||
|     {KC_TRNS, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_TRNS}, | ||||
|     {KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO} | ||||
|   }, | ||||
| 
 | ||||
|  [3] = { | ||||
|     {KC_EXLM,  KC_7,    KC_5,    KC_3,      KC_1,    KC_9,    KC_0,    KC_2,    KC_4,    KC_6,    KC_8, KC_EQL},  | ||||
|     {TG(4),   KC_NO, KC_PGUP, KC_HOME, KC_INSERT,   KC_NO,   KC_NO,  BL_DEC,   KC_UP,  BL_INC,   KC_NO, KC_NO}, | ||||
|     {KC_TRNS, KC_NO, KC_PGDN,  KC_END, KC_DELETE,   KC_NO,   KC_NO, KC_LEFT, KC_DOWN, KC_RGHT,   KC_NO, KC_TRNS}, | ||||
|     {KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO} | ||||
|   }, | ||||
| 
 | ||||
|  [4] = { | ||||
|     {KC_TILD, KC_HASH, KC_LPRN, KC_RPRN, S(KC_QUOT), KC_PERC, KC_UNDS, KC_CIRC,  KC_DLR,   KC_AT, KC_ASTR, KC_PLUS},  | ||||
|     {KC_TRNS,   KC_NO,   KC_NO,   KC_NO,      KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO}, | ||||
|     {KC_TRNS,   KC_NO,   KC_NO,   KC_NO,      KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_TRNS}, | ||||
|     {KC_NO,   KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO} | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| const uint16_t PROGMEM fn_actions[] = { | ||||
| 
 | ||||
| }; | ||||
| @ -0,0 +1,362 @@ | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <math.h> | ||||
| #include <avr/pgmspace.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <avr/io.h> | ||||
| 
 | ||||
| #include "audio.h" | ||||
| #include "keymap_common.h" | ||||
| 
 | ||||
| #define PI 3.14159265 | ||||
| 
 | ||||
| // #define PWM_AUDIO
 | ||||
| 
 | ||||
| #ifdef PWM_AUDIO | ||||
|     #include "wave.h" | ||||
|     #define SAMPLE_DIVIDER 39 | ||||
|     #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) | ||||
|     // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
 | ||||
| #endif | ||||
| 
 | ||||
| void delay_us(int count) { | ||||
|   while(count--) { | ||||
|     _delay_us(1); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| int voices = 0; | ||||
| int voice_place = 0; | ||||
| double frequency = 0; | ||||
| int volume = 0; | ||||
| long position = 0; | ||||
| 
 | ||||
| double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||
| int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||
| bool sliding = false; | ||||
| 
 | ||||
| int max = 0xFF; | ||||
| float sum = 0; | ||||
| int value = 128; | ||||
| float place = 0; | ||||
| float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||
| 
 | ||||
| uint16_t place_int = 0; | ||||
| bool repeat = true; | ||||
| uint8_t * sample; | ||||
| uint16_t sample_length = 0; | ||||
| 
 | ||||
| 
 | ||||
| bool notes = false; | ||||
| bool note = false; | ||||
| float note_frequency = 0; | ||||
| float note_length = 0; | ||||
| uint16_t note_position = 0; | ||||
| float (* notes_pointer)[][2]; | ||||
| uint8_t notes_length; | ||||
| bool notes_repeat; | ||||
| uint8_t current_note = 0; | ||||
| 
 | ||||
| void stop_all_notes() { | ||||
|     voices = 0; | ||||
|     #ifdef PWM_AUDIO | ||||
|         TIMSK3 &= ~_BV(OCIE3A); | ||||
|     #else | ||||
|         TIMSK3 &= ~_BV(OCIE3A); | ||||
|         TCCR3A &= ~_BV(COM3A1); | ||||
|     #endif | ||||
|     notes = false; | ||||
|     note = false; | ||||
|     frequency = 0; | ||||
|     volume = 0; | ||||
| 
 | ||||
|     for (int i = 0; i < 8; i++) { | ||||
|         frequencies[i] = 0; | ||||
|         volumes[i] = 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void stop_note(double freq) { | ||||
|     #ifdef PWM_AUDIO | ||||
|         freq = freq / SAMPLE_RATE; | ||||
|     #endif | ||||
|     for (int i = 7; i >= 0; i--) { | ||||
|         if (frequencies[i] == freq) { | ||||
|             frequencies[i] = 0; | ||||
|             volumes[i] = 0; | ||||
|             for (int j = i; (j < 7); j++) { | ||||
|                 frequencies[j] = frequencies[j+1]; | ||||
|                 frequencies[j+1] = 0; | ||||
|                 volumes[j] = volumes[j+1]; | ||||
|                 volumes[j+1] = 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     voices--; | ||||
|     if (voices < 0) | ||||
|         voices = 0; | ||||
|     if (voices == 0) { | ||||
|         #ifdef PWM_AUDIO | ||||
|             TIMSK3 &= ~_BV(OCIE3A); | ||||
|         #else | ||||
|             TIMSK3 &= ~_BV(OCIE3A); | ||||
|             TCCR3A &= ~_BV(COM3A1); | ||||
|         #endif | ||||
|         frequency = 0; | ||||
|         volume = 0; | ||||
|         note = false; | ||||
|     } else { | ||||
|         double freq = frequencies[voices - 1]; | ||||
|         int vol = volumes[voices - 1]; | ||||
|         double starting_f = frequency; | ||||
|         if (frequency < freq) { | ||||
|             sliding = true; | ||||
|             for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { | ||||
|                 frequency = f; | ||||
|             } | ||||
|             sliding = false; | ||||
|         } else if (frequency > freq) { | ||||
|             sliding = true; | ||||
|             for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { | ||||
|                 frequency = f; | ||||
|             } | ||||
|             sliding = false; | ||||
|         } | ||||
|         frequency = freq; | ||||
|         volume = vol; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void init_notes() { | ||||
| 
 | ||||
|     #ifdef PWM_AUDIO | ||||
|         PLLFRQ = _BV(PDIV2); | ||||
|         PLLCSR = _BV(PLLE); | ||||
|         while(!(PLLCSR & _BV(PLOCK))); | ||||
|         PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ | ||||
| 
 | ||||
|         /* Init a fast PWM on Timer4 */ | ||||
|         TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ | ||||
|         TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ | ||||
|         OCR4A = 0; | ||||
| 
 | ||||
|         /* Enable the OC4A output */ | ||||
|         DDRC |= _BV(PORTC6); | ||||
| 
 | ||||
|         TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
 | ||||
|          | ||||
|         TCCR3A = 0x0; // Options not needed
 | ||||
|         TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
 | ||||
|         OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
 | ||||
|     #else | ||||
|         DDRC |= _BV(PORTC6); | ||||
| 
 | ||||
|         TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
 | ||||
| 
 | ||||
|         TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); | ||||
|         TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); | ||||
|     #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ISR(TIMER3_COMPA_vect) { | ||||
| 
 | ||||
|     if (note) { | ||||
|         #ifdef PWM_AUDIO | ||||
|             if (voices == 1) { | ||||
|                 // SINE
 | ||||
|                 OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; | ||||
|              | ||||
|                 // SQUARE
 | ||||
|                 // if (((int)place) >= 1024){
 | ||||
|                 //     OCR4A = 0xFF >> 2;
 | ||||
|                 // } else {
 | ||||
|                 //     OCR4A = 0x00;
 | ||||
|                 // }
 | ||||
|                  | ||||
|                 // SAWTOOTH
 | ||||
|                 // OCR4A = (int)place / 4;
 | ||||
| 
 | ||||
|                 // TRIANGLE
 | ||||
|                 // if (((int)place) >= 1024) {
 | ||||
|                 //     OCR4A = (int)place / 2;
 | ||||
|                 // } else {
 | ||||
|                 //     OCR4A = 2048 - (int)place / 2;
 | ||||
|                 // }
 | ||||
| 
 | ||||
|                 place += frequency; | ||||
| 
 | ||||
|                 if (place >= SINE_LENGTH) | ||||
|                     place -= SINE_LENGTH; | ||||
| 
 | ||||
|             } else { | ||||
|                 int sum = 0; | ||||
|                 for (int i = 0; i < voices; i++) { | ||||
|                     // SINE
 | ||||
|                     sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; | ||||
| 
 | ||||
|                     // SQUARE
 | ||||
|                     // if (((int)places[i]) >= 1024){
 | ||||
|                     //     sum += 0xFF >> 2;
 | ||||
|                     // } else {
 | ||||
|                     //     sum += 0x00;
 | ||||
|                     // }
 | ||||
| 
 | ||||
|                     places[i] += frequencies[i]; | ||||
| 
 | ||||
|                     if (places[i] >= SINE_LENGTH) | ||||
|                         places[i] -= SINE_LENGTH; | ||||
|                 } | ||||
|                 OCR4A = sum; | ||||
|             } | ||||
|         #else | ||||
|             if (frequency > 0) { | ||||
|                 // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
 | ||||
|                 // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
 | ||||
|                 if (place > 10) { | ||||
|                     voice_place = (voice_place + 1) % voices; | ||||
|                     place = 0.0; | ||||
|                 } | ||||
|                 ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
 | ||||
|                 OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period
 | ||||
|                 place++; | ||||
|             } | ||||
|         #endif | ||||
|     } | ||||
| 
 | ||||
|     // SAMPLE
 | ||||
|     // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
 | ||||
| 
 | ||||
|     // place_int++;
 | ||||
| 
 | ||||
|     // if (place_int >= sample_length)
 | ||||
|     //     if (repeat)
 | ||||
|     //         place_int -= sample_length;
 | ||||
|     //     else
 | ||||
|     //         TIMSK3 &= ~_BV(OCIE3A);
 | ||||
| 
 | ||||
| 
 | ||||
|     if (notes) { | ||||
|         #ifdef PWM_AUDIO | ||||
|             OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; | ||||
| 
 | ||||
|             place += note_frequency; | ||||
|             if (place >= SINE_LENGTH) | ||||
|                 place -= SINE_LENGTH; | ||||
|         #else | ||||
|             if (note_frequency > 0) { | ||||
|                 ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period
 | ||||
|                 OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period
 | ||||
|             } | ||||
|         #endif | ||||
| 
 | ||||
| 
 | ||||
|         note_position++; | ||||
|         if (note_position >= note_length) { | ||||
|             current_note++; | ||||
|             if (current_note >= notes_length) { | ||||
|                 if (notes_repeat) { | ||||
|                     current_note = 0; | ||||
|                 } else { | ||||
|                     #ifdef PWM_AUDIO | ||||
|                         TIMSK3 &= ~_BV(OCIE3A); | ||||
|                     #else | ||||
|                         TIMSK3 &= ~_BV(OCIE3A); | ||||
|                         TCCR3A &= ~_BV(COM3A1); | ||||
|                     #endif | ||||
|                     notes = false; | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|             #ifdef PWM_AUDIO | ||||
|                 note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; | ||||
|                 note_length = (*notes_pointer)[current_note][1]; | ||||
|             #else | ||||
|                 note_frequency = (*notes_pointer)[current_note][0]; | ||||
|                 note_length = (*notes_pointer)[current_note][1] / 4; | ||||
|             #endif | ||||
|             note_position = 0; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { | ||||
|     if (note) | ||||
|         stop_all_notes(); | ||||
|     notes = true; | ||||
| 
 | ||||
|     notes_pointer = np; | ||||
|     notes_length = n_length; | ||||
|     notes_repeat = n_repeat; | ||||
| 
 | ||||
|     place = 0; | ||||
|     current_note = 0; | ||||
|     #ifdef PWM_AUDIO | ||||
|         note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; | ||||
|         note_length = (*notes_pointer)[current_note][1]; | ||||
|     #else | ||||
|         note_frequency = (*notes_pointer)[current_note][0]; | ||||
|         note_length = (*notes_pointer)[current_note][1] / 4; | ||||
|     #endif | ||||
|     note_position = 0; | ||||
| 
 | ||||
| 
 | ||||
|     #ifdef PWM_AUDIO | ||||
|         TIMSK3 |= _BV(OCIE3A); | ||||
|     #else | ||||
|         TIMSK3 |= _BV(OCIE3A); | ||||
|         TCCR3A |= _BV(COM3A1); | ||||
|     #endif | ||||
| } | ||||
| 
 | ||||
| void play_sample(uint8_t * s, uint16_t l, bool r) { | ||||
|     stop_all_notes(); | ||||
|     place_int = 0; | ||||
|     sample = s; | ||||
|     sample_length = l; | ||||
|     repeat = r; | ||||
| 
 | ||||
|     #ifdef PWM_AUDIO | ||||
|         TIMSK3 |= _BV(OCIE3A); | ||||
|     #else | ||||
|     #endif | ||||
| } | ||||
| 
 | ||||
| void play_note(double freq, int vol) { | ||||
|     if (notes) | ||||
|         stop_all_notes(); | ||||
|     note = true; | ||||
|     #ifdef PWM_AUDIO | ||||
|         freq = freq / SAMPLE_RATE; | ||||
|     #endif | ||||
|     if (freq > 0) { | ||||
|         if (frequency != 0) { | ||||
|             double starting_f = frequency; | ||||
|             if (frequency < freq) { | ||||
|                 for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {    | ||||
|                     frequency = f; | ||||
|                 } | ||||
|             } else if (frequency > freq) { | ||||
|                 for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { | ||||
|                     frequency = f; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         frequency = freq; | ||||
|         volume = vol; | ||||
| 
 | ||||
|         frequencies[voices] = frequency; | ||||
|         volumes[voices] = volume; | ||||
|         voices++; | ||||
|     } | ||||
| 
 | ||||
|     #ifdef PWM_AUDIO | ||||
|         TIMSK3 |= _BV(OCIE3A); | ||||
|     #else | ||||
|         TIMSK3 |= _BV(OCIE3A); | ||||
|         TCCR3A |= _BV(COM3A1); | ||||
|     #endif | ||||
| 
 | ||||
| } | ||||
| @ -1,246 +0,0 @@ | ||||
| #include "beeps.h" | ||||
| #include <math.h> | ||||
| #include <avr/pgmspace.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <avr/io.h> | ||||
| 
 | ||||
| #define PI 3.14159265 | ||||
| 
 | ||||
| void delay_us(int count) { | ||||
|   while(count--) { | ||||
|     _delay_us(1); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| int voices = 0; | ||||
| double frequency = 0; | ||||
| int volume = 0; | ||||
| int position = 0; | ||||
| 
 | ||||
| double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||
| int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||
| bool sliding = false; | ||||
| #define RANGE 1000 | ||||
| volatile int i=0; //elements of the wave
 | ||||
| 
 | ||||
| 
 | ||||
| void beeps() { | ||||
|     play_notes(); | ||||
| } | ||||
| 
 | ||||
| void send_freq(double freq, int vol) { | ||||
|     int duty = (((double)F_CPU) / freq); | ||||
|     ICR3 = duty; // Set max to the period
 | ||||
|     OCR3A = duty >> (0x10 - vol); // Set compare to half the period
 | ||||
| } | ||||
| 
 | ||||
| void stop_all_notes() { | ||||
|     voices = 0; | ||||
|     TCCR3A = 0; | ||||
|     TCCR3B = 0; | ||||
|     frequency = 0; | ||||
|     volume = 0; | ||||
| 
 | ||||
|     for (int i = 0; i < 8; i++) { | ||||
|         frequencies[i] = 0; | ||||
|         volumes[i] = 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void stop_note(double freq) { | ||||
|     for (int i = 7; i >= 0; i--) { | ||||
|         if (frequencies[i] == freq) { | ||||
|             frequencies[i] = 0; | ||||
|             volumes[i] = 0; | ||||
|             for (int j = i; (j < 7); j++) { | ||||
|                 frequencies[j] = frequencies[j+1]; | ||||
|                 frequencies[j+1] = 0; | ||||
|                 volumes[j] = volumes[j+1]; | ||||
|                 volumes[j+1] = 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     voices--; | ||||
|     if (voices < 0) | ||||
|         voices = 0; | ||||
|     if (voices == 0) { | ||||
|         TCCR3A = 0; | ||||
|         TCCR3B = 0; | ||||
|         frequency = 0; | ||||
|         volume = 0; | ||||
|     } else { | ||||
|         double freq = frequencies[voices - 1]; | ||||
|         int vol = volumes[voices - 1]; | ||||
|         if (frequency < freq) { | ||||
|             sliding = true; | ||||
|             for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { | ||||
|                 send_freq(f, vol); | ||||
|             } | ||||
|             sliding = false; | ||||
|         } else if (frequency > freq) { | ||||
|             sliding = true; | ||||
|             for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { | ||||
|                 send_freq(f, vol); | ||||
|             } | ||||
|             sliding = false; | ||||
|         } | ||||
|         send_freq(freq, vol); | ||||
|         frequency = freq; | ||||
|         volume = vol; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void init_notes() { | ||||
|     // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10);
 | ||||
|     // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
 | ||||
| 
 | ||||
|     // DDRC |= (1<<6); 
 | ||||
| 
 | ||||
|     // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
 | ||||
|     // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
 | ||||
| 
 | ||||
|     // ICR3 = 0xFFFF; 
 | ||||
|     // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
 | ||||
| 
 | ||||
| 
 | ||||
|     // cli();
 | ||||
| 
 | ||||
|     // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
 | ||||
|     //    this gives a timer interrupt at 15625Hz. */
 | ||||
|     // TIMSK3 = (1 << OCIE3A);
 | ||||
| 
 | ||||
|     // /* clear/reset timer on match */
 | ||||
|     // // TCCR3A = 1<<WGM31 | 0<<WGM30;  CTC mode, reset on match 
 | ||||
|     // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */
 | ||||
| 
 | ||||
|     // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
 | ||||
|     // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
 | ||||
| 
 | ||||
| 
 | ||||
|     // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
 | ||||
|     // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
 | ||||
|     // // SPCR = 0x50;
 | ||||
|     // // SPSR = 0x01;
 | ||||
|     // DDRC |= (1<<6);
 | ||||
|     // // ICR3 = 0xFFFF; 
 | ||||
|     // // OCR3A=80;
 | ||||
|     // PORTC |= (1<<6);
 | ||||
| 
 | ||||
|     // sei();
 | ||||
| } | ||||
| 
 | ||||
| // #define highByte(c) ((c >> 8) & 0x00FF)
 | ||||
| // #define lowByte(c) (c & 0x00FF)
 | ||||
| 
 | ||||
| ISR(TIMER3_COMPA_vect) { | ||||
| 
 | ||||
|     if (ICR3 > 0 && !sliding) { | ||||
|         switch (position) { | ||||
|             case 0: { | ||||
|                 int duty = (((double)F_CPU) / (frequency)); | ||||
|                 ICR3 = duty; // Set max to the period
 | ||||
|                 OCR3A = duty >> 1; // Set compare to half the period
 | ||||
|                 break; | ||||
|             } | ||||
|             case 1: { | ||||
|                 int duty = (((double)F_CPU) / (frequency*2)); | ||||
|                 ICR3 = duty; // Set max to the period
 | ||||
|                 OCR3A = duty >> 1; // Set compare to half the period
 | ||||
|                 break; | ||||
|             } | ||||
|             case 2: { | ||||
|                 int duty = (((double)F_CPU) / (frequency*3)); | ||||
|                 ICR3 = duty; // Set max to the period
 | ||||
|                 OCR3A = duty >> 1; // Set compare to half the period
 | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         position = (position + 1) % 3; | ||||
|     } | ||||
| //     /* OCR2A has been cleared, per TCCR2A above */
 | ||||
| //     // OCR3A = 127;
 | ||||
| 
 | ||||
| //     // pos1 += incr1;
 | ||||
| //     // pos2 += incr2;
 | ||||
| //     // pos3 += incr3;
 | ||||
| 
 | ||||
| //     // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)];
 | ||||
| 
 | ||||
| //     // OCR3A = sample;
 | ||||
| 
 | ||||
| 
 | ||||
| //     OCR3A=pgm_read_byte(&sinewave[pos1]);
 | ||||
| //     pos1++;
 | ||||
| //     // PORTC &= ~(1<<6);
 | ||||
| 
 | ||||
| //     /* buffered, 1x gain, active mode */
 | ||||
| //     // SPDR = highByte(sample) | 0x70;
 | ||||
| //     // while (!(SPSR & (1<<SPIF)));
 | ||||
| 
 | ||||
| //     // SPDR = lowByte(sample);
 | ||||
| //     // while (!(SPSR & (1<<SPIF)));
 | ||||
| 
 | ||||
| //     // PORTC |= (1<<6);
 | ||||
| } | ||||
| 
 | ||||
| void play_note(double freq, int vol) { | ||||
| 
 | ||||
|     if (freq > 0) { | ||||
|         DDRC |= (1<<6);  | ||||
| 
 | ||||
|         TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); | ||||
|         TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); | ||||
| 
 | ||||
|         if (frequency != 0) { | ||||
|             if (frequency < freq) { | ||||
|                 for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { | ||||
|                     send_freq(f, vol); | ||||
|                 } | ||||
|             } else if (frequency > freq) { | ||||
|                 for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { | ||||
|                     send_freq(f, vol); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         send_freq(freq, vol); | ||||
|         frequency = freq; | ||||
|         volume = vol; | ||||
| 
 | ||||
|         frequencies[voices] = frequency; | ||||
|         volumes[voices] = volume; | ||||
|         voices++; | ||||
|     } | ||||
|     // ICR3 = 0xFFFF;
 | ||||
|     // for (int i = 0; i < 10000; i++) {
 | ||||
|     //     OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
 | ||||
|     //     // _delay_us(50);
 | ||||
|     // }
 | ||||
| 
 | ||||
|     // TCCR3A = 0;
 | ||||
|     // TCCR3B = 0;
 | ||||
| } | ||||
| 
 | ||||
| // void note(int x, float length) {
 | ||||
| //     DDRC |= (1<<6);
 | ||||
| // 	int t = (int)(440*pow(2,-x/12.0)); // starting note
 | ||||
| //     for (int y = 0; y < length*1000/t; y++) { // note length
 | ||||
| //         PORTC |= (1<<6);
 | ||||
| //         delay_us(t);
 | ||||
| //         PORTC &= ~(1<<6);
 | ||||
| //         delay_us(t);
 | ||||
| //     }
 | ||||
| // 	PORTC &= ~(1<<6);
 | ||||
| // }
 | ||||
| 
 | ||||
| // void true_note(float x, float y, float length) {
 | ||||
| // 	for (uint32_t i = 0; i < length * 50; i++) {
 | ||||
| // 		uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); 
 | ||||
| // 		for (int u = 0; u < 8; u++) {
 | ||||
| // 			if (v & (1 << u) && !(PORTC&(1<<6)))
 | ||||
| // 		        PORTC |= (1<<6);
 | ||||
| // 		    else if (PORTC&(1<<6))
 | ||||
| // 	        	PORTC &= ~(1<<6);
 | ||||
| // 		}
 | ||||
| // 	}
 | ||||
| // 	PORTC &= ~(1<<6);
 | ||||
| // }
 | ||||
| @ -0,0 +1,265 @@ | ||||
| #include <avr/io.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <avr/pgmspace.h> | ||||
| 
 | ||||
| #define SINE_LENGTH 2048 | ||||
| 
 | ||||
| const uint8_t sinewave[] PROGMEM= //2048 values
 | ||||
| { | ||||
| 0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, | ||||
| 0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85, | ||||
| 0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88, | ||||
| 0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c, | ||||
| 0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f, | ||||
| 0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92, | ||||
| 0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95, | ||||
| 0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98, | ||||
| 0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b, | ||||
| 0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e, | ||||
| 0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1, | ||||
| 0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4, | ||||
| 0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7, | ||||
| 0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa, | ||||
| 0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad, | ||||
| 0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0, | ||||
| 0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3, | ||||
| 0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6, | ||||
| 0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8, | ||||
| 0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb, | ||||
| 0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe, | ||||
| 0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1, | ||||
| 0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3, | ||||
| 0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6, | ||||
| 0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9, | ||||
| 0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb, | ||||
| 0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce, | ||||
| 0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0, | ||||
| 0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2, | ||||
| 0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5, | ||||
| 0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7, | ||||
| 0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9, | ||||
| 0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc, | ||||
| 0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde, | ||||
| 0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0, | ||||
| 0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2, | ||||
| 0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4, | ||||
| 0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6, | ||||
| 0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8, | ||||
| 0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9, | ||||
| 0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb, | ||||
| 0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed, | ||||
| 0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee, | ||||
| 0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0, | ||||
| 0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1, | ||||
| 0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3, | ||||
| 0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4, | ||||
| 0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5, | ||||
| 0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, | ||||
| 0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, | ||||
| 0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, | ||||
| 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, | ||||
| 0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, | ||||
| 0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, | ||||
| 0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc, | ||||
| 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, | ||||
| 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, | ||||
| 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, | ||||
| 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, | ||||
| 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, | ||||
| 0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, | ||||
| 0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, | ||||
| 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, | ||||
| 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, | ||||
| 0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd, | ||||
| 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, | ||||
| 0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, | ||||
| 0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb, | ||||
| 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa, | ||||
| 0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, | ||||
| 0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, | ||||
| 0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, | ||||
| 0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, | ||||
| 0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5, | ||||
| 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4, | ||||
| 0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3, | ||||
| 0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, | ||||
| 0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0, | ||||
| 0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef, | ||||
| 0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed, | ||||
| 0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb, | ||||
| 0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea, | ||||
| 0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8, | ||||
| 0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6, | ||||
| 0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4, | ||||
| 0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2, | ||||
| 0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0, | ||||
| 0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde, | ||||
| 0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc, | ||||
| 0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda, | ||||
| 0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8, | ||||
| 0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5, | ||||
| 0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3, | ||||
| 0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1, | ||||
| 0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce, | ||||
| 0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc, | ||||
| 0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9, | ||||
| 0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7, | ||||
| 0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4, | ||||
| 0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1, | ||||
| 0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf, | ||||
| 0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc, | ||||
| 0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9, | ||||
| 0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6, | ||||
| 0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4, | ||||
| 0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1, | ||||
| 0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae, | ||||
| 0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab, | ||||
| 0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8, | ||||
| 0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5, | ||||
| 0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2, | ||||
| 0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f, | ||||
| 0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c, | ||||
| 0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99, | ||||
| 0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96, | ||||
| 0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93, | ||||
| 0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f, | ||||
| 0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c, | ||||
| 0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89, | ||||
| 0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86, | ||||
| 0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83, | ||||
| 0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80, | ||||
| 0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d, | ||||
| 0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a, | ||||
| 0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77, | ||||
| 0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73, | ||||
| 0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70, | ||||
| 0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d, | ||||
| 0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a, | ||||
| 0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67, | ||||
| 0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64, | ||||
| 0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61, | ||||
| 0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e, | ||||
| 0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b, | ||||
| 0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58, | ||||
| 0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55, | ||||
| 0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52, | ||||
| 0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f, | ||||
| 0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c, | ||||
| 0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49, | ||||
| 0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47, | ||||
| 0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44, | ||||
| 0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41, | ||||
| 0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e, | ||||
| 0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c, | ||||
| 0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39, | ||||
| 0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36, | ||||
| 0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34, | ||||
| 0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31, | ||||
| 0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f, | ||||
| 0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d, | ||||
| 0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a, | ||||
| 0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28, | ||||
| 0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26, | ||||
| 0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23, | ||||
| 0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21, | ||||
| 0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f, | ||||
| 0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d, | ||||
| 0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b, | ||||
| 0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19, | ||||
| 0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17, | ||||
| 0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16, | ||||
| 0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14, | ||||
| 0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12, | ||||
| 0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, | ||||
| 0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf, | ||||
| 0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe, | ||||
| 0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc, | ||||
| 0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb, | ||||
| 0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa, | ||||
| 0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9, | ||||
| 0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8, | ||||
| 0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7, | ||||
| 0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6, | ||||
| 0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, | ||||
| 0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4, | ||||
| 0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3, | ||||
| 0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3, | ||||
| 0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, | ||||
| 0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1, | ||||
| 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, | ||||
| 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, | ||||
| 0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, | ||||
| 0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1, | ||||
| 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, | ||||
| 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, | ||||
| 0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2, | ||||
| 0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, | ||||
| 0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3, | ||||
| 0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4, | ||||
| 0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5, | ||||
| 0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, | ||||
| 0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6, | ||||
| 0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7, | ||||
| 0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8, | ||||
| 0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa, | ||||
| 0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb, | ||||
| 0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc, | ||||
| 0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd, | ||||
| 0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf, | ||||
| 0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10, | ||||
| 0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12, | ||||
| 0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14, | ||||
| 0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15, | ||||
| 0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17, | ||||
| 0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19, | ||||
| 0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b, | ||||
| 0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d, | ||||
| 0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f, | ||||
| 0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21, | ||||
| 0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23, | ||||
| 0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25, | ||||
| 0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27, | ||||
| 0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a, | ||||
| 0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c, | ||||
| 0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e, | ||||
| 0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31, | ||||
| 0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, | ||||
| 0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36, | ||||
| 0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, | ||||
| 0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b, | ||||
| 0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e, | ||||
| 0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, | ||||
| 0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43, | ||||
| 0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46, | ||||
| 0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49, | ||||
| 0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b, | ||||
| 0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e, | ||||
| 0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51, | ||||
| 0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54, | ||||
| 0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57, | ||||
| 0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a, | ||||
| 0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d, | ||||
| 0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60, | ||||
| 0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63, | ||||
| 0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66, | ||||
| 0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69, | ||||
| 0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c, | ||||
| 0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70, | ||||
| 0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73, | ||||
| 0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76, | ||||
| 0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79, | ||||
| 0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c, | ||||
| 0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f | ||||
| }; | ||||
					Loading…
					
					
				
		Reference in new issue
	
	 Jack Humbert
						Jack Humbert