Merge branch 'tildearrow:master' into master
This commit is contained in:
commit
1d5813aba3
|
|
@ -14,7 +14,7 @@ set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
set(CMAKE_PROJECT_VERSION_MAJOR 0)
|
set(CMAKE_PROJECT_VERSION_MAJOR 0)
|
||||||
set(CMAKE_PROJECT_VERSION_MINOR 5)
|
set(CMAKE_PROJECT_VERSION_MINOR 5)
|
||||||
set(CMAKE_PROJECT_VERSION_PATCH 6)
|
set(CMAKE_PROJECT_VERSION_PATCH 7)
|
||||||
|
|
||||||
if (ANDROID)
|
if (ANDROID)
|
||||||
set(BUILD_GUI_DEFAULT OFF)
|
set(BUILD_GUI_DEFAULT OFF)
|
||||||
|
|
|
||||||
|
|
@ -15,17 +15,17 @@
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleLongVersionString</key>
|
<key>CFBundleLongVersionString</key>
|
||||||
<string>0.5.6</string>
|
<string>0.5.7</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
<string>Furnace</string>
|
<string>Furnace</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>0.5.6</string>
|
<string>0.5.7</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>0.5.6</string>
|
<string>0.5.7</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
|
|
|
||||||
|
|
@ -805,8 +805,8 @@ int DivEngine::calcBaseFreq(double clock, double divider, int note, bool period)
|
||||||
int DivEngine::calcFreq(int base, int pitch, bool period, int octave) {
|
int DivEngine::calcFreq(int base, int pitch, bool period, int octave) {
|
||||||
if (song.linearPitch) {
|
if (song.linearPitch) {
|
||||||
return period?
|
return period?
|
||||||
round(base*pow(2,-(double)pitch/(12.0*128.0))/(98.0+globalPitch*6.0)*98.0):
|
base*pow(2,-(double)pitch/(12.0*128.0))/(98.0+globalPitch*6.0)*98.0:
|
||||||
(round(base*pow(2,(double)pitch/(12.0*128.0))*(98+globalPitch*6))/98);
|
(base*pow(2,(double)pitch/(12.0*128.0))*(98+globalPitch*6))/98;
|
||||||
}
|
}
|
||||||
return period?
|
return period?
|
||||||
base-pitch:
|
base-pitch:
|
||||||
|
|
@ -1196,8 +1196,24 @@ int DivEngine::addInstrument(int refChan) {
|
||||||
return insCount;
|
return insCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum DivInsFormats {
|
||||||
|
DIV_INSFORMAT_DMP,
|
||||||
|
DIV_INSFORMAT_TFI,
|
||||||
|
DIV_INSFORMAT_VGI,
|
||||||
|
DIV_INSFORMAT_FTI,
|
||||||
|
DIV_INSFORMAT_BTI
|
||||||
|
};
|
||||||
|
|
||||||
bool DivEngine::addInstrumentFromFile(const char *path) {
|
bool DivEngine::addInstrumentFromFile(const char *path) {
|
||||||
warnings="";
|
warnings="";
|
||||||
|
|
||||||
|
const char* pathRedux=strrchr(path,DIR_SEPARATOR);
|
||||||
|
if (pathRedux==NULL) {
|
||||||
|
pathRedux="Instrument";
|
||||||
|
} else {
|
||||||
|
pathRedux++;
|
||||||
|
}
|
||||||
|
|
||||||
FILE* f=ps_fopen(path,"rb");
|
FILE* f=ps_fopen(path,"rb");
|
||||||
if (f==NULL) {
|
if (f==NULL) {
|
||||||
lastError=strerror(errno);
|
lastError=strerror(errno);
|
||||||
|
|
@ -1274,251 +1290,356 @@ bool DivEngine::addInstrumentFromFile(const char *path) {
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else { // read as .dmp
|
} else { // read as a different format
|
||||||
// this is a ridiculous mess
|
const char* ext=strrchr(path,'.');
|
||||||
unsigned char version=0;
|
DivInsFormats format=DIV_INSFORMAT_DMP;
|
||||||
unsigned char sys=0;
|
if (ext!=NULL) {
|
||||||
try {
|
String extS;
|
||||||
reader.seek(0,SEEK_SET);
|
for (; *ext; ext++) {
|
||||||
version=reader.readC();
|
char i=*ext;
|
||||||
} catch (EndOfFileException e) {
|
if (i>='A' && i<='Z') {
|
||||||
lastError="premature end of file";
|
i+='a'-'A';
|
||||||
logE("premature end of file!\n");
|
}
|
||||||
delete ins;
|
extS+=i;
|
||||||
delete[] buf;
|
}
|
||||||
return false;
|
if (extS==String(".dmp")) {
|
||||||
|
format=DIV_INSFORMAT_DMP;
|
||||||
|
} else if (extS==String(".tfi")) {
|
||||||
|
format=DIV_INSFORMAT_TFI;
|
||||||
|
} else if (extS==String(".vgi")) {
|
||||||
|
format=DIV_INSFORMAT_VGI;
|
||||||
|
} else if (extS==String(".fti")) {
|
||||||
|
format=DIV_INSFORMAT_FTI;
|
||||||
|
} else if (extS==String(".bti")) {
|
||||||
|
format=DIV_INSFORMAT_BTI;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
switch (format) {
|
||||||
|
case DIV_INSFORMAT_DMP: {
|
||||||
|
// this is a ridiculous mess
|
||||||
|
unsigned char version=0;
|
||||||
|
unsigned char sys=0;
|
||||||
|
try {
|
||||||
|
reader.seek(0,SEEK_SET);
|
||||||
|
version=reader.readC();
|
||||||
|
} catch (EndOfFileException e) {
|
||||||
|
lastError="premature end of file";
|
||||||
|
logE("premature end of file!\n");
|
||||||
|
delete ins;
|
||||||
|
delete[] buf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (version>11) {
|
if (version>11) {
|
||||||
lastError="unknown instrument version!";
|
lastError="unknown instrument version!";
|
||||||
delete ins;
|
delete ins;
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version>=11) { // 1.0
|
ins->name=pathRedux;
|
||||||
try {
|
|
||||||
sys=reader.readC();
|
|
||||||
|
|
||||||
switch (sys) {
|
if (version>=11) { // 1.0
|
||||||
case 1: // YMU759
|
try {
|
||||||
ins->type=DIV_INS_FM;
|
sys=reader.readC();
|
||||||
break;
|
|
||||||
case 2: // Genesis
|
switch (sys) {
|
||||||
ins->type=DIV_INS_FM;
|
case 1: // YMU759
|
||||||
break;
|
ins->type=DIV_INS_FM;
|
||||||
case 3: // SMS
|
break;
|
||||||
ins->type=DIV_INS_STD;
|
case 2: // Genesis
|
||||||
break;
|
ins->type=DIV_INS_FM;
|
||||||
case 4: // Game Boy
|
break;
|
||||||
ins->type=DIV_INS_GB;
|
case 3: // SMS
|
||||||
break;
|
ins->type=DIV_INS_STD;
|
||||||
case 5: // PC Engine
|
break;
|
||||||
ins->type=DIV_INS_PCE;
|
case 4: // Game Boy
|
||||||
break;
|
ins->type=DIV_INS_GB;
|
||||||
case 6: // NES
|
break;
|
||||||
ins->type=DIV_INS_STD;
|
case 5: // PC Engine
|
||||||
break;
|
ins->type=DIV_INS_PCE;
|
||||||
case 7: case 0x17: // C64
|
break;
|
||||||
ins->type=DIV_INS_C64;
|
case 6: // NES
|
||||||
break;
|
ins->type=DIV_INS_STD;
|
||||||
case 8: // Arcade
|
break;
|
||||||
ins->type=DIV_INS_FM;
|
case 7: case 0x17: // C64
|
||||||
break;
|
ins->type=DIV_INS_C64;
|
||||||
default:
|
break;
|
||||||
lastError="unknown instrument type!";
|
case 8: // Arcade
|
||||||
|
ins->type=DIV_INS_FM;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lastError="unknown instrument type!";
|
||||||
|
delete ins;
|
||||||
|
delete[] buf;
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (EndOfFileException e) {
|
||||||
|
lastError="premature end of file";
|
||||||
|
logE("premature end of file!\n");
|
||||||
delete ins;
|
delete ins;
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (EndOfFileException e) {
|
|
||||||
lastError="premature end of file";
|
|
||||||
logE("premature end of file!\n");
|
|
||||||
delete ins;
|
|
||||||
delete[] buf;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
bool mode=true;
|
|
||||||
if (version>1) {
|
|
||||||
mode=reader.readC();
|
|
||||||
if (mode==0) {
|
|
||||||
if (version<11) {
|
|
||||||
ins->type=DIV_INS_STD;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
ins->type=DIV_INS_FM;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
ins->type=DIV_INS_FM;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode) { // FM
|
try {
|
||||||
if (version<10) {
|
bool mode=true;
|
||||||
if (version>1) {
|
if (version>1) {
|
||||||
ins->fm.ops=reader.readC()?4:2;
|
mode=reader.readC();
|
||||||
} else {
|
if (mode==0) {
|
||||||
ins->fm.ops=reader.readC()?2:4;
|
if (version<11) {
|
||||||
}
|
ins->type=DIV_INS_STD;
|
||||||
}
|
}
|
||||||
if (version>1) { // HELP! in which version of the format did we start storing FMS!
|
} else {
|
||||||
ins->fm.fms=reader.readC();
|
ins->type=DIV_INS_FM;
|
||||||
}
|
|
||||||
ins->fm.fb=reader.readC();
|
|
||||||
ins->fm.alg=reader.readC();
|
|
||||||
// DITTO
|
|
||||||
if (sys!=1) ins->fm.ams=reader.readC();
|
|
||||||
|
|
||||||
for (int j=0; j<ins->fm.ops; j++) {
|
|
||||||
ins->fm.op[j].mult=reader.readC();
|
|
||||||
ins->fm.op[j].tl=reader.readC();
|
|
||||||
ins->fm.op[j].ar=reader.readC();
|
|
||||||
ins->fm.op[j].dr=reader.readC();
|
|
||||||
ins->fm.op[j].sl=reader.readC();
|
|
||||||
ins->fm.op[j].rr=reader.readC();
|
|
||||||
ins->fm.op[j].am=reader.readC();
|
|
||||||
// what the hell how do I tell!
|
|
||||||
if (sys==1) { // YMU759
|
|
||||||
ins->fm.op[j].ws=reader.readC();
|
|
||||||
ins->fm.op[j].ksl=reader.readC();
|
|
||||||
ins->fm.op[j].vib=reader.readC();
|
|
||||||
ins->fm.op[j].egt=reader.readC();
|
|
||||||
ins->fm.op[j].sus=reader.readC();
|
|
||||||
ins->fm.op[j].ksr=reader.readC();
|
|
||||||
ins->fm.op[j].dvb=reader.readC();
|
|
||||||
ins->fm.op[j].dam=reader.readC();
|
|
||||||
} else {
|
|
||||||
ins->fm.op[j].rs=reader.readC();
|
|
||||||
ins->fm.op[j].dt=reader.readC();
|
|
||||||
ins->fm.op[j].dt2=ins->fm.op[j].dt>>4;
|
|
||||||
ins->fm.op[j].dt&=15;
|
|
||||||
ins->fm.op[j].d2r=reader.readC();
|
|
||||||
ins->fm.op[j].ssgEnv=reader.readC();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // STD
|
|
||||||
if (ins->type!=DIV_INS_GB) {
|
|
||||||
ins->std.volMacroLen=reader.readC();
|
|
||||||
if (version>5) {
|
|
||||||
for (int i=0; i<ins->std.volMacroLen; i++) {
|
|
||||||
ins->std.volMacro[i]=reader.readI();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i=0; i<ins->std.volMacroLen; i++) {
|
ins->type=DIV_INS_FM;
|
||||||
ins->std.volMacro[i]=reader.readC();
|
}
|
||||||
|
|
||||||
|
if (mode) { // FM
|
||||||
|
if (version<10) {
|
||||||
|
if (version>1) {
|
||||||
|
ins->fm.ops=reader.readC()?4:2;
|
||||||
|
} else {
|
||||||
|
ins->fm.ops=reader.readC()?2:4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (version>1) { // HELP! in which version of the format did we start storing FMS!
|
||||||
|
ins->fm.fms=reader.readC();
|
||||||
|
}
|
||||||
|
ins->fm.fb=reader.readC();
|
||||||
|
ins->fm.alg=reader.readC();
|
||||||
|
// DITTO
|
||||||
|
if (sys!=1) ins->fm.ams=reader.readC();
|
||||||
|
|
||||||
|
for (int j=0; j<ins->fm.ops; j++) {
|
||||||
|
ins->fm.op[j].mult=reader.readC();
|
||||||
|
ins->fm.op[j].tl=reader.readC();
|
||||||
|
ins->fm.op[j].ar=reader.readC();
|
||||||
|
ins->fm.op[j].dr=reader.readC();
|
||||||
|
ins->fm.op[j].sl=reader.readC();
|
||||||
|
ins->fm.op[j].rr=reader.readC();
|
||||||
|
ins->fm.op[j].am=reader.readC();
|
||||||
|
// what the hell how do I tell!
|
||||||
|
if (sys==1) { // YMU759
|
||||||
|
ins->fm.op[j].ws=reader.readC();
|
||||||
|
ins->fm.op[j].ksl=reader.readC();
|
||||||
|
ins->fm.op[j].vib=reader.readC();
|
||||||
|
ins->fm.op[j].egt=reader.readC();
|
||||||
|
ins->fm.op[j].sus=reader.readC();
|
||||||
|
ins->fm.op[j].ksr=reader.readC();
|
||||||
|
ins->fm.op[j].dvb=reader.readC();
|
||||||
|
ins->fm.op[j].dam=reader.readC();
|
||||||
|
} else {
|
||||||
|
ins->fm.op[j].rs=reader.readC();
|
||||||
|
ins->fm.op[j].dt=reader.readC();
|
||||||
|
ins->fm.op[j].dt2=ins->fm.op[j].dt>>4;
|
||||||
|
ins->fm.op[j].dt&=15;
|
||||||
|
ins->fm.op[j].d2r=reader.readC();
|
||||||
|
ins->fm.op[j].ssgEnv=reader.readC();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // STD
|
||||||
|
if (ins->type!=DIV_INS_GB) {
|
||||||
|
ins->std.volMacroLen=reader.readC();
|
||||||
|
if (version>5) {
|
||||||
|
for (int i=0; i<ins->std.volMacroLen; i++) {
|
||||||
|
ins->std.volMacro[i]=reader.readI();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<ins->std.volMacroLen; i++) {
|
||||||
|
ins->std.volMacro[i]=reader.readC();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (version<11) for (int i=0; i<ins->std.volMacroLen; i++) {
|
||||||
|
if (ins->std.volMacro[i]>15 && ins->type==DIV_INS_STD) ins->type=DIV_INS_PCE;
|
||||||
|
}
|
||||||
|
if (ins->std.volMacroLen>0) {
|
||||||
|
ins->std.volMacroOpen=true;
|
||||||
|
ins->std.volMacroLoop=reader.readC();
|
||||||
|
} else {
|
||||||
|
ins->std.volMacroOpen=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ins->std.arpMacroLen=reader.readC();
|
||||||
|
if (version>5) {
|
||||||
|
for (int i=0; i<ins->std.arpMacroLen; i++) {
|
||||||
|
ins->std.arpMacro[i]=reader.readI();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<ins->std.arpMacroLen; i++) {
|
||||||
|
ins->std.arpMacro[i]=reader.readC();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ins->std.arpMacroLen>0) {
|
||||||
|
ins->std.arpMacroOpen=true;
|
||||||
|
ins->std.arpMacroLoop=reader.readC();
|
||||||
|
} else {
|
||||||
|
ins->std.arpMacroOpen=false;
|
||||||
|
}
|
||||||
|
if (version>8) { // TODO: when?
|
||||||
|
ins->std.arpMacroMode=reader.readC();
|
||||||
|
}
|
||||||
|
|
||||||
|
ins->std.dutyMacroLen=reader.readC();
|
||||||
|
if (version>5) {
|
||||||
|
for (int i=0; i<ins->std.dutyMacroLen; i++) {
|
||||||
|
ins->std.dutyMacro[i]=reader.readI();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<ins->std.dutyMacroLen; i++) {
|
||||||
|
ins->std.dutyMacro[i]=reader.readC();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ins->std.dutyMacroLen>0) {
|
||||||
|
ins->std.dutyMacroOpen=true;
|
||||||
|
ins->std.dutyMacroLoop=reader.readC();
|
||||||
|
} else {
|
||||||
|
ins->std.dutyMacroOpen=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ins->std.waveMacroLen=reader.readC();
|
||||||
|
if (version>5) {
|
||||||
|
for (int i=0; i<ins->std.waveMacroLen; i++) {
|
||||||
|
ins->std.waveMacro[i]=reader.readI();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<ins->std.waveMacroLen; i++) {
|
||||||
|
ins->std.waveMacro[i]=reader.readC();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ins->std.waveMacroLen>0) {
|
||||||
|
ins->std.waveMacroOpen=true;
|
||||||
|
ins->std.waveMacroLoop=reader.readC();
|
||||||
|
} else {
|
||||||
|
ins->std.waveMacroOpen=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ins->type==DIV_INS_C64) {
|
||||||
|
ins->c64.triOn=reader.readC();
|
||||||
|
ins->c64.sawOn=reader.readC();
|
||||||
|
ins->c64.pulseOn=reader.readC();
|
||||||
|
ins->c64.noiseOn=reader.readC();
|
||||||
|
|
||||||
|
ins->c64.a=reader.readC();
|
||||||
|
ins->c64.d=reader.readC();
|
||||||
|
ins->c64.s=reader.readC();
|
||||||
|
ins->c64.r=reader.readC();
|
||||||
|
|
||||||
|
ins->c64.duty=(reader.readC()*4095)/100;
|
||||||
|
|
||||||
|
ins->c64.ringMod=reader.readC();
|
||||||
|
ins->c64.oscSync=reader.readC();
|
||||||
|
ins->c64.toFilter=reader.readC();
|
||||||
|
if (version<0x07) { // TODO: UNSURE
|
||||||
|
ins->c64.volIsCutoff=reader.readI();
|
||||||
|
} else {
|
||||||
|
ins->c64.volIsCutoff=reader.readC();
|
||||||
|
}
|
||||||
|
ins->c64.initFilter=reader.readC();
|
||||||
|
|
||||||
|
ins->c64.res=reader.readC();
|
||||||
|
ins->c64.cut=(reader.readC()*2047)/100;
|
||||||
|
ins->c64.hp=reader.readC();
|
||||||
|
ins->c64.bp=reader.readC();
|
||||||
|
ins->c64.lp=reader.readC();
|
||||||
|
ins->c64.ch3off=reader.readC();
|
||||||
|
}
|
||||||
|
if (ins->type==DIV_INS_GB) {
|
||||||
|
ins->gb.envVol=reader.readC();
|
||||||
|
ins->gb.envDir=reader.readC();
|
||||||
|
ins->gb.envLen=reader.readC();
|
||||||
|
ins->gb.soundLen=reader.readC();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (version<11) for (int i=0; i<ins->std.volMacroLen; i++) {
|
} catch (EndOfFileException e) {
|
||||||
if (ins->std.volMacro[i]>15 && ins->type==DIV_INS_STD) ins->type=DIV_INS_PCE;
|
lastError="premature end of file";
|
||||||
}
|
logE("premature end of file!\n");
|
||||||
if (ins->std.volMacroLen>0) {
|
delete ins;
|
||||||
ins->std.volMacroOpen=true;
|
delete[] buf;
|
||||||
ins->std.volMacroLoop=reader.readC();
|
return false;
|
||||||
} else {
|
|
||||||
ins->std.volMacroOpen=false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ins->std.arpMacroLen=reader.readC();
|
|
||||||
if (version>5) {
|
|
||||||
for (int i=0; i<ins->std.arpMacroLen; i++) {
|
|
||||||
ins->std.arpMacro[i]=reader.readI();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i=0; i<ins->std.arpMacroLen; i++) {
|
|
||||||
ins->std.arpMacro[i]=reader.readC();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ins->std.arpMacroLen>0) {
|
|
||||||
ins->std.arpMacroOpen=true;
|
|
||||||
ins->std.arpMacroLoop=reader.readC();
|
|
||||||
} else {
|
|
||||||
ins->std.arpMacroOpen=false;
|
|
||||||
}
|
|
||||||
if (version>8) { // TODO: when?
|
|
||||||
ins->std.arpMacroMode=reader.readC();
|
|
||||||
}
|
|
||||||
|
|
||||||
ins->std.dutyMacroLen=reader.readC();
|
|
||||||
if (version>5) {
|
|
||||||
for (int i=0; i<ins->std.dutyMacroLen; i++) {
|
|
||||||
ins->std.dutyMacro[i]=reader.readI();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i=0; i<ins->std.dutyMacroLen; i++) {
|
|
||||||
ins->std.dutyMacro[i]=reader.readC();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ins->std.dutyMacroLen>0) {
|
|
||||||
ins->std.dutyMacroOpen=true;
|
|
||||||
ins->std.dutyMacroLoop=reader.readC();
|
|
||||||
} else {
|
|
||||||
ins->std.dutyMacroOpen=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ins->std.waveMacroLen=reader.readC();
|
|
||||||
if (version>5) {
|
|
||||||
for (int i=0; i<ins->std.waveMacroLen; i++) {
|
|
||||||
ins->std.waveMacro[i]=reader.readI();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i=0; i<ins->std.waveMacroLen; i++) {
|
|
||||||
ins->std.waveMacro[i]=reader.readC();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ins->std.waveMacroLen>0) {
|
|
||||||
ins->std.waveMacroOpen=true;
|
|
||||||
ins->std.waveMacroLoop=reader.readC();
|
|
||||||
} else {
|
|
||||||
ins->std.waveMacroOpen=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ins->type==DIV_INS_C64) {
|
|
||||||
ins->c64.triOn=reader.readC();
|
|
||||||
ins->c64.sawOn=reader.readC();
|
|
||||||
ins->c64.pulseOn=reader.readC();
|
|
||||||
ins->c64.noiseOn=reader.readC();
|
|
||||||
|
|
||||||
ins->c64.a=reader.readC();
|
|
||||||
ins->c64.d=reader.readC();
|
|
||||||
ins->c64.s=reader.readC();
|
|
||||||
ins->c64.r=reader.readC();
|
|
||||||
|
|
||||||
ins->c64.duty=(reader.readC()*4095)/100;
|
|
||||||
|
|
||||||
ins->c64.ringMod=reader.readC();
|
|
||||||
ins->c64.oscSync=reader.readC();
|
|
||||||
ins->c64.toFilter=reader.readC();
|
|
||||||
if (version<0x07) { // TODO: UNSURE
|
|
||||||
ins->c64.volIsCutoff=reader.readI();
|
|
||||||
} else {
|
|
||||||
ins->c64.volIsCutoff=reader.readC();
|
|
||||||
}
|
|
||||||
ins->c64.initFilter=reader.readC();
|
|
||||||
|
|
||||||
ins->c64.res=reader.readC();
|
|
||||||
ins->c64.cut=(reader.readC()*2047)/100;
|
|
||||||
ins->c64.hp=reader.readC();
|
|
||||||
ins->c64.bp=reader.readC();
|
|
||||||
ins->c64.lp=reader.readC();
|
|
||||||
ins->c64.ch3off=reader.readC();
|
|
||||||
}
|
|
||||||
if (ins->type==DIV_INS_GB) {
|
|
||||||
ins->gb.envVol=reader.readC();
|
|
||||||
ins->gb.envDir=reader.readC();
|
|
||||||
ins->gb.envLen=reader.readC();
|
|
||||||
ins->gb.soundLen=reader.readC();
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} catch (EndOfFileException e) {
|
case DIV_INSFORMAT_TFI:
|
||||||
lastError="premature end of file";
|
try {
|
||||||
logE("premature end of file!\n");
|
reader.seek(0,SEEK_SET);
|
||||||
delete ins;
|
|
||||||
delete[] buf;
|
ins->type=DIV_INS_FM;
|
||||||
return false;
|
ins->name=pathRedux;
|
||||||
|
|
||||||
|
ins->fm.alg=reader.readC();
|
||||||
|
ins->fm.fb=reader.readC();
|
||||||
|
|
||||||
|
for (int i=0; i<4; i++) {
|
||||||
|
DivInstrumentFM::Operator& op=ins->fm.op[i];
|
||||||
|
|
||||||
|
op.mult=reader.readC();
|
||||||
|
op.dt=reader.readC();
|
||||||
|
op.tl=reader.readC();
|
||||||
|
op.rs=reader.readC();
|
||||||
|
op.ar=reader.readC();
|
||||||
|
op.dr=reader.readC();
|
||||||
|
op.d2r=reader.readC();
|
||||||
|
op.rr=reader.readC();
|
||||||
|
op.sl=reader.readC();
|
||||||
|
op.ssgEnv=reader.readC();
|
||||||
|
}
|
||||||
|
} catch (EndOfFileException e) {
|
||||||
|
lastError="premature end of file";
|
||||||
|
logE("premature end of file!\n");
|
||||||
|
delete ins;
|
||||||
|
delete[] buf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DIV_INSFORMAT_VGI:
|
||||||
|
try {
|
||||||
|
reader.seek(0,SEEK_SET);
|
||||||
|
|
||||||
|
ins->type=DIV_INS_FM;
|
||||||
|
ins->name=pathRedux;
|
||||||
|
|
||||||
|
ins->fm.alg=reader.readC();
|
||||||
|
ins->fm.fb=reader.readC();
|
||||||
|
unsigned char fmsams=reader.readC();
|
||||||
|
ins->fm.fms=fmsams&7;
|
||||||
|
ins->fm.ams=fmsams>>4;
|
||||||
|
|
||||||
|
for (int i=0; i<4; i++) {
|
||||||
|
DivInstrumentFM::Operator& op=ins->fm.op[i];
|
||||||
|
|
||||||
|
op.mult=reader.readC();
|
||||||
|
op.dt=reader.readC();
|
||||||
|
op.tl=reader.readC();
|
||||||
|
op.rs=reader.readC();
|
||||||
|
op.ar=reader.readC();
|
||||||
|
op.dr=reader.readC();
|
||||||
|
if (op.dr&0x80) {
|
||||||
|
op.am=1;
|
||||||
|
op.dr&=0x7f;
|
||||||
|
}
|
||||||
|
op.d2r=reader.readC();
|
||||||
|
op.rr=reader.readC();
|
||||||
|
op.sl=reader.readC();
|
||||||
|
op.ssgEnv=reader.readC();
|
||||||
|
}
|
||||||
|
} catch (EndOfFileException e) {
|
||||||
|
lastError="premature end of file";
|
||||||
|
logE("premature end of file!\n");
|
||||||
|
delete ins;
|
||||||
|
delete[] buf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DIV_INSFORMAT_FTI:
|
||||||
|
break;
|
||||||
|
case DIV_INSFORMAT_BTI:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reader.tell()<reader.size()) {
|
if (reader.tell()<reader.size()) {
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,8 @@
|
||||||
warnings+=(String("\n")+x); \
|
warnings+=(String("\n")+x); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DIV_VERSION "0.5.7pre3"
|
#define DIV_VERSION "0.5.7pre4"
|
||||||
#define DIV_ENGINE_VERSION 51
|
#define DIV_ENGINE_VERSION 52
|
||||||
|
|
||||||
enum DivStatusView {
|
enum DivStatusView {
|
||||||
DIV_STATUS_NOTHING=0,
|
DIV_STATUS_NOTHING=0,
|
||||||
|
|
|
||||||
|
|
@ -5585,6 +5585,8 @@ FurnaceGUI::FurnaceGUI():
|
||||||
loopRow(-1),
|
loopRow(-1),
|
||||||
loopEnd(-1),
|
loopEnd(-1),
|
||||||
isClipping(0),
|
isClipping(0),
|
||||||
|
extraChannelButtons(0),
|
||||||
|
patNameTarget(-1),
|
||||||
editControlsOpen(true),
|
editControlsOpen(true),
|
||||||
ordersOpen(true),
|
ordersOpen(true),
|
||||||
insListOpen(true),
|
insListOpen(true),
|
||||||
|
|
@ -5609,13 +5611,13 @@ FurnaceGUI::FurnaceGUI():
|
||||||
selecting(false),
|
selecting(false),
|
||||||
curNibble(false),
|
curNibble(false),
|
||||||
orderNibble(false),
|
orderNibble(false),
|
||||||
extraChannelButtons(false),
|
|
||||||
followOrders(true),
|
followOrders(true),
|
||||||
followPattern(true),
|
followPattern(true),
|
||||||
changeAllOrders(false),
|
changeAllOrders(false),
|
||||||
collapseWindow(false),
|
collapseWindow(false),
|
||||||
demandScrollX(false),
|
demandScrollX(false),
|
||||||
fancyPattern(false),
|
fancyPattern(false),
|
||||||
|
wantPatName(false),
|
||||||
curWindow(GUI_WINDOW_NOTHING),
|
curWindow(GUI_WINDOW_NOTHING),
|
||||||
nextWindow(GUI_WINDOW_NOTHING),
|
nextWindow(GUI_WINDOW_NOTHING),
|
||||||
wavePreviewOn(false),
|
wavePreviewOn(false),
|
||||||
|
|
|
||||||
|
|
@ -517,14 +517,14 @@ class FurnaceGUI {
|
||||||
char finalLayoutPath[4096];
|
char finalLayoutPath[4096];
|
||||||
|
|
||||||
int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor;
|
int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor;
|
||||||
int loopOrder, loopRow, loopEnd, isClipping;
|
int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget;
|
||||||
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
|
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
|
||||||
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
|
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
|
||||||
bool mixerOpen, debugOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen;
|
bool mixerOpen, debugOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen;
|
||||||
bool pianoOpen, notesOpen, channelsOpen;
|
bool pianoOpen, notesOpen, channelsOpen;
|
||||||
SelectionPoint selStart, selEnd, cursor;
|
SelectionPoint selStart, selEnd, cursor;
|
||||||
bool selecting, curNibble, orderNibble, extraChannelButtons, followOrders, followPattern, changeAllOrders;
|
bool selecting, curNibble, orderNibble, followOrders, followPattern, changeAllOrders;
|
||||||
bool collapseWindow, demandScrollX, fancyPattern;
|
bool collapseWindow, demandScrollX, fancyPattern, wantPatName;
|
||||||
FurnaceGUIWindows curWindow, nextWindow;
|
FurnaceGUIWindows curWindow, nextWindow;
|
||||||
float peak[2];
|
float peak[2];
|
||||||
float patChanX[DIV_MAX_CHANS+1];
|
float patChanX[DIV_MAX_CHANS+1];
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,12 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
#define _USE_MATH_DEFINES
|
#define _USE_MATH_DEFINES
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
#include "imgui_internal.h"
|
#include "imgui_internal.h"
|
||||||
#include "IconsFontAwesome4.h"
|
#include "IconsFontAwesome4.h"
|
||||||
|
#include "misc/cpp/imgui_stdlib.h"
|
||||||
#include "guiConst.h"
|
#include "guiConst.h"
|
||||||
#include <fmt/printf.h>
|
#include <fmt/printf.h>
|
||||||
|
|
||||||
|
|
@ -376,8 +378,8 @@ void FurnaceGUI::drawPattern() {
|
||||||
}
|
}
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Selectable(extraChannelButtons?" --##ExtraChannelButtons":" ++##ExtraChannelButtons",false,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) {
|
if (ImGui::Selectable((extraChannelButtons==2)?" --##ExtraChannelButtons":" ++##ExtraChannelButtons",false,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) {
|
||||||
extraChannelButtons=!extraChannelButtons;
|
if (++extraChannelButtons>2) extraChannelButtons=0;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
||||||
fancyPattern=!fancyPattern;
|
fancyPattern=!fancyPattern;
|
||||||
|
|
@ -448,7 +450,34 @@ void FurnaceGUI::drawPattern() {
|
||||||
if (settings.soloAction!=2) if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
if (settings.soloAction!=2) if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
||||||
e->toggleSolo(i);
|
e->toggleSolo(i);
|
||||||
}
|
}
|
||||||
if (extraChannelButtons) {
|
if (extraChannelButtons==2) {
|
||||||
|
DivPattern* pat=e->song.pat[i].getPattern(e->song.orders.ord[i][ord],true);
|
||||||
|
ImGui::PushFont(mainFont);
|
||||||
|
if (patNameTarget==i) {
|
||||||
|
snprintf(chanID,2048,"##PatNameI%d_%d",i,ord);
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(8.0f*dpiScale));
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX()+4.0f*dpiScale);
|
||||||
|
ImGui::InputText(chanID,&pat->name);
|
||||||
|
if (wantPatName) {
|
||||||
|
wantPatName=false;
|
||||||
|
ImGui::SetItemDefaultFocus();
|
||||||
|
ImGui::SetKeyboardFocusHere(-1);
|
||||||
|
} else {
|
||||||
|
if (!ImGui::IsItemActive()) {
|
||||||
|
patNameTarget=-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
snprintf(chanID,2048," %s##PatName%d",pat->name.c_str(),i);
|
||||||
|
if (ImGui::Selectable(chanID,true,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) {
|
||||||
|
patNameTarget=i;
|
||||||
|
wantPatName=true;
|
||||||
|
snprintf(chanID,2048,"##PatNameI%d_%d",i,ord);
|
||||||
|
ImGui::SetActiveID(ImGui::GetID(chanID),ImGui::GetCurrentWindow());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::PopFont();
|
||||||
|
} else if (extraChannelButtons==1) {
|
||||||
snprintf(chanID,2048,"%c##_HCH%d",e->song.chanCollapse[i]?'+':'-',i);
|
snprintf(chanID,2048,"%c##_HCH%d",e->song.chanCollapse[i]?'+':'-',i);
|
||||||
ImGui::SetCursorPosX(ImGui::GetCursorPosX()+4.0f*dpiScale);
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX()+4.0f*dpiScale);
|
||||||
if (ImGui::SmallButton(chanID)) {
|
if (ImGui::SmallButton(chanID)) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue