Go Down

Topic: ribbon controller (Read 503 times) previous topic - next topic

Archie64

Hi hope someone can help, I intend to build some of the excellent Tom Scarff midi to ribbon controllers, when I looked at the sletch for the arduino it seems to be only covering a range of 15 notes but on the site it states that the scale can be changed to 24 or 36 notes - can anyone tell me which parameter in the sketch I need to change to obtain either a 24 or 36 note scale?
/**********************************************************
* NAME:                 Ribbon/Softpot Controller forSound Generation via MIDI
* WRITTEN BY:           TOM SCARFF
* DATE:                 20/2/2009
* FILE SAVED AS:        midi_ribbon_controller.pde
* FOR:                  Miduino ATmega168
* CLOCK:                16.00 MHz CRYSTAL                                        
* PROGRAMME FUNCTION:   Trigger a MIDI Sound,
* depending on ribbon/softPot voltage level when pushed,
* and generate Pitch Bend while Note is ON.
*
**************************************************************************/




// analog Thresholds for softPot sensing
#define softPotThreshold_ON 100
#define softPotThreshold_OFF 10
#define startNote  60
#define Bounce_Period 15
#define Pitch_Bend_Sensitivity 2
#define Program 50

int softPotPin = 0;                 // softPot connected to analog pin 0
int LedPin = 13;                // LED connected to digital pin 13
byte softPotState=0;
byte x;
byte MIDIchannel;
byte velocity=127;
byte note_onoff;
int bend;
int val_noteOn;
int val_now=0x7f;
int val;

void setup()                    // run once, when the sketch previouss
{
 pinMode(4, INPUT); // Set Inputs for 4 way DIP Switch
 pinMode(5, INPUT);
 pinMode(6, INPUT);
 pinMode(7, INPUT);
 digitalWrite(4, HIGH); // Set inputs Pull-up resistors High
 digitalWrite(5, HIGH);
 digitalWrite(6, HIGH);
 digitalWrite(7, HIGH);

 Serial.begin(31250);
 pinMode(LedPin, OUTPUT);      // sets the digital pin as output

 for (x=1; x<=4; x++){
   digitalWrite( LedPin, HIGH );
   delay(300);
   digitalWrite( LedPin, LOW );
   delay(300);
 }

 midiSend( 0xC0 | MIDIchannel, Program );
}

void loop()                     // run over and over again
{
 // Read 4-way DIP switch
 MIDIchannel=digitalRead(4) + (digitalRead(5)<<1) + (digitalRead(6)<<2) + (digitalRead(7)<<3);

 val = analogRead(softPotPin); // read voltage on analog pin 0

 if( val >= softPotThreshold_ON  && softPotState==0) {

   note_onoff=val/64 + startNote;  //  0 to 15 + 60
   noteOn(MIDIchannel,  note_onoff, velocity);
   softPotState=0xff;

   pitch_bend_test();

 }


 if( val <= softPotThreshold_OFF  && softPotState>0 ) {
   noteOff(MIDIchannel,  note_onoff, velocity);
   softPotState=0;
 }

 delay(Bounce_Period);
}


//++++++++++++++++++++++Functions++++++++++++++++++++++++++++++++++++++++

// Send a MIDI note-on message.  
void noteOn(byte channel, byte note, byte velocity) {
 midiMsg( (0x90 | channel), note, velocity);
}

// Send a MIDI note-off message.
void noteOff(byte channel, byte note, byte velocity) {
 midiMsg( (0x80 | channel), note, velocity);
}

// Send a MIDI Pitch bend  message.  
void pitch_bend(byte channel, byte LSB, byte MSB) {
 midiMsg( (0xE0 | channel), LSB, MSB);      // set LSB = 0
}

//  Send a two byte midi message  
void midiSend(byte status, byte data ) {
 Serial.print(status, BYTE);
 Serial.print(data, BYTE);
}

// Send a general MIDI message
void midiMsg(byte cmd, byte data1, byte data2) {
 digitalWrite(LedPin,HIGH);  // indicate we're sending MIDI data
 Serial.print(cmd, BYTE);
 Serial.print(data1, BYTE);
 Serial.print(data2, BYTE);
 digitalWrite(LedPin,LOW);
}
//------------------------------------------------------------------

void pitch_bend_test(){

 val_noteOn = analogRead(softPotPin)/Pitch_Bend_Sensitivity; // read voltage on analog pin 0 range 0 to 1023


 while(val >= softPotThreshold_ON){
   val_now = analogRead(softPotPin)/Pitch_Bend_Sensitivity; // read voltage on analog pin 0 range 0 to 1023

   if(val_now > val_noteOn){
     bend = (val_now - val_noteOn) + 64;
     bend = bend & 0x007F;
     pitch_bend(MIDIchannel,0x00, bend);
   }

   if(val_now < val_noteOn){
     bend = 64 - (val_noteOn - val_now);
     bend = bend & 0x007F;
     pitch_bend(MIDIchannel,0x00, bend);
   }

   delay(Bounce_Period);
   val = analogRead(softPotPin); // read voltage on analog pin 0
 }

}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  


I will publish photos of the controller as soon as I have made them but need to sort this problem out first as I intend to build several of them for an electronic music performance.

Many thanks

Archie

Grumpy_Mike

Quote
note_onoff=val/64 + startNote;  //  0 to 15 + 60


Change the 64 to a lower number to get more notes.

val has a range of 0 to 1023 so the divide by 64 will split the range into 16 notes. If you use a divide by 32 you will get 32 notes. However, the notes will be more closly packed on the sliding scale and could produce some jitter.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy