// constantes, variables y ajustes
#define bitSet64(value, bit) ((value) |= (1ULL << (bit)))
#define bitClear64(value, bit) ((value) &= ~(1ULL << (bit)))
#define bitWrite64(value, bit, bitvalue) (bitvalue ? bitSet64(value, bit) : bitClear64(value, bit))
#define sonido
//#define debug
#define midi_
//#define midiSync
//#define SAMPLER
#define DRUM
#define DRUMS
#include <math.h>
#include <SD.h>
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SerialFlash.h>
#ifdef sonido
//------------------AUDIO DESIGN TOOL----------------
// GUItool: begin automatically generated code
#ifdef SAMPLER
String muestra[64] = { "1.raw", "2.raw", "3.raw", "4.raw", "5.raw", "6.raw", "7.raw", "8.raw", "9.raw", "10.raw",
"11.raw", "12.raw", "13.raw", "14.raw", "15.raw", "16.raw", "17.raw", "18.raw", "19.raw", "20.raw",
"21.raw", "22.raw", "23.raw", "24.raw", "25.raw", "26.raw", "27.raw", "28.raw", "29.raw", "30.raw",
"31.raw", "32.raw", "33.raw", "34.raw", "35.raw", "36.raw", "37.raw", "38.raw", "39.raw", "40.raw",
"41.raw", "42.raw", "43.raw", "44.raw", "45.raw", "46.raw", "47.raw", "48.raw", "49.raw", "50.raw",
"51.raw", "52.raw", "53.raw", "54.raw", "55.raw", "56.raw", "57.raw", "58.raw", "59.raw", "60.raw",
"61.raw", "62.raw", "63.raw", "64.raw"
};
AudioPlaySdRaw sample0; //xy=220,122
AudioPlaySdRaw sample1; //xy=220,242
AudioPlaySdRaw sample2; //xy=220,362
AudioPlaySdRaw sample3; //xy=220,482
AudioPlaySdRaw sample4; //xy=220,602
AudioPlaySdRaw sample5; //xy=220,722
AudioPlaySdRaw sample6; //xy=220,842
AudioPlaySdRaw sample7; //xy=220,962
AudioConnection patchCord12(sample0, 0, mixer0, 2);
AudioConnection patchCord14(sample1, 0, mixer1, 2);
AudioConnection patchCord16(sample2, 0, mixer2, 2);
AudioConnection patchCord18(sample3, 0, mixer3, 2);
AudioConnection patchCord20(sample4, 0, mixer4, 2);
AudioConnection patchCord22(sample5, 0, mixer5, 2);
AudioConnection patchCord23(sample6, 0, mixer6, 2);
AudioConnection patchCord24(sample7, 0, mixer7, 2);
#endif
AudioSynthNoiseWhite noise1; //xy=57,331.2500047683716
AudioMixer4 mixer1; //xy=379,202
AudioMixer4 mixer2; //xy=379,322
AudioMixer4 mixer3; //xy=379,442
AudioMixer4 mixer4; //xy=379,562
AudioMixer4 mixer0; //xy=381,94.75
AudioMixer4 mixer5; //xy=379,682
AudioMixer4 mixer6; //xy=379,802
AudioMixer4 mixer7; //xy=379,922
#ifdef DRUMS
AudioSynthSimpleDrum drum1; //xy=219,162
AudioSynthSimpleDrum drum2; //xy=219,282
AudioSynthSimpleDrum drum0; //xy=220,35
AudioSynthSimpleDrum drum3; //xy=219,402
AudioSynthSimpleDrum drum4; //xy=219,522
AudioSynthSimpleDrum drum5; //xy=219,642
AudioSynthSimpleDrum drum6; //xy=219,762
AudioSynthSimpleDrum drum7; //xy=219,882
AudioConnection patchCord9(drum1, 0, mixer1, 0);
AudioConnection patchCord10(drum2, 0, mixer2, 0);
AudioConnection patchCord11(drum0, 0, mixer0, 0);
AudioConnection patchCord13(drum3, 0, mixer3, 0);
AudioConnection patchCord15(drum4, 0, mixer4, 0);
AudioConnection patchCord17(drum5, 0, mixer5, 0);
AudioConnection patchCord19(drum6, 0, mixer6, 0);
AudioConnection patchCord21(drum7, 0, mixer7, 0);
#endif
AudioEffectEnvelope envelope0; //xy=229.75,76.75
AudioEffectEnvelope envelope1; //xy=230,202
AudioEffectEnvelope envelope2; //xy=230,322
AudioEffectEnvelope envelope3; //xy=230,442
AudioEffectEnvelope envelope4; //xy=230,562
AudioEffectEnvelope envelope5; //xy=230,682
AudioEffectEnvelope envelope6; //xy=230,802
AudioEffectEnvelope envelope7; //xy=230,922
AudioFilterBiquad biquad1; //xy=522,202
AudioFilterBiquad biquad2; //xy=522,322
AudioFilterBiquad biquad0; //xy=523.2500076293945,109.50000095367432
AudioFilterBiquad biquad3; //xy=522,442
AudioFilterBiquad biquad4; //xy=522,562
AudioFilterBiquad biquad5; //xy=522,682
//AudioFilterStateVariable filter1; //xy=525,33.75
AudioFilterBiquad biquad6; //xy=522,802
AudioFilterBiquad biquad7; //xy=522,922
AudioMixer4 mixer10; //xy=707,710
AudioMixer4 mixer11; //xy=709,845
AudioMixer4 mixer13; //xy=710,598
AudioMixer4 mixer12; //xy=714,384
AudioMixer4 mixer9; //xy=719,276
AudioMixer4 mixer8; //xy=721,150
AudioMixer4 mixer16; //xy=808,483
//AudioEffectFreeverb freeverb1; //xy=950,487
AudioMixer4 mixer15; //xy=1086,599
AudioMixer4 mixer14; //xy=1090,371
AudioOutputI2S i2s1; //xy=1216,481
AudioConnection patchCord1(noise1, envelope1);
AudioConnection patchCord2(noise1, envelope2);
AudioConnection patchCord3(noise1, envelope3);
AudioConnection patchCord4(noise1, envelope4);
AudioConnection patchCord5(noise1, envelope5);
AudioConnection patchCord6(noise1, envelope6);
AudioConnection patchCord7(noise1, envelope7);
AudioConnection patchCord8(noise1, envelope0);
AudioConnection patchCord25(envelope0, 0, mixer0, 1);
AudioConnection patchCord26(envelope1, 0, mixer1, 1);
AudioConnection patchCord27(envelope2, 0, mixer2, 1);
AudioConnection patchCord28(envelope3, 0, mixer3, 1);
AudioConnection patchCord29(envelope4, 0, mixer4, 1);
AudioConnection patchCord30(envelope5, 0, mixer5, 1);
AudioConnection patchCord31(envelope6, 0, mixer6, 1);
AudioConnection patchCord32(envelope7, 0, mixer7, 1);
AudioConnection patchCord33(mixer1, biquad1);
AudioConnection patchCord34(mixer2, biquad2);
AudioConnection patchCord35(mixer3, biquad3);
AudioConnection patchCord36(mixer4, biquad4);
//AudioConnection patchCord37(mixer0, 0, filter1, 0);
AudioConnection patchCord37(mixer0, biquad0);
AudioConnection patchCord38(mixer5, biquad5);
AudioConnection patchCord39(mixer6, biquad6);
AudioConnection patchCord40(mixer7, biquad7);
AudioConnection patchCord41(biquad1, 0, mixer8, 1);
AudioConnection patchCord42(biquad1, 0, mixer9, 1);
AudioConnection patchCord43(biquad1, 0, mixer12, 1);
AudioConnection patchCord44(biquad2, 0, mixer8, 2);
AudioConnection patchCord45(biquad2, 0, mixer9, 2);
AudioConnection patchCord46(biquad2, 0, mixer12, 2);
AudioConnection patchCord47(biquad3, 0, mixer8, 3);
AudioConnection patchCord48(biquad3, 0, mixer9, 3);
AudioConnection patchCord49(biquad3, 0, mixer12, 3);
AudioConnection patchCord50(biquad4, 0, mixer10, 0);
AudioConnection patchCord51(biquad4, 0, mixer11, 0);
AudioConnection patchCord52(biquad4, 0, mixer13, 0);
AudioConnection patchCord53(biquad5, 0, mixer10, 1);
AudioConnection patchCord54(biquad5, 0, mixer11, 1);
AudioConnection patchCord55(biquad5, 0, mixer13, 1);
//AudioConnection patchCord56(filter1, 0, mixer8, 0);
//AudioConnection patchCord57(filter1, 0, mixer9, 0);
//AudioConnection patchCord58(filter1, 0, mixer12, 0);
AudioConnection patchCord56(biquad0, 0, mixer8, 0);
AudioConnection patchCord57(biquad0, 0, mixer9, 0);
AudioConnection patchCord58(biquad0, 0, mixer12, 0);
AudioConnection patchCord59(biquad6, 0, mixer10, 2);
AudioConnection patchCord60(biquad6, 0, mixer11, 2);
AudioConnection patchCord61(biquad6, 0, mixer13, 2);
AudioConnection patchCord62(biquad7, 0, mixer10, 3);
AudioConnection patchCord63(biquad7, 0, mixer11, 3);
AudioConnection patchCord64(biquad7, 0, mixer13, 3);
AudioConnection patchCord65(mixer10, 0, mixer14, 1);
AudioConnection patchCord66(mixer11, 0, mixer15, 1);
AudioConnection patchCord67(mixer13, 0, mixer16, 1);
AudioConnection patchCord68(mixer12, 0, mixer16, 0);
AudioConnection patchCord69(mixer9, 0, mixer15, 0);
AudioConnection patchCord70(mixer8, 0, mixer14, 0);
//AudioConnection patchCord71(mixer16, freeverb1);
//AudioConnection patchCord72(freeverb1, 0, mixer14, 2);
//AudioConnection patchCord73(freeverb1, 0, mixer15, 2);
AudioConnection patchCord74(mixer15, 0, i2s1, 1);
AudioConnection patchCord75(mixer14, 0, i2s1, 0);
// GUItool: end automatically generated code
//------------------AUDIO DESIGN TOOL----------------
#ifdef DRUMS
AudioSynthSimpleDrum *drum[8] =
{
&drum0, &drum1, &drum2, &drum3, &drum4, &drum5, &drum6, &drum7
};
#endif
#ifdef SAMPLER
AudioPlaySdRaw *sample[8] =
{
&sample0, &sample1, &sample2, &sample3, &sample4, &sample5, &sample6, &sample7
};
#endif
AudioEffectEnvelope *envelope[8] =
{
&envelope0, &envelope1, &envelope2, &envelope3, &envelope4, &envelope5, &envelope6, &envelope7
};
AudioFilterBiquad *biquad[8] =
{
&biquad0, &biquad1, &biquad2, &biquad3, &biquad4, &biquad5, &biquad6, &biquad7
};
AudioMixer4 *mixer[17] =
{
&mixer0, &mixer1, &mixer2, &mixer3, &mixer4, &mixer5, &mixer6, &mixer7,
&mixer8, &mixer9, &mixer10, &mixer11, &mixer12, &mixer13, &mixer14, &mixer15,
&mixer16
};
#endif
/*
AudioPlayMemory sample[8];
#include "AudioSampleHat01wavv.h"
#include "AudioSampleHat02wavv.h"
#include "AudioSampleKick02wavq.h"
#include "AudioSampleKickwavq.h"
#include "AudioSampleSnarewavq.h"
#include "AudioSampleSnare01wavq.h"
#include "AudioSampleSnare02wavq.h"
*/
#ifdef midi_
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
#endif
#ifdef midiSync
byte counter;
byte CLOCK = 248;
byte START = 250;
byte CONTINUE = 251;
byte STOP = 252;
#endif
#include <EEPROM.h>
//int eeAddress; //Location we want the data to be put.
// L E D S
#include <WS2812Serial.h>
#define numled 72
#define PIN0 17
byte BRIGHTNESS = 30;
byte drawingMemory[numled * 3]; // 3 bytes per LED
DMAMEM byte displayMemory[numled * 12]; // 12 bytes per LED
WS2812Serial leds(numled, displayMemory, drawingMemory, PIN0, WS2812_GRB);
int ledRef = 0; // contador para refresco de los leds
// numero de ciclos del loop necesarios para la escritura de los leds
#define ledRefMini 40 //50 // reloj perfecto pero mucha latencia?
int ledRef_ = ( ledRefMini * 81 ) - 1; // los 80 ciclos del grid y el pico final!!
// E N C O D E R :
//#define ENCODER_OPTIMIZE_INTERRUPTS
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
#define encA 14
#define encB 15
#define encClick 16
Encoder myEnc( encA, encB );
byte enc4;
byte _enc4;
int enc;
int _enc;
byte encPos;
byte actRow;
byte actCol;
bool encButt;
bool _encButt;
bool encButt_;
bool shuttle;
#define row0 30 // pins for 4051 row
#define row1 31
#define row2 8
#define col0 12 // pins for column
#define col1 13
#define col2 27
#define col3 26
#define pad 33 // COLUMN, pin de lectura del los pad del panel
#define triggIn 19 // entrada de relog
#define resetInput 18
bool butt[8][10]; // lectura de los pads,
bool _butt[8][10]; // comparador
bool butt_[8][8]; // estado del boton, las dos ultimas columnas no se estanb utilizando
bool recModulation;
bool recMode = true; //'true' sería insert note,false sería delete, muy guapo para performance
const byte triggOut[] = {2, 3, 4, 5, 6, 9, 10, 11};// pines de salida para las 8 pistas de triggers
bool resetIn;
bool _resetIn;
bool trigg; // entrada del clock
bool _trigg;
#define maxSteps 63 // longitud maxima de la secuencia ( quitandole -1 )
// VARIABLES PARA ALMACENAR COMO PRESET:
uint64_t dot[64][8];
uint64_t roll[64][8];
byte prob[64][8][(maxSteps + 1)];
byte val[64][8][maxSteps + 1]; // esta variablepodríamos usarlapara la velocidad midi x ejemplo
byte steps[64][8]; // duracion de cada linea
byte pMode[64][8]; // 0 normal, 1 reverse, 2 pendulum
byte clockDiv[64][8]; // division de reloj del row -1 ( 0 para clock divison = 1 ),
byte euclNum[64][8];
uint64_t noInitPatt;
uint64_t masterTrack;
uint64_t noInitProject;
byte part[65][64];
uint64_t noInitPart; // incluir en los presets
//--------GLOBAL SETTINGS---------
bool playSample[8] = { false, false, false, false, false, false, false, false };
bool playDrum[8] = { true, true, true, true, true, true, true, true };
byte midiNote[8];
uint8_t raw[8] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // archivo que reproducira cada sampler/pista
bool resetSeq_;
byte actPatt;
byte nextPatt;
byte pattCounter;
byte loopSize[65];
byte actPart = 64;
byte multButtMax = 0;
byte multButtMin = 63;
int multButt = -1; // esto nos sirve para saber el ultimo botón pulsado y si se ha pulsado algo
byte multButt_ = 64; // esto es para ajustar con el primer loop
bool liveRecord_;
// otras variables relativas a las secuencias:
int pos[8]; // posicion del puntero de reproducción
int count[8]; // contador para el clock divider
byte page[8]; // contador de paginas para del display d cada pista
bool dir[8] = { true, true, true, true, true, true, true, true }; // direccion de la reproduccion para el modo pendulum
//int numeroClave; // variable para mi script de random, calculado a partir del contador de espera de los leds.
// implementaciones avanzadas
//byte ramification; // ciclo acumulativo de remates
/* tipose de rwamidficacion
proprcional
aritmetica */
//byte alg; // algoritmo de remates
/* nothing
inverse
reverse
re-order 3.3.2.3.3.2. -> 3.3.3.3.2.2. */
//bool logic; // para las pistas lógicas
//byte logicType; // quizasa no hace falta bool, solo el tipo > 0
bool mute[8];
int8_t sculpt[8]; // random offset
int i; // loop helpers
byte x;
byte y;
byte suma;
// control de tempo:
bool intTempo = false; // tempo interno, false seria externo (clock input)
int tempo = 120; // 120/min = 2/seg = 500 milis; tempo en la medida tradicional,
elapsedMicros temp;
uint32_t temp_ = 125000; // deducido a partir de tempo o viceversa, lo q debe durar temp
unsigned int t32 = temp_ / 2;
int stepCount; // byte es poco para un contador de pulsos
byte beatCount; // este es para los trsillos y el swing
byte swingAmount; // de 0 a 100
unsigned int swingTemp_; //el tiempo de retraso que lleva el golpe de swing, máximo 1/3 del pulso
bool t32_; // esto no me mola, usaremos algo distinto para el contador del relog
//bool t64;
#define triggLength 1000 //duracion de los triggers en microsegundos
byte editMode; // probando con tempo
byte lastEditMode;
// 0 - normal
// 1 - length -> azul
// 2 - play mode -> no deberia ser un menu, encoder y selector de pistas
// 3 - clock div -> verde
// 4 - probabilidad
// 5 - roll
// 6 - rotate
// 7 - euclidean -> no deberia ser un menu, encoder y selector de pistas
// 8 - tempo -> no deberia ser un menu, encoder
// 9 - midi -> no deberia ser un menu, encoder y selector de pistas
// 10 - val
// 11 - audio
// 12 - brillo y settings?
// 13 - swing -> no deberia ser un menu, encoder
// 14 - modulacion
// 15 - pattern
// 16 - drum settings
// 17 - mute
// 18 - invert
// 19 - editPart
// 20 - part grid
// 21 - song editor
// 22 - shuttle
// 23 - escoger muestra
bool edit; // esto se usa para que el encoder no se mueva,
//comprobar en que menus haria falta movimiento
// M E N U - H O R I Z O N T A L
bool menu2 = false;
// M E N U V E R T I C A L
bool menuVertical; // activa la vision de menu horizontal
byte menuIndex; // 0 audio, 1 mezcla, 2 modulacion
byte menuParam; // parámtros del 1 al 8
int menuVar[3][8][8]; // [menuIndex][actTrack][menuParam]
//drum synth
#define drumVol 0
#define drumDecay 1
#define drumFreq 2
#define drumMod 3
#define drumSecond 4
#define noiseVol 5
#define noiseDecay 6
//---------------
#define volumen 0
#define panoramica 1
#define revAmount 2
#define filterFreq 3
#define resonancia 4
#define filterType 5
//channel mixer
//reverb settings
#define revSize 0
#define revDamp 1
#define revL 2
#define revR 3
/*
Mix(1, 2, 3):
-vol
-pan
-reverb
Mod:
*/
// P U S H B U T T O N S - en principio no estoy usando los 'bool' excepto en el encoder
// pasa por lo modos de edicion
#define playStopButt 0
#define tempoButt 0
#define homeButt 1
#define settingsButt 1
#define lengthButt 2
#define divButt 2
#define pattButt 3
#define saveAllButt 3 // esto deberia ser save project?
#define playModeButt 4
#define masterTrackButt 4
#define fillButt 5
#define euclButt 5
#define muteButt 6
// mute all
#define provButt 7
// prob roll
#define invButt 8 // tambien invert all
// inv all
#define rollButt 9
#define midiButt 9
#define rotateButt 10 //tambien rotate all
//rotate all
#define valButt 11
#define modButt 11
#define trippButt 12 //tresillos
#define swingButt 12
#define audioButt 13 // drumSynth
#define shiftButt 14
#define zoomButt 15
#define brightButt 15
// botones de funcion del grid:
// D R U M S Y T N H - linea 7
#define drumSynthVol 49
#define drumSynthDecay 50
#define drumSynthFreq 51
#define drumSynthMod 52
#define drumSynthSecond 53
#define noiseSynthVol 54
#define noiseSynthDecay 55
// M I X E R - ultima linea
#define mixerVol 57
#define mixerPan 58
#define mixerReverbSend 59
#define mixerFilterFreq 60
#define mixerFilterRes 61
#define mixerFilterType 62
bool shiftButt_; // para las egundas funsiones de cada boton, tambien como track select?
bool zoom; //estado del zoom
byte zoomTrack;
// ENTRADAS DE CV Y MATRIZ DE MODULACIÓN:
const byte cvIn[4] = { 22 , 22 , 22 , 22 };// 22, 23, 24, 25
int cvRead[4]; //lectura de CV
int8_t modMatrix[3][8][7]; // cuatro canales de CV, de -100 a 100%
byte modSource[3][8][7]; // [menuIndex][actTrack][menuParam]
long rndNumber = random(16);