PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Dependents:   Sensitive

Fork of PokittoLib by Jonne Valola

POKITTO_LIBS/Synth/Synth_helpers.cpp

Committer:
spinal
Date:
2017-10-18
Revision:
15:0bbe8f6fae32
Parent:
7:72f87b7c7400

File content as of revision 15:0bbe8f6fae32:

/**************************************************************************/
/*!
    @file     Synth_envfuncs.cpp
    @author   Jonne Valola

    @section LICENSE

    Pokitto development stage library
    Software License Agreement

    Copyright (c) 2015, Jonne Valola ("Author")
    All rights reserved.

    This library is intended solely for the purpose of Pokitto development.

    Redistribution and use in source and binary forms, with or without
    modification requires written permission from Author.
*/
/**************************************************************************/

#include "Pokitto.h"
#include "Synth.h"

#define PROGMEM
    #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
    #ifndef WIN32
    #ifndef pgm_read_word
    #define pgm_read_word(addr) (*(const unsigned short *)(addr))
    #endif
    #else
    #define pgm_read_word(addr) (*(const unsigned int *)(addr))
    #endif // WIN32

// http://www.arklyffe.com/main/2010/08/29/xorshift-pseudorandom-number-generator/
static uint8_t y8 = 1;
static uint16_t y16 = 1;

// returns values from 1 to 255 inclusive, period is 255
uint8_t xorshift8(void) {
    //y8 ^= (y8 << 7);
    y8 ^= (y8 * 128);
    y8 ^= (y8 >> 5);
    //return y8 ^= (y8 << 3);
    return y8 ^= (y8 * 8);
}

// returns values from 1 to 65535 inclusive, period is 65535
uint16_t xorshift16(void) {
    //y16 ^= (y16 << 13);
    y16 ^= (y16 * 8192);
    y16 ^= (y16 >> 9);
    //return y16 ^= (y16 << 7);
    return y16 ^= (y16 * 128);
}


int8_t arptable[MAX_ARPMODE][5] = {
{0,0,0,0,0}, // Off
{0,4,7,4,0}, // Major tonic, 3rd, 5th
{0,3,7,3,0}, // Minor tonic, 3rd, 5th
{0,1,0,-1,0}, // vibrato test
{0,12,0,12,0}, // octave test
{0,11,14,17,21}, // funky test
};

/** VITAL TABLES **/

uint16_t cincs[] ={
36,  // 0 - NOTE_B0
38,  // 1 - NOTE_C1
40,  // 2 - NOTE_CS1
43,  // 3 - NOTE_D1
45,  // 4 - NOTE_DS1
47,  // 5 - NOTE_E1
51,  // 6 - NOTE_F1
53,  // 7 - NOTE_FS1
56,  // 8 - NOTE_G1
60,  // 9 - NOTE_GS1
63,  // 10 - NOTE_A1
67,  // 11 - NOTE_AS1
71,  // 12 - NOTE_B1
75,  // 13 - NOTE_C2
79,  // 14 - NOTE_CS2
84,  // 15 - NOTE_D2
90,  // 16 - NOTE_DS2
94,  // 17 - NOTE_E2
100,  // 18 - NOTE_F2
107,  // 19 - NOTE_FS2
113,  // 20 - NOTE_G2
120,  // 21 - NOTE_GS2
127,  // 22 - NOTE_A2
135,  // 23 - NOTE_AS2
142,  // 24 - NOTE_B2
151,  // 25 - NOTE_C3
160,  // 26 - NOTE_CS3
169,  // 27 - NOTE_D3
180,  // 28 - NOTE_DS3
190,  // 29 - NOTE_E3
201,  // 30 - NOTE_F3
213,  // 31 - NOTE_FS3
225,  // 32 - NOTE_G3
239, //239,  // 33 - NOTE_GS3
253,  // 34 - NOTE_A3
267,  // 35 - NOTE_AS3
284,  // 36 - NOTE_B3
301,  // 37 - NOTE_C4
318,  // 38 - NOTE_CS4
338,  // 39 - NOTE_D4
358,  // 40 - NOTE_DS4
379,  // 41 - NOTE_E4
402,  // 42 - NOTE_F4
426,  // 43 - NOTE_FS4
452,  // 44 - NOTE_G4
478,  // 45 - NOTE_GS4
504,  // 46 - NOTE_A4 // 440Hz
537,  // 47 - NOTE_AS4
570,  // 48 - NOTE_B4
601,  // 49 - NOTE_C5
636,  // 50 - NOTE_CS5
676,  // 51 - NOTE_D5
712,  // 52 - NOTE_DS5
762,  // 53 - NOTE_E5
799,  // 54 - NOTE_F5
851,  // 55 - NOTE_FS5
898,  // 56 - NOTE_G5
950,  // 57 - NOTE_GS5
1008,  // 58 - NOTE_A5
1074,  // 59 - NOTE_AS5
1130,  // 60 - NOTE_B5
1214,  // 61 - NOTE_C6
1285,  // 62 - NOTE_CS6
1337,  // 63 - NOTE_D6
1425,  // 64 - NOTE_DS6
1524,  // 65 - NOTE_E6
1598,  // 66 - NOTE_F6
1680,  // 67 - NOTE_FS6
1820,  // 68 - NOTE_G6
1928,  // 69 - NOTE_GS6
2048,  // 70 - NOTE_A6
2114,  // 71 - NOTE_AS6
2260,  // 72 - NOTE_B6
2427,  // 73 - NOTE_C7
2521,  // 74 - NOTE_CS7
2731,  // 75 - NOTE_D7
2849,  // 76 - NOTE_DS7
2979,  // 77 - NOTE_E7
3277,  // 78 - NOTE_F7
3449,  // 79 - NOTE_FS7
3641,  // 80 - NOTE_G7
3855,  // 81 - NOTE_GS7
4096,  // 82 - NOTE_A7
4369,  // 83 - NOTE_AS7
4681,  // 84 - NOTE_B7
4681,  // 85 - NOTE_C8
5041,  // 86 - NOTE_CS8
5461,  // 87 - NOTE_D8
5958,  // 88 - NOTE_DS8
};


/** NOTE TO TEXT TABLES **/

const char note_0[] PROGMEM = "B-0";  // 0 - NOTE_B0
const char note_1[] PROGMEM = "C-1";  // 1 - NOTE_C1
const char note_2[] PROGMEM = "C#1";  // 2 - NOTE_CS1
const char note_3[] PROGMEM = "D-1";  // 3 - NOTE_D1
const char note_4[] PROGMEM = "D#1";  // 4 - NOTE_DS1
const char note_5[] PROGMEM = "E-1";  // 5 - NOTE_E1
const char note_6[] PROGMEM = "F-1";  // 6 - NOTE_F1
const char note_7[] PROGMEM = "F#1";  // 7 - NOTE_FS1
const char note_8[] PROGMEM = "G-1";  // 8 - NOTE_G1
const char note_9[] PROGMEM = "G#1";  // 9 - NOTE_GS1
const char note_10[] PROGMEM = "A-1";  // 10 - NOTE_A1
const char note_11[] PROGMEM = "A#1";  // 11 - NOTE_AS1
const char note_12[] PROGMEM = "B-1";  // 12 - NOTE_B1
const char note_13[] PROGMEM = "C-2";  // 2 - NOTE_C2
const char note_14[] PROGMEM = "C#2";  // 2 - NOTE_CS2
const char note_15[] PROGMEM = "D-2";  // 3 - NOTE_D2
const char note_16[] PROGMEM = "D#2";  // 4 - NOTE_DS2
const char note_17[] PROGMEM = "E-2";  // 5 - NOTE_E2
const char note_18[] PROGMEM = "F-2";  // 6 - NOTE_F2
const char note_19[] PROGMEM = "F#2";  // 7 - NOTE_FS2
const char note_20[] PROGMEM = "G-2";  // 8 - NOTE_G2
const char note_21[] PROGMEM = "G#2";  // 9 - NOTE_GS2
const char note_22[] PROGMEM = "A-2";  // 20 - NOTE_A2
const char note_23[] PROGMEM = "A#2";  // 22 - NOTE_AS2
const char note_24[] PROGMEM = "B-2";  // 22 - NOTE_B2
const char note_25[] PROGMEM = "C-3";  // 3 - NOTE_C3
const char note_26[] PROGMEM = "C#3";  // 3 - NOTE_CS3
const char note_27[] PROGMEM = "D-3";  // 3 - NOTE_D3
const char note_28[] PROGMEM = "D#3";  // 4 - NOTE_DS3
const char note_29[] PROGMEM = "E-3";  // 5 - NOTE_E3
const char note_30[] PROGMEM = "F-3";  // 6 - NOTE_F3
const char note_31[] PROGMEM = "F#3";  // 7 - NOTE_FS3
const char note_32[] PROGMEM = "G-3";  // 8 - NOTE_G3
const char note_33[] PROGMEM = "G#3";  // 9 - NOTE_GS3
const char note_34[] PROGMEM = "A-3";  // 30 - NOTE_A3
const char note_35[] PROGMEM = "A#3";  // 33 - NOTE_AS3
const char note_36[] PROGMEM = "B-3";  // 33 - NOTE_B3
const char note_37[] PROGMEM = "C-4";  // 4 - NOTE_C4
const char note_38[] PROGMEM = "C#4";  // 4 - NOTE_CS4
const char note_39[] PROGMEM = "D-4";  // 3 - NOTE_D4
const char note_40[] PROGMEM = "D#4";  // 4 - NOTE_DS4
const char note_41[] PROGMEM = "E-4";  // 5 - NOTE_E4
const char note_42[] PROGMEM = "F-4";  // 6 - NOTE_F4
const char note_43[] PROGMEM = "F#4";  // 7 - NOTE_FS4
const char note_44[] PROGMEM = "G-4";  // 8 - NOTE_G4
const char note_45[] PROGMEM = "G#4";  // 9 - NOTE_GS4
const char note_46[] PROGMEM = "A-4";  // 40 - NOTE_A4
const char note_47[] PROGMEM = "A#4";  // 44 - NOTE_AS4
const char note_48[] PROGMEM = "B-4";  // 44 - NOTE_B4
const char note_49[] PROGMEM = "C-5";  // 5 - NOTE_C5
const char note_50[] PROGMEM = "C#5";  // 5 - NOTE_CS5
const char note_51[] PROGMEM = "D-5";  // 3 - NOTE_D5
const char note_52[] PROGMEM = "D#5";  // 4 - NOTE_DS5
const char note_53[] PROGMEM = "E-5";  // 5 - NOTE_E5
const char note_54[] PROGMEM = "F-5";  // 6 - NOTE_F5
const char note_55[] PROGMEM = "F#5";  // 7 - NOTE_FS5
const char note_56[] PROGMEM = "G-5";  // 8 - NOTE_G5
const char note_57[] PROGMEM = "G#5";  // 9 - NOTE_GS5
const char note_58[] PROGMEM = "A-5";  // 50 - NOTE_A5
const char note_59[] PROGMEM = "A#5";  // 55 - NOTE_AS5
const char note_60[] PROGMEM = "B-5";  // 55 - NOTE_B5
const char note_61[] PROGMEM = "C-6";  // 6 - NOTE_C6
const char note_62[] PROGMEM = "C#6";  // 6 - NOTE_CS6
const char note_63[] PROGMEM = "D-6";  // 3 - NOTE_D6
const char note_64[] PROGMEM = "D#6";  // 4 - NOTE_DS6
const char note_65[] PROGMEM = "E-6";  // 5 - NOTE_E6
const char note_66[] PROGMEM = "F-6";  // 6 - NOTE_F6
const char note_67[] PROGMEM = "F#6";  // 7 - NOTE_FS6
const char note_68[] PROGMEM = "G-6";  // 8 - NOTE_G6
const char note_69[] PROGMEM = "G#6";  // 9 - NOTE_GS6
const char note_70[] PROGMEM = "A-6";  // 60 - NOTE_A6
const char note_71[] PROGMEM = "A#6";  // 66 - NOTE_AS6
const char note_72[] PROGMEM = "B-6";  // 66 - NOTE_B6
const char note_73[] PROGMEM = "C-7";  // 7 - NOTE_C7
const char note_74[] PROGMEM = "C#7";  // 7 - NOTE_CS7
const char note_75[] PROGMEM = "D-7";  // 3 - NOTE_D7
const char note_76[] PROGMEM = "D#7";  // 4 - NOTE_DS7
const char note_77[] PROGMEM = "E-7";  // 5 - NOTE_E7
const char note_78[] PROGMEM = "F-7";  // 6 - NOTE_F7
const char note_79[] PROGMEM = "F#7";  // 7 - NOTE_FS7
const char note_80[] PROGMEM = "G-7";  // 8 - NOTE_G7
const char note_81[] PROGMEM = "G#7";  // 9 - NOTE_GS7
const char note_82[] PROGMEM = "A-7";  // 70 - NOTE_A7
const char note_83[] PROGMEM = "A#7";  // 77 - NOTE_AS7
const char note_84[] PROGMEM = "B-7";  // 77 - NOTE_B7
const char note_85[] PROGMEM = "C-8";  // 8 - NOTE_C8
const char note_86[] PROGMEM = "C#8";  // 8 - NOTE_CS8
const char note_87[] PROGMEM = "D-8";  // 3 - NOTE_D8
const char note_88[] PROGMEM = "D#8";  // 4 - NOTE_DS8

const char* note_table[] PROGMEM = {
 note_0,
 note_1,
 note_2,
 note_3,
 note_4,
 note_5,
 note_6,
 note_7,
 note_8,
 note_9,
 note_10,
 note_11,
 note_12,
 note_13,
 note_14,
 note_15,
 note_16,
 note_17,
 note_18,
 note_19,
 note_20,
 note_21,
 note_22,
 note_23,
 note_24,
 note_25,
 note_26,
 note_27,
 note_28,
 note_29,
 note_30,
 note_31,
 note_32,
 note_33,
 note_34,
 note_35,
 note_36,
 note_37,
 note_38,
 note_39,
 note_40,
 note_41,
 note_42,
 note_43,
 note_44,
 note_45,
 note_46,
 note_47,
 note_48,
 note_49,
 note_50,
 note_51,
 note_52,
 note_53,
 note_54,
 note_55,
 note_56,
 note_57,
 note_58,
 note_59,
 note_60,
 note_61,
 note_62,
 note_63,
 note_64,
 note_65,
 note_66,
 note_67,
 note_68,
 note_69,
 note_70,
 note_71,
 note_72,
 note_73,
 note_74,
 note_75,
 note_76,
 note_77,
 note_78,
 note_79,
 note_80,
 note_81,
 note_82,
 note_83,
 note_84,
 note_85,
 note_86,
 note_87,
 note_88,
};

void getNoteString(char * buffer, uint8_t i) {
    if (i>88) strcpy(buffer,"@@@");
    else strcpy(buffer, note_table[i]);
}