続きです。
実際にフェーダも付けてみました。
どうせ付けるなら滑らかに動いて消え際もスムーズな14bitフェーダにしよう!と思い立ってプログラムを組んでみました。
実際はarduinoのアナログインの分解能は10bit = 0-1023なので、14bit = 0-16383には程遠いのですが、7bit = 0-127よりはずっとなめらかなはずです。
フェーダを二本付けて、それぞれCC#1(MSB)とCC#33(LSB)、CC#2(MSB)とCC#34(LSB)の組み合わせで値を送信するようにしました。
動かしてみたら、動くには動いたのですが、常にフェーダがフラフラ動いて落ち着かない。
で、通常のデバウンスに加えて、前の値と新しい値の加重平均をとって新しい値にすることで入力を滑らかにしてみました(下の
青字のくだりです)。
あと、arduinoのリファレンスには書いてないけど、簡潔に書けるようなので試しに
ポインタを使ってみました。
赤字のくだりです。
もろもろ、ちゃんと動いているようです。動きはなめらか。フラフラ動きません。
ありものの5kA,50kAのフェーダを使ったため、動きが画面と違いすぎて過激すぎるのが難点。
Bカーブのフェーダが欲しい!
もし6本フルにつけるんだったら、電源のことも考えて50kBということになるのかな?
以下、スケッチ。
//The circuit:
// * switch(momentary) 1,2,3,4 connected to digital in ,4,6,8,10 and ground pin 5,7,9,11.
// * pot 1,2 cennter terminal connected to analog in A0,A1 :each ground terminal connected to ground :each ref connected to +5v
// * digital in 1 connected to MIDI jack pin 5
// * MIDI jack pin 2 connected to ground
// * MIDI jack pin 4 connected to +5V through 220-ohm resistor
// Attach a MIDI cable to the jack.
//
// USAGE:
//
// 2. Open, compile, and upload this sketch into your Arduino.
// 3.Connect arduino's MIDI-out to MIDI I/F (or connect MIDI through USB-MIDI,if you use arduino UNO and MOCO LUFA) .
// 4. Launch your music software such as Ableton Live,choose control for each switch/pot.
//
#define pushVal 0 //for push-on switches.
//#define pushVal 1 //Otherwise,use this for push -off switches.
#define nd 4 //number of digital switches.
#define na 2 //number of analog pots.
#define msg 176 //controll change. note-on:144 note-off:128
const byte inPin[nd] = {4,6,8,10}; //input pins for switches.
const byte gndPin[nd] = {5,7,9,11}; //input pins' ground.
const byte val1[nd] = {70,71,72,73}; //control No or note No
byte val2[nd]; //controll value or velocity
const byte anaIn[na] = {0,1}; // analog input pins for pots.
const byte val1MSB[na] = {1,2}; //control number for MSB
const byte val1LSB[na] = {33,34}; // control number for LSB
int anaVal2[na]; //control value
long digiTime[nd];//the last time each switch was toggled.
long anaTime[na]; //the last time each pot's value changed.
const long digiDebounce = 30; //switch's debounce time. Increase if the output flickers.
const long anaDebounce = 50; //pot's debounce time. Increase if the output is unstable.
void setup(){
for(int i=0 ; i < nd ; i++ ){
pinMode(inPin[i] , INPUT);
digitalWrite(inPin[i] , HIGH);
pinMode(gndPin[i] , OUTPUT);
digitalWrite(gndPin[i] , LOW);
digiTime[i] = millis();
val2[i] = readPin(i);
}
for(int i = 0 ; i < na ; i++ ){
anaTime[na] = millis();
anaVal2[na] = analogRead(anaIn[na]);
}
Serial.begin(31250);
}
void loop(){
int reading;
long now;
byte MSB,LSB;
for(int i = 0 ; i < nd ; i++ ){
reading = readPin(i);
if(reading != val2[i]){
now = millis();
if(now-digiTime[i] > digiDebounce){
val2[i] = reading;
MIDI_TX(msg , val1[i] , val2[i] );
digiTime[i] = now;
}
}
}
for(int i = 0 ; i< na ; i++ ){
reading = smoothedAnalogRead(anaIn[i],anaVal2[i]);
if( reading != anaVal2[i] ){
now = millis();
if(now-anaTime[i] > anaDebounce ){
anaVal2[i] = reading ;
getMSBLSB( reading , &MSB , &LSB );
MIDI_TX(msg , val1MSB[i], MSB );
MIDI_TX(msg , val1LSB[i], LSB );
anaTime[i] = now;
}
}
}
}
int readPin(int i){
return digitalRead(inPin[i]) == pushVal ? 127 : 0 ;
}
void MIDI_TX(int MESSAGE, int VAL1, int VAL2)
{
Serial.write(MESSAGE);
Serial.write(VAL1);
Serial.write(VAL2);
}
int smoothedAnalogRead(int num , int val ){
return ( val * 2 + analogRead(num) ) / 3;
}
void getMSBLSB(int num , byte* MSB ,byte* LSB ){
int mapped;
mapped = map(num,0,1023,0,16383);
*MSB = mapped / 128;
*LSB = mapped % 128;
}
スケッチ終わり。
コメント
コメントを投稿