mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-02 02:52:40 +00:00
MIDI velocity mapping, part 1
This commit is contained in:
parent
d37669a8f0
commit
99dd85bcb4
12 changed files with 41 additions and 2 deletions
|
@ -719,6 +719,10 @@ DivDispatchOscBuffer* DivPlatformAY8910::getOscBuffer(int ch) {
|
||||||
return oscBuf[ch];
|
return oscBuf[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DivPlatformAY8910::mapVelocity(int ch, unsigned char vel) {
|
||||||
|
return round(15.0*pow(((double)vel/127.0),0.33));
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* DivPlatformAY8910::getRegisterPool() {
|
unsigned char* DivPlatformAY8910::getRegisterPool() {
|
||||||
return regPool;
|
return regPool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,7 @@ class DivPlatformAY8910: public DivDispatch {
|
||||||
int dispatch(DivCommand c);
|
int dispatch(DivCommand c);
|
||||||
void* getChanState(int chan);
|
void* getChanState(int chan);
|
||||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||||
|
int mapVelocity(int ch, unsigned char vel);
|
||||||
unsigned char* getRegisterPool();
|
unsigned char* getRegisterPool();
|
||||||
int getRegisterPoolSize();
|
int getRegisterPoolSize();
|
||||||
void flushWrites();
|
void flushWrites();
|
||||||
|
|
|
@ -718,6 +718,10 @@ DivDispatchOscBuffer* DivPlatformAY8930::getOscBuffer(int ch) {
|
||||||
return oscBuf[ch];
|
return oscBuf[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DivPlatformAY8930::mapVelocity(int ch, unsigned char vel) {
|
||||||
|
return round(31.0*pow(((double)vel/127.0),0.22));
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* DivPlatformAY8930::getRegisterPool() {
|
unsigned char* DivPlatformAY8930::getRegisterPool() {
|
||||||
return regPool;
|
return regPool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,6 +132,7 @@ class DivPlatformAY8930: public DivDispatch {
|
||||||
int dispatch(DivCommand c);
|
int dispatch(DivCommand c);
|
||||||
void* getChanState(int chan);
|
void* getChanState(int chan);
|
||||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||||
|
int mapVelocity(int ch, unsigned char vel);
|
||||||
unsigned char* getRegisterPool();
|
unsigned char* getRegisterPool();
|
||||||
int getRegisterPoolSize();
|
int getRegisterPoolSize();
|
||||||
void reset();
|
void reset();
|
||||||
|
|
|
@ -121,6 +121,20 @@ class DivPlatformFMBase: public DivDispatch {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual int mapVelocity(int ch, unsigned char vel) {
|
||||||
|
// -0.75dB per step
|
||||||
|
// -6: 64: 8
|
||||||
|
// -12: 32: 16
|
||||||
|
// -18: 16: 24
|
||||||
|
// -24: 8: 32
|
||||||
|
// -30: 4: 40
|
||||||
|
// -36: 2: 48
|
||||||
|
// -42: 1: 56
|
||||||
|
if (vel==0) return 0;
|
||||||
|
if (vel==127) return 127;
|
||||||
|
return CLAMP(round(128.0-(56.0-log2(vel)*8.0)),0,127);
|
||||||
|
}
|
||||||
|
|
||||||
friend void putDispatchChan(void*,int,int);
|
friend void putDispatchChan(void*,int,int);
|
||||||
|
|
||||||
|
|
|
@ -539,6 +539,10 @@ DivDispatchOscBuffer* DivPlatformPCE::getOscBuffer(int ch) {
|
||||||
return oscBuf[ch];
|
return oscBuf[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DivPlatformPCE::mapVelocity(int ch, unsigned char vel) {
|
||||||
|
return round(31.0*pow(((double)vel/127.0),0.22));
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* DivPlatformPCE::getRegisterPool() {
|
unsigned char* DivPlatformPCE::getRegisterPool() {
|
||||||
return regPool;
|
return regPool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ class DivPlatformPCE: public DivDispatch {
|
||||||
DivChannelModeHints getModeHints(int chan);
|
DivChannelModeHints getModeHints(int chan);
|
||||||
DivSamplePos getSamplePos(int ch);
|
DivSamplePos getSamplePos(int ch);
|
||||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||||
|
int mapVelocity(int ch, unsigned char vel);
|
||||||
unsigned char* getRegisterPool();
|
unsigned char* getRegisterPool();
|
||||||
int getRegisterPoolSize();
|
int getRegisterPoolSize();
|
||||||
void reset();
|
void reset();
|
||||||
|
|
|
@ -462,6 +462,10 @@ DivDispatchOscBuffer* DivPlatformSMS::getOscBuffer(int ch) {
|
||||||
return oscBuf[ch];
|
return oscBuf[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DivPlatformSMS::mapVelocity(int ch, unsigned char vel) {
|
||||||
|
return round(15.0*pow(((double)vel/127.0),0.33));
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* DivPlatformSMS::getRegisterPool() {
|
unsigned char* DivPlatformSMS::getRegisterPool() {
|
||||||
return regPool;
|
return regPool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,7 @@ class DivPlatformSMS: public DivDispatch {
|
||||||
DivMacroInt* getChanMacroInt(int ch);
|
DivMacroInt* getChanMacroInt(int ch);
|
||||||
unsigned short getPan(int chan);
|
unsigned short getPan(int chan);
|
||||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||||
|
int mapVelocity(int ch, unsigned char vel);
|
||||||
unsigned char* getRegisterPool();
|
unsigned char* getRegisterPool();
|
||||||
int getRegisterPoolSize();
|
int getRegisterPoolSize();
|
||||||
void reset();
|
void reset();
|
||||||
|
|
|
@ -308,6 +308,10 @@ DivDispatchOscBuffer* DivPlatformT6W28::getOscBuffer(int ch) {
|
||||||
return oscBuf[ch];
|
return oscBuf[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DivPlatformT6W28::mapVelocity(int ch, unsigned char vel) {
|
||||||
|
return round(15.0*pow(((double)vel/127.0),0.33));
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* DivPlatformT6W28::getRegisterPool() {
|
unsigned char* DivPlatformT6W28::getRegisterPool() {
|
||||||
return regPool;
|
return regPool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,7 @@ class DivPlatformT6W28: public DivDispatch {
|
||||||
DivMacroInt* getChanMacroInt(int ch);
|
DivMacroInt* getChanMacroInt(int ch);
|
||||||
unsigned short getPan(int chan);
|
unsigned short getPan(int chan);
|
||||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||||
|
int mapVelocity(int ch, unsigned char vel);
|
||||||
unsigned char* getRegisterPool();
|
unsigned char* getRegisterPool();
|
||||||
int getRegisterPoolSize();
|
int getRegisterPoolSize();
|
||||||
void reset();
|
void reset();
|
||||||
|
|
|
@ -1372,8 +1372,8 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) {
|
||||||
}
|
}
|
||||||
if (note.on) {
|
if (note.on) {
|
||||||
dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,note.channel,note.ins,1));
|
dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,note.channel,note.ins,1));
|
||||||
if (note.volume>=0) {
|
if (note.volume>=0 && !disCont[dispatchOfChan[note.channel]].dispatch->isVolGlobal()) {
|
||||||
int mappedVol=disCont[dispatchOfChan[note.channel]].dispatch->mapVelocity(note.channel,note.volume);
|
int mappedVol=disCont[dispatchOfChan[note.channel]].dispatch->mapVelocity(dispatchChanOfChan[note.channel],note.volume);
|
||||||
logV("dispatching volume (%d -> %d)",note.volume,mappedVol);
|
logV("dispatching volume (%d -> %d)",note.volume,mappedVol);
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,note.channel,mappedVol));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,note.channel,mappedVol));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue