Optimera kod? Arduino Nano som MIDIsignalsgenerator.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Housepainter
EF Sponsor
Inlägg: 1318
Blev medlem: 19 juli 2006, 18:50:38
Ort: Borås

Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av Housepainter »

Tjo. Förr när jag hängde här på forat så höll jag mig borta från denna avdelningen, gjorde något försök med Sodjans picar och försökte lära mig lite C++. Men det lades på is, tills jag fick upp ögonen för Arduino. Jag har bra länge mest kopierat andras kod och flashat, bytt ut några grejer här och där bara. Använt delay() och sånna saker som man inte får göra.. :)
Men nu har jag äntligen börjat knäcka de första nötterna och förstå lite mer än jag gjort innan.

Så jag beslöt mig för att försöka realisera en idé jag fick efteratt jag hittade en kod på en enkel synth med en Pentatonisk skala som man gjorde med en Arduino. :idea:
"Men va tråkigt när man inte kan byta tonart" tänkte jag och fick iden att man kunde ha något som skickar midi där man kan byta både tonart och skala. Så sen var det bara att sätta igång, trodde inte att jag skulle lyckas något vidare. Men efter att ha varit ledig i en vecka och haft tid till att sitta med det såhar jag lyckats få till en kod som funkar och gör vad jag vill att den skall göra.
Jag har rakt av skrivit av koden i delen som läser av input och debouncar, men det är den enda delen som jag inte skrivit själv.

Jag känner mig stolt över vad jag har lyckats med, men samtidigt vet jag att det med största sannolikhet finns bättre sätt att skriva koden på. Så nu när jag ändå har löst mina problem själv så tänkte jag be er kolla på det och snällt kanske kunna ge förslag på hur jag kan optimera/ändra så det blir ännu bättre. :tumupp: Jag må ha överdrivet kommenterat min kod på uppenbara delar, men hey, bättre att vara övertydlig än inte tydlig alls.
Allmänna tips om kodningens vett och etikett mottages tacksamt. Ser min formatering av koden korrekt ut osv.. :oops:

Kod: Markera allt

//Ranom MIDI note generator - a project by Housepainter.
//The project is made with Arduino Nano, a Liquid Qrystal display, two buttons and a MIDI output.
//LCD connected rs=11, en=10, d4=8, d5=7, d6=6, d7=5. Buttons to pin 2 and 3(other leg to GND). 
//MIDI output via TX and a 220R resistor. 
//There is a "top menu" with three options, Scale, Note and Tempo(for the moment not used). 
//The second button selects the menu option visible and you see the options to choose between
//Under Scale there is 4 options, Major, Minor, Pentatonic and Dorian
//Under Note there is all 12 notes to choose from. From C C#...to ...A# B.
//Tempo is in BPM, an there is also the alternatives Fast(Fst) and Random(Ran).

//This is my first "real" coding project, don't shoot me for my bad coding skills. :)

#include <MIDI.h>
#include <LiquidCrystal.h>


//lcd setup
const int rs=11, en=10, d4=8, d5=7, d6=6, d7=5;
LiquidCrystal lcd(rs,en,d4, d5, d6, d7);

//MIDI setup
MIDI_CREATE_DEFAULT_INSTANCE();

//Menu declarations
int topMenu = 0;                                //Keeps track of which menu selected
int lastTopMenu = 2;                            //Keeps track of which menu that WAS selected

int menu = 0;                                   //0=topMenu,1=scaleMenu,2=noteMenu,3=tempoMenu
int subMenuScale = 0;                           //Keeps track of which Scale selected
int lastSubMenuScale;                           //Keeps track of which Scale WAS selected
int scalesMax = 3;                              //Sets max number of scales
int subMenuKey = 0;                            //Keeps track of which key selected
int lastSubMenuKey;                            //Keeps track of which key WAS selected
int subMenuTempo = 0;                           //Keeps track of which tempo selected
int lastSubMenuTempo;                           //Keeps track of which tempo WAS selected
int tempoMax = 10;

//Text for the display
char* topMenuText[] = {"Scale","Key","Tempo"}; //top menu alternatives for print on lcd
char* scales[] = {"Major  ","Minor  ","Pentat.","Dorian "};  //scale choise values for print on lcd
char* keys[] = {"C ","C#","D ","D#","E ","F ","F#","G ","G#","A ","A#","B "};//note choise values for print on lcd
char* tempo[] = {"60 ","70 ","80 ","90 ","100","110","120","130","140","Fst","Ran"};  //tempo choise values for print on lcd

int scaleSetting;         //Value that sets the MIDI output
int keySetting;          //Value that sets the MIDI output
int tempoSetting;         //Value that sets the MIDI output
int scale[16];            //Takes value from scaleSetting & noteSetting and sets what scale to play



//Button declarations
//Button 1
const int inputPin1 = 2;      //Button 1 on pin 2
int inputState1;              //Used in buttonRead() to keep track of button presses
int lastInputState1 = HIGH;   //Used in buttonRead() to keep track of button presses
bool inputFlag1 = LOW;        //Used in buttonRead() to keep track of button presses
long lastDebounceTime1 = 0;   //Used in buttonRead() to keep track of button presses
//Button 2
const int inputPin2 = 3;      //Button 2 on pin 3
int inputState2;              //Used in buttonRead() to keep track of button presses
int lastInputState2 = HIGH;   //Used in buttonRead() to keep track of button presses
bool inputFlag2 = LOW;        //Used in buttonRead() to keep track of button presses
long lastDebounceTime2 = 0;   //Used in buttonRead() to keep track of button presses

long debounceDelay = 50;    //Debounce time

//For delay between played notes
unsigned long previousMillis = 0; 
long interval = 1000;
unsigned long previousMillis2 = 0; 
long interval2 = 100;
int intervalRandom1;
int intervalRandom2;


//Keys declaration
int cMajor[16] = {36,40,43,48,52,55,60,64,67,72,76,79,36,48,60,72};       //MIDI values of notes
int cMinor[16] = {36,39,43,48,51,55,60,63,67,72,75,79,36,48,60,72};       //MIDI values of notes
int cPentatonic[16] = {48,51,53,55,58,60,63,65,67,70,72,75,77,79,82,48};  //MIDI values of notes
int cDorian[16] = {48,50,51,53,55,57,58,60,62,63,65,67,69,70,72,48};      //MIDI values of notes


void setup() {
  pinMode(inputPin1, INPUT_PULLUP);
  pinMode(inputPin2, INPUT_PULLUP);
  MIDI.begin(4);
  Serial.begin(31250);
  lcd.begin(16,2);

  //Absolutely useless but nice looking boot screen
  lcd.print("Booting.        ");
  delay(500);
  lcd.clear();
  lcd.print("Booting..       ");
  delay(500);
  lcd.clear();
  lcd.print("Booting...      ");
  delay(500);
  lcd.clear();
  lcd.print("Booting....     ");
  delay(1000);
  lcd.clear();  
  lcd.print("Housepainters");
  lcd.setCursor(0,1);
  lcd.print("Random");
  delay(1500);
  lcd.clear();
  lcd.print("MIDI signal");
  lcd.setCursor(0,1);
  lcd.print("Generator");
  delay(2000);
  lcd.clear();
  lcdUpdate();
}


void loop() {
  buttonRead();   //Read the inputs
  menuScroll();   //Button 1 scrolls menu
  menuSelect();   //Button 2 selects the value
  setTempo();
  resolveMIDI();  //Choses the right scale to play depending on given values
  MIDIsend();     //Sends MIDI data
}


void buttonRead() {
  //Read button 1. If pressed, debounce and then set inputflag1 to HIGH
  int reading1 = digitalRead(inputPin1);
  if (reading1 != lastInputState1){
    lastDebounceTime1 = millis();
  }
  if ((millis() - lastDebounceTime1) > debounceDelay) {
    if (reading1 != inputState1) {
      inputState1 = reading1;
      if (inputState1 == LOW) {
        inputFlag1 = HIGH;
        lcd.clear();
      }
    }
  }
  lastInputState1 = reading1;

  //Read button 2. If pressed, debounce and then set inputflag2 to HIGH
  int reading2 = digitalRead(inputPin2);
  if (reading2 != lastInputState2){
    lastDebounceTime2 = millis();
  }
  if ((millis() - lastDebounceTime2) > debounceDelay) {
    if (reading2 != inputState2) {
      inputState2 = reading2;
      if (inputState2 == LOW) {
        inputFlag2 = HIGH;
      }
    }
  }
  lastInputState2 = reading2;
}


void menuScroll() {
  //Top Menu
  if(menu == 0 && inputFlag1 == HIGH){    //If menu is 0(Top menu) and button 1 is pressed
    if(topMenu == 2){                     //If on last option
      topMenu = 0;                        //Goto first option
    }
    else {
      topMenu++;                          //Else go to next menu option
    }
    if (topMenu != lastTopMenu){          //If menu option changed
      lcdUpdate();                        //update lcd
      lastTopMenu = topMenu;              //Keeps track of last menu option chosen
    }    
  }
  //Scale Menu
  else if(menu == 1 && inputFlag1 == HIGH){   //If menu is 1(Scale) and button 1 is pressed
    if(subMenuScale == scalesMax){                    //If on last option
      subMenuScale = 0;                       //Goto first option
    }
    else {
      subMenuScale++;                         //Else, go to next menu option
    }
    if (subMenuScale != lastSubMenuScale){    //If menu option changed
      lcdUpdate();                            //update lcd
      lastSubMenuScale = subMenuScale;        //Keeps track of last menu option chosen
    }
  }
  //Note Menu
  else if(menu == 2 && inputFlag1 == HIGH){   //If menu is 2(Key) and button 1 is pressed
    if(subMenuKey == 11){                    //If on last option
      subMenuKey = 0;                        //Goto first option
    }
    else {
      subMenuKey++;                          //Else, go to next menu option
    }
    if (subMenuKey != lastSubMenuKey){      //If menu option changed
      lcdUpdate();                            //update lcd
      lastSubMenuKey = subMenuKey;          //Keeps track of last menu option chosen
    }
  }
  //Tempo Menu
  else if(menu == 3 && inputFlag1 == HIGH){   //If menu is 3(Tempo) and button 1 is pressed
    if(subMenuTempo == tempoMax){                    //If on last option
      subMenuTempo = 0;                       //Goto first option
    }
    else {
      subMenuTempo++;                         //Else, go to next menu option
    }
    if (subMenuTempo != lastSubMenuTempo){    //If menu option changed
      lcdUpdate();                            //update lcd
      lastSubMenuTempo = subMenuTempo;        //Keeps track of last menu option chosen
    }
  }
  else {    
  }
  
  inputFlag1 = LOW;
}


void menuSelect() {

  if(inputFlag2 == HIGH && menu == 0) {       //If top menu is active and button 2 is pressed, choose the sub menu shown.
                                              //also set the var "menu" to the right value
                                              //(to keep track of which menu that is active)
    switch(topMenu) {                           
      case 0:                                 //If button 2 is pressed and topMenu is set to 0
      menu = 1;                               //set menu to 1(scale)
      lcdUpdate();                            //update lcd
      break;

      case 1:                                 //If button 2 is pressed and topMenu is set to 1
      menu = 2;                               //set menu to 2(key)
      lcdUpdate();                            //update lcd
      break;

      case 2:                                 //If button 2 is pressed and topMenu is set to 2
      menu = 3;                               //set menu to 3(tempo)
      lcdUpdate();                            //update lcd
      break;
    }
  }
  else if(inputFlag2 == HIGH && menu != 0) {  //If button 2 is pressed and a sub menu is active, set the sub menu option.
    switch(menu) {
      case 1:                                 //If menu 1 is active and button 2 is pressed, 
      scaleSetting = subMenuScale;            //set the scale shown on lcd as active
      menu = 0;                               //Then jump back to top menu
      lcdUpdate();                            //update the lcd
      break;

      case 2:                                 //If menu 2 is active and button 2 is pressed,
      keySetting = subMenuKey;               //set the note shown on lcd as active
      menu = 0;                               //Then jump back to top menu
      lcdUpdate();                            //update the lcd
      break;

      case 3:                                 //If menu 2 is active and button 2 is pressed,
      tempoSetting = subMenuTempo;            //set the note shown on lcd as active
      menu = 0;                               //Then jump back to top menu
      lcdUpdate();                            //update the lcd
      break;
  }
} 
  inputFlag2 = LOW;                           //Reset inputflag2 and wait for new input
}


void setTempo() {
  if(tempoSetting == 0) {           //60 bpm
    interval = 1000;
    interval2 = 200;
  }
  else if(tempoSetting == 1) {      //70 bpm
    interval = 857;
    interval2 = 200;
  }
  else if(tempoSetting == 2) {      //80 bpm
    interval = 750;
    interval2 = 200;
  }
  else if(tempoSetting == 3) {      //90 bpm
    interval = 667;
    interval2 = 200;
  }
  else if(tempoSetting == 4) {      //100 bpm
    interval = 600;
    interval2 = 200;
  }
  else if(tempoSetting == 5) {      //110 bpm
    interval = 545;
    interval2 = 200;
  }
  else if(tempoSetting == 6) {      //120 bpm
    interval = 500;
    interval2 = 200;
  }
  else if(tempoSetting == 7) {      //130 bpm
    interval = 462;
    interval2 = 200;
  }
  else if(tempoSetting == 8) {      //140 bpm
    interval = 429;
    interval2 = 200;
  }
  else if(tempoSetting == 9) {      //Fast
    interval = 100;
    interval2 = 100;
  }
  else if(tempoSetting == 10) {      //Random tempo
    interval = intervalRandom1;
    interval2 = intervalRandom2;
  }
}

void resolveMIDI() {                                    //copy selected scale array to array "scale"
  
  if(keySetting == 0) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i];
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i];
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i];
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i];
      }
      break;
    }
  }
  else if(keySetting == 1) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 1;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 1;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 1;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 1;
      }
      break;
    }
  }
  else if(keySetting == 2) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 2;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 2;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 2;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 2;
      }
      break;
    }
  }
  else if(keySetting == 3) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 3;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 3;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 3;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 3;
      }
      break;
    }
  }
  else if(keySetting == 4) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 4;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 4;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 4;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 4;
      }
      break;
    }
  }
  else if(keySetting == 5) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 5;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 5;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 5;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 5;
      }
      break;
    }
  }
  else if(keySetting == 6) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 6;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 6;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 6;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 6;
      }
      break;
    }
  }
  else if(keySetting == 7) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 7;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 7;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 7;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 7;
      }
      break;
    }
  }
  else if(keySetting == 8) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 8;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 8;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 8;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 8;
      }
      break;
    }
  }
  else if(keySetting == 9) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 9;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 9;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 9;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 9;
      }
      break;
    }
  }
  else if(keySetting == 10) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 10;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 10;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 10;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 10;
      }
      break;
    }
  }
  else if(keySetting == 11) {
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + 11;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + 11;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + 11;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + 11;
      }
      break;
    }
  }
//  else if(noteSetting == 11 && scaleSetting == 0) {     //I did this section this way before. 
//    for( int i = 0 ; i < 16 ; ++i ){
//    scale[i] = cMajor[i] + 11;
//    }
//  }
//  else if(noteSetting == 11 && scaleSetting == 1) {
//    for( int i = 0 ; i < 16 ; ++i ){
//    scale[i] = cMinor[i] + 11;
//    }
//  }
//  else if(noteSetting == 11 && scaleSetting == 2) {
//    for( int i = 0 ; i < 16 ; ++i ){
//    scale[i] = cPentatonic[i] + 11;
//    }
//  }
//  else if(noteSetting == 11 && scaleSetting == 3) {
//    for( int i = 0 ; i < 16 ; ++i ){
//    scale[i] = cDorian[i] + 11;
//    }
//  }
}

void MIDIsend() {
  int noteSend = scale[random(0,15)];             //note to send shall be randomly picked out of one of the midi scale arrays, scale defined in resolveMidi()
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    MIDI.sendNoteOn(noteSend, 127, 1);              //send picked note with velocity 127 on channel 1
    intervalRandom1 = random(500,1500);                    //Sets random time for when next note should be played.
    unsigned long currentMillis2 = millis();
    if (currentMillis2 - previousMillis2 >= interval2) {
      previousMillis2 = currentMillis2;
      MIDI.sendNoteOff(noteSend, 0, 1);             //send "note off" to same randomly picked note. Silence!
      intervalRandom2 = random(100,500);                    //Sets random time for when next note should be muted.
    }
  }
}

void lcdUpdate() {
  lcd.clear();
  lcd.print(topMenuText[topMenu]);
  lcd.setCursor(0,1);
  lcd.print(keys[subMenuKey]);
  lcd.setCursor(3,1);
  lcd.print(scales[subMenuScale]);
  lcd.setCursor(13,1);
  lcd.print(tempo[subMenuTempo]);
}

Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av Glattnos »

"Booting..." behöver inte vara helt onödig för det kan ju vara så att man vill att det ska ta en stund innan den kör igång programmet för att kringutrustning ska starta ordentligt(det kanske strömsätts samtidigt).
Jag är inte proffs och har inte gått igenom koden i detalj, tycker den ser bra ut. Jag antar att dina switch case och else if skulle kunna göras om till funktioner för att korta ner koden lite. Dock tror jag att maskin-koden som genereras ändå blir i princip likadan så det är inte så noga för den sakens skull.

Bra gjort skulle jag säga med tanke på din erfarenhet :) Även jag skulle vara intresserad av ifall någon som är bättre än mig kan ge förslag på vad som kan förbättras/förenklas i den koden.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av johano »

Borde inte resolveMidi() kunna kortas ner till:

Kod: Markera allt

  void resolveMidi()
  {
    if(keySetting <0 || keySetting > 11)
      return;
      
    switch(scaleSetting) {
        case 0:                                
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMajor[i] + keySetting;
      }                            
      break;
        case 1:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cMinor[i] + keySetting;
      }
      break;
        case 2:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cPentatonic[i] + keySetting;
      }
      break;
        case 3:
      for( int i = 0 ; i < 16 ; ++i ){
      scale[i] = cDorian[i] + keySetting;
      }
      break;
    }  	
  }
/j
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av Glattnos »

Jo det borde ju gå :) Snyggt!
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av johano »

Går att få bort switchsatsen också såklart

Kod: Markera allt

  void resolveMidi()
  {
    if(keySetting<0 || keySetting>11 || scaleSetting<0 || scaleSetting>3)
      return;
    
    int*p[]={cMajor,cMinor,cPentatonic,cDorian};
    
    for( int i = 0 ; i < 16 ; ++i ) {
      scale[i] = p[scaleSetting][i] + keySetting;
    }                            
  } 
Användarvisningsbild
Housepainter
EF Sponsor
Inlägg: 1318
Blev medlem: 19 juli 2006, 18:50:38
Ort: Borås

Re: Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av Housepainter »

Det där skall jag kika närmre på! Misstänkte att man kunde förenkla just den biten väsentligt, men kunde inte komma på det själv. Tack för förslaget!! Det blir så mycker mer överskådligt när man får bort den klumpen av kod!
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: Optimera kod? Arduino Nano som MIDIsignalsgenerator.

Inlägg av mounte »

Trevlig projekt detta, bra jobbat att sy ihop det hela.
Jag har skrivit om delar av det men inte haft hårdvara att testa med så har säkert haft sönder en hel del saker ;) Säkert med LCD:n då jag är osäker på hur kolumn och rad indexeras, men detta borde du enkelt lösa...
https://gist.github.com/mounte/1eb8d5bc ... fe00bfc997

Några funderingar och tips.
Eftersom resolveMIDI behöver bara kallas på om scaleSetting eller keySetting har ändrats så här kan en del "optimeras".
Samma sak gäller för setTempo, såvida inte random är valt. Jag skulle dock kunna tänka mig att man sätter en flagga att random ska användas och att man inte sätter random-värdet i setTempo utan i MIDIsend metoden.

I MIDIsend så undrar jag över logiken när noten ska sättas "off" den använder ju noteSend som kommer uppdateras varje gång MIDIsend() kallas på. Hur är detta tänkt att det ska hänga ihop? Hur kan du vara säker på att det är tonen som du sänder som också stängs av?
Skriv svar