Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // -----------------------------------------------
- // LL412
- // -----------------------------------------------
- // Historique:
- // (Baloran) laurent.lecatelier@free.fr, version 0.1.3 07/05/2012
- // (Baloran) laurent.lecatelier@free.fr, version 0.1.4 08/05/2012
- // (Baloran) laurent.lecatelier@free.fr, version 0.1.5 10/05/2012 : optimisation du code, ajout du LFO Rand et Alien, Ajout du Midi Thru, Amélioration Dual et Split
- // (Baloran) laurent.lecatelier@free.fr, version 0.1.6 11/05/2012 : ajout du stop, continu, start midi
- // (Baloran) laurent.lecatelier@free.fr, version 0.1.7 03/06/2012 : ajout de l'accord, ajout d'arpèges divers
- // -----------------------------------------------
- #include <LiquidCrystal.h>
- #include "MIDI.h"
- #include <EEPROM.h>
- #include <avr/pgmspace.h>
- // Forme d'ondes du LFO
- const char Sinus[] PROGMEM = {128, 131, 134, 137, 140, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 179, 182, 185, 188, 191, 193, 196, 199, 201, 204, 206, 209, 211, 213, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 239, 240, 241, 243, 244, 245, 246, 248, 249, 250, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 251, 250, 250, 249, 248, 246, 245, 244, 243, 241, 240, 239, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220, 218, 216, 213, 211, 209, 206, 204, 201, 199, 196, 193, 191, 188, 185, 182, 179, 177, 174, 171, 168, 165, 162, 159, 156, 153, 150, 147, 144, 140, 137, 134, 131, 128, 125, 122, 119, 116, 112, 109, 106, 103, 100, 97, 94, 91, 88, 85, 82, 79, 77, 74, 71, 68, 65, 63, 60, 57, 55, 52, 50, 47, 45, 43, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 21, 19, 17, 16, 15, 13, 12, 11, 10, 8, 7, 6, 6, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 19, 21, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 43, 45, 47, 50, 52, 55, 57, 60, 63, 65, 68, 71, 74, 77, 79, 82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 116, 119, 122, 125};
- const char Triangle[] PROGMEM = {128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 255, 253, 251, 249, 247, 245, 243, 241, 239, 237, 235, 233, 231, 229, 227, 225, 223, 221, 219, 217, 215, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 173, 171, 169, 167, 165, 163, 161, 159, 157, 155, 153, 151, 149, 147, 145, 143, 141, 139, 137, 135, 133, 131, 129, 127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107, 105, 103, 101, 99, 97, 95, 93, 91, 89, 87, 85, 83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126 };
- const char Rampe[] PROGMEM = {128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 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, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127 };
- const char Carre[] PROGMEM = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 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, 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 };
- const char Sinsom[] PROGMEM = {128, 133, 137, 142, 147, 151, 156, 160, 165, 169, 173, 178, 182, 186, 190, 193, 197, 201, 204, 208, 211, 214, 217, 219, 222, 224, 227, 229, 231, 232, 234, 235, 236, 237, 238, 239, 239, 240, 240, 240, 239, 239, 238, 238, 237, 236, 234, 233, 232, 230, 228, 226, 224, 222, 220, 217, 215, 212, 209, 206, 204, 201, 198, 195, 192, 188, 185, 182, 179, 176, 172, 169, 166, 163, 160, 157, 153, 150, 148, 145, 142, 139, 136, 134, 131, 129, 126, 124, 122, 120, 118, 116, 115, 113, 112, 111, 109, 108, 107, 107, 106, 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 107, 107, 108, 109, 110, 111, 112, 113, 115, 116, 117, 119, 120, 122, 123, 125, 126, 128, 130, 131, 133, 134, 136, 137, 139, 140, 141, 143, 144, 145, 146, 147, 148, 149, 149, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 150, 149, 149, 148, 147, 145, 144, 143, 141, 140, 138, 136, 134, 132, 130, 127, 125, 122, 120, 117, 114, 111, 108, 106, 103, 99, 96, 93, 90, 87, 84, 80, 77, 74, 71, 68, 65, 61, 58, 55, 52, 50, 47, 44, 41, 39, 36, 34, 32, 30, 28, 26, 24, 23, 22, 20, 19, 18, 18, 17, 17, 16, 16, 16, 17, 17, 18, 19, 20, 21, 22, 24, 25, 27, 29, 32, 34, 37, 39, 42, 45, 48, 52, 55, 59, 63, 66, 70, 74, 78, 83, 87, 91, 96, 100, 105, 109, 114, 119, 123 };
- const char Ransom[] PROGMEM = {128, 130, 131, 133, 134, 136, 137, 139, 140, 142, 143, 145, 146, 148, 149, 151, 152, 154, 155, 157, 158, 160, 161, 163, 164, 166, 167, 169, 170, 172, 173, 175, 176, 178, 179, 181, 182, 184, 185, 187, 188, 190, 191, 193, 194, 196, 197, 199, 200, 202, 203, 205, 206, 208, 209, 211, 212, 214, 215, 217, 218, 220, 221, 223, 96, 98, 99, 101, 102, 104, 105, 107, 108, 110, 111, 113, 114, 116, 117, 119, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 137, 138, 140, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 159, 161, 162, 164, 165, 167, 168, 170, 171, 173, 174, 176, 177, 179, 180, 182, 183, 185, 186, 188, 189, 191, 64, 66, 67, 69, 70, 72, 73, 75, 76, 78, 79, 81, 82, 84, 85, 87, 88, 90, 91, 93, 94, 96, 97, 99, 100, 102, 103, 105, 106, 108, 109, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145, 147, 148, 150, 151, 153, 154, 156, 157, 159, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 119, 121, 122, 124, 125, 127 };
- // Choix fréquence du LFO
- const PROGMEM uint16_t Onde_Hz[] = {100, 102, 105, 107, 110, 112, 115, 117, 120, 122, 125, 127, 130, 132, 135, 137, 140, 142, 145, 147, 150, 152, 155, 157, 160, 162, 165, 168, 170, 173, 175, 178, 181, 183, 186, 188, 191, 194, 196, 199, 202, 204, 207, 209, 212, 215, 217, 220, 223, 226, 228, 231, 234, 236, 239, 242, 245, 247, 250, 253, 256, 258, 261, 264, 267, 269, 272, 275, 278, 281, 283, 286, 289, 292, 295, 298, 301, 303, 306, 309, 312, 315, 318, 321, 324, 327, 329, 332, 335, 338, 341, 344, 347, 350, 353, 356, 359, 362, 365, 368, 371, 374, 377, 380, 383, 386, 389, 393, 396, 399, 402, 405, 408, 411, 414, 417, 421, 424, 427, 430, 433, 436, 440, 443, 446, 449, 453, 456, 459, 462, 466, 469, 472, 475, 479, 482, 485, 489, 492, 495, 499, 502, 505, 509, 512, 516, 519, 522, 526, 529, 533, 536, 540, 543, 546, 550, 553, 557, 561, 564, 568, 571, 575, 578, 582, 585, 589, 593, 596, 600, 604, 607, 611, 615, 618, 622, 626, 629, 633, 637, 641, 644, 648, 652, 656, 660, 663, 667, 671, 675, 679, 683, 687, 690, 694, 698, 702, 706, 710, 714, 718, 722, 726, 730, 734, 738, 742, 746, 751, 755, 759, 763, 767, 771, 775, 780, 784, 788, 792, 797, 801, 805, 809, 814, 818, 822, 827, 831, 835, 840, 844, 849, 853, 858, 862, 867, 871, 876, 880, 885, 889, 894, 899, 903, 908, 912, 917, 922, 927, 931, 936, 941, 946, 950, 955, 960, 965, 970, 975, 980, 985, 990, 995, 1000, 1005, 1010, 1015, 1020, 1025, 1030, 1035, 1040, 1046, 1051, 1056, 1061, 1066, 1072, 1077, 1082, 1088, 1093, 1099, 1104, 1110, 1115, 1121, 1126, 1132, 1137, 1143, 1148, 1154, 1160, 1165, 1171, 1177, 1183, 1189, 1194, 1200, 1206, 1212, 1218, 1224, 1230, 1236, 1242, 1248, 1254, 1261, 1267, 1273, 1279, 1286, 1292, 1298, 1305, 1311, 1317, 1324, 1330, 1337, 1344, 1350, 1357, 1364, 1370, 1377, 1384, 1391, 1398, 1405, 1411, 1418, 1425, 1433, 1440, 1447, 1454, 1461, 1469, 1476, 1483, 1491, 1498, 1506, 1513, 1521, 1528, 1536, 1544, 1551, 1559, 1567, 1575, 1583, 1591, 1599, 1607, 1615, 1624, 1632, 1640, 1649, 1657, 1666, 1674, 1683, 1692, 1700, 1709, 1718, 1727, 1736, 1745, 1754, 1764, 1773, 1782, 1792, 1801, 1811, 1820, 1830, 1840, 1850, 1860, 1870, 1880, 1890, 1900, 1910, 1921, 1931, 1942, 1953, 1964, 1974, 1985, 1997, 2008, 2019, 2030, 2042, 2054, 2065, 2077, 2089, 2101, 2113, 2126, 2138, 2151, 2163, 2176, 2189, 2202, 2215, 2229, 2242, 2256, 2269, 2283, 2298, 2312, 2326, 2341, 2356, 2371, 2386, 2401, 2416, 2432, 2448, 2464, 2480, 2497, 2514, 2531, 2548, 2565, 2583, 2601, 2619, 2638, 2657, 2676, 2695, 2715, 2735, 2755, 2775, 2796, 2818, 2839, 2862, 2884, 2907, 2930, 2954, 2978, 3003, 3028, 3054, 3080, 3107, 3134, 3162, 3191, 3221, 3251, 3281, 3313, 3345, 3379, 3413, 3448, 3484, 3521, 3560, 3600, 3640, 3683, 3727, 3772, 3819, 3868, 3919, 3972, 4027, 4086, 4146, 4210, 4278, 4349, 4425, 4505, 4592, 4684, 4784, 4892, 5011, 5143, 5290, 5456, 5649, 5876, 6155, 6514, 7020, 8000};
- // Initialisation librairie LCD
- LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
- // constantes hardware
- const byte anaIn0 = A4;
- const byte anaIn1 = A2;
- const byte anaIn2 = A0;
- #define DATAOUT 11//MOSI
- #define DATAIN 12//MISO Pa sutilisé pour le moment
- #define SPICLOCK 13//sck
- #define DAC_0 10//ss
- #define DAC_1 9//ss un seul DAC pour le moment
- #define GATE_0 8
- #define GATE_1 9
- // Allocation
- #define MIDI_LENBUF 32
- #define MIDI_LENARP 8
- #define MIDI_LENSEQ 32
- #define MIDI_MOTIF 96
- // Gestion du temps
- int REF_1V = 895; // coorespondance DAC 1v/Oct
- #define REF_CTRL 32
- #define REF_CMD_DELAY 200
- unsigned long refTime;
- unsigned long deltaTime;
- unsigned long nextTime;
- unsigned long nextGate;
- unsigned long refCmd;
- unsigned long depTime;
- // Gestion des modes
- char buf[16];
- char p_buffer[20];
- #define P(str) (strcpy_P(p_buffer, PSTR(str)), p_buffer)
- #define MODE_MODE 0
- #define MODE_REGLAGE 1
- byte mode_reglage = MODE_MODE;
- #define NB_MENU_REGLAGE 10
- const char m_Reglage_0[] PROGMEM = "ACCORD";
- const char m_Reglage_1[] PROGMEM = "+-SEMI";
- const char m_Reglage_2[] PROGMEM = "+-BEND";
- const char m_Reglage_3[] PROGMEM = "KEYTRA";
- const char m_Reglage_4[] PROGMEM = "1 VOLT";
- const char m_Reglage_5[] PROGMEM = "GATE/X";
- const char m_Reglage_6[] PROGMEM = "CHNL";
- const char m_Reglage_7[] PROGMEM = "CLK";
- const char m_Reglage_8[] PROGMEM = "MUTVEL";
- const char m_Reglage_9[] PROGMEM = "EEPROM";
- const char * const menu_Reglage[] PROGMEM = {
- m_Reglage_0,
- m_Reglage_1,
- m_Reglage_2,
- m_Reglage_3,
- m_Reglage_4,
- m_Reglage_5,
- m_Reglage_6,
- m_Reglage_7,
- m_Reglage_8,
- m_Reglage_9 };
- /*
- char *Menu_Reglage[] = { "+-SEMI",
- "+-OCTA",
- "+-BEND",
- "KEYTRA",
- "1 VOLT",
- "GATE/X",
- "MIDCHA",
- "MIDCLK",
- "MUTVEL",
- "EEPROM"};
- */
- #define REGLE_ACCORD 0
- #define REGLE_DEMIT 1
- #define REGLE_BEND 2
- #define REGLE_DECAL 3
- #define REGLE_REF1V 4
- #define REGLE_GATECLK 5
- #define REGLE_MIDI 6
- #define REGLE_CLOCK 7
- #define REGLE_VELMUT 8
- #define REGLE_EEPROM 9
- #define NB_MENU_MODE 8
- const char m_Mode_0[] PROGMEM = "SIMPLE";
- const char m_Mode_1[] PROGMEM = "LEGATO";
- const char m_Mode_2[] PROGMEM = "DUAL";
- const char m_Mode_3[] PROGMEM = "SPLIT";
- const char m_Mode_4[] PROGMEM = "ARP";
- const char m_Mode_5[] PROGMEM = "ARP/SU";
- const char m_Mode_6[] PROGMEM = "ARP/TR";
- const char m_Mode_7[] PROGMEM = "SEQUEN";
- const char * const menu_Mode[] PROGMEM = {
- m_Mode_0,
- m_Mode_1,
- m_Mode_2,
- m_Mode_3,
- m_Mode_4,
- m_Mode_5,
- m_Mode_6,
- m_Mode_7 };
- /*
- char *Menu_Mode[] = { "SIMPLE",
- "REGATE",
- "DUAL",
- "SPLIT",
- "ARP",
- "SUS",
- "TRANS",
- "SEQ" };
- */
- byte gen_Reglage = REGLE_DEMIT;
- byte old_Reglage = REGLE_DEMIT;
- #define MODE_MONO 0
- #define MODE_RETRIG 1
- #define MODE_DUO 2
- #define MODE_SPLIT 3
- #define MODE_ARPEGE 4
- #define MODE_ARPEGE_SUST 5
- #define MODE_ARPEGE_TRANS 6
- #define MODE_SEQUENCER 7
- byte gen_Mode = MODE_MONO;
- byte old_Mode = MODE_MONO;
- // Gestion des controleur
- #define NB_MENU_CTRL 6
- #define NB_MENU_CTRL_RED 2
- #define NB_MENU_VELMUT 5
- const char m_Ctrl_0[] PROGMEM = "VEL";
- const char m_Ctrl_1[] PROGMEM = "EXP";
- const char m_Ctrl_2[] PROGMEM = "EXPxVEL";
- const char m_Ctrl_3[] PROGMEM = "LFO";
- const char m_Ctrl_4[] PROGMEM = "LFOxVEL";
- const char m_Ctrl_5[] PROGMEM = "LFOxEXP";
- const char m_Ctrl_6[] PROGMEM = "OFF";
- const char m_Ctrl_7[] PROGMEM = "MUTE";
- const char m_Ctrl_8[] PROGMEM = "MUTEXP";
- const char * const menu_Ctrl[] PROGMEM = {
- m_Ctrl_0,
- m_Ctrl_1,
- m_Ctrl_2,
- m_Ctrl_3,
- m_Ctrl_4,
- m_Ctrl_5};
- const char * const menu_Ctrl_Red[] PROGMEM = {
- m_Ctrl_6,
- m_Ctrl_1 };
- const char * const menu_Velmut[] PROGMEM = {
- m_Ctrl_6,
- m_Ctrl_0,
- m_Ctrl_1,
- m_Ctrl_7,
- m_Ctrl_8};
- /*
- char *Menu_Ctrl[] = { "VEL",
- "EXP",
- "EXPxVEL",
- "LFO",
- "LFOxVEL",
- "LFOxEXP" };
- */
- #define MODE_CTRL_VEL 0
- #define MODE_CTRL_EXP 1
- #define MODE_CTRL_EXPVEL 2
- #define MODE_CTRL_LFO 3
- #define MODE_CTRL_LFOVEL 4
- #define MODE_CTRL_LFOEXP 5
- byte gen_Ctrl = MODE_CTRL_VEL;
- int gen_CtrlPc = 100; // 0-100
- int old_CtrlPc = 100; // 0-100
- byte gen_Last_Ctrl = 0;
- byte gen_Last_Velo = 0;
- // Gestion du LFO
- #define NB_ONDE 8
- byte gen_Onde = 0;
- int gen_Rand = 128;
- int cycle_Rand = 300;
- char inc_Rand = 0;
- int gen_OndeHz = 998;
- int old_OndeHz = 998;
- const char m_Onde_0[] PROGMEM = "SIN";
- const char m_Onde_1[] PROGMEM = "TRI";
- const char m_Onde_2[] PROGMEM = "SAW";
- const char m_Onde_3[] PROGMEM = "SQR";
- const char m_Onde_4[] PROGMEM = "2SIN";
- const char m_Onde_5[] PROGMEM = "2SAW";
- const char m_Onde_6[] PROGMEM = "RAND";
- const char m_Onde_7[] PROGMEM = "ALIEN";
- const char * const menu_Onde[] PROGMEM = {
- m_Onde_0,
- m_Onde_1,
- m_Onde_2,
- m_Onde_3,
- m_Onde_4,
- m_Onde_5,
- m_Onde_6,
- m_Onde_7};
- /*
- char *Menu_Onde[] = { "SIN",
- "TRI",
- "SAW",
- "SQR",
- "2SIN",
- "2SAW"};
- */
- // Gestion du Bend
- char gen_Pitch = 2;
- int midi_Pitch_Value = 0;
- // Gestion midi
- char gen_Midi=0;
- char gen_Clock=0;
- char gen_Clock_State=0;
- char gen_Cpt_Clock=0;
- char gen_Midi_Gate=0;
- char gen_VelMute=0;
- char ref_VelMute=48;
- char gen_GateClk=4;
- char cpt_gate=0;
- // Gestion de la transposition générale
- char gen_Transpose = 0 ;
- char gen_Accord = 0;
- char gen_Decalage = 24 ;
- // Gestion du tempo
- int gen_Tempo = 120 ;
- int old_Tempo = 120 ;
- int cycle = 60000 / 120;
- // Gestion des notes
- char *Note[] = { "C","C#","D","D#","E","F","F#","G","G#","A","A#","B" };
- byte gen_Split = 48;
- boolean init_Dual=false;
- // Gestion du Buffer Midi
- typedef struct {
- byte Etat;
- byte Note;
- byte Expr;
- unsigned long rTime;
- } BufMidi;
- BufMidi bMidi[MIDI_LENBUF];
- int gen_Midi_Max = 0;
- // Gestion des motif / Arpège / Sequence
- typedef struct {
- char *nom;
- byte octave;
- byte sens;
- } Sch_Motif;
- #define NB_MOTIF 23
- Sch_Motif lMotif[]={
- {"Up1",1,0},
- {"Up2",2,0},
- {"Up3",3,0},
- {"Dw1",1,1},
- {"Dw2",2,1},
- {"Dw3",3,1},
- {"UD1",1,2},
- {"UD2",2,2},
- {"UD3",3,2},
- {"Ran1",1,4},
- {"Ran2",2,4},
- {"Ran3",3,4},
- {"Rnb1",1,5},
- {"Rnb2",2,5},
- {"Rnb3",3,5},
- {"Pro1",1,3},
- {"Pro2",2,3},
- {"Cov1",1,6},
- {"Cov2",2,6},
- {"Low1",1,7},
- {"Low2",2,7},
- {"Hig1",1,8},
- {"Hig2",2,8}};
- byte ord_Motif[MIDI_LENARP];
- byte Motif[MIDI_MOTIF];
- byte temp_Motif[MIDI_MOTIF];
- char gen_Motif = 0;
- char old_Motif = 0;
- char pos_Motif = 0;
- char max_Motif = 0;
- char max_Order_Motif = 0;
- boolean doit_Reconstruit_Motif;
- boolean is_Recorder=true;
- char pos_Recorder=0;
- char ref_Arpege_Trans=0;
- // Gestion LCD
- char tmpCh[30];
- #define Z0 0
- #define Z1 1
- #define Z2 2
- #define Z3 3
- #define Z4 4
- #define Z5 5
- char *zVide = "";
- byte ZL[]= {7, 7, 6, 7, 7, 6};
- byte ZPOS[]= {1, 8, 14, 1, 8, 14};
- byte ZLIN[]= {0, 0, 0, 1, 1, 1};
- void str_LCD(int Zn, char *value)
- {
- char buf[16];
- byte cpt=0;
- while ( value[cpt] && cpt < ZL[Zn] ) {
- buf[cpt]=value[cpt];
- cpt++;
- }
- while ( cpt < ZL[Zn] ) buf[cpt++]=32;
- buf[cpt++]=0;
- lcd.setCursor(ZPOS[Zn],ZLIN[Zn]);
- lcd.print(buf);
- }
- void progmem_LCD(int Zn, char *Adress)
- {
- strcpy_P(tmpCh, Adress);
- str_LCD(Zn, tmpCh);
- }
- void int_LCD(int Zn, int value)
- {
- sprintf(tmpCh,"%d",value);
- str_LCD(Zn, tmpCh);
- }
- void sign_LCD(int Zn, int value)
- {
- if (value>0)
- sprintf(tmpCh,"+%d",value);
- else
- sprintf(tmpCh,"%d",value);
- str_LCD(Zn, tmpCh);
- }
- void trans_LCD(int Zn, int value)
- {
- if (value>0)
- sprintf(tmpCh,"TR=+%d",value);
- else
- sprintf(tmpCh,"TR=%d",value);
- str_LCD(Zn, tmpCh);
- }
- void pc_LCD(int Zn, int value)
- {
- sprintf(tmpCh,"%d%%",value);
- str_LCD(Zn, tmpCh);
- }
- void hz_LCD(int Zn, int value)
- {
- float temp = 1000.0 / value;
- int temp1 = (temp - (int)temp) * 100;
- sprintf(tmpCh,"%d.%d Hz", (int)temp, temp1 );
- str_LCD(Zn, tmpCh);
- }
- void tempo_LCD(int Zn, int value)
- {
- if (gen_Clock==0)
- sprintf(tmpCh,"%d BPM", value );
- else
- strcpy(tmpCh,P("EXT."));
- str_LCD(Zn, tmpCh);
- }
- void note_LCD(int Zn, byte value)
- {
- sprintf(tmpCh,"%s%d", Note[ (value % 12 ) ], (value/12) + 1 );
- str_LCD(Zn, tmpCh);
- }
- void midi_LCD(int Zn, int value)
- {
- switch(value)
- {
- case 0:
- str_LCD(Zn, P("OMNI"));break;
- case 17:
- str_LCD(Zn, P("OFF"));break;
- default:
- int_LCD(Zn, value);break;
- }
- }
- byte clock_Div[]={0, 6 , 8 , 12 , 24};
- void clock_LCD(int Zn, int value)
- {
- switch(value)
- {
- case 0:
- str_LCD(Zn, P("INT"));break;
- case 1:
- str_LCD(Zn, P("EXT/6"));break;
- case 2:
- str_LCD(Zn, P("EXT/8"));break;
- case 3:
- str_LCD(Zn, P("EXT/12"));break;
- case 4:
- str_LCD(Zn, P("EXT/24"));break;
- }
- }
- void onoff_LCD(int Zn, int value)
- {
- switch(value)
- {
- case 0:
- str_LCD(Zn, P("OFF") );break;
- default:
- int_LCD(Zn, value);break;
- }
- }
- void div_LCD(int Zn, int value)
- {
- sprintf(tmpCh,"1/%d", value);
- str_LCD(Zn, tmpCh);
- }
- void pos_LCD(int Zn, int value)
- {
- sprintf(tmpCh,"%d/%d", value + 1, MIDI_LENSEQ );
- str_LCD(Zn, tmpCh);
- }
- // Gestion des boutons
- #define REF_BTN_ON 800
- typedef struct {
- byte Port;
- byte Etat;
- byte Autorepet;
- } Sch_Btn;
- Sch_Btn btn[] = {
- {A5,0,0},
- {A3,0,0},
- {A1,0,0}
- };
- void ScanBtn()
- {
- for (int numBtn=0;numBtn<3;numBtn++)
- {
- int bVal = analogRead( btn[numBtn].Port );
- if (bVal > REF_BTN_ON)
- {
- if ( btn[numBtn].Etat == 0 )
- btn[numBtn].Etat = 1;
- }
- else
- {
- if ( btn[numBtn].Etat > 0 )
- btn[numBtn].Etat = 0;
- }
- }
- }
- boolean BtnTest(int numBtn, boolean autoRepet)
- {
- if (autoRepet && btn[numBtn].Etat == 2)
- {
- btn[numBtn].Autorepet--;
- if (btn[numBtn].Autorepet==0) btn[numBtn].Etat = 1;
- }
- boolean ret = (btn[numBtn].Etat == 1 );
- if ( ret )
- {
- btn[numBtn].Autorepet=2;
- btn[numBtn].Etat=2;
- }
- return ret;
- }
- // Fonctions EEPROM
- void EEPROM_writeInt(int ee, int value)
- {
- byte* p = (byte*)(void*)&value;
- for (int i = 0; i < sizeof(value); i++)
- EEPROM.write(ee++, *p++);
- }
- int EEPROM_readInt(int ee, int ref)
- {
- int value = 0;
- byte* p = (byte*)(void*)&value;
- if ( (byte)EEPROM.read(ee+1) == (byte)255 ) return ref;
- for (int i = 0; i < sizeof(value); i++)
- *p++ = EEPROM.read(ee++);
- return value;
- }
- // Fonction TRI
- void irsort(byte *a, int n)
- {
- for (int i = 1; i < n; ++i)
- {
- int j = a[i];
- int k;
- for (k = i - 1; (k >= 0) && (j > a[k]); k--)
- {
- a[k + 1] = a[k];
- }
- a[k + 1] = j;
- }
- }
- void isort(byte *a, int n)
- {
- for (int i = 1; i < n; ++i)
- {
- int j = a[i];
- int k;
- for (k = i - 1; (k >= 0) && (j < a[k]); k--)
- {
- a[k + 1] = a[k];
- }
- a[k + 1] = j;
- }
- }
- // Fonction de construction du motif
- void Reconstruit_Motif(byte reord)
- {
- int tmp_max_Motif;
- if ( reord == 1 )
- {
- max_Order_Motif=0;
- for ( int ct = 0; ct < gen_Midi_Max;ct++ )
- {
- if ( bMidi[ct].Etat >= 1 )
- {
- ord_Motif[max_Order_Motif++] = bMidi[ct].Note;
- }
- }
- isort(ord_Motif,max_Order_Motif);
- doit_Reconstruit_Motif = false;
- }
- max_Motif=0;
- tmp_max_Motif=0;
- switch( lMotif[gen_Motif].sens )
- {
- case 0:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- Motif[max_Motif++]= ord_Motif[note] + oct * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- break;
- case 1:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- Motif[max_Motif++]= ord_Motif[max_Order_Motif - note - 1] + ( lMotif[gen_Motif].octave - oct - 1) * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- break;
- case 2:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- Motif[max_Motif++]=ord_Motif[note] + oct * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- max_Motif--; // pour éviter la redondance;
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note < max_Order_Motif ; note++)
- {
- Motif[max_Motif++]=ord_Motif[max_Order_Motif - note - 1] + ( lMotif[gen_Motif].octave - oct - 1) * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- max_Motif--; // pour éviter la redondance;
- break;
- case 12:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- Motif[max_Motif++]=ord_Motif[max_Order_Motif - note - 1] + ( lMotif[gen_Motif].octave - oct - 1) * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- max_Motif--; // pour éviter la redondance;
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note < max_Order_Motif ; note++)
- {
- Motif[max_Motif++]=ord_Motif[note] + oct * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- max_Motif--; // pour éviter la redondance;
- break;
- case 3:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- temp_Motif[tmp_max_Motif++]=ord_Motif[note] + oct * 12;
- if ( tmp_max_Motif >= MIDI_MOTIF ) break;
- }
- }
- // AJoute la premiere note un octave plus haut
- if ( tmp_max_Motif < MIDI_MOTIF )
- temp_Motif[tmp_max_Motif++] = ord_Motif[0] + lMotif[gen_Motif].octave * 12;
- for (int bar = 0 ; bar < tmp_max_Motif - max_Order_Motif + 1 ; bar++)
- {
- for (int bar1 = 0 ; bar1 < max_Order_Motif ; bar1++)
- {
- Motif[max_Motif++] = temp_Motif[bar+bar1];
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- break;
- case 4:
- case 5:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- Motif[max_Motif++]=ord_Motif[note] + oct * 12;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- for (int bar = 0 ; bar < max_Motif ; bar++)
- {
- int pos = random(bar,max_Motif);
- tmp_max_Motif = Motif[bar];
- Motif[bar]=Motif[pos];
- Motif[pos]=tmp_max_Motif;
- }
- break;
- case 6:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- temp_Motif[tmp_max_Motif++]=ord_Motif[note] + oct * 12;
- if ( tmp_max_Motif >= MIDI_MOTIF ) break;
- }
- }
- {
- int bar=0; int bar1=tmp_max_Motif-1;
- while (bar <= bar1)
- {
- Motif[max_Motif++] = temp_Motif[bar];
- Motif[max_Motif++] = temp_Motif[bar1];
- bar++;
- bar1--;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- break;
- case 7:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- temp_Motif[tmp_max_Motif++]=ord_Motif[note] + oct * 12;
- if ( tmp_max_Motif >= MIDI_MOTIF ) break;
- }
- }
- {
- int bar=0; int bar1=1;
- while (bar1 < tmp_max_Motif)
- {
- Motif[max_Motif++] = temp_Motif[bar];
- Motif[max_Motif++] = temp_Motif[bar1];
- bar1++;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- break;
- case 8:
- for (int oct=0 ; oct < lMotif[gen_Motif].octave ; oct++)
- {
- for (int note=0 ; note<max_Order_Motif ; note++)
- {
- temp_Motif[tmp_max_Motif++]=ord_Motif[note] + oct * 12;
- if ( tmp_max_Motif >= MIDI_MOTIF ) break;
- }
- }
- {
- int bar=tmp_max_Motif-1; int bar1=tmp_max_Motif-2;
- while (bar1 >= 0)
- {
- Motif[max_Motif++] = temp_Motif[bar];
- Motif[max_Motif++] = temp_Motif[bar1];
- bar1--;
- if ( max_Motif >= MIDI_MOTIF ) break;
- }
- }
- break;
- }
- if ( pos_Motif >= max_Motif) pos_Motif=0;
- }
- // ------------------
- // Conversion Note tension
- // ------------------
- void p_CV(byte port, int pitch)
- {
- if (pitch < gen_Decalage ) return;
- if ( gen_Pitch > 0 && mode_reglage == MODE_MODE )
- {
- dac_Out(port, (long)REF_1V * ( pitch - gen_Decalage + gen_Transpose ) / 12 + midi_Pitch_Value + gen_Accord) ;
- }
- else
- dac_Out(port, (long)REF_1V * ( pitch - gen_Decalage + gen_Transpose ) / 12 + gen_Accord);
- }
- // ------------------
- // Ecriture d'un Gate sur Out
- // ------------------
- void p_GATE(byte port, byte Etat)
- {
- switch(port)
- {
- case 0:
- digitalWrite(GATE_0, Etat);
- break;
- case 1:
- digitalWrite(GATE_1, Etat);
- break;
- }
- }
- // ------------------
- // Initialisation Mode MIDI et nettoyage buffer
- // ------------------
- void maj_Ecran()
- {
- if ( mode_reglage == MODE_MODE )
- {
- trans_LCD( Z0, gen_Transpose);
- progmem_LCD( Z3, (char*)pgm_read_word(&(menu_Mode[gen_Mode])));
- switch(gen_Mode)
- {
- case MODE_MONO:
- case MODE_RETRIG:
- progmem_LCD( Z1, (char*)pgm_read_word(&(menu_Onde[gen_Onde])));
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Ctrl[gen_Ctrl])));
- hz_LCD( Z4, gen_OndeHz );
- pc_LCD( Z5, gen_CtrlPc );
- old_OndeHz = map( analogRead(anaIn1) ,0 , 1023 , 511 , 0);
- old_OndeHz = pgm_read_word_near(Onde_Hz + old_OndeHz);
- old_CtrlPc = map( analogRead(anaIn2) ,0 , 1023 , 0 , 100);
- break;
- case MODE_DUO:
- str_LCD( Z1, zVide );
- str_LCD( Z2, zVide );
- str_LCD( Z4, zVide );
- str_LCD( Z5, zVide );
- break;
- case MODE_SPLIT:
- note_LCD( Z1, gen_Split );
- str_LCD( Z2, zVide );
- str_LCD( Z4, zVide );
- str_LCD( Z5, zVide );
- break;
- case MODE_ARPEGE:
- str_LCD( Z1, zVide );
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Ctrl_Red[gen_Ctrl])));
- str_LCD( Z4, lMotif[gen_Motif].nom );
- tempo_LCD( Z5, gen_Tempo );
- old_Tempo = map( analogRead(anaIn2) ,0 , 1023 , 20 , 1000);
- old_Motif = map( analogRead(anaIn1) ,0 , 1023 , 0 , NB_MOTIF -1 );
- break;
- case MODE_ARPEGE_SUST:
- str_LCD( Z1, P("CLEAR") );
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Ctrl_Red[gen_Ctrl])));
- str_LCD( Z4, lMotif[gen_Motif].nom );
- tempo_LCD( Z5, gen_Tempo );
- old_Tempo = map( analogRead(anaIn2) ,0 , 1023 , 20 , 1000);
- old_Motif = map( analogRead(anaIn1) ,0 , 1023 , 0 , NB_MOTIF -1 );
- break;
- case MODE_ARPEGE_TRANS:
- if (is_Recorder)
- {
- str_LCD( Z1, P("REC") );
- }
- else
- {
- str_LCD( Z1, P("PLAY") );
- }
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Ctrl_Red[gen_Ctrl])));
- str_LCD( Z4, lMotif[gen_Motif].nom );
- tempo_LCD( Z5, gen_Tempo );
- old_Tempo = map( analogRead(anaIn2) ,0 , 1023 , 20 , 1000);
- old_Motif = map( analogRead(anaIn1) ,0 , 1023 , 0 , NB_MOTIF -1 );
- break;
- case MODE_SEQUENCER:
- if (is_Recorder)
- {
- str_LCD( Z1, P("REC") );
- pos_LCD( Z2, pos_Recorder );
- }
- else
- {
- str_LCD( Z1, P("PLAY") );
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Velmut[gen_VelMute])));
- }
- str_LCD( Z4, lMotif[gen_Motif].nom );
- tempo_LCD( Z5, gen_Tempo );
- break;
- }
- }
- else
- {
- if ( gen_Reglage != REGLE_EEPROM )
- {
- str_LCD( Z0, P("ESC") );
- str_LCD( Z1, P("-") );
- str_LCD( Z2, P("+") );
- progmem_LCD( Z3, (char*)pgm_read_word(&(menu_Reglage[gen_Reglage])));
- str_LCD( Z4, zVide );
- }
- switch(gen_Reglage)
- {
- case REGLE_DEMIT:
- sign_LCD( Z5, gen_Transpose );
- break;
- case REGLE_ACCORD:
- sign_LCD( Z5, gen_Accord );
- break;
- case REGLE_BEND:
- onoff_LCD( Z5, gen_Pitch );
- break;
- case REGLE_DECAL:
- int_LCD( Z5, gen_Decalage );
- break;
- case REGLE_REF1V:
- int_LCD( Z5, REF_1V );
- break;
- case REGLE_MIDI:
- midi_LCD( Z5, gen_Midi );
- break;
- case REGLE_GATECLK:
- div_LCD( Z5, gen_GateClk );
- break;
- case REGLE_CLOCK:
- clock_LCD( Z5, gen_Clock );
- break;
- case REGLE_VELMUT:
- int_LCD( Z5, ref_VelMute );
- break;
- case REGLE_EEPROM:
- str_LCD( Z0, P("ESC") );
- str_LCD( Z1, P("READ") );
- str_LCD( Z2, P("WRITE") );
- progmem_LCD( Z3, (char*)pgm_read_word(&(menu_Reglage[gen_Reglage])));
- str_LCD( Z5, zVide );
- str_LCD( Z4, zVide );
- break;
- }
- }
- }
- void clear_Buf()
- {
- for (int ct=0;ct<MIDI_LENBUF;ct++)
- {
- bMidi[ct].Etat=0;
- bMidi[ct].Note=0;
- }
- p_GATE(0,LOW);
- p_GATE(1,LOW);
- dac_Out(1,0);
- randomSeed(millis());
- pos_Recorder = 0;
- pos_Motif=0;
- Reconstruit_Motif(1);
- if ( mode_reglage == MODE_MODE )
- {
- switch(gen_Mode)
- {
- case MODE_MONO:
- gen_Midi_Max=1;
- break;
- case MODE_RETRIG:
- gen_Midi_Max=1;
- break;
- case MODE_DUO:
- gen_Midi_Max=2;
- break;
- case MODE_SPLIT:
- gen_Midi_Max=2;
- break;
- case MODE_ARPEGE:
- gen_Midi_Max=MIDI_LENARP;
- if (gen_Ctrl>=NB_MENU_CTRL_RED) gen_Ctrl=0;
- break;
- case MODE_ARPEGE_SUST:
- gen_Midi_Max=MIDI_LENARP;
- if (gen_Ctrl>=NB_MENU_CTRL_RED) gen_Ctrl=0;
- break;
- case MODE_ARPEGE_TRANS:
- is_Recorder=true;
- gen_Midi_Max=MIDI_LENARP;
- if (gen_Ctrl>=NB_MENU_CTRL_RED) gen_Ctrl=0;
- break;
- case MODE_SEQUENCER:
- is_Recorder=true;
- gen_Midi_Max=MIDI_LENARP;
- break;
- }
- }
- maj_Ecran();
- }
- // ------------------
- // Callback Midi PitchBend
- // ------------------
- void HandlePitchBend(byte channel, int bend)
- {
- if (gen_Pitch>0) {
- midi_Pitch_Value = ( (long)bend * REF_1V * gen_Pitch / 12 ) / 8192;
- if ( gen_Mode < MODE_ARPEGE )
- for (int ct=0 ; ct<gen_Midi_Max ; ct++ ) p_CV(ct , bMidi[ct].Note);
- }
- }
- // ------------------
- // Callback Midi NOte On
- // ------------------
- void HandleNoteOn(byte channel, byte pitch, byte velocity)
- {
- char posIndex;
- char ct;
- if (velocity == 0)
- {
- HandleNoteOff(channel, pitch, velocity);
- return;
- }
- else
- {
- gen_Last_Velo = velocity;
- }
- switch(gen_Mode)
- {
- case MODE_MONO:
- if ( bMidi[0].Etat == 0 )
- {
- bMidi[0].Etat = 1 ;
- bMidi[0].Note = pitch ;
- bMidi[0].rTime = millis() ;
- if ( gen_Ctrl == MODE_CTRL_VEL ) dac_Out(1, (long)velocity * REF_CTRL * gen_CtrlPc / 100 );
- if ( gen_Ctrl == MODE_CTRL_EXPVEL ) dac_Out(1, ( (long)velocity * REF_CTRL * gen_CtrlPc / 100 ) * gen_Last_Ctrl / 127 );
- p_CV(0,pitch);
- p_GATE(0,HIGH);
- }
- else
- {
- bMidi[0].rTime = millis() ;
- bMidi[0].Note = pitch ;
- p_CV(0,pitch);
- }
- break;
- case MODE_RETRIG:
- if ( bMidi[0].Etat == 0 )
- {
- bMidi[0].Etat = 1 ;
- bMidi[0].Note = pitch ;
- if ( gen_Ctrl == MODE_CTRL_VEL ) dac_Out(1, (long)velocity * REF_CTRL * gen_CtrlPc / 100 );
- if ( gen_Ctrl == MODE_CTRL_EXPVEL ) dac_Out(1, ( (long)velocity * REF_CTRL * gen_CtrlPc / 100 ) * gen_Last_Ctrl / 127 );
- bMidi[0].rTime = millis() ;
- p_CV(0,pitch);
- p_GATE(0,HIGH);
- }
- else
- {
- p_GATE(0,LOW);
- bMidi[0].Note = pitch ;
- if ( gen_Ctrl == MODE_CTRL_VEL ) dac_Out(1, (long)velocity * REF_CTRL * gen_CtrlPc / 100 );
- if ( gen_Ctrl == MODE_CTRL_EXPVEL ) dac_Out(1, ( (long)velocity * REF_CTRL * gen_CtrlPc / 100 ) * gen_Last_Ctrl / 127 );
- bMidi[0].rTime = millis() ;
- p_CV(0,pitch);
- p_GATE(0,HIGH);
- }
- break;
- case MODE_DUO:
- posIndex=0;
- for (ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 0 )
- {
- bMidi[ct].rTime = millis() ;
- bMidi[ct].Etat = 1 ;
- bMidi[ct].Note = pitch ;
- p_CV(ct,pitch);
- p_GATE(ct,HIGH);
- break;
- }
- else
- {
- if ( bMidi[ct].rTime > bMidi[posIndex].rTime ) posIndex = ct;
- }
- }
- if (ct>=gen_Midi_Max)
- {
- p_GATE(posIndex,LOW);
- bMidi[posIndex].rTime = millis() ;
- bMidi[posIndex].Etat = 1 ;
- bMidi[posIndex].Note = pitch ;
- p_CV(posIndex,pitch);
- p_GATE(posIndex,HIGH);
- }
- break;
- case MODE_SPLIT:
- if (init_Dual)
- {
- gen_Split = pitch;
- note_LCD( Z1, gen_Split );
- }
- else
- {
- int port = pitch < gen_Split ? 0 : 1;
- if ( bMidi[port].Etat == 0 )
- {
- bMidi[port].Etat = 1 ;
- bMidi[port].Note = pitch ;
- bMidi[port].rTime = millis() ;
- p_CV(port,pitch);
- p_GATE(port,HIGH);
- }
- else
- {
- p_GATE(port,LOW);
- bMidi[port].Note = pitch ;
- bMidi[port].rTime = millis() ;
- p_CV(port,pitch);
- p_GATE(port,HIGH);
- }
- }
- break;
- case MODE_ARPEGE:
- posIndex=0;
- for (ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 0 )
- {
- bMidi[ct].rTime = millis() ;
- bMidi[ct].Etat = 1 ;
- bMidi[ct].Note = pitch ;
- doit_Reconstruit_Motif=true;
- break;
- }
- else
- {
- if ( bMidi[ct].rTime < bMidi[posIndex].rTime ) posIndex = ct;
- }
- }
- if (ct>=gen_Midi_Max)
- {
- bMidi[posIndex].rTime = millis() ;
- bMidi[posIndex].Etat = 1 ;
- bMidi[posIndex].Note = pitch ;
- doit_Reconstruit_Motif=true;
- }
- break;
- case MODE_ARPEGE_SUST:
- for (ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 1 ) break;
- }
- if ( ct >= gen_Midi_Max ) // toutes les notes ont été relachées
- {
- for (ct = 0; ct < gen_Midi_Max; ct++ )
- {
- bMidi[ct].Etat = 0 ;
- }
- }
- for (ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 0 )
- {
- bMidi[ct].Etat = 1 ;
- bMidi[ct].Note = pitch ;
- doit_Reconstruit_Motif=true;
- break;
- }
- if ( bMidi[ct].Etat >= 0 && pitch == bMidi[ct].Note )
- {
- bMidi[ct].Etat = 0 ;
- doit_Reconstruit_Motif=true;
- break;
- }
- }
- break;
- case MODE_ARPEGE_TRANS:
- if (is_Recorder)
- {
- for (ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 0 )
- {
- bMidi[ct].Etat = 1 ;
- bMidi[ct].Note = pitch ;
- doit_Reconstruit_Motif=true;
- break;
- }
- if ( bMidi[ct].Etat == 1 && pitch == bMidi[ct].Note )
- {
- bMidi[ct].Etat = 0 ;
- doit_Reconstruit_Motif=true;
- break;
- }
- }
- }
- else
- {
- ref_Arpege_Trans = (int)pitch - (int)ord_Motif[0];
- }
- break;
- case MODE_SEQUENCER:
- if ( is_Recorder )
- {
- bMidi[pos_Recorder].Etat=1;
- bMidi[pos_Recorder].Note = pitch ;
- bMidi[pos_Recorder].rTime = millis() ;
- bMidi[pos_Recorder].Expr = velocity;
- if ( gen_VelMute == 1)
- dac_Out(1, (int)bMidi[pos_Recorder].Expr * REF_CTRL );
- p_CV(0,pitch);
- p_GATE(0,HIGH);
- if (pos_Recorder < MIDI_LENSEQ ) pos_Recorder++;
- pos_LCD(Z2, pos_Recorder);
- }
- else
- {
- ref_Arpege_Trans = (int)pitch - (int)bMidi[0].Note;
- }
- break;
- }
- }
- // ------------------
- // Callback Midi NOte Off
- // ------------------
- void HandleNoteOff(byte channel, byte pitch, byte velocity)
- {
- switch(gen_Mode)
- {
- case MODE_MONO:
- case MODE_RETRIG:
- // case MODE_REGLAGE_VO:
- if ( bMidi[0].Etat == 1 && pitch == bMidi[0].Note )
- {
- p_GATE(0,LOW);
- bMidi[0].Etat = 0 ;
- // if ( Mode_Ctrl == MODE_CTRL_VEL ) dac_Out(1, (int)0 );
- }
- break;
- case MODE_DUO:
- for (int ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 1 && pitch == bMidi[ct].Note )
- {
- p_GATE(ct,LOW);
- bMidi[ct].Etat = 0 ;
- }
- }
- break;
- case MODE_SPLIT:
- if (!init_Dual)
- {
- int port = pitch < gen_Split ? 0 : 1;
- if ( bMidi[port].Etat == 1 && pitch == bMidi[port].Note )
- {
- p_GATE(port,LOW);
- bMidi[port].Etat = 0 ;
- }
- }
- break;
- case MODE_ARPEGE:
- for (int ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 1 && pitch == bMidi[ct].Note )
- {
- bMidi[ct].Etat = 0 ;
- doit_Reconstruit_Motif=true;
- break;
- }
- }
- break;
- case MODE_ARPEGE_SUST:
- for (int ct = 0; ct < gen_Midi_Max; ct++ )
- {
- if ( bMidi[ct].Etat == 1 && pitch == bMidi[ct].Note )
- {
- bMidi[ct].Etat = 2 ;
- break;
- }
- }
- break;
- case MODE_ARPEGE_TRANS:
- break;
- case MODE_SEQUENCER:
- if (is_Recorder)
- {
- p_GATE(0,LOW);
- }
- break;
- }
- }
- // ------------------
- // Callback Clock Midi
- // ------------------
- void HandleClock()
- {
- if (gen_Clock==0) return;
- gen_Cpt_Clock++;
- if (gen_Cpt_Clock >= clock_Div[gen_Clock])
- {
- nextTime = millis()-1;
- if (gen_Clock_State>0) gen_Clock_State=2;
- gen_Cpt_Clock=0;
- }
- if (gen_Cpt_Clock >= clock_Div[gen_Clock] / 2 && nextGate > 0)
- {
- nextGate = millis()-1;
- }
- }
- void HandleStart()
- {
- if (gen_Clock==0) return;
- pos_Motif=0;
- gen_Clock_State=2;
- gen_Cpt_Clock=0;
- midi_Pitch_Value=0;
- nextTime = millis()-1;
- }
- void HandleContinue()
- {
- if (gen_Clock==0) return;
- gen_Clock_State=2;
- gen_Cpt_Clock=0;
- nextTime = millis()-1;
- }
- void HandleStop()
- {
- if (gen_Clock==0) return;
- gen_Clock_State=0;
- }
- // ------------------
- // Callback Midi Control Change
- // ------------------
- void HandleControlChange(byte channel, byte number, byte value)
- {
- switch (number)
- {
- case 0x01: //Modulation Wheel or Lever
- case 0x02: //Breath Controller
- case 0x0B: //Expression Controller
- gen_Last_Ctrl = value;
- switch(gen_Mode)
- {
- case MODE_MONO:
- case MODE_RETRIG:
- if ( gen_Ctrl == MODE_CTRL_EXP ) dac_Out(1, (long)value * REF_CTRL * gen_CtrlPc / 100);
- break;
- case MODE_ARPEGE:
- case MODE_ARPEGE_SUST:
- case MODE_ARPEGE_TRANS:
- if ( gen_Ctrl == MODE_CTRL_EXP ) dac_Out(1, (long)value * REF_CTRL );
- break;
- case MODE_SEQUENCER:
- if ( gen_VelMute == 2 || gen_VelMute == 4 ) dac_Out(1, (long)value * REF_CTRL );
- break;
- }
- break;
- }
- }
- // ------------------
- // Ecriture tension sur DAC
- // ------------------
- void dac_Out(int port, uint16_t sample)
- {
- uint8_t dacSPI0 = 0;
- uint8_t dacSPI1 = 0;
- byte selector;
- switch (port)
- {
- case 0:
- selector = DAC_0;
- sample = sample | 0b0111000000000000;
- break;
- case 1:
- selector = DAC_0;
- sample = sample | 0b1111000000000000;
- break;
- }
- dacSPI0 = (sample >> 8) & 0x00FF;
- dacSPI1 = sample & 0x00FF;
- digitalWrite(selector,LOW);
- SPDR = dacSPI0; // Start the transmission
- while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
- {
- };
- SPDR = dacSPI1;
- while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
- {
- };
- digitalWrite(selector,HIGH);
- }
- // ------------------
- // Setup Arduino
- // ------------------
- void setup()
- {
- byte clr;
- lcd.begin(24, 2);
- lcd.clear();
- // Initialisation DAC(s) et SPI
- pinMode(DATAOUT, OUTPUT);
- pinMode(DATAIN, INPUT);
- pinMode(SPICLOCK,OUTPUT);
- pinMode(DAC_0,OUTPUT);
- digitalWrite(DAC_0,LOW);
- SPCR = (1<<SPE)|(1<<MSTR);
- clr=SPSR;
- clr=SPDR;
- delay(10);
- // Initialisation Buffer
- mode_reglage = MODE_MODE;
- gen_Transpose = EEPROM_readInt(10,gen_Transpose);
- gen_Accord = EEPROM_readInt(12,gen_Accord);
- gen_Decalage = EEPROM_readInt(14,gen_Decalage);
- REF_1V = EEPROM_readInt(16,REF_1V);
- if (REF_1V < 800) REF_1V=895;
- gen_Midi = EEPROM_readInt(18,gen_Midi);
- gen_Clock = EEPROM_readInt(20,gen_Clock);
- ref_VelMute = EEPROM_readInt(22,ref_VelMute);
- gen_VelMute = EEPROM_readInt(24,gen_VelMute);
- gen_Onde = EEPROM_readInt(26,gen_Onde);
- gen_Ctrl = EEPROM_readInt(28,gen_Ctrl);
- gen_CtrlPc = EEPROM_readInt(30,gen_CtrlPc);
- gen_Pitch = EEPROM_readInt(32,gen_Pitch);
- gen_GateClk = EEPROM_readInt(34,gen_GateClk);
- gen_Tempo = EEPROM_readInt(36,gen_Tempo);
- gen_Motif = EEPROM_readInt(38,gen_Motif);
- gen_OndeHz = EEPROM_readInt(40,gen_OndeHz);
- gen_Split = EEPROM_readInt(42,gen_Split);
- clear_Buf();
- // Initialisation Midi
- MIDI.begin(gen_Midi);
- MIDI.turnThruOn();
- MIDI.setHandleNoteOn(HandleNoteOn);
- MIDI.setHandleNoteOff(HandleNoteOff );
- MIDI.setHandleControlChange(HandleControlChange);
- MIDI.setHandlePitchBend(HandlePitchBend);
- MIDI.setHandleClock(HandleClock);
- MIDI.setHandleStart(HandleStart);
- MIDI.setHandleStop(HandleStop);
- MIDI.setHandleContinue(HandleContinue);
- pinMode(GATE_0,OUTPUT);
- pinMode(GATE_1,OUTPUT);
- digitalWrite(GATE_0,LOW);
- digitalWrite(GATE_1,LOW);
- // Gestion du temps
- depTime = refCmd = nextTime = millis();
- nextGate = 0;
- }
- void GateClock()
- {
- if ( cpt_gate == 0 ) p_GATE(1,HIGH);
- if ( cpt_gate == 1 ) p_GATE(1,LOW);
- cpt_gate++;
- if ( cpt_gate >= gen_GateClk ) cpt_gate=0;
- }
- void incRand()
- {
- gen_Rand+=inc_Rand;
- if (gen_Rand<0) { gen_Rand=0;inc_Rand=-inc_Rand;}
- if (gen_Rand>4000) { gen_Rand=4000;inc_Rand=-inc_Rand;}
- cycle_Rand++;
- if (cycle_Rand>gen_OndeHz)
- {
- cycle_Rand=0;
- inc_Rand=random(0,3)-1;
- }
- }
- void loop()
- {
- int v0, v1, v2, v3;
- refTime = millis();
- // Pour éviter le bouclage si refTime passe à zéro...
- /*
- if ( refTime < depTime ) {
- depTime = refCmd = nextTime = refTime;
- }
- */
- MIDI.read();
- if ( mode_reglage == MODE_MODE && ( gen_Mode == MODE_MONO || gen_Mode == MODE_RETRIG ))
- {
- if ( gen_Ctrl == MODE_CTRL_LFO )
- {
- int pos_onde = ( (long)( refTime - depTime ) * 256 / gen_OndeHz ) % 256;
- // 6 = ...t(1, (long)pgm_read_byte_near(Triangle + pos_onde) * 16 * gen_CtrlPc / 100 )...
- switch( gen_Onde )
- {
- case 0:
- dac_Out(1, (long)pgm_read_byte_near(Sinus + pos_onde) * gen_CtrlPc * 16 / 100); break;
- case 1:
- dac_Out(1, (long)pgm_read_byte_near(Triangle + pos_onde) * gen_CtrlPc * 16 / 100); break;
- case 2:
- dac_Out(1, (long)pgm_read_byte_near(Rampe + pos_onde) * gen_CtrlPc * 16 / 100); break;
- case 3:
- dac_Out(1, (long)pgm_read_byte_near(Carre + pos_onde) * gen_CtrlPc * 16 / 100); break;
- case 4:
- dac_Out(1, (long)pgm_read_byte_near(Sinsom + pos_onde) * gen_CtrlPc * 16 / 100); break;
- case 5:
- dac_Out(1, (long)pgm_read_byte_near(Ransom + pos_onde) * gen_CtrlPc * 16 / 100); break;
- case 6:
- dac_Out(1, (long)gen_Rand * gen_CtrlPc / 100);
- incRand();
- break;
- case 7:
- dac_Out(1, (long)gen_Rand * gen_CtrlPc / 10);
- incRand();
- break;
- }
- }
- // 800 = ...+ pos_onde) * 16 * gen_CtrlPc ) / 100 ) * gen_Last_Ctrl / 128...
- if ( gen_Ctrl == MODE_CTRL_LFOEXP )
- {
- int pos_onde = ( (long)( refTime - depTime ) * 256 / gen_OndeHz ) % 256;
- switch( gen_Onde )
- {
- case 0:
- // dac_Out(1, ((long)pgm_read_byte_near(Sinus + pos_onde) * 16 * gen_CtrlPc / 100 ) * gen_Last_Ctrl / 128 ); break;
- dac_Out(1, (long)pgm_read_byte_near(Sinus + pos_onde) * gen_CtrlPc * gen_Last_Ctrl / 800 ); break;
- case 1:
- dac_Out(1, (long)pgm_read_byte_near(Triangle + pos_onde) * gen_CtrlPc * gen_Last_Ctrl / 800 ); break;
- case 2:
- dac_Out(1, (long)pgm_read_byte_near(Rampe + pos_onde) * gen_CtrlPc * gen_Last_Ctrl / 800 ); break;
- case 3:
- dac_Out(1, (long)pgm_read_byte_near(Carre + pos_onde) * gen_CtrlPc * gen_Last_Ctrl / 800 ); break;
- case 4:
- dac_Out(1, (long)pgm_read_byte_near(Sinsom + pos_onde) * gen_CtrlPc * gen_Last_Ctrl / 800 ); break;
- case 5:
- dac_Out(1, (long)pgm_read_byte_near(Ransom + pos_onde) * gen_CtrlPc * gen_Last_Ctrl / 800 ); break;
- case 6:
- dac_Out(1, (long)gen_Rand * gen_CtrlPc * gen_Last_Ctrl / 12800 );
- incRand();
- break;
- case 7:
- dac_Out(1, (long)gen_Rand * gen_CtrlPc * gen_Last_Ctrl / 1280 );
- incRand();
- break;
- }
- }
- if ( gen_Ctrl == MODE_CTRL_LFOVEL )
- {
- int pos_onde = ( (long)( refTime - depTime ) * 256 / gen_OndeHz ) % 256;
- switch( gen_Onde )
- {
- case 0:
- dac_Out(1, (long)pgm_read_byte_near(Sinus + pos_onde) * gen_CtrlPc * gen_Last_Velo / 800 ); break;
- case 1:
- dac_Out(1, (long)pgm_read_byte_near(Triangle + pos_onde) * gen_CtrlPc * gen_Last_Velo / 800 ); break;
- case 2:
- dac_Out(1, (long)pgm_read_byte_near(Rampe + pos_onde) * gen_CtrlPc * gen_Last_Velo / 800 ); break;
- case 3:
- dac_Out(1, (long)pgm_read_byte_near(Carre + pos_onde) * gen_CtrlPc * gen_Last_Velo / 800 ); break;
- case 4:
- dac_Out(1, (long)pgm_read_byte_near(Sinsom + pos_onde) * gen_CtrlPc * gen_Last_Velo / 800 ); break;
- case 5:
- dac_Out(1, (long)pgm_read_byte_near(Ransom + pos_onde) * gen_CtrlPc * gen_Last_Velo / 800 ); break;
- case 6:
- dac_Out(1, (long)gen_Rand * gen_CtrlPc * gen_Last_Ctrl / 12800 );
- incRand();
- break;
- case 7:
- dac_Out(1, (long)gen_Rand * gen_CtrlPc * gen_Last_Ctrl / 1280 );
- incRand();
- break;
- }
- }
- }
- if ( refTime > refCmd )
- {
- ScanBtn();
- if ( BtnTest(0, false) )
- {
- if ( mode_reglage == MODE_MODE )
- {
- mode_reglage = MODE_REGLAGE;
- old_Reglage = map( analogRead(anaIn0) ,0 , 1023 , 0 , NB_MENU_REGLAGE - 1);
- }
- else
- {
- mode_reglage = MODE_MODE;
- old_Mode = map( analogRead(anaIn0) ,0 , 1023 , 0 , NB_MENU_MODE - 1);
- }
- maj_Ecran();
- }
- if ( mode_reglage == MODE_REGLAGE )
- {
- v0 = map( analogRead(anaIn0) ,0 , 1023 , 0 , NB_MENU_REGLAGE - 1);
- if ( v0 != old_Reglage )
- {
- gen_Reglage = old_Reglage = v0;
- maj_Ecran();
- }
- if ( BtnTest(1, true) )
- {
- switch (gen_Reglage)
- {
- case REGLE_DEMIT:
- gen_Transpose--;
- if (gen_Transpose<-12) gen_Transpose=-12;
- sign_LCD( Z5, gen_Transpose );
- break;
- case REGLE_ACCORD:
- gen_Accord--;
- if (gen_Accord<-100) gen_Accord=-100;
- sign_LCD( Z5, gen_Accord);
- break;
- case REGLE_BEND:
- gen_Pitch--;
- if (gen_Pitch<0) {
- gen_Pitch=0; midi_Pitch_Value = 0;
- }
- onoff_LCD( Z5, gen_Pitch );
- break;
- case REGLE_DECAL:
- gen_Decalage-=12;
- if (gen_Decalage<0) gen_Decalage=0;
- int_LCD( Z5, gen_Decalage );
- break;
- case REGLE_REF1V:
- REF_1V--;
- if (REF_1V < 850) REF_1V=850;
- int_LCD( Z5, REF_1V );
- break;
- case REGLE_GATECLK:
- gen_GateClk--;
- if (gen_GateClk < 2) gen_GateClk=2;
- div_LCD( Z5, gen_GateClk);
- break;
- case REGLE_MIDI:
- gen_Midi--;
- if (gen_Midi < 0) gen_Midi=0;
- midi_LCD( Z5, gen_Midi);
- MIDI.setInputChannel(gen_Midi);
- break;
- case REGLE_CLOCK:
- gen_Clock--;
- if (gen_Clock < 0) gen_Clock=0;
- clock_LCD( Z5, gen_Clock);
- break;
- case REGLE_VELMUT:
- ref_VelMute--;
- if (ref_VelMute < 0) ref_VelMute=0;
- int_LCD( Z5, ref_VelMute);
- break;
- case REGLE_EEPROM:
- gen_Transpose = EEPROM_readInt(10,gen_Transpose);
- gen_Accord = EEPROM_readInt(12,gen_Accord);
- gen_Decalage = EEPROM_readInt(14,gen_Decalage);
- REF_1V = EEPROM_readInt(16,REF_1V);
- if (REF_1V < 800) REF_1V=890;
- gen_Midi = EEPROM_readInt(18,gen_Midi);
- gen_Clock = EEPROM_readInt(20,gen_Clock);
- ref_VelMute = EEPROM_readInt(22,ref_VelMute);
- gen_VelMute = EEPROM_readInt(24,gen_VelMute);
- gen_Onde = EEPROM_readInt(26,gen_Onde);
- gen_Ctrl = EEPROM_readInt(28,gen_Ctrl);
- gen_CtrlPc = EEPROM_readInt(30,gen_CtrlPc);
- gen_Pitch = EEPROM_readInt(32,gen_Pitch);
- gen_GateClk = EEPROM_readInt(34,gen_GateClk);
- gen_Tempo = EEPROM_readInt(36,gen_Tempo);
- gen_Motif = EEPROM_readInt(38,gen_Motif);
- gen_OndeHz = EEPROM_readInt(40,gen_OndeHz);
- gen_Split = EEPROM_readInt(42,gen_Split);
- break;
- }
- p_CV(0, bMidi[0].Note );
- }
- if ( BtnTest(2, true) )
- {
- switch (gen_Reglage)
- {
- case REGLE_DEMIT:
- gen_Transpose++;
- if (gen_Transpose>12) gen_Transpose=12;
- sign_LCD( Z5, gen_Transpose );
- break;
- case REGLE_ACCORD:
- gen_Accord++;
- if (gen_Accord>100) gen_Accord=100;
- sign_LCD( Z5, gen_Accord );
- break;
- case REGLE_BEND:
- gen_Pitch++;
- if (gen_Pitch>12) gen_Pitch=12;
- onoff_LCD( Z5, gen_Pitch );
- break;
- case REGLE_DECAL:
- gen_Decalage+=12;
- if (gen_Decalage>64) gen_Decalage=64;
- int_LCD( Z5, gen_Decalage );
- break;
- case REGLE_REF1V:
- REF_1V++;
- if (REF_1V > 950) REF_1V=950;
- int_LCD( Z5, REF_1V );
- break;
- case REGLE_GATECLK:
- gen_GateClk++;
- if (gen_GateClk > 16) gen_GateClk=16;
- div_LCD( Z5, gen_GateClk);
- break;
- case REGLE_MIDI:
- gen_Midi++;
- if (gen_Midi > 17) gen_Midi=17;
- midi_LCD( Z5, gen_Midi);
- MIDI.setInputChannel(gen_Midi);
- break;
- case REGLE_CLOCK:
- gen_Clock++;
- if (gen_Clock > 4) gen_Clock=4;
- clock_LCD( Z5, gen_Clock);
- break;
- case REGLE_VELMUT:
- ref_VelMute++;
- if (ref_VelMute > 127) ref_VelMute=127;
- int_LCD( Z5, ref_VelMute);
- break;
- case REGLE_EEPROM:
- EEPROM_writeInt(10,gen_Transpose);
- EEPROM_writeInt(12,gen_Accord);
- EEPROM_writeInt(14,gen_Decalage);
- EEPROM_writeInt(16,REF_1V);
- EEPROM_writeInt(18,gen_Midi);
- EEPROM_writeInt(20,gen_Clock);
- EEPROM_writeInt(22,ref_VelMute);
- EEPROM_writeInt(24,gen_VelMute);
- EEPROM_writeInt(26,gen_Onde);
- EEPROM_writeInt(28,gen_Ctrl);
- EEPROM_writeInt(30,gen_CtrlPc);
- EEPROM_writeInt(32,gen_Pitch);
- EEPROM_writeInt(34,gen_GateClk);
- EEPROM_writeInt(36,gen_Tempo);
- EEPROM_writeInt(38,gen_Motif);
- EEPROM_writeInt(40,gen_OndeHz);
- EEPROM_writeInt(42,gen_Split);
- break;
- }
- p_CV(0, bMidi[0].Note );
- }
- }
- else
- {
- v0 = map( analogRead(anaIn0) ,0 , 1023 - 100, 0 , NB_MENU_MODE - 1);
- if ( v0 != old_Mode )
- {
- nextTime = refTime;
- gen_Mode=old_Mode=v0;
- clear_Buf();
- maj_Ecran();
- }
- switch ( gen_Mode )
- {
- case MODE_MONO:
- case MODE_RETRIG:
- if ( BtnTest(1, true) )
- {
- gen_Onde++;
- if (gen_Onde>=NB_ONDE) gen_Onde=0;
- progmem_LCD( Z1, (char*)pgm_read_word(&(menu_Onde[gen_Onde])));
- }
- if ( BtnTest(2, true) )
- {
- gen_Ctrl++;
- if (gen_Ctrl>=NB_MENU_CTRL) gen_Ctrl=0;
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Ctrl[gen_Ctrl])));
- dac_Out(1,0);
- }
- v1 = map( analogRead(anaIn1) ,0 , 1023 , 511 , 0);
- v1 = pgm_read_word_near(Onde_Hz + v1);
- if ( v1 != old_OndeHz )
- {
- gen_OndeHz = old_OndeHz = v1;
- hz_LCD(Z4, gen_OndeHz );
- depTime = millis();
- }
- v2 = map( analogRead(anaIn2) ,0 , 1023 , 0 , 100);
- if ( v2 != old_CtrlPc )
- {
- gen_CtrlPc = old_CtrlPc =v2;
- pc_LCD(Z5,gen_CtrlPc);
- }
- break;
- case MODE_SPLIT:
- init_Dual = ( BtnTest(1, true) );
- break;
- case MODE_ARPEGE:
- case MODE_ARPEGE_SUST:
- case MODE_ARPEGE_TRANS:
- if ( BtnTest(2, true) )
- {
- gen_Ctrl++;
- if (gen_Ctrl>=NB_MENU_CTRL_RED) gen_Ctrl=0;
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Ctrl_Red[gen_Ctrl])));
- }
- v2 = map( analogRead(anaIn2) ,0 , 1023 , 20 , 1000);
- if ( v2 != old_Tempo )
- {
- gen_Tempo=old_Tempo=v2;
- cycle = 60000/gen_Tempo;
- tempo_LCD(Z5,gen_Tempo);
- }
- v1 = map( analogRead(anaIn1) ,0 , 1023 , 0 , NB_MOTIF -1 );
- if (v1 != old_Motif )
- {
- gen_Motif = old_Motif = v1;
- doit_Reconstruit_Motif = true;
- str_LCD( Z4, lMotif[gen_Motif].nom );
- }
- break;
- case MODE_SEQUENCER:
- if ( !is_Recorder && BtnTest(2, false) )
- {
- gen_VelMute++;
- if (gen_VelMute >= NB_MENU_VELMUT) gen_VelMute=0;
- progmem_LCD( Z2, (char*)pgm_read_word(&(menu_Velmut[gen_VelMute])));
- }
- v2 = map( analogRead(anaIn2) ,0 , 1023 , 20 , 1000);
- if ( v2 != old_Tempo )
- {
- gen_Tempo=old_Tempo=v2;
- cycle = 60000/gen_Tempo;
- tempo_LCD(Z5,gen_Tempo);
- }
- break;
- }
- }
- refCmd = refTime + REF_CMD_DELAY ;
- }
- if (gen_Mode >= MODE_ARPEGE )
- {
- if ( refTime > nextGate && nextGate > 0 )
- {
- p_GATE(0,LOW);
- nextGate = 0;
- }
- if ( refTime > nextTime && mode_reglage == MODE_MODE )
- {
- switch(gen_Mode)
- {
- case MODE_ARPEGE:
- case MODE_ARPEGE_SUST:
- if ( BtnTest(1, false) )
- {
- clear_Buf();
- cpt_gate=0;
- }
- if (doit_Reconstruit_Motif) Reconstruit_Motif(1);
- if (max_Motif>0)
- {
- if ( gen_Clock == 0 || gen_Clock_State == 2)
- {
- gen_Clock_State = 1;
- p_CV(0, Motif[pos_Motif]);
- p_GATE(0,HIGH);
- nextGate = refTime + cycle / 2;
- GateClock();
- pos_Motif++;
- if (pos_Motif>=max_Motif)
- {
- pos_Motif=0;
- if (lMotif[gen_Motif].sens == 4 ) Reconstruit_Motif(0);
- }
- }
- }
- break;
- case MODE_ARPEGE_TRANS:
- if ( BtnTest(1, false) )
- {
- if ( is_Recorder )
- {
- is_Recorder=false;
- pos_Motif=0;
- ref_Arpege_Trans=0;
- maj_Ecran();
- cpt_gate=0;
- }
- else
- {
- clear_Buf();
- }
- }
- if (doit_Reconstruit_Motif) Reconstruit_Motif(1);
- if (max_Motif>0)
- {
- if ( gen_Clock == 0 || gen_Clock_State == 2)
- {
- gen_Clock_State = 1;
- p_CV(0, Motif[pos_Motif] + (!is_Recorder?ref_Arpege_Trans:0) );
- p_GATE(0,HIGH);
- GateClock();
- nextGate = refTime + cycle / 2;
- pos_Motif++;
- if (pos_Motif>=max_Motif)
- {
- pos_Motif=0;
- if (lMotif[gen_Motif].sens == 4 ) Reconstruit_Motif(0);
- }
- }
- }
- break;
- case MODE_SEQUENCER:
- if ( BtnTest(1, false) )
- {
- if ( is_Recorder )
- {
- is_Recorder=false;
- pos_Motif=0;
- ref_Arpege_Trans=0;
- dac_Out(1,0);
- maj_Ecran();
- cpt_gate=0;
- }
- else
- {
- clear_Buf();
- }
- }
- if ( !is_Recorder && pos_Recorder >0 )
- {
- if ( gen_Clock == 0 || gen_Clock_State == 2)
- {
- gen_Clock_State = 1;
- if (gen_VelMute < 3 || bMidi[pos_Motif].Expr > ref_VelMute)
- {
- if (gen_VelMute == 1 )
- dac_Out(1, (int)bMidi[pos_Motif].Expr * REF_CTRL );
- p_CV(0, bMidi[pos_Motif].Note + ref_Arpege_Trans);
- p_GATE(0,HIGH);
- nextGate = refTime + cycle / 2;
- }
- GateClock();
- pos_Motif++;
- if (pos_Motif>=pos_Recorder) pos_Motif=0;
- }
- }
- break;
- }
- // while ( nextTime <= refTime ) nextTime += cycle;
- if ( gen_Clock==0 )
- nextTime += cycle;
- else
- nextTime += 200;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement