Advertisement
degu234

subtracting sequencer3

Sep 7th, 2021
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Mit diesem Notensequencer können "Wahrscheinlichkeiten" für jede Note eingegeben werden.
  2.     Nach dem Einschalten werden die aktuellen Potipositionen auf % "Wahrscheinlichkeit" umgerechnet und in einem
  3.     array hinterlegt. Es wird die Note mit der höchsten Wahrscheinlichkeit ermittelt.
  4.     Nach Eingang eines ersten Clocksignals soll die Note mit der höchsten WHK gespielt werden.
  5.     Danach werden der Note 10% wahrscheinlichkeit abgezogen und der nächste maximalwert ermittelt.
  6.     Nach einem neuelichen Clocksignal wird der gerade ermittelte maximalwert ausgegeben, 10%WHK der gerade
  7.     gespielten Note abgezogen und der nächste Maximalwert ermittelt.
  8.  
  9.     Eine Note wird mitunter solange gespielt (dabei weiterhin ein Abzug von 10& WHK bei jedem Clocksignal),
  10.     bis es eine andere Note gibt deren WHK mittlerweile höher ist.
  11.     Wenn die WHK für eine Note unter 10 fällt wird die Position des jeweiligen AnalogInputs abgefragt
  12.     und als neue WHK herangezogen.
  13.     Optional:
  14.  *  **Wenn alle Noten ein ähnliches WHK Level erreicht haben kann mittels random die WHK für die Notenfolge variiert werden.
  15.  *  **%-Abzug der WHK kann variiert werden
  16.  *  **Selectable Octave Range
  17.  
  18. */
  19. #include <MyMCP4725.h>
  20. MyMCP4725 DAC(0x60); //I2C-Adress = 0x60
  21.  
  22. const int clockPin = 9;
  23. const int pinC = 0;           //setze Wert 0 für "pinC"
  24. const int pinCs = 1;           //setze Wert 1 für "pinC#"
  25. const int pinD = 2;           //setze Wert 2 für "pinD"
  26. const int pinDs = 3;           //setze Wert 3 für "pinD#"
  27.  
  28.  
  29. //Notes-Probability
  30. int probC = 0;               //setze (vorerst) einen Wert für probC
  31. int probCs = 0;               //setze (vorerst) einen Wert für probC#
  32. int probD = 0;               //setze (vorerst) einen Wert für probD
  33. int probDs = 0;               //setze (vorerst) einen Wert für probD#
  34. int analogReadArraysize = 4;
  35. int analogReadArray[4];  // erstelle ein Array mit 4 Werten, hier werden die analogreads der einzelnen noten für den durchlauf gespeichert
  36. float outPut[4] = {3, 4, 4.5, 5};             //Ausgangsspannungen für den DAC entsprechend den Noten C, C#, D, D# im 1V/Oktave System (12Noten/1V + Oktave)
  37.  
  38. int maxVal = analogReadArray[0];
  39. int clockState = 0;         // Variable to save tasterstate
  40. int mode = 0;
  41. bool dacStatus = false;
  42.  
  43. void setup() {
  44.   Serial.begin(115200);
  45.   DAC.setVoltage(5);
  46.   if (DAC.isReady())
  47.   {
  48.     Serial.println("\nDAC in Ordnung!");
  49.     dacStatus = true;
  50.   }
  51.   else Serial.println("DAC Fehler!");
  52.  
  53.  
  54.   pinMode(clockPin, INPUT);
  55.  
  56.   probC = (int)map(analogRead(pinC), 0, 1023, 0, 100);                           //lies im setup durchlauf, nach dem einschalten die potiwerte
  57.   analogReadArray[0] = probC;                                                    //und setze den Wert in das analogReadArray, erster Index
  58.   probCs = (int)map(analogRead(pinCs), 0, 1023, 0, 100);                            //lies im setup durchlauf, nach dem einschalten die potiwerte
  59.   analogReadArray[1] = probCs;                                                    //und setze den Wert in das analogReadArray, zweiter Index
  60.   probD = (int)map(analogRead(pinD), 0, 1023, 0, 100);                            //lies im setup durchlauf, nach dem einschalten die potiwerte
  61.   analogReadArray[2] = probD;                                                 //und setze den Wert in das analogReadArray, dritter Index
  62.   probDs = (int)map(analogRead(pinDs), 0, 1023, 0, 100);                           //lies im setup durchlauf, nach dem einschalten die potiwerte
  63.   analogReadArray[3] = probDs;                                                //und setze den Wert in das analogReadArray, vierter Index
  64.  
  65. }
  66.  
  67. void loop() {
  68.   clockState = digitalRead(clockPin);
  69.   int maxValIndex = 0;
  70.  
  71.   if (dacStatus) {
  72.     int maxVal = 0;
  73.  
  74.     for (int i = 0; i < analogReadArraysize; i++) {
  75.       if (analogReadArray[i] > maxVal) {
  76.         maxVal      = analogReadArray[i];
  77.         //maxVal = max(analogReadArray[i], maxVal);
  78.         maxValIndex = i;
  79.       }
  80.     }
  81.     if (clockState == HIGH) {
  82.       switch (maxValIndex) {
  83.         case 0:
  84.           DAC.setVoltage(outPut[0]);
  85.           probC = probC - 10;
  86.           break;
  87.         case 1:
  88.           DAC.setVoltage(outPut[1]);
  89.           probCs = probCs - 10;
  90.           break;
  91.         case 2:
  92.           DAC.setVoltage(outPut[2]);
  93.           probD = probD - 10;
  94.           break;
  95.         case 3:
  96.           DAC.setVoltage(outPut[3]);
  97.           probDs = probDs - 10;
  98.           break;
  99.         default:                                                                  //next taster push brings us back to page 0
  100.           mode = 0;
  101.       }
  102.       if (probC <= 10) {
  103.         probC = (int)map(analogRead(pinC), 0, 1023, 0, 100);                           //lies im setup durchlauf, nach dem einschalten die potiwerte
  104.         analogReadArray[0] = probC;                          //und setze den Wert in das analogReadArray, erster Index
  105.       }
  106.       if (probCs <= 10) {
  107.         probCs = (int)map(analogRead(pinCs), 0, 1023, 0, 100);                           //lies im setup durchlauf, nach dem einschalten die potiwerte
  108.         analogReadArray[1] = probCs;                          //und setze den Wert in das analogReadArray, erster Index
  109.       }
  110.  
  111.       if (probD <= 10) {
  112.         probD = (int)map(analogRead(pinD), 0, 1023, 0, 100);                           //lies im setup durchlauf, nach dem einschalten die potiwerte
  113.         analogReadArray[2] = probD;                          //und setze den Wert in das analogReadArray, erster Index
  114.       }
  115.       if (probDs <= 10) {
  116.         probDs = (int)map(analogRead(pinDs), 0, 1023, 0, 100);                           //lies im setup durchlauf, nach dem einschalten die potiwerte
  117.         analogReadArray[1] = probDs;                          //und setze den Wert in das analogReadArray, erster Index
  118.       }
  119.  
  120.       //Ausgabe des Potiwertes im Normal-Modus
  121.       //DAC.setVoltage(outPut[maxVal]);
  122.       Serial.print(maxVal);
  123.       Serial.print("--");
  124.       Serial.print(maxValIndex);
  125.       Serial.print("--");
  126.       Serial.print(probC);
  127.       Serial.print("-");
  128.       Serial.print(probCs);
  129.       Serial.print("-");
  130.       Serial.print(probD);
  131.       Serial.print("-");
  132.       Serial.print(probDs);
  133.       Serial.print("--");
  134.       Serial.println(DAC.readRegister());
  135.  
  136.       delay(500);
  137.     }
  138.   }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement