2011-11-18

9) Syncuino: Cleared Code - Same Function


This example shows that the space for a certain set of functions on Arduino (in this case the step sequencer Syncuino) can be reduced by some simple coding tricks. This version of syncuino features also a bug-fix for holding notes. Of course it does also feature transposing notes by a ps/2 keyboard introduced in the last version.

Here´s the difference:
Version 8:
Binary sketch size: 12646 bytes (of a 126976 byte maximum)
Version 9 with cleared code:
Binary sketch size: 11602 bytes (of a 126976 byte maximum)

So the Arduino Mega needs 1044 bytes less, yust by ably programming. You also have less code to write.

1st example: Using loops

old code:
digitalWrite(22, HIGH);
digitalWrite(24, LOW);
digitalWrite(26, LOW);
digitalWrite(28, LOW);
digitalWrite(30, LOW);
digitalWrite(32, LOW);
digitalWrite(34, LOW);
digitalWrite(36, LOW);
digitalWrite(38, LOW);
digitalWrite(40, LOW);
digitalWrite(42, LOW);
digitalWrite(44, LOW);
digitalWrite(46, LOW);
digitalWrite(48, LOW);
digitalWrite(50, LOW);
digitalWrite(52, LOW);

new code:
digitalWrite(22, HIGH);
for(int i=24;i<53;i=i+2){digitalWrite(i, LOW);}



2nd example: Don´t use variables if not necessary

old code:
Shuffle_Flag = digitalRead(ShufflePin);
if(Shuffle_Flag == LOW) {
ShuffleDelay = 0;
}
if (Shuffle_Flag == HIGH){
ShuffleDelay = 2; // start every 2nd note two MIDI clock signals later (ShuffleDelay = 1...4)
}

new code:
if(digitalRead(ShufflePin) == LOW) {ShuffleDelay = 0;}
else if (digitalRead(ShufflePin) == HIGH){ShuffleDelay = 2;}

3rd example:
Use a sub program for code that appears more than once in the code.


Here´s the cleared and bug-fixed Syncuino Code (Version 9):



// Declaration of Varialbes

byte midi_start = 0xfa;
byte midi_stop = 0xfc;
byte midi_clock = 0xf8;
byte midi_continue = 0xfb;
int play_flag = 0;
byte data;
int clock_step=0;
int note = 0x3F;
int LowestNote=36;
int HighestNote=36+3*12; //3 Octaves over LowestNote

int Note1 = (96*1)/16-5;
int Note2 = (96*2)/16-5;
int Note3 = (96*3)/16-5;
int Note4 = (96*4)/16-5;
int Note5 = (96*5)/16-5;
int Note6 = (96*6)/16-5;
int Note7 = (96*7)/16-5;
int Note8 = (96*8)/16-5;
int Note9 = (96*9)/16-5;
int Note10 = (96*10)/16-5;
int Note11 = (96*11)/16-5;
int Note12 = (96*12)/16-5;
int Note13 = (96*13)/16-5;
int Note14 = (96*14)/16-5;
int Note15 = (96*15)/16-5;
int Note16 = (96*16)/16-5;

int SeqLength = 6*16; //Sequence length is 16*16th notes

int ShufflePin = 2;
int ShuffleDelay = 0;

int Seq1Pin = 3;
int Seq2Pin = 4;
int PlayMode = 1;

int HoldNote_Flag = HIGH;

int transpose = 0;
const int DataPin = 20; //yellow cable
const int IRQpin = 21; //blue cable
#include
PS2Keyboard keyboard;

// Initialization

void setup() {

Serial.begin(31250);

delay(1000);
keyboard.begin(DataPin, IRQpin);


pinMode(ShufflePin, INPUT); //Pin 0 for shuffle on/off as input

for(int i=22;i<53;i=i+2){pinMode(i, OUTPUT);} for(int i=2;i<6;i++){pinMode(i, INPUT);} digitalWrite(22, HIGH); for(int i=24;i<53;i=i+2){digitalWrite(i, LOW);} } // Main Programm void loop() { //------------------------------------------------------------------------------------------- // Check keyboard if (keyboard.available()) { // read the next key char c = keyboard.read(); // check for some of function-keys if (c == PS2_ESC) {transpose=0;} else if (c == PS2_F1) {transpose=1;} else if (c == PS2_F2) {transpose=2;} else if (c == PS2_F3) {transpose=3;} else if (c == PS2_F4) {transpose=4;} else if (c == PS2_F5) {transpose=5;} else if (c == PS2_F6) {transpose=6;} else if (c == PS2_F7) {transpose=7;} else if (c == PS2_F8) {transpose=8;} else if (c == PS2_F9) {transpose=9;} else if (c == PS2_F10) {transpose=10;} else if (c == PS2_F11) {transpose=11;} else if (c == PS2_F12) {transpose=12;} else {transpose=transpose;} } //------------------------------------------------------------------------------------------- // Check Shuffle if(digitalRead(ShufflePin) == LOW) {ShuffleDelay = 0;} else if (digitalRead(ShufflePin) == HIGH){ShuffleDelay = 2;} // start every 2nd note two MIDI clock signals later (ShuffleDelay = 1...4) Note1 = (96*1)/16-5; Note2 = (96*2)/16-5+ShuffleDelay; Note3 = (96*3)/16-5; Note4 = (96*4)/16-5+ShuffleDelay; Note5 = (96*5)/16-5; Note6 = (96*6)/16-5+ShuffleDelay; Note7 = (96*7)/16-5; Note8 = (96*8)/16-5+ShuffleDelay; Note9 = (96*9)/16-5; Note10 = (96*10)/16-5+ShuffleDelay; Note11 = (96*11)/16-5; Note12 = (96*12)/16-5+ShuffleDelay; Note13 = (96*13)/16-5; Note14 = (96*14)/16-5+ShuffleDelay; Note15 = (96*15)/16-5; Note16 = (96*16)/16-5+ShuffleDelay; //------------------------------------------------------------------------------------------- // Check PlayMode if(digitalRead(Seq1Pin) == HIGH) {PlayMode = 1;} //Play sequence forwards else if(digitalRead(Seq1Pin == LOW)) {PlayMode = 2;} //Play sequence backwards //------------------------------------------------------------------------------------------- // Check MIDI if(Serial.available() > 0) {
data = Serial.read();
if(data == midi_start) {
play_flag = 1;
clock_step=0;
}
else if(data == midi_continue) {
play_flag = 1;
}

else if(data == midi_stop) {
play_flag = 0;
clock_step=0;
sendMidiNote (0x80, note, 0x7F); //last note off

digitalWrite(22, HIGH);
for(int i=24;i<53;i=i+2){digitalWrite(i, LOW);} } else if((data == midi_clock) && (play_flag == 1) && PlayMode == 1) { Sync1(); //Play sequence forwards } else if((data == midi_clock) && (play_flag == 1) && PlayMode == 2) { Sync2(); //Play sequence backwards } } } //------------------------------------------------------------------------------------------- // Functions void Sync1() { // play forwards 16 x 16th notes, repeat after the cycle is finshed clock_step = clock_step+1; if (clock_step==Note1){PlayNote1();digitalWrite(22, HIGH);digitalWrite(52, LOW);} else if (clock_step==Note2){PlayNote2();digitalWrite(24, HIGH);digitalWrite(22, LOW);} else if (clock_step==Note3){PlayNote3();digitalWrite(26, HIGH);digitalWrite(24, LOW);} else if (clock_step==Note4){PlayNote4();digitalWrite(28, HIGH);digitalWrite(26, LOW);} else if (clock_step==Note5){PlayNote5();digitalWrite(30, HIGH);digitalWrite(28, LOW);} else if (clock_step==Note6){PlayNote6();digitalWrite(32, HIGH);digitalWrite(30, LOW);} else if (clock_step==Note7){PlayNote7();digitalWrite(34, HIGH);digitalWrite(32, LOW);} else if (clock_step==Note8){PlayNote8();digitalWrite(36, HIGH);digitalWrite(34, LOW);} else if (clock_step==Note9){PlayNote9();digitalWrite(38, HIGH);digitalWrite(36, LOW);} else if (clock_step==Note10){PlayNote10();digitalWrite(40, HIGH);digitalWrite(38, LOW);} else if (clock_step==Note11){PlayNote11();digitalWrite(42, HIGH);digitalWrite(40, LOW);} else if (clock_step==Note12){PlayNote12();digitalWrite(44, HIGH);digitalWrite(42, LOW);} else if (clock_step==Note13){PlayNote13();digitalWrite(46, HIGH);digitalWrite(44, LOW);} else if (clock_step==Note14){PlayNote14();digitalWrite(48, HIGH);digitalWrite(46, LOW);} else if (clock_step==Note15){PlayNote15();digitalWrite(50, HIGH);digitalWrite(48, LOW);} else if (clock_step==Note16){PlayNote16();digitalWrite(52, HIGH);digitalWrite(50, LOW);} else if (clock_step==SeqLength){clock_step=0;} } void Sync2() { // play backwards 16 x 16th notes, repeat after the cycle is finshed, clock_step = clock_step+1; if (clock_step==Note1){PlayNote16();digitalWrite(52, HIGH);digitalWrite(22, LOW);} else if (clock_step==Note2){PlayNote15();digitalWrite(50, HIGH);digitalWrite(52, LOW);} else if (clock_step==Note3){PlayNote14();digitalWrite(48, HIGH);digitalWrite(50, LOW);} else if (clock_step==Note4){PlayNote13();digitalWrite(46, HIGH);digitalWrite(48, LOW);} else if (clock_step==Note5){PlayNote12();digitalWrite(44, HIGH);digitalWrite(46, LOW);} else if (clock_step==Note6){PlayNote11();digitalWrite(42, HIGH);digitalWrite(44, LOW);} else if (clock_step==Note7){PlayNote10();digitalWrite(40, HIGH);digitalWrite(42, LOW);} else if (clock_step==Note8){PlayNote9();digitalWrite(38, HIGH);digitalWrite(40, LOW);} else if (clock_step==Note9){PlayNote8();digitalWrite(36, HIGH);digitalWrite(38, LOW);} else if (clock_step==Note10){PlayNote7();digitalWrite(34, HIGH);digitalWrite(36, LOW);} else if (clock_step==Note11){PlayNote6();digitalWrite(32, HIGH);digitalWrite(34, LOW);} else if (clock_step==Note12){PlayNote5();digitalWrite(30, HIGH);digitalWrite(32, LOW);} else if (clock_step==Note13){PlayNote4();digitalWrite(28, HIGH);digitalWrite(30, LOW);} else if (clock_step==Note14){PlayNote3();digitalWrite(26, HIGH);digitalWrite(28, LOW);} else if (clock_step==Note15){PlayNote2();digitalWrite(24, HIGH);digitalWrite(26, LOW);} else if (clock_step==Note16){PlayNote1();digitalWrite(22, HIGH);digitalWrite(24, LOW);} else if (clock_step==SeqLength){clock_step=0;} } void sendMidiNote (byte midiCommand, byte noteValue, byte velocityValue){ Serial.print(midiCommand, BYTE); Serial.print(noteValue, BYTE); Serial.print(velocityValue, BYTE); } void PlayNote1() { if (analogRead(0) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(0), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(0) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(0), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote2() {

if (analogRead(1) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(1), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(1) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(1), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}


void PlayNote3() {
if (analogRead(2) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(2), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(2) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(2), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote4() {
if (analogRead(3) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(3), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(3) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(3), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote5() {
if (analogRead(4) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(4), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(4) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(4), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote6() {
if (analogRead(5) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(5), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(5) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(5), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote7() {
if (analogRead(6) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(6), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(6) > 127 && HoldNote_Flag==LOW) {
note = map(analogRead(6), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote8() {
if (analogRead(7) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(7), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(7) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(7), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote9() {
if (analogRead(8) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(8), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(8) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(8), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}


void PlayNote10() {
if (analogRead(9) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(9), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(9) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(9), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote11() {
if (analogRead(10) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(10), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(10) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(10), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote12() {
if (analogRead(11) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(11), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(11) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(11), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote13() {
if (analogRead(12) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(12), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(12) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(12), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote14() {
if (analogRead(13) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(13), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(13) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(13), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote15() {
if (analogRead(14) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(14), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(14) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(14), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}

void PlayNote16() {
if (analogRead(15) > 127 && HoldNote_Flag==HIGH) {
note = map(analogRead(15), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
else if (analogRead(15) > 127 && HoldNote_Flag==LOW) {
sendMidiNote (0x80, note, 0x7F); //last note off
note = map(analogRead(15), 0, 1023, LowestNote, HighestNote) + transpose;
sendMidiNote (0x90, note, 0x7F); //note of this step on
}
}