add support for loading .vgi and .tfi instruments
This commit is contained in:
		
							parent
							
								
									3f57cf0951
								
							
						
					
					
						commit
						57c4e22d70
					
				|  | @ -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(); |         if (version>=11) { // 1.0
 | ||||||
|    |           try { | ||||||
|         switch (sys) { |             sys=reader.readC(); | ||||||
|           case 1: // YMU759
 |        | ||||||
|             ins->type=DIV_INS_FM; |             switch (sys) { | ||||||
|             break; |               case 1: // YMU759
 | ||||||
|           case 2: // Genesis
 |                 ins->type=DIV_INS_FM; | ||||||
|             ins->type=DIV_INS_FM; |                 break; | ||||||
|             break; |               case 2: // Genesis
 | ||||||
|           case 3: // SMS
 |                 ins->type=DIV_INS_FM; | ||||||
|             ins->type=DIV_INS_STD; |                 break; | ||||||
|             break; |               case 3: // SMS
 | ||||||
|           case 4: // Game Boy
 |                 ins->type=DIV_INS_STD; | ||||||
|             ins->type=DIV_INS_GB; |                 break; | ||||||
|             break; |               case 4: // Game Boy
 | ||||||
|           case 5: // PC Engine
 |                 ins->type=DIV_INS_GB; | ||||||
|             ins->type=DIV_INS_PCE; |                 break; | ||||||
|             break; |               case 5: // PC Engine
 | ||||||
|           case 6: // NES
 |                 ins->type=DIV_INS_PCE; | ||||||
|             ins->type=DIV_INS_STD; |                 break; | ||||||
|             break; |               case 6: // NES
 | ||||||
|           case 7: case 0x17: // C64
 |                 ins->type=DIV_INS_STD; | ||||||
|             ins->type=DIV_INS_C64; |                 break; | ||||||
|             break; |               case 7: case 0x17: // C64
 | ||||||
|           case 8: // Arcade
 |                 ins->type=DIV_INS_C64; | ||||||
|             ins->type=DIV_INS_FM; |                 break; | ||||||
|             break; |               case 8: // Arcade
 | ||||||
|           default: |                 ins->type=DIV_INS_FM; | ||||||
|             lastError="unknown instrument type!"; |                 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()) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 tildearrow
						tildearrow