ARDUINO DCO with MIDI
the tone() function is musical usable.
Components and supplies
1
Arduino Nano
Tools and machines
1
Solder Iron
Apps and platforms
1
Arduino IDE 2.0 (beta)
Project description
Code
DCO
cpp
tone()
1// MIDI DCO w/ tone(); & saw DAC 2 3#include <SPI.h> 4 5// pins 6byte note = 8; // note pin 7byte cs = 10; // DAC CS pin 8byte gate = 4; // gate pin 9byte mute = 5; // mute the SAW 10byte s0 = 6; // 4512 S0 11byte s1 = 7; // 4512 S1 12// values 13float tune; // tune value 14int pot; // tune pot 15word value; // actual DAC value 16byte mid[3]; // MIDI data 17byte midimin = 12; // min. MIDI note 18byte midimax = 96; // max. MIDI note 19 20const word freq[]{0, 21523,554,587,622,659,698,740,784,831,880,932,988, 221047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976, 232093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951, 244186,4435,4699,4978,5274,5588,5920,6272,6645,7040,7459,7902, 254186,4435,4699,4978,5274,5588,5920,6272,6645,7040,7459,7902, 264186,4435,4699,4978,5274,5588,5920,6272,6645,7040,7459,7902, 274186,4435,4699,4978,5274,5588,5920,6272,6645,7040,7459,7902, 288372}; 29 30const byte divider[]{0, 313,3,3,3,3,3,3,3,3,3,3,3, 323,3,3,3,3,3,3,3,3,3,3,3, 333,3,3,3,3,3,3,3,3,3,3,3, 343,3,3,3,3,3,3,3,3,3,3,3, 352,2,2,2,2,2,2,2,2,2,2,2, 361,1,1,1,1,1,1,1,1,1,1,1, 370,0,0,0,0,0,0,0,0,0,0,0, 380}; 39 40 41void setup() 42{ 43pinMode(cs,OUTPUT); 44pinMode(gate,OUTPUT); 45pinMode(note,OUTPUT); 46pinMode(A0,INPUT); 47pinMode(mute,OUTPUT); 48pinMode(s0,OUTPUT); 49pinMode(s1,OUTPUT); 50 51digitalWrite(gate,LOW); 52digitalWrite(cs,HIGH); 53digitalWrite(mute,LOW); 54 55Serial.begin(31250); 56SPI.begin(); 57DAC(0); 58} 59 60void DAC(word value) 61{ 62 digitalWrite(cs,LOW); 63 SPI.beginTransaction(SPISettings(4000000,MSBFIRST,SPI_MODE0)); 64 bitWrite(value,15,LOW); // bit 15 - dual DAC selector - LOW 65 bitWrite(value,14,LOW); // bit 14 - buffer - LOW 66 bitWrite(value,13,HIGH); // bit 13 - double GAIN - HIGH 67 bitWrite(value,12,HIGH); // bit 12 - output shut down - HIGH 68 SPI.transfer(highByte(value)); 69 SPI.transfer(lowByte(value)); 70 SPI.endTransaction(); 71 digitalWrite(cs,HIGH); 72 bitClear(value,15); 73 bitClear(value,14); 74 bitClear(value,13); 75 bitClear(value,12); 76} 77 78// noteOn = 144 79// noteOff = 128 80 81void loop() 82{ 83midicomm: 84if (Serial.available() == 1) 85 { 86 mid[0] = Serial.read(); 87 if (bitRead(mid[0],7) == HIGH && bitRead(mid[0],6) == LOW && bitRead(mid[0],5) == LOW) goto midinote; 88 } 89 else 90 { 91 goto midicomm; 92 } 93 94midinote: 95if (Serial.available() == 1) 96 { 97 mid[1] = Serial.read(); 98 if (bitRead(mid[1],7) == HIGH && bitRead(mid[1],6) == LOW && bitRead(mid[1],5) == LOW) 99 { 100 mid[0] = mid[1]; 101 goto midinote; 102 } 103 pot = (analogRead(A0) / 4) - 128 ; 104 tune = 1 / ((float(pot) / 1100) + 1); 105 } 106 else 107 { 108 goto midinote; 109 } 110 111midivol: 112if (Serial.available() == 1) 113 { 114 mid[2] = Serial.read(); 115 if (bitRead(mid[2],7) == HIGH && bitRead(mid[2],6) == LOW && bitRead(mid[2],5) == LOW) 116 { 117 mid[0] = mid[2]; 118 goto midinote; 119 } 120 } 121 else 122 { 123 goto midivol; 124 } 125 126if (bitRead(mid[0],4) == HIGH && mid[2] > 0 && mid[1] >= midimin && mid[1] <= midimax) 127 { 128 // note ON 129 tone(note,word(freq[mid[1] - midimin + 1] * tune)); 130 value = ((mid[1] - midimin + 1) * 34) + 1000 ; 131 DAC(value); 132 digitalWrite(s0,bitRead(divider[mid[1] - midimin + 1],0)); 133 digitalWrite(s1,bitRead(divider[mid[1] - midimin + 1],1)); 134 digitalWrite(gate,HIGH); 135 digitalWrite(mute,HIGH); 136 } 137 else 138 { 139 // note OFF 140 digitalWrite(mute,LOW); 141 digitalWrite(gate,LOW); 142 noTone(note); 143 DAC(0); 144 digitalWrite(s0,LOW); 145 digitalWrite(s1,LOW); 146 } 147}
Documentation
schematic
schematic
arduino-dco.gif

Comments
Only logged in users can leave comments