degu234

ChordOrgan Synthvoice-case

Aug 27th, 2021
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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