diff src/modplug/load_mt2.cxx @ 2337:107c1fed3d92

Port Schism modplug core.
author "Tony Vroon <chainsaw@gentoo.org>"
date Thu, 24 Jan 2008 12:05:59 +0000
parents 6907fc39b53f
children
line wrap: on
line diff
--- a/src/modplug/load_mt2.cxx	Wed Jan 23 19:37:05 2008 +0100
+++ b/src/modplug/load_mt2.cxx	Thu Jan 24 12:05:59 2008 +0000
@@ -282,6 +282,7 @@
 			Log("Pattern #%d @%04X: %d lines, %d bytes\n", iPat, dwMemPos-6, nLines, pmp->wDataLen);
 	#endif
 			PatternSize[iPat] = nLines;
+			PatternAllocSize[iPat] = nLines;
 			Patterns[iPat] = AllocatePattern(nLines, m_nChannels);
 			if (!Patterns[iPat]) return TRUE;
 			MODCOMMAND *m = Patterns[iPat];
@@ -395,6 +396,7 @@
 #endif
 	memset(InstrMap, 0, sizeof(InstrMap));
 	m_nInstruments = (pfh->wInstruments < MAX_INSTRUMENTS) ? pfh->wInstruments : MAX_INSTRUMENTS-1;
+	m_dwSongFlags |= SONG_INSTRUMENTMODE;
 	for (UINT iIns=1; iIns<=255; iIns++)
 	{
 		if (dwMemPos+36 > dwMemLength) return TRUE;
@@ -408,7 +410,7 @@
 			{
 				memset(penv, 0, sizeof(INSTRUMENTHEADER));
 				memcpy(penv->name, pmi->szName, 32);
-				penv->nGlobalVol = 64;
+				penv->nGlobalVol = 128;
 				penv->nPan = 128;
 				for (UINT i=0; i<120; i++)
 				{
@@ -460,7 +462,7 @@
 				for (UINT iEnv=0; iEnv<4; iEnv++) if (pehdr[iEnv])
 				{
 					MT2ENVELOPE *pme = pehdr[iEnv];
-					WORD *pEnvPoints = NULL;
+					int *pEnvPoints = NULL;
 					BYTE *pEnvData = NULL;
 				#ifdef MT2DEBUG
 					Log("  Env %d.%d @%04X: %d points\n", iIns, iEnv, (UINT)(((BYTE *)pme)-lpStream), pme->nPoints);
@@ -472,12 +474,12 @@
 						if (pme->nFlags & 1) penv->dwFlags |= ENV_VOLUME;
 						if (pme->nFlags & 2) penv->dwFlags |= ENV_VOLSUSTAIN;
 						if (pme->nFlags & 4) penv->dwFlags |= ENV_VOLLOOP;
-						penv->nVolEnv = (pme->nPoints > 16) ? 16 : pme->nPoints;
-						penv->nVolSustainBegin = penv->nVolSustainEnd = pme->nSustainPos;
-						penv->nVolLoopStart = pme->nLoopStart;
-						penv->nVolLoopEnd = pme->nLoopEnd;
-						pEnvPoints = penv->VolPoints;
-						pEnvData = penv->VolEnv;
+						penv->VolEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
+						penv->VolEnv.nSustainStart = penv->VolEnv.nSustainEnd = pme->nSustainPos;
+						penv->VolEnv.nLoopStart = pme->nLoopStart;
+						penv->VolEnv.nLoopEnd = pme->nLoopEnd;
+						pEnvPoints = penv->VolEnv.Ticks;
+						pEnvData = penv->VolEnv.Values;
 						break;
 
 					// Panning Envelope
@@ -485,12 +487,12 @@
 						if (pme->nFlags & 1) penv->dwFlags |= ENV_PANNING;
 						if (pme->nFlags & 2) penv->dwFlags |= ENV_PANSUSTAIN;
 						if (pme->nFlags & 4) penv->dwFlags |= ENV_PANLOOP;
-						penv->nPanEnv = (pme->nPoints > 16) ? 16 : pme->nPoints;
-						penv->nPanSustainBegin = penv->nPanSustainEnd = pme->nSustainPos;
-						penv->nPanLoopStart = pme->nLoopStart;
-						penv->nPanLoopEnd = pme->nLoopEnd;
-						pEnvPoints = penv->PanPoints;
-						pEnvData = penv->PanEnv;
+						penv->PanEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
+						penv->PanEnv.nSustainStart = penv->PanEnv.nSustainEnd = pme->nSustainPos;
+						penv->PanEnv.nLoopStart = pme->nLoopStart;
+						penv->PanEnv.nLoopEnd = pme->nLoopEnd;
+						pEnvPoints = penv->PanEnv.Ticks;
+						pEnvData = penv->PanEnv.Values;
 						break;
 
 					// Pitch/Filter envelope
@@ -498,12 +500,12 @@
 						if (pme->nFlags & 1) penv->dwFlags |= (iEnv==3) ? (ENV_PITCH|ENV_FILTER) : ENV_PITCH;
 						if (pme->nFlags & 2) penv->dwFlags |= ENV_PITCHSUSTAIN;
 						if (pme->nFlags & 4) penv->dwFlags |= ENV_PITCHLOOP;
-						penv->nPitchEnv = (pme->nPoints > 16) ? 16 : pme->nPoints;
-						penv->nPitchSustainBegin = penv->nPitchSustainEnd = pme->nSustainPos;
-						penv->nPitchLoopStart = pme->nLoopStart;
-						penv->nPitchLoopEnd = pme->nLoopEnd;
-						pEnvPoints = penv->PitchPoints;
-						pEnvData = penv->PitchEnv;
+						penv->PitchEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints;
+						penv->PitchEnv.nSustainStart = penv->PitchEnv.nSustainEnd = pme->nSustainPos;
+						penv->PitchEnv.nLoopStart = pme->nLoopStart;
+						penv->PitchEnv.nLoopEnd = pme->nLoopEnd;
+						pEnvPoints = penv->PitchEnv.Ticks;
+						pEnvData = penv->PitchEnv.Values;
 					}
 					// Envelope data
 					if ((pEnvPoints) && (pEnvData) && (pedata[iEnv]))
@@ -592,7 +594,7 @@
 							Ins[nSmp].nVibType = pmi->bVibType;
 							Ins[nSmp].nVibSweep = pmi->bVibSweep;
 							Ins[nSmp].nVibDepth = pmi->bVibDepth;
-							Ins[nSmp].nVibRate = pmi->bVibRate;
+							Ins[nSmp].nVibRate = pmi->bVibRate/4;
 						}
 					}
 				}