MIDI velocity mapping, part 1

This commit is contained in:
tildearrow 2023-12-16 19:37:14 -05:00
parent d37669a8f0
commit 99dd85bcb4
12 changed files with 41 additions and 2 deletions

View file

@ -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;
} }

View file

@ -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();

View file

@ -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;
} }

View file

@ -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();

View file

@ -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);

View file

@ -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;
} }

View file

@ -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();

View file

@ -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;
} }

View file

@ -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();

View file

@ -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;
} }

View file

@ -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();

View file

@ -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));
} }