parent
8991fa98ba
commit
4ce116ca0a
10 changed files with 278 additions and 90 deletions
|
|
@ -13,6 +13,8 @@
|
|||
enum DivDispatchCmds {
|
||||
DIV_CMD_NOTE_ON=0,
|
||||
DIV_CMD_NOTE_OFF,
|
||||
DIV_CMD_NOTE_OFF_ENV,
|
||||
DIV_CMD_ENV_RELEASE,
|
||||
DIV_CMD_INSTRUMENT,
|
||||
DIV_CMD_VOLUME,
|
||||
DIV_CMD_GET_VOLUME,
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@
|
|||
#include <map>
|
||||
#include <queue>
|
||||
|
||||
#define DIV_VERSION "0.5.5pre1"
|
||||
#define DIV_ENGINE_VERSION 43
|
||||
#define DIV_VERSION "0.5.5pre2"
|
||||
#define DIV_ENGINE_VERSION 44
|
||||
|
||||
enum DivStatusView {
|
||||
DIV_STATUS_NOTHING=0,
|
||||
|
|
|
|||
|
|
@ -253,6 +253,36 @@ void DivInstrument::putInsData(SafeWriter* w) {
|
|||
w->writeC(op.ssgMacro[j]);
|
||||
}
|
||||
}
|
||||
|
||||
// release points
|
||||
w->writeI(std.volMacroRel);
|
||||
w->writeI(std.arpMacroRel);
|
||||
w->writeI(std.dutyMacroRel);
|
||||
w->writeI(std.waveMacroRel);
|
||||
w->writeI(std.pitchMacroRel);
|
||||
w->writeI(std.ex1MacroRel);
|
||||
w->writeI(std.ex2MacroRel);
|
||||
w->writeI(std.ex3MacroRel);
|
||||
w->writeI(std.algMacroRel);
|
||||
w->writeI(std.fbMacroRel);
|
||||
w->writeI(std.fmsMacroRel);
|
||||
w->writeI(std.amsMacroRel);
|
||||
for (int i=0; i<4; i++) {
|
||||
DivInstrumentSTD::OpMacro& op=std.opMacros[i];
|
||||
|
||||
w->writeI(op.amMacroRel);
|
||||
w->writeI(op.arMacroRel);
|
||||
w->writeI(op.drMacroRel);
|
||||
w->writeI(op.multMacroRel);
|
||||
w->writeI(op.rrMacroRel);
|
||||
w->writeI(op.slMacroRel);
|
||||
w->writeI(op.tlMacroRel);
|
||||
w->writeI(op.dt2MacroRel);
|
||||
w->writeI(op.rsMacroRel);
|
||||
w->writeI(op.dtMacroRel);
|
||||
w->writeI(op.d2rMacroRel);
|
||||
w->writeI(op.ssgMacroRel);
|
||||
}
|
||||
}
|
||||
|
||||
DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) {
|
||||
|
|
@ -484,6 +514,39 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) {
|
|||
}
|
||||
}
|
||||
|
||||
// release points
|
||||
if (version>=44) {
|
||||
std.volMacroRel=reader.readI();
|
||||
std.arpMacroRel=reader.readI();
|
||||
std.dutyMacroRel=reader.readI();
|
||||
std.waveMacroRel=reader.readI();
|
||||
std.pitchMacroRel=reader.readI();
|
||||
std.ex1MacroRel=reader.readI();
|
||||
std.ex2MacroRel=reader.readI();
|
||||
std.ex3MacroRel=reader.readI();
|
||||
std.algMacroRel=reader.readI();
|
||||
std.fbMacroRel=reader.readI();
|
||||
std.fmsMacroRel=reader.readI();
|
||||
std.amsMacroRel=reader.readI();
|
||||
|
||||
for (int i=0; i<4; i++) {
|
||||
DivInstrumentSTD::OpMacro& op=std.opMacros[i];
|
||||
|
||||
op.amMacroRel=reader.readI();
|
||||
op.arMacroRel=reader.readI();
|
||||
op.drMacroRel=reader.readI();
|
||||
op.multMacroRel=reader.readI();
|
||||
op.rrMacroRel=reader.readI();
|
||||
op.slMacroRel=reader.readI();
|
||||
op.tlMacroRel=reader.readI();
|
||||
op.dt2MacroRel=reader.readI();
|
||||
op.rsMacroRel=reader.readI();
|
||||
op.dtMacroRel=reader.readI();
|
||||
op.d2rMacroRel=reader.readI();
|
||||
op.ssgMacroRel=reader.readI();
|
||||
}
|
||||
}
|
||||
|
||||
return DIV_DATA_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -123,6 +123,9 @@ struct DivInstrumentSTD {
|
|||
signed char volMacroLoop, arpMacroLoop, dutyMacroLoop, waveMacroLoop;
|
||||
signed char pitchMacroLoop, ex1MacroLoop, ex2MacroLoop, ex3MacroLoop;
|
||||
signed char algMacroLoop, fbMacroLoop, fmsMacroLoop, amsMacroLoop;
|
||||
signed char volMacroRel, arpMacroRel, dutyMacroRel, waveMacroRel;
|
||||
signed char pitchMacroRel, ex1MacroRel, ex2MacroRel, ex3MacroRel;
|
||||
signed char algMacroRel, fbMacroRel, fmsMacroRel, amsMacroRel;
|
||||
struct OpMacro {
|
||||
// ar, dr, mult, rr, sl, tl, dt2, rs, dt, d2r, ssgEnv;
|
||||
unsigned char amMacro[256];
|
||||
|
|
@ -146,6 +149,9 @@ struct DivInstrumentSTD {
|
|||
signed char amMacroLoop, arMacroLoop, drMacroLoop, multMacroLoop;
|
||||
signed char rrMacroLoop, slMacroLoop, tlMacroLoop, dt2MacroLoop;
|
||||
signed char rsMacroLoop, dtMacroLoop, d2rMacroLoop, ssgMacroLoop;
|
||||
signed char amMacroRel, arMacroRel, drMacroRel, multMacroRel;
|
||||
signed char rrMacroRel, slMacroRel, tlMacroRel, dt2MacroRel;
|
||||
signed char rsMacroRel, dtMacroRel, d2rMacroRel, ssgMacroRel;
|
||||
OpMacro():
|
||||
amMacroOpen(false), arMacroOpen(false), drMacroOpen(false), multMacroOpen(false),
|
||||
rrMacroOpen(false), slMacroOpen(false), tlMacroOpen(true), dt2MacroOpen(false),
|
||||
|
|
@ -155,7 +161,10 @@ struct DivInstrumentSTD {
|
|||
rsMacroLen(0), dtMacroLen(0), d2rMacroLen(0), ssgMacroLen(0),
|
||||
amMacroLoop(-1), arMacroLoop(-1), drMacroLoop(-1), multMacroLoop(-1),
|
||||
rrMacroLoop(-1), slMacroLoop(-1), tlMacroLoop(-1), dt2MacroLoop(-1),
|
||||
rsMacroLoop(-1), dtMacroLoop(-1), d2rMacroLoop(-1), ssgMacroLoop(-1) {
|
||||
rsMacroLoop(-1), dtMacroLoop(-1), d2rMacroLoop(-1), ssgMacroLoop(-1),
|
||||
amMacroRel(-1), arMacroRel(-1), drMacroRel(-1), multMacroRel(-1),
|
||||
rrMacroRel(-1), slMacroRel(-1), tlMacroRel(-1), dt2MacroRel(-1),
|
||||
rsMacroRel(-1), dtMacroRel(-1), d2rMacroRel(-1), ssgMacroRel(-1) {
|
||||
memset(amMacro,0,256);
|
||||
memset(arMacro,0,256);
|
||||
memset(drMacro,0,256);
|
||||
|
|
@ -210,7 +219,19 @@ struct DivInstrumentSTD {
|
|||
algMacroLoop(-1),
|
||||
fbMacroLoop(-1),
|
||||
fmsMacroLoop(-1),
|
||||
amsMacroLoop(-1) {
|
||||
amsMacroLoop(-1),
|
||||
volMacroRel(-1),
|
||||
arpMacroRel(-1),
|
||||
dutyMacroRel(-1),
|
||||
waveMacroRel(-1),
|
||||
pitchMacroRel(-1),
|
||||
ex1MacroRel(-1),
|
||||
ex2MacroRel(-1),
|
||||
ex3MacroRel(-1),
|
||||
algMacroRel(-1),
|
||||
fbMacroRel(-1),
|
||||
fmsMacroRel(-1),
|
||||
amsMacroRel(-1) {
|
||||
memset(volMacro,0,256*sizeof(int));
|
||||
memset(arpMacro,0,256*sizeof(int));
|
||||
memset(dutyMacro,0,256*sizeof(int));
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#include "macroInt.h"
|
||||
#include "instrument.h"
|
||||
|
||||
#define doMacro(finished,had,has,val,pos,source,sourceLen,sourceLoop) \
|
||||
#define doMacro(finished,had,has,val,pos,source,sourceLen,sourceLoop,sourceRel) \
|
||||
if (finished) finished=false; \
|
||||
if (had!=has) { \
|
||||
finished=true; \
|
||||
|
|
@ -9,6 +9,9 @@
|
|||
had=has; \
|
||||
if (has) { \
|
||||
val=source[pos++]; \
|
||||
if (pos==sourceRel && !released) { \
|
||||
pos--; \
|
||||
} \
|
||||
if (pos>=sourceLen) { \
|
||||
if (sourceLoop<sourceLen && sourceLoop>=0) { \
|
||||
pos=sourceLoop; \
|
||||
|
|
@ -21,41 +24,45 @@
|
|||
void DivMacroInt::next() {
|
||||
if (ins==NULL) return;
|
||||
|
||||
doMacro(finishedVol,hadVol,hasVol,vol,volPos,ins->std.volMacro,ins->std.volMacroLen,ins->std.volMacroLoop);
|
||||
doMacro(finishedArp,hadArp,hasArp,arp,arpPos,ins->std.arpMacro,ins->std.arpMacroLen,ins->std.arpMacroLoop);
|
||||
doMacro(finishedDuty,hadDuty,hasDuty,duty,dutyPos,ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop);
|
||||
doMacro(finishedWave,hadWave,hasWave,wave,wavePos,ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop);
|
||||
doMacro(finishedVol,hadVol,hasVol,vol,volPos,ins->std.volMacro,ins->std.volMacroLen,ins->std.volMacroLoop,ins->std.volMacroRel);
|
||||
doMacro(finishedArp,hadArp,hasArp,arp,arpPos,ins->std.arpMacro,ins->std.arpMacroLen,ins->std.arpMacroLoop,ins->std.arpMacroRel);
|
||||
doMacro(finishedDuty,hadDuty,hasDuty,duty,dutyPos,ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop,ins->std.dutyMacroRel);
|
||||
doMacro(finishedWave,hadWave,hasWave,wave,wavePos,ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop,ins->std.waveMacroRel);
|
||||
|
||||
doMacro(finishedPitch,hadPitch,hasPitch,pitch,pitchPos,ins->std.pitchMacro,ins->std.pitchMacroLen,ins->std.pitchMacroLoop);
|
||||
doMacro(finishedEx1,hadEx1,hasEx1,ex1,ex1Pos,ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop);
|
||||
doMacro(finishedEx2,hadEx2,hasEx2,ex2,ex2Pos,ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop);
|
||||
doMacro(finishedEx3,hadEx3,hasEx3,ex3,ex3Pos,ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop);
|
||||
doMacro(finishedPitch,hadPitch,hasPitch,pitch,pitchPos,ins->std.pitchMacro,ins->std.pitchMacroLen,ins->std.pitchMacroLoop,ins->std.pitchMacroRel);
|
||||
doMacro(finishedEx1,hadEx1,hasEx1,ex1,ex1Pos,ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel);
|
||||
doMacro(finishedEx2,hadEx2,hasEx2,ex2,ex2Pos,ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel);
|
||||
doMacro(finishedEx3,hadEx3,hasEx3,ex3,ex3Pos,ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel);
|
||||
|
||||
doMacro(finishedAlg,hadAlg,hasAlg,alg,algPos,ins->std.algMacro,ins->std.algMacroLen,ins->std.algMacroLoop);
|
||||
doMacro(finishedFb,hadFb,hasFb,fb,fbPos,ins->std.fbMacro,ins->std.fbMacroLen,ins->std.fbMacroLoop);
|
||||
doMacro(finishedFms,hadFms,hasFms,fms,fmsPos,ins->std.fmsMacro,ins->std.fmsMacroLen,ins->std.fmsMacroLoop);
|
||||
doMacro(finishedAms,hadAms,hasAms,ams,amsPos,ins->std.amsMacro,ins->std.amsMacroLen,ins->std.amsMacroLoop);
|
||||
doMacro(finishedAlg,hadAlg,hasAlg,alg,algPos,ins->std.algMacro,ins->std.algMacroLen,ins->std.algMacroLoop,ins->std.algMacroRel);
|
||||
doMacro(finishedFb,hadFb,hasFb,fb,fbPos,ins->std.fbMacro,ins->std.fbMacroLen,ins->std.fbMacroLoop,ins->std.fbMacroRel);
|
||||
doMacro(finishedFms,hadFms,hasFms,fms,fmsPos,ins->std.fmsMacro,ins->std.fmsMacroLen,ins->std.fmsMacroLoop,ins->std.fmsMacroRel);
|
||||
doMacro(finishedAms,hadAms,hasAms,ams,amsPos,ins->std.amsMacro,ins->std.amsMacroLen,ins->std.amsMacroLoop,ins->std.amsMacroRel);
|
||||
|
||||
for (int i=0; i<4; i++) {
|
||||
DivInstrumentSTD::OpMacro& m=ins->std.opMacros[i];
|
||||
IntOp& o=op[i];
|
||||
doMacro(o.finishedAm,o.hadAm,o.hasAm,o.am,o.amPos,m.amMacro,m.amMacroLen,m.amMacroLoop);
|
||||
doMacro(o.finishedAr,o.hadAr,o.hasAr,o.ar,o.arPos,m.arMacro,m.arMacroLen,m.arMacroLoop);
|
||||
doMacro(o.finishedDr,o.hadDr,o.hasDr,o.dr,o.drPos,m.drMacro,m.drMacroLen,m.drMacroLoop);
|
||||
doMacro(o.finishedMult,o.hadMult,o.hasMult,o.mult,o.multPos,m.multMacro,m.multMacroLen,m.multMacroLoop);
|
||||
doMacro(o.finishedAm,o.hadAm,o.hasAm,o.am,o.amPos,m.amMacro,m.amMacroLen,m.amMacroLoop,m.amMacroRel);
|
||||
doMacro(o.finishedAr,o.hadAr,o.hasAr,o.ar,o.arPos,m.arMacro,m.arMacroLen,m.arMacroLoop,m.arMacroRel);
|
||||
doMacro(o.finishedDr,o.hadDr,o.hasDr,o.dr,o.drPos,m.drMacro,m.drMacroLen,m.drMacroLoop,m.drMacroRel);
|
||||
doMacro(o.finishedMult,o.hadMult,o.hasMult,o.mult,o.multPos,m.multMacro,m.multMacroLen,m.multMacroLoop,m.multMacroRel);
|
||||
|
||||
doMacro(o.finishedRr,o.hadRr,o.hasRr,o.rr,o.rrPos,m.rrMacro,m.rrMacroLen,m.rrMacroLoop);
|
||||
doMacro(o.finishedSl,o.hadSl,o.hasSl,o.sl,o.slPos,m.slMacro,m.slMacroLen,m.slMacroLoop);
|
||||
doMacro(o.finishedTl,o.hadTl,o.hasTl,o.tl,o.tlPos,m.tlMacro,m.tlMacroLen,m.tlMacroLoop);
|
||||
doMacro(o.finishedDt2,o.hadDt2,o.hasDt2,o.dt2,o.dt2Pos,m.dt2Macro,m.dt2MacroLen,m.dt2MacroLoop);
|
||||
doMacro(o.finishedRr,o.hadRr,o.hasRr,o.rr,o.rrPos,m.rrMacro,m.rrMacroLen,m.rrMacroLoop,m.rrMacroRel);
|
||||
doMacro(o.finishedSl,o.hadSl,o.hasSl,o.sl,o.slPos,m.slMacro,m.slMacroLen,m.slMacroLoop,m.slMacroRel);
|
||||
doMacro(o.finishedTl,o.hadTl,o.hasTl,o.tl,o.tlPos,m.tlMacro,m.tlMacroLen,m.tlMacroLoop,m.tlMacroRel);
|
||||
doMacro(o.finishedDt2,o.hadDt2,o.hasDt2,o.dt2,o.dt2Pos,m.dt2Macro,m.dt2MacroLen,m.dt2MacroLoop,m.dt2MacroRel);
|
||||
|
||||
doMacro(o.finishedRs,o.hadRs,o.hasRs,o.rs,o.rsPos,m.rsMacro,m.rsMacroLen,m.rsMacroLoop);
|
||||
doMacro(o.finishedDt,o.hadDt,o.hasDt,o.dt,o.dtPos,m.dtMacro,m.dtMacroLen,m.dtMacroLoop);
|
||||
doMacro(o.finishedD2r,o.hadD2r,o.hasD2r,o.d2r,o.d2rPos,m.d2rMacro,m.d2rMacroLen,m.d2rMacroLoop);
|
||||
doMacro(o.finishedSsg,o.hadSsg,o.hasSsg,o.ssg,o.ssgPos,m.ssgMacro,m.ssgMacroLen,m.ssgMacroLoop);
|
||||
doMacro(o.finishedRs,o.hadRs,o.hasRs,o.rs,o.rsPos,m.rsMacro,m.rsMacroLen,m.rsMacroLoop,m.rsMacroRel);
|
||||
doMacro(o.finishedDt,o.hadDt,o.hasDt,o.dt,o.dtPos,m.dtMacro,m.dtMacroLen,m.dtMacroLoop,m.dtMacroRel);
|
||||
doMacro(o.finishedD2r,o.hadD2r,o.hasD2r,o.d2r,o.d2rPos,m.d2rMacro,m.d2rMacroLen,m.d2rMacroLoop,m.d2rMacroRel);
|
||||
doMacro(o.finishedSsg,o.hadSsg,o.hasSsg,o.ssg,o.ssgPos,m.ssgMacro,m.ssgMacroLen,m.ssgMacroLoop,m.ssgMacroRel);
|
||||
}
|
||||
}
|
||||
|
||||
void DivMacroInt::release() {
|
||||
released=true;
|
||||
}
|
||||
|
||||
void DivMacroInt::init(DivInstrument* which) {
|
||||
ins=which;
|
||||
volPos=0;
|
||||
|
|
@ -71,6 +78,8 @@ void DivMacroInt::init(DivInstrument* which) {
|
|||
fmsPos=0;
|
||||
amsPos=0;
|
||||
|
||||
released=false;
|
||||
|
||||
hasVol=false;
|
||||
hasArp=false;
|
||||
hasDuty=false;
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ class DivMacroInt {
|
|||
DivInstrument* ins;
|
||||
int volPos, arpPos, dutyPos, wavePos, pitchPos, ex1Pos, ex2Pos, ex3Pos;
|
||||
int algPos, fbPos, fmsPos, amsPos;
|
||||
bool released;
|
||||
public:
|
||||
int vol;
|
||||
int arp;
|
||||
|
|
@ -80,6 +81,7 @@ class DivMacroInt {
|
|||
willRr(false), willSl(false), willTl(false), willDt2(false),
|
||||
willRs(false), willDt(false), willD2r(false), willSsg(false) {}
|
||||
} op[4];
|
||||
void release();
|
||||
void next();
|
||||
void init(DivInstrument* which);
|
||||
void notifyInsDeletion(DivInstrument* which);
|
||||
|
|
@ -97,6 +99,7 @@ class DivMacroInt {
|
|||
fbPos(0),
|
||||
fmsPos(0),
|
||||
amsPos(0),
|
||||
released(false),
|
||||
vol(0),
|
||||
arp(0),
|
||||
duty(0),
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@ const char* notes[12]={
|
|||
const char* cmdName[DIV_CMD_MAX]={
|
||||
"NOTE_ON",
|
||||
"NOTE_OFF",
|
||||
"NOTE_OFF_ENV",
|
||||
"ENV_RELEASE",
|
||||
"INSTRUMENT",
|
||||
"VOLUME",
|
||||
"GET_VOLUME",
|
||||
|
|
@ -95,6 +97,10 @@ const char* formatNote(unsigned char note, unsigned char octave) {
|
|||
static char ret[4];
|
||||
if (note==100) {
|
||||
return "OFF";
|
||||
} else if (note==101) {
|
||||
return "===";
|
||||
} else if (note==102) {
|
||||
return "REL";
|
||||
} else if (octave==0 && note==0) {
|
||||
return "---";
|
||||
}
|
||||
|
|
@ -456,7 +462,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
|||
dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,i,pat->data[whatRow][2]));
|
||||
}
|
||||
// note
|
||||
if (pat->data[whatRow][0]==100) {
|
||||
if (pat->data[whatRow][0]==100) { // note off
|
||||
//chan[i].note=-1;
|
||||
chan[i].keyOn=false;
|
||||
chan[i].keyOff=true;
|
||||
|
|
@ -477,6 +483,29 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
|||
chan[i].scheduledSlideReset=true;
|
||||
}
|
||||
dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,i));
|
||||
} else if (pat->data[whatRow][0]==101) { // note off + env release
|
||||
//chan[i].note=-1;
|
||||
chan[i].keyOn=false;
|
||||
chan[i].keyOff=true;
|
||||
if (chan[i].inPorta) {
|
||||
if (chan[i].stopOnOff) {
|
||||
chan[i].portaNote=-1;
|
||||
chan[i].portaSpeed=-1;
|
||||
chan[i].stopOnOff=false;
|
||||
}
|
||||
if (disCont[dispatchOfChan[i]].dispatch->keyOffAffectsPorta(dispatchChanOfChan[i])) {
|
||||
chan[i].portaNote=-1;
|
||||
chan[i].portaSpeed=-1;
|
||||
if (i==2 && sysOfChan[i]==DIV_SYSTEM_SMS) {
|
||||
chan[i+1].portaNote=-1;
|
||||
chan[i+1].portaSpeed=-1;
|
||||
}
|
||||
}
|
||||
chan[i].scheduledSlideReset=true;
|
||||
}
|
||||
dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF_ENV,i));
|
||||
} else if (pat->data[whatRow][0]==102) { // env release
|
||||
dispatchCmd(DivCommand(DIV_CMD_ENV_RELEASE,i));
|
||||
} else if (!(pat->data[whatRow][0]==0 && pat->data[whatRow][1]==0)) {
|
||||
chan[i].oldNote=chan[i].note;
|
||||
chan[i].note=pat->data[whatRow][0]+((signed char)pat->data[whatRow][1])*12;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue