Advertisement
degu234

ChordOrgan Synthvoice-case+wf-wahl

Aug 27th, 2021
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 14.02 KB | None | 0 0
  1. #include <synth_waveform.h>
  2.  
  3. //todo:
  4. //!chord changing!
  5. //!waveform selection!
  6. //poti hook-up
  7. //!1V/Octave-tracking!
  8. //EnvelopeGenerator with trigger in that actually sends a control value to the filter (dc2 * 8184)
  9. //
  10. //
  11. //
  12. //stationKnob = A9
  13. //stationCV = A8
  14. //startKnob = A7
  15. //startCV = A6
  16. //tasterButton = Pin 8
  17. //triggerCV = Pin 9
  18. //Output = dac1
  19.  
  20.  
  21. #include <Audio.h>
  22. #include <Wire.h>
  23. #include <SPI.h>
  24. #include <SD.h>
  25. #include <SerialFlash.h>
  26.  
  27. // GUItool: begin automatically generated code
  28. AudioSynthWaveform       waveform3;      //xy=83.75000762939453,347.0000081062317
  29. AudioSynthWaveform       waveform1;      //xy=86.7500114440918,251.0000057220459
  30. AudioSynthWaveform       waveform2;      //xy=87.75000762939453,300.0000066757202
  31. AudioSynthWaveform       waveform4;      //xy=96.75000762939453,397.00000190734863
  32. AudioMixer4              mixer1;         //xy=246.75002670288086,288.00000381469727
  33. AudioFilterStateVariable filter1;        //xy=406.75000381469727,250.00000381469727
  34. AudioSynthWaveformDc     dc1;            //xy=475,536.25
  35. AudioFilterStateVariable filter2;        //xy=547,195
  36. AudioMixer4              mixer2;         //xy=574.5000152587891,319.00000953674316
  37. AudioEffectWaveFolder    wavefolder1;    //xy=741.25,382.5
  38. AudioEffectBitcrusher    bitcrusher1;    //xy=772.2500190734863,272.2500333786011
  39. AudioEffectDelay         delay1;         //xy=942.0001220703125,523.5000152587891
  40. AudioMixer4              mixer3;         //xy=946.0000267028809,340.0000333786011
  41. AudioFilterStateVariable filter3;        //xy=946.6000061035156,415
  42. AudioMixer4              mixer5;         //xy=1223.7500343322754,251.25000953674316
  43. AudioOutputAnalog        dac1;           //xy=1386.7500381469727,316.00000858306885
  44. AudioConnection          patchCord1(waveform3, 0, mixer1, 2);
  45. AudioConnection          patchCord2(waveform1, 0, mixer1, 0);
  46. AudioConnection          patchCord3(waveform2, 0, mixer1, 1);
  47. AudioConnection          patchCord4(waveform4, 0, mixer1, 3);
  48. AudioConnection          patchCord5(mixer1, 0, filter1, 0);
  49. AudioConnection          patchCord6(filter1, 0, filter2, 0);
  50. AudioConnection          patchCord7(dc1, 0, wavefolder1, 1);
  51. AudioConnection          patchCord8(filter2, 0, mixer2, 0);
  52. AudioConnection          patchCord9(mixer2, 0, wavefolder1, 0);
  53. AudioConnection          patchCord10(wavefolder1, bitcrusher1);
  54. AudioConnection          patchCord11(bitcrusher1, 0, mixer3, 0);
  55. AudioConnection          patchCord12(delay1, 0, filter3, 0);
  56. AudioConnection          patchCord13(mixer3, delay1);
  57. AudioConnection          patchCord14(mixer3, 0, mixer5, 0);
  58. AudioConnection          patchCord15(filter3, 2, mixer3, 1);
  59. AudioConnection          patchCord16(mixer5, dac1);
  60. AudioControlSGTL5000     sgtl5000_1;     //xy=822,662
  61. // GUItool: end automatically generated code
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68. //Konstanten
  69. const int tasterPin = 8;     //taster an Pin 8 angeschlossen
  70. //const int triggerPin = 9;    //Klinkenbuchse für Gate oder Trigger an Pin 9 angeschlossen
  71.  
  72. const int L1Pin = 3;       // LED1 an Pin 3 angeschlossen
  73. const int L2Pin = 4;      // LED2 an Pin 4 angeschlossen
  74. const int L3Pin = 5;      // LED3 an Pin 5 angeschlossen
  75. const int L4Pin = 6;      // LED4 an Pin 6 angeschlossen
  76.  
  77. //Variablen
  78. int mode = 0;                // Variable für die verschiedenen festgelegten Modi
  79. int tasterState = 0;         // Variable zum Speichern des Tasterstatus
  80. //int triggerState = 0;     // Variable zum Speichern des Triggerstatus
  81. float Note2[8] = {1.25992, 1.18920, 1.25992, 1.33484};  //Frequenzverhältnis erste zu zweite Note
  82. float Note3[8] = {1.49830, 1.49830, 1.49830, 1.49830};  //Frequenzverhältnis erste zu dritte Note
  83. float Note4[8] = {1.88774, 1.88774, 1.88775, 1.88775};  //Frequenzverhältnis erste zu vierte Note
  84. int noteArray[8] = {0, 1, 2, 3, 4, 5, 6, 7}; //Notenarray von dem das "NoteN"-array seine Zuordnung erhält
  85.  
  86.  
  87.  
  88. void setup() {
  89.   //setting up the audio components
  90.   //===========================================================================
  91.   AudioMemory(200);
  92.  
  93.   waveform1.begin(WAVEFORM_SAWTOOTH);
  94.   waveform1.amplitude(0.75);
  95.   waveform1.frequency(65.41);
  96.   waveform1.pulseWidth(0.15);
  97.  
  98.   waveform2.begin(WAVEFORM_SAWTOOTH);
  99.   waveform2.amplitude(0.75);
  100.   waveform2.frequency(65.41);
  101.   waveform2.pulseWidth(0.15);
  102.  
  103.   waveform3.begin(WAVEFORM_SAWTOOTH);
  104.   waveform3.amplitude(0.75);
  105.   waveform3.frequency(65.41);
  106.   waveform3.pulseWidth(0.15);
  107.  
  108.   waveform4.begin(WAVEFORM_SAWTOOTH);
  109.   waveform4.amplitude(0.75);
  110.   waveform4.frequency(65.41);
  111.   waveform4.pulseWidth(0.15);
  112.  
  113.   mixer1.gain(0, 0.3);
  114.   mixer1.gain(1, 0.3);
  115.   mixer1.gain(2, 0.3);
  116.   mixer1.gain(3, 0.3);
  117. /*
  118.   envelope1.delay(0);
  119.   envelope1.attack(20);
  120.   envelope1.hold(0);
  121.   envelope1.decay(5000);
  122.   envelope1.sustain(0.7);
  123.   envelope1.release(500);
  124. */
  125.   //dc2.amplitude(0);
  126.  
  127.   filter1.frequency(16000);                                                  //setze Filterfreq auf 100
  128.   filter1.resonance(0);                                                      //setze Resonanz auf 0
  129.  
  130.   filter2.frequency(16000);                                                  //setze Filterfreq auf 100
  131.   filter2.resonance(0);                                                      //setze Resonanz auf 0
  132.  
  133.   mixer2.gain(0, 1);                                                         //setze Mixer2(Kanal, Gain) (0-3, 0-1)
  134.   mixer2.gain(1, 1);
  135.  
  136.   dc1.amplitude(0.05);                                                       //dc1 für Wavefolder Input
  137.  
  138.   bitcrusher1.bits(16);
  139.   bitcrusher1.sampleRate(44100);
  140.  
  141.   delay1.delay(0, 3);                                                        //setze Delay(OutKanal, gespeicherte Samples) (0-7, 3-449*) *maximal
  142.  
  143.   filter3.frequency(200);                                                   //setze Filterfreq auf 4000
  144.   filter3.resonance(0);                                                      //setze Resonanz auf 0
  145.  
  146.   mixer3.gain(0, 1);                                                         //setze Mixer2(Kanal, Gain) (0-3, 0-1)
  147.   mixer3.gain(1, 0);
  148.  
  149.   //mixer4.gain(1, 0);
  150.   //mixer4.gain(0, 0);
  151.  
  152.   mixer5.gain(0, 0.5);
  153.   //mixer5.gain(1, 0.5);
  154.  
  155.  
  156.   //setting up the audio components DONE!!
  157.   //===========================================================================
  158.  
  159.   //setting up the Pins as In´s n Out´s
  160.   //============================================================================
  161.   pinMode(tasterPin, INPUT);                                                 //taster ist input
  162.   //pinMode(triggerPin, INPUT);                                             //trigger ist input
  163.   pinMode(L1Pin, OUTPUT);                                                    // Setzt den LEDPin als Ausgang
  164.   pinMode(L2Pin, OUTPUT);                                                    // Setzt den LEDPin als Ausgang
  165.   pinMode(L3Pin, OUTPUT);                                                    // Setzt den LEDPin als Ausgang
  166.   pinMode(L4Pin, OUTPUT);                                                    // Setzt den LEDPin als Ausgang
  167. }
  168.  
  169. void loop() {
  170.  
  171.   tasterState = digitalRead(tasterPin);                                       //lies tasterPin und setze tasterState
  172. //  triggerState = digitalRead(triggerPin);                                  //lies triggerPin und setze auf triggerState
  173.  
  174.   int startCV = analogRead(A8);                                               //lies Analog8 und setze auf startCV
  175.   int startKnob = analogRead(A7);                                             //lies Analog7 und setze auf startKnob
  176.   int stationKnob = analogRead(A9);                                           //lies Analog9 und setze auf stationKnob
  177.   int stationCV = analogRead(A6);                                             //lies Analog6 und setze auf stationCV
  178.  
  179. /*
  180.   if (triggerState == HIGH)
  181.   {
  182.     envelope1.noteOn();
  183.   }
  184.   else  if (triggerState == LOW)
  185.   {
  186.     envelope1.noteOff();
  187.   }
  188. */
  189.   float PitchCV = map(startCV, 0, 1023, 65.41, 2093);
  190.   waveform1.frequency((float)(PitchCV) * 1);                                  //WF1 spielt Grundton in 1Hz/V Skala DIE vermutlich auch NICHT FUNKTIONIERT!!!
  191.   waveform2.frequency((float)(PitchCV) * Note2[0]);                           //WF2 spielt Grundton * Frequenzverhältnis aus "Note2"-array
  192.   waveform3.frequency((float)(PitchCV) * Note3[0]);                           //WF3 spielt Grundton * Frequenzverhältnis aus "Note3"-array
  193.   waveform4.frequency((float)(PitchCV) * Note4[0]);                           //WF4 spielt Grundton * Frequenzverhältnis aus "Note4"-array
  194.  
  195.   //float voltOctave = map(startCV, 0, 1023, 0, 3.3);
  196.   //waveform1.frequency(((pow(2, (voltOctave)) * 55)) * 1);                   //WF1 spielt Grundton in 1V/Oktave Skala DIE NICHT FUNKTIONIERT!!!
  197.   //waveform2.frequency(((pow(2, (voltOctave)) * 55)) * Note2[0]);            //WF2 spielt Grundton * Frequenzverhältnis aus "Note2"-array
  198.   //waveform3.frequency(((pow(2, (voltOctave)) * 55)) * Note3[0]);            //WF3 spielt Grundton * Frequenzverhältnis aus "Note3"-array
  199.   //waveform4.frequency(((pow(2, (voltOctave)) * 55)) * Note4[0]);            //WF4 spielt Grundton * Frequenzverhältnis aus "Note4"-array
  200.  
  201.  
  202.   int cutoff = map(stationCV, 0, 1023, 65.41, 8184);                          //mappe Poti zu cutoff
  203.   filter1.frequency(cutoff);                                                  //Filter1 filtert cutoff
  204.  
  205.   if (tasterState == HIGH)                                                    //wenn tasterState ist High
  206.   {
  207.     mode++;                                                                   //zähle switch mode + 1
  208.     delay(200);                                                               //delay zur Entprellung
  209.   }
  210.  
  211.   //==========================================================================
  212.  
  213.   switch (mode) {
  214.     case 0: //Filter5 + Resonance
  215.       digitalWrite(L1Pin, LOW);                                               //Led 1 aus
  216.       digitalWrite(L2Pin, LOW);                                               //Led 2 aus
  217.       digitalWrite(L3Pin, LOW);                                               //Led 3 aus
  218.       digitalWrite(L4Pin, LOW);                                               //Led 4 aus
  219.       filter2.frequency((float)map(stationKnob, 0, 1023, 65.41, 8184));       //Filter1 filtert cutoff
  220.       filter2.resonance((float)map(startKnob, 0, 1023, 0, 5));                //steuert Resonanz
  221.       break;
  222.  
  223.     case 1: //Volume1 + 2,3,4
  224.       digitalWrite(L1Pin, HIGH);                                              //Led 1 an
  225.       digitalWrite(L2Pin, LOW);                                               //Led 2 aus
  226.       digitalWrite(L3Pin, LOW);                                               //Led 3 aus
  227.       digitalWrite(L4Pin, LOW);                                               //Led 4 aus
  228.       mixer1.gain(0, ((float)stationKnob / 3069));                            //Lautstärke Mixer1 Eingang 0
  229.       mixer1.gain(1, ((float)startKnob / 3069));                              //Lautstärke Mixer1 Eingang 1
  230.       mixer1.gain(2, ((float)startKnob / 3069));                              //Lautstärke Mixer1 Eingang 2
  231.       mixer1.gain(3, ((float)startKnob / 3069));                              //Lautstärke Mixer1 Eingang 3
  232.       break;
  233.  
  234.     case 2: //Chord
  235.       digitalWrite(L1Pin, LOW);                                               //Led 1 aus
  236.       digitalWrite(L2Pin, HIGH);                                              //Led 2 an
  237.       digitalWrite(L3Pin, LOW);                                               //Led 3 aus
  238.       digitalWrite(L4Pin, LOW);                                               //Led 4 aus
  239.       //int noteArray[map(stationKnob, 0, 1023, 0, 7)];                       //stationKnob trägt Wert zwischen 0-7 ins noteArray ein
  240.       waveform1.begin(map(startKnob, 0, 1023, 0, 12));
  241.       waveform2.begin(map(startKnob, 0, 1023, 0, 12));
  242.       waveform3.begin(map(startKnob, 0, 1023, 0, 12));
  243.       waveform4.begin(map(startKnob, 0, 1023, 0, 12));
  244.       break;
  245.  
  246.     case 3: //wavefolder + bitcrusher
  247.       digitalWrite(L1Pin, LOW);                                               //Led 1 aus
  248.       digitalWrite(L2Pin, LOW);                                               //Led 2 aus
  249.       digitalWrite(L3Pin, HIGH);                                              //Led 3 an
  250.       digitalWrite(L4Pin, LOW);                                               //Led 4 aus
  251.       dc1.amplitude((float) stationKnob / 1023);                              //dc-spannung für Wavefolder gesteuert von stationKnob
  252.       bitcrusher1.sampleRate(map(startKnob, 0, 1023, 1, 44100));              //samplerate von 1-44100Hz gesteuert von startKnob
  253.       break;
  254.  
  255.     case 4: //delaytime + feedback
  256.       digitalWrite(L1Pin, LOW);                                               //Led 1 aus
  257.       digitalWrite(L2Pin, LOW);                                               //Led 2 aus
  258.       digitalWrite(L3Pin, LOW);                                               //Led 3 aus
  259.       digitalWrite(L4Pin, HIGH);                                              //Led 4 aus
  260.       delay1.delay(0, map(stationKnob, 0, 1023, 3, 200));                     //delaytime von 3-200ms gesteuert von stationknob
  261.       mixer3.gain(1, ((float)startKnob / 1023));                              //delayfeedback 0-1 gesteuert von startknob
  262.       break;
  263.  
  264.     default:
  265.       mode = 0;
  266.   }
  267.  
  268.  
  269.   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  270.   //waveform2.frequency((float)(65.4064 * pow(2, (startCV)) * Note2[noteArray]));                     //WF2 spielt Grundton * Frequenzverhältnis aus "Note2"-array
  271.   //waveform3.frequency((float)(65.4064 * pow(2, (startCV)) * Note3[noteArray]));                    //  WF3 spielt Grundton * Frequenzverhältnis aus "Note3"-array
  272.   //waveform4.frequency((float)(65.4064 * pow(2, (startCV)) * Note4[noteArray]));                    //  WF4 spielt Grundton * Frequenzverhältnis aus "Note4"-array
  273.  
  274.   //Fehlermeldung: invalid types 'float [8][int [8]]' for array subscript
  275.   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement