First and foremost, please forgive my ignorant and noob-ish question. I have tried to resolve my problem myself but all of the internet searches and reverse-engineering of publicly available code has left me possibly more confused than I was before.
All that I am trying to do is write a piece of code that will allow me to trigger 1 MIDI note by pressing an FSR. The harder you press the FSR, the louder the MIDI note will sound.
Bizarrely, I was able to write code from scratch that enabled my board to play a repeating 45-second melody via the MIDI serial. It's when I tried to add the FSR to the mix that I became hopelessly confused.
I am embarrassed because I know that this will turn out to be a relatively simple few lines of code, but at this point I am willing to swallow my pride and throw myself on the mercy of this board.
Any help that anyone can provide would be greatly appreciated, and I promise to pay it forward to the next noob once I know enough about the arduino to offer advice.
you're describing what is often called channel aftertouch in MIDI parlance.
instead of simply triggering a note (or series of notes) upon any change on the force sensor, read the value of the force sensor in a loop and use it to insert MIDI Volume commands on the output channel until there is no force detected on the force sensor.
if you program it correctly, you should get a "soft" (low volume) note if you lightly tap the sensor, and a louder note if you rap the sensor sharply.
from a musician standpoint, it might be more interesting to use the initial reading to send the "note on" command, and a reading of no force (once the sensor is let go) to send the "note off" ...in between those times, translate the force on the sensor to send MIDI Expression values on that channel (in a loop). when the "no force" event is detected, remember to reset the MIDI Expression value to '0' on that channel along with sending the "note off" command. -- this will act more like a regular MIDI controller with "channel aftertouch" ...
Ok, I have finally hacked together a tiny kernel of a sketch that plays a midi note (middle C), and gets louder the harder I press, like so:
//with apologies to roguescience
int fsrC = 0; //FSR is on pin 0
int fsrVal = 0; //variable for reading FSR value
int mappedFsrVal = 0; //variable for holding remapped FSR value
int prevFsrVal = 0; //variable for storing our prev FSR value
int thresh1 = 0; //threshold amount
void setup() {
Serial.begin(31250); //MIDI communicates at 31250 baud
}
void loop(){
fsrVal = analogRead(fsrC); //read input from FSR
mappedFsrVal = map(fsrVal, 0, 127, 0, 127); //map value to 0-127
if(abs(mappedFsrVal - prevFsrVal) >= thresh1){
midiOUT(0xB0, 7, mappedFsrVal); //CC Volume message
midiOUT(0x90, 60, mappedFsrVal); //MIDI noteOn message/Play Middle C
prevFsrVal = mappedFsrVal;
delay(100);
}
}
void midiOUT(char command, char value1, char value2) {
Serial.print(command, BYTE);
Serial.print(value1, BYTE);
Serial.print(value2, BYTE);
}
My problem now is that it triggers so fast that I get a constant, rapid-fire series of notes every time I press my FSR. I have tried introducing a delay, but all that has done is to regulate the amount of time that exists between the false-triggers, and as I increase the delay, it incrementally decreases the speed at which I can trigger individual midi messages by pressing the FSR.
I think I need to make these rapid-fire false triggers dependent on the state of the prevFsrVal but the mechanism through which I would do this eludes me.
It is for that reason that I ask, is there a way of "debouncing" the serial information coming from the FSR?
I need the FSR to trigger once when I press it, and yet still be sensitive enough that I can press it quickly (ie 100ms between presses) and still send discrete midi messages.
Okay, that previous post was predicated on the idea that I can have the arduino "remember" what the state of the analog input was before the current state of the analog input.
Now my ridiculously clueless question to anyone and everyone is, is there in fact a way to do that?
I keep trying to write a piece of code that will do that and keep thinking that I am doing it but then it doesn't work and I realize that I am just restating what the current state of the analog pin is.
How do you say "was" in the arduino programming language?*
*with regards to analog/variable inputs. I have seen some pieces of code like this for digital inputs and am assuming that there is a difference with regards to analog inputs.