sonicmanipulator
Member
Hi all.......I have a program that runs fine on a Mega and it also works on the Teensy 2.0 in serial mode (using Hairless) but will not work in MIDI mode. Haven't found any joy on the net. It's for a device to send MIDI pitch bend
Here's the code:
// Vibe Bar Main Program
//
// Sees the movement of the Vibe Bar
// Between full left and dead spot
// Between full right and dead spot
// Between full forward and dead spot
// Between full back and dead spot
// and maps to MIDI output.
//
// Claude Woodward 17/06/15
//
#include <Vibe_Bar_Configuration.h>
#include <EEPROM.h>
// MIDI Libraries
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
// MIDI Constants
int pitchBEND = 224;
// These Analog pins are defined in ~/Documents/Arduino/libraries/Vibe_Bar_Configuration/Vibe_Bar_Configuration.cpp
// These lines tell the Arduino where the Hall Effect sensors are connected to
extern const int SENSOR_LEFT_RIGHT;
extern const int SENSOR_FWD_BACK;
// These Analog pins are defined in ~/Documents/Arduino/libraries/Vibe_Bar_Configuration/Vibe_Bar_Configuration.cpp
// This defines where the Arduino built-in LED is
extern const int LED_PIN;
// These are text names for non-volatile memory addresses
// These are defined in ~/Documents/Arduino/libraries/Vibe_Bar_Configuration/Vibe_Bar_Configuration.cpp
extern const int VIBE_LR_MIN1;
extern const int VIBE_LR_MIN2;
extern const int VIBE_LR_MAX1;
extern const int VIBE_LR_MAX2;
extern const int VIBE_LR_DEAD_MIN1;
extern const int VIBE_LR_DEAD_MIN2;
extern const int VIBE_LR_DEAD_MAX1;
extern const int VIBE_LR_DEAD_MAX2;
extern const int VIBE_FB_MIN1;
extern const int VIBE_FB_MIN2;
extern const int VIBE_FB_MAX1;
extern const int VIBE_FB_MAX2;
extern const int VIBE_FB_DEAD_MIN1;
extern const int VIBE_FB_DEAD_MIN2;
extern const int VIBE_FB_DEAD_MAX1;
extern const int VIBE_FB_DEAD_MAX2;
// This is called a 'class' it contains functions and data that alre all carried around together
// This particular class contains the graph mapping the hall effect sensor reading to a MIDI output
class CustomCalibration {
public:
void setup( int minVal, int maxVal, int deadMin, int deadMax, int outMin, int outMax ) {
_minVal = minVal;
_maxVal = maxVal;
_deadMin = deadMin;
_deadMax = deadMax;
_outMin = outMin;
_outMax = outMax;
_outMid = ( outMin + outMax ) / 2;
if ( minVal > deadMin || deadMin > deadMax || deadMax > maxVal || outMin > outMax )
{
pinMode(LED_PIN,OUTPUT);
Serial.begin(19200);
Serial.println("EEPROM Calibration Value Check Failed: Possible cause = bad calibration");
while (true){
digitalWrite(LED_PIN,HIGH);
delay(500);
digitalWrite(LED_PIN,LOW);
delay(500);
Serial.print(" minVal = ");
Serial.print(_minVal);
Serial.print(" maxVal = ");
Serial.print(_maxVal);
Serial.print(" deadMin = ");
Serial.print(_deadMin);
Serial.print(" deadMax = ");
Serial.print(_deadMax);
Serial.print(" outMin = ");
Serial.print(_outMin);
Serial.print(" outMax = ");
Serial.print(_outMax);
Serial.println();
}
}
}
int Map(int value) {
if( value < _minVal ) {
return _outMin;
} else if ( value < _deadMin ) {
return map( value, _minVal, _deadMin, _outMin, _outMid );
} else if ( value < _deadMax ) {
return _outMid;
} else if ( value < _maxVal ) {
return map( value, _deadMax, _maxVal, _outMid, _outMax );
} else {
return _outMax;
}
}
private:
int _minVal, _maxVal, _deadMin, _deadMax, _outMin, _outMax, _outMid;
};
CustomCalibration leftRightCalibration, fwdBackCalibration;
void setup() {
// MIDI Range constants
int midiMin = 0;
int midiMax = 127;
// Initialise the Serial port (MIDI is sent over Serial)
Serial.begin(31250);//(19200);//
// Create custom mapping objects (they map the Hall Effect sensor values to the MIDI range - and incorporate a 'dead spot')
leftRightCalibration = CustomCalibration();
fwdBackCalibration = CustomCalibration();
// Load calibration points from the EEPROM (these are stored during the calibration routine)
leftRightCalibration.setup( EEPROM.read(VIBE_LR_MIN1) + EEPROM.read(VIBE_LR_MIN2)*256, EEPROM.read(VIBE_LR_MAX1) + EEPROM.read(VIBE_LR_MAX2)*256,
EEPROM.read(VIBE_LR_DEAD_MIN1) + EEPROM.read(VIBE_LR_DEAD_MIN2)*256, EEPROM.read(VIBE_LR_DEAD_MAX1) + EEPROM.read(VIBE_LR_DEAD_MAX2)*256, midiMin, ( ( midiMax * 2 ) / 3 ) + 1 );
fwdBackCalibration.setup( EEPROM.read(VIBE_FB_MIN1) + EEPROM.read(VIBE_FB_MIN2)*256, EEPROM.read(VIBE_FB_MAX1) + EEPROM.read(VIBE_FB_MAX2)*256,
EEPROM.read(VIBE_FB_DEAD_MIN1) + EEPROM.read(VIBE_FB_DEAD_MIN2)*256, EEPROM.read(VIBE_FB_DEAD_MAX1) + EEPROM.read(VIBE_FB_DEAD_MAX2)*256, midiMin, ( midiMax * 1 ) / 3 );
}
void loop() {
// Read Sensors
int leftRightRawValue = analogRead( SENSOR_LEFT_RIGHT );
int fwdBackRawValue = analogRead( SENSOR_FWD_BACK );
// Map to MIDI range
int leftRightValue = leftRightCalibration.Map( leftRightRawValue );
int fwdBackValue = fwdBackCalibration.Map( fwdBackRawValue );
// Combine Left-Right and Forward-Back into a single bend measurement
int bendVal = leftRightValue + fwdBackValue;
// Send as MIDI command
MIDImessage(pitchBEND, 0, bendVal);
}
void MIDImessage(int command, int MIDInote, int MIDIvelocity) {
Serial.write(command);
Serial.write(MIDInote);
Serial.write(MIDIvelocity);
delay(20);
}
Any ideas?
sonicmanipulator
Here's the code:
// Vibe Bar Main Program
//
// Sees the movement of the Vibe Bar
// Between full left and dead spot
// Between full right and dead spot
// Between full forward and dead spot
// Between full back and dead spot
// and maps to MIDI output.
//
// Claude Woodward 17/06/15
//
#include <Vibe_Bar_Configuration.h>
#include <EEPROM.h>
// MIDI Libraries
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
// MIDI Constants
int pitchBEND = 224;
// These Analog pins are defined in ~/Documents/Arduino/libraries/Vibe_Bar_Configuration/Vibe_Bar_Configuration.cpp
// These lines tell the Arduino where the Hall Effect sensors are connected to
extern const int SENSOR_LEFT_RIGHT;
extern const int SENSOR_FWD_BACK;
// These Analog pins are defined in ~/Documents/Arduino/libraries/Vibe_Bar_Configuration/Vibe_Bar_Configuration.cpp
// This defines where the Arduino built-in LED is
extern const int LED_PIN;
// These are text names for non-volatile memory addresses
// These are defined in ~/Documents/Arduino/libraries/Vibe_Bar_Configuration/Vibe_Bar_Configuration.cpp
extern const int VIBE_LR_MIN1;
extern const int VIBE_LR_MIN2;
extern const int VIBE_LR_MAX1;
extern const int VIBE_LR_MAX2;
extern const int VIBE_LR_DEAD_MIN1;
extern const int VIBE_LR_DEAD_MIN2;
extern const int VIBE_LR_DEAD_MAX1;
extern const int VIBE_LR_DEAD_MAX2;
extern const int VIBE_FB_MIN1;
extern const int VIBE_FB_MIN2;
extern const int VIBE_FB_MAX1;
extern const int VIBE_FB_MAX2;
extern const int VIBE_FB_DEAD_MIN1;
extern const int VIBE_FB_DEAD_MIN2;
extern const int VIBE_FB_DEAD_MAX1;
extern const int VIBE_FB_DEAD_MAX2;
// This is called a 'class' it contains functions and data that alre all carried around together
// This particular class contains the graph mapping the hall effect sensor reading to a MIDI output
class CustomCalibration {
public:
void setup( int minVal, int maxVal, int deadMin, int deadMax, int outMin, int outMax ) {
_minVal = minVal;
_maxVal = maxVal;
_deadMin = deadMin;
_deadMax = deadMax;
_outMin = outMin;
_outMax = outMax;
_outMid = ( outMin + outMax ) / 2;
if ( minVal > deadMin || deadMin > deadMax || deadMax > maxVal || outMin > outMax )
{
pinMode(LED_PIN,OUTPUT);
Serial.begin(19200);
Serial.println("EEPROM Calibration Value Check Failed: Possible cause = bad calibration");
while (true){
digitalWrite(LED_PIN,HIGH);
delay(500);
digitalWrite(LED_PIN,LOW);
delay(500);
Serial.print(" minVal = ");
Serial.print(_minVal);
Serial.print(" maxVal = ");
Serial.print(_maxVal);
Serial.print(" deadMin = ");
Serial.print(_deadMin);
Serial.print(" deadMax = ");
Serial.print(_deadMax);
Serial.print(" outMin = ");
Serial.print(_outMin);
Serial.print(" outMax = ");
Serial.print(_outMax);
Serial.println();
}
}
}
int Map(int value) {
if( value < _minVal ) {
return _outMin;
} else if ( value < _deadMin ) {
return map( value, _minVal, _deadMin, _outMin, _outMid );
} else if ( value < _deadMax ) {
return _outMid;
} else if ( value < _maxVal ) {
return map( value, _deadMax, _maxVal, _outMid, _outMax );
} else {
return _outMax;
}
}
private:
int _minVal, _maxVal, _deadMin, _deadMax, _outMin, _outMax, _outMid;
};
CustomCalibration leftRightCalibration, fwdBackCalibration;
void setup() {
// MIDI Range constants
int midiMin = 0;
int midiMax = 127;
// Initialise the Serial port (MIDI is sent over Serial)
Serial.begin(31250);//(19200);//
// Create custom mapping objects (they map the Hall Effect sensor values to the MIDI range - and incorporate a 'dead spot')
leftRightCalibration = CustomCalibration();
fwdBackCalibration = CustomCalibration();
// Load calibration points from the EEPROM (these are stored during the calibration routine)
leftRightCalibration.setup( EEPROM.read(VIBE_LR_MIN1) + EEPROM.read(VIBE_LR_MIN2)*256, EEPROM.read(VIBE_LR_MAX1) + EEPROM.read(VIBE_LR_MAX2)*256,
EEPROM.read(VIBE_LR_DEAD_MIN1) + EEPROM.read(VIBE_LR_DEAD_MIN2)*256, EEPROM.read(VIBE_LR_DEAD_MAX1) + EEPROM.read(VIBE_LR_DEAD_MAX2)*256, midiMin, ( ( midiMax * 2 ) / 3 ) + 1 );
fwdBackCalibration.setup( EEPROM.read(VIBE_FB_MIN1) + EEPROM.read(VIBE_FB_MIN2)*256, EEPROM.read(VIBE_FB_MAX1) + EEPROM.read(VIBE_FB_MAX2)*256,
EEPROM.read(VIBE_FB_DEAD_MIN1) + EEPROM.read(VIBE_FB_DEAD_MIN2)*256, EEPROM.read(VIBE_FB_DEAD_MAX1) + EEPROM.read(VIBE_FB_DEAD_MAX2)*256, midiMin, ( midiMax * 1 ) / 3 );
}
void loop() {
// Read Sensors
int leftRightRawValue = analogRead( SENSOR_LEFT_RIGHT );
int fwdBackRawValue = analogRead( SENSOR_FWD_BACK );
// Map to MIDI range
int leftRightValue = leftRightCalibration.Map( leftRightRawValue );
int fwdBackValue = fwdBackCalibration.Map( fwdBackRawValue );
// Combine Left-Right and Forward-Back into a single bend measurement
int bendVal = leftRightValue + fwdBackValue;
// Send as MIDI command
MIDImessage(pitchBEND, 0, bendVal);
}
void MIDImessage(int command, int MIDInote, int MIDIvelocity) {
Serial.write(command);
Serial.write(MIDInote);
Serial.write(MIDIvelocity);
delay(20);
}
Any ideas?
sonicmanipulator