I used tip and ring, it means you only have one cable running from the controller to the synth rather than two. Then at the synth I have a TRS → 2xTS converter:
(OK, TRS → 3x(2xTS) …)
I used tip and ring, it means you only have one cable running from the controller to the synth rather than two. Then at the synth I have a TRS → 2xTS converter:
(OK, TRS → 3x(2xTS) …)
Thanks @eric & @analogoutput 
Can i use a Nano instead of a Micro with no change in the code ?
(with a check on the correspond pins of course)
I believe so ![]()
There is something that i don’t understand somewhere …
On the Audette code explaination, i can read that :
Physical Setup, Ribbon:
Top of Soft Pot: (No Connection)
Wiper of Soft Pot: A5
Bottom of Soft Pot: Gnd
It don’t need +5V on the Top like this ?
No, because it’s using the internal pullup resistor.
Ok, thanks again 
(more …)
I try to download the code, and i have some problem.
I download the Biquad.h, test the code and i have some errors
" Arduino : 1.8.9 (Windows 7), Carte : “Arduino Nano, ATmega328P (Old Bootloader)”
sketch_may04a:746:5: error: stray ‘\302’ in program
© 2021 GitHub, Inc. ^sketch_may04a:746:5: error: stray ‘\251’ in program
sketch_may04a:11:1: error: ‘Skip’ does not name a type
Skip to content
^
In file included from C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:81:0:
C:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:178:39: error: ‘SPISettings’ has not been declared
inline static void beginTransaction(SPISettings settings) {
^C:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h: In static member function ‘static void SPIClass::beginTransaction(int)’:
C:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:203:21: error: request for member ‘spcr’ in ‘settings’, which is of non-class type ‘int’
SPCR = settings.spcr; ^C:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:204:21: error: request for member ‘spsr’ in ‘settings’, which is of non-class type ‘int’
SPSR = settings.spsr; ^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: In function ‘void setup()’:
sketch_may04a:217:6: error: redefinition of ‘void setup()’
void setup() {
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:1:6: note: ‘void setup()’ previously defined here
void setup() {
^sketch_may04a:98:19: error: ‘Serial1’ was not declared in this scope
#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:241:19: note: in expansion of macro ‘Serial_t’
if (WRITE_MIDI) Serial_t.begin(31250);
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: In function ‘void loop()’:
sketch_may04a:267:6: error: redefinition of ‘void loop()’
void loop() {
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:6:6: note: ‘void loop()’ previously defined here
void loop() {
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: In function ‘void setBendRange(int)’:
sketch_may04a:98:19: error: ‘Serial1’ was not declared in this scope
#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:601:3: note: in expansion of macro ‘Serial_t’
Serial_t.write(CC_byte); //control change
^
C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: In function ‘void transmitBrightness(byte)’:
sketch_may04a:98:19: error: ‘Serial1’ was not declared in this scope
#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:625:3: note: in expansion of macro ‘Serial_t’
Serial_t.write((byte)MIDI_CC);
^
C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: In function ‘void transmitPitchBend()’:
sketch_may04a:98:19: error: ‘Serial1’ was not declared in this scope
#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:648:5: note: in expansion of macro ‘Serial_t’
Serial_t.write((byte)MIDI_PITCH_BEND); ^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: In function ‘void recenterMidiPitchBend()’:
sketch_may04a:98:19: error: ‘Serial1’ was not declared in this scope
#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
^C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino:657:3: note: in expansion of macro ‘Serial_t’
Serial_t.write((byte)MIDI_PITCH_BEND);
^
C:\Users\Client\sketchbook\libraries\sketch_may04a\sketch_may04a.ino: At global scope:
sketch_may04a:746:8: error: expected unqualified-id before numeric constant
© 2021 GitHub, Inc. ^exit status 1
stray ‘\302’ in program
and i understand nothing
what can i do ?
please some help
No idea about the rest, but the “stray” complaints are due to the compiler (either gcc or if it’s some arduino thing) choking on non-ASCII characters, which either means that it doesn’t handle non-ASCII at all, or that it expects the files to use UTF-8 but got Latin 1 or Windows encoding.
sketch_may04a:746:5: error: stray ‘\302’ in program
Upgrading to a more recent version may fix this.
thx i 'll go try it
(…)
yes now this one has disappeared 
Well i solved the code problem (thanks @eric), but the circuit does not work.
I tested and I have 5V at the regulator, at the + of the arduino and at the + of the IC.
The arduino also sends 5V in the ribbon which works.
I also have 5V in Gate output, but nothing in CV and VCF output.
Infact nothing on the out of the MCP4922
@analogoutput have you an idea of what I could have done wrong
So you’re saying you have correct voltages coming from the ribbon to the Arduino, but nothing coming out of the DAC?
You have +5 V on the DAC Vref inputs?
You have correct pin assignments in the code for the signals to the DAC?
yes
yes 5V on Vref A & B
i think, i do that
I change that in the code because there was an error with Serial1
Before :
#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
//#define Serial_t (Serial) //for MIDI for Arduino UNO
After :
//#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
#define Serial_t (Serial) //for MIDI for Arduino UNO
and some mod find in your blog decription (Ribbon part 3 software change).
to invert the gate signal out, can i do this ? :
Before
#define TRIG_NOTE_ON (0) // LOW
#define TRIG_NOTE_OFF (MAX_DAC_COUNTS) //HIGH
After
#define TRIG_NOTE_OFF (0) // LOW
#define TRIG_NOTE_ON (MAX_DAC_COUNTS) //HIGH
or that ?
#define TRIG_NOTE_ON (0) // HIGH
#define TRIG_NOTE_OFF (MAX_DAC_COUNTS) //LOW
thanks
Here’s the comparison of my code to Audette’s, annotated.
Apparently I had to change angle brackets to quotes to make this work
31c26
< #include <Biquad.h> //http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/
---
> #include "Biquad.h" //http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/
For Nano or Pro Mini use Serial, not Serial1
47,48c42,43
< #define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
< //#define Serial_t (Serial) //for MIDI for Arduino UNO
---
> //#define Serial_t (Serial1) //for MIDI for Arduino Micro or for TEENSY
> #define Serial_t (Serial) //for MIDI for Arduino UNO
Apparently I used a different analog pin
52c46
< const int ribbonPin = A5;
---
> const int ribbonPin = A3;
These are unused lines I deleted
55,59d48
< //int drivePin = 4; //Digital pin #4
< //int drivePin_state = HIGH;
< const int pushButton1_pin = 2; // Push button, Digital Pin
< const int pushButton2_pin = 3; // Push button, Digital Pin
< const int pushButton3_pin = 4; // Push button, Digital Pin
64,65d52
< //const int comparePin = A4;
< //const int comparePinGnd = A5;
90,92d76
< #define RIBBON_BY_VCC 1
< #define RIBBON_BY_WIPER 2
< const int ribbon_mode = RIBBON_BY_WIPER;
96c80
Different values observed in hardware
< int ribbon_max_val = 335,ribbon_min_val = 15; //for my Arduino Micro
---
> int ribbon_max_val = 378,ribbon_min_val = 20; //for my Arduino Pro Mini
107c91
I made it span a wider pitch range
< const float ribbon_span_half_steps_float = 36;
---
> const float ribbon_span_half_steps_float = 60;
I changed the bottom note
137c121,122
< #define CV_note_bottom (12) //Note C1 instead of C0
---
> //#define CV_note_bottom (12) //Note C1 instead of C0
> #define CV_note_bottom (0) //RSH no offset
More constants based on what is seen in hardware
140c125
< #define MAX_DAC_VOLT (5.180) //laptop is 5.04V, USB wall-wart is 5.182V
---
> #define MAX_DAC_VOLT (4.97) //laptop is 5.04V, USB wall-wart is 5.182V
This is a little mysterious – I *think* Audette's synth uses gates
that are the reverse of Euro/Kosmo?
142,143c127,128
< #define TRIG_NOTE_ON (0) // LOW
< #define TRIG_NOTE_OFF (MAX_DAC_COUNTS) //HIGH
---
> #define TRIG_NOTE_OFF (0) // LOW
> #define TRIG_NOTE_ON (MAX_DAC_COUNTS) //HIGH
Needed to make serial monitor debugging work
189c173,174
< Serial.begin(115200*2); //for Arduino Micro only
---
> // Serial.begin(115200*2); //for Arduino Micro only
> Serial.begin(9600); // RSH
More unused lines I deleted
241d225
< int prev_but_val[] = {HIGH, HIGH, HIGH};
303,308d286
<
< //read putshbutton
< boolean but_val = (digitalRead(pushButton1_pin) == LOW); //pressed makes it LOW...so set the value as TRUE
< boolean but2_val = (digitalRead(pushButton2_pin) == LOW); //pressed makes it LOW...so set the value as TRUE
< //boolean but3_val = (digitalRead(pushButton3_pin) == LOW); //pressed makes it LOW...so set the value as TRUE
<
395,396d372
< prev_but_val[0] = but_val;
< prev_but_val[1] = but2_val;
412d387
< //if (drivePin_state == LOW) ribbon_value_float = RIBBON_SPAN - ribbon_value_float;
414,421d388
< // //invert the drive pin
< // toggle_counter++;
< // if (toggle_counter >= 1) {
< // toggle_counter = 0;
< // drivePin_state = !drivePin_state;
< // digitalWrite(drivePin,drivePin_state);
< // }
<
641c608
I changed this so both CV outputs are the same
< const float KBD_track = 0.6;
---
> const float KBD_track = 1.0; // RSH: No difference in scaling
Thanks a lot !!!
i will try this tomorrow 
for this one you add a ligne ?
Correct, but // is a C++ comment so that line is ignored by the compiler. If you’re updating things by hand, you can just change (12) to (0).
(or try it without that change and only change the lowest note setting once you’ve gotten things to work and figured out what note you want)
Thx @fredrik
i’ve just test it and the same thing, still nothing out of the DAC 
Are there several kinds of MCP4922 and I will not have the right one?
mine is: MCP4922 E / P
or maybe is it defective (how can I test it plz)
Or can it come from my DIY ribbon with copper and velostat ?
I think you could try to test the ribbon controller and the dac separately. Just write a simple sketch that reads pin A5 and prints it to the serial out. And then write a sketch that outputs just a sequence of voltages at the dac. I will see if I can come up with something usable during my lunch break 
edit: For the analog read (check if the diy ribbon works):
void setup() {
// initialize serial
Serial.begin(9600);
}
void loop() {
// read pin
int val = analogRead(A5);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = val * (5.0 / 1023.0);
// print on serial
Serial.println(voltage);
}
run this on the arduino and then check the serial monitor
edit2: For the dac test you can use parts of the audette code:
#include <SPI.h>
const int slaveSelectPin = 10; //for commanding the DAC
const int trig_pin = 5; //for Trigger High/Low for CV
void setup() {
//initialize the DAC
pinMode(trig_pin,OUTPUT); digitalWrite(trig_pin, 1);
pinMode(slaveSelectPin, OUTPUT);
digitalWrite(slaveSelectPin,HIGH); //set DAC ready to accept commands
SPI.begin();
SPI.setDataMode(SPI_MODE0); //MCP4922 can be either Mode 0 or Mode 3 (supposedly)
SPI.setBitOrder(MSBFIRST);
}
void loop() {
// setting the two DAC channels to
MCP4922_write(slaveSelectPin,2000,4000);
digitalWrite(trig_pin, 0); // could also be 1, not sure here
}
void MCP4922_write(const int &slavePin,const int &value1,const int &value2) {
int value = 0;
byte configByte = 0;
byte data=0;
int channel=0;
for (channel = 0; channel < 2; channel++) {
digitalWrite(slavePin,LOW); //set DAC ready to accept commands
if (channel == 0) {
configByte = B01110000; //channel 0, Vref buffered, Gain of 1x, Active Mode
value = value1;
} else {
configByte = B11110000; //channel 1, Vref buffered, Gain of 1x, Active Mode
value = value2;
}
//write first byte
data = highByte(value);
data = B00001111 & data; //clear out the 4 command bits
data = configByte | data; //set the first four command bits
SPI.transfer(data);
//write second byte
data = lowByte(value);
SPI.transfer(data);
//close the transfer
digitalWrite(slavePin,HIGH); //set DAC ready to accept commands
}
}
This should set your DAC channels to ~2.5V and ~5V which you can check with your multimeter
edit3:
Only now spotted it: there is some debugging code just set these to one (line 34ff) and then look at the serial monitor:
//debugging info
#define PRINT_TEXT (0)
#define PRINT_BEND_TEXT (0)
#define PRINT_CAL_TEXT (0)
#define PRINT_RAW_RIBBON_VALUE (0)
#define PRINT_CV_TEXT (0)