comparison src/modplug/load_mdl.cxx @ 2218:6907fc39b53f

That didn't merge properly. I'll try again at some other point.
author William Pitcock <nenolod@atheme.org>
date Fri, 07 Dec 2007 12:13:37 -0600
parents 3673c7ec4ea2
children 107c1fed3d92
comparison
equal deleted inserted replaced
2217:6a4d667a9183 2218:6907fc39b53f
74 case 0xB0: param = data & 0x0F; command = CMD_GLOBALVOLSLIDE; break; 74 case 0xB0: param = data & 0x0F; command = CMD_GLOBALVOLSLIDE; break;
75 case 0xF0: param = ((data >> 8) & 0x0F) | 0xA0; break; 75 case 0xF0: param = ((data >> 8) & 0x0F) | 0xA0; break;
76 } 76 }
77 break; 77 break;
78 case 0x0F: command = CMD_SPEED; break; 78 case 0x0F: command = CMD_SPEED; break;
79 79 case 0x10: if ((param & 0xF0) != 0xE0) { command = CMD_VOLUMESLIDE; if ((param & 0xF0) == 0xF0) param = ((param << 4) | 0x0F); else param >>= 2; } break;
80 case 0x10: 80 case 0x20: if ((param & 0xF0) != 0xE0) { command = CMD_VOLUMESLIDE; if ((param & 0xF0) != 0xF0) param >>= 2; } break;
81 if ((param & 0xF0) != 0xE0) {
82 command = CMD_VOLUMESLIDE;
83 if ((param & 0xF0) == 0xF0) {
84 param = ((param << 4) | 0x0F);
85 } else {
86 param >>= 2;
87 if (param > 0xF)
88 param = 0xF;
89 param <<= 4;
90 }
91 }
92 break;
93 case 0x20:
94 if ((param & 0xF0) != 0xE0) {
95 command = CMD_VOLUMESLIDE;
96 if ((param & 0xF0) != 0xF0) {
97 param >>= 2;
98 if (param > 0xF)
99 param = 0xF;
100 }
101 }
102 break;
103
104 case 0x30: command = CMD_RETRIG; break; 81 case 0x30: command = CMD_RETRIG; break;
105 case 0x40: command = CMD_TREMOLO; break; 82 case 0x40: command = CMD_TREMOLO; break;
106 case 0x50: command = CMD_TREMOR; break; 83 case 0x50: command = CMD_TREMOR; break;
107 case 0xEF: if (param > 0xFF) param = 0xFF; command = CMD_OFFSET; break; 84 case 0xEF: if (param > 0xFF) param = 0xFF; command = CMD_OFFSET; break;
108 } 85 }
215 BYTE inspanenv[MAX_INSTRUMENTS]; 192 BYTE inspanenv[MAX_INSTRUMENTS];
216 LPCBYTE pvolenv, ppanenv, ppitchenv; 193 LPCBYTE pvolenv, ppanenv, ppitchenv;
217 UINT nvolenv, npanenv, npitchenv; 194 UINT nvolenv, npanenv, npitchenv;
218 195
219 if ((!lpStream) || (dwMemLength < 1024)) return FALSE; 196 if ((!lpStream) || (dwMemLength < 1024)) return FALSE;
220 if ((bswapLE32(pmsh->id) != 0x4C444D44) || ((pmsh->version & 0xF0) > 0x10)) return FALSE; 197 if ((pmsh->id != 0x4C444D44) || ((pmsh->version & 0xF0) > 0x10)) return FALSE;
221 memset(patterntracks, 0, sizeof(patterntracks)); 198 memset(patterntracks, 0, sizeof(patterntracks));
222 memset(smpinfo, 0, sizeof(smpinfo)); 199 memset(smpinfo, 0, sizeof(smpinfo));
223 memset(insvolenv, 0, sizeof(insvolenv)); 200 memset(insvolenv, 0, sizeof(insvolenv));
224 memset(inspanenv, 0, sizeof(inspanenv)); 201 memset(inspanenv, 0, sizeof(inspanenv));
225 dwMemPos = 5; 202 dwMemPos = 5;
226 dwTrackPos = 0; 203 dwTrackPos = 0;
227 pvolenv = ppanenv = ppitchenv = NULL; 204 pvolenv = ppanenv = ppitchenv = NULL;
228 nvolenv = npanenv = npitchenv = 0; 205 nvolenv = npanenv = npitchenv = 0;
229 m_nSamples = m_nInstruments = 0; 206 m_nSamples = m_nInstruments = 0;
230 m_dwSongFlags |= SONG_INSTRUMENTMODE;
231 while (dwMemPos+6 < dwMemLength) 207 while (dwMemPos+6 < dwMemLength)
232 { 208 {
233 block = *((WORD *)(lpStream+dwMemPos)); 209 block = *((WORD *)(lpStream+dwMemPos));
234 blocklen = *((DWORD *)(lpStream+dwMemPos+2)); 210 blocklen = *((DWORD *)(lpStream+dwMemPos+2));
235 block = bswapLE16(block);
236 blocklen = bswapLE32(blocklen);
237 dwMemPos += 6; 211 dwMemPos += 6;
238 if (dwMemPos + blocklen > dwMemLength) 212 if (dwMemPos + blocklen > dwMemLength)
239 { 213 {
240 if (dwMemPos == 11) return FALSE; 214 if (dwMemPos == 11) return FALSE;
241 break; 215 break;
244 { 218 {
245 // IN: infoblock 219 // IN: infoblock
246 case 0x4E49: 220 case 0x4E49:
247 pmib = (MDLINFOBLOCK *)(lpStream+dwMemPos); 221 pmib = (MDLINFOBLOCK *)(lpStream+dwMemPos);
248 memcpy(m_szNames[0], pmib->songname, 32); 222 memcpy(m_szNames[0], pmib->songname, 32);
249 norders = bswapLE16(pmib->norders); 223 norders = pmib->norders;
250 if (norders > MAX_ORDERS) norders = MAX_ORDERS; 224 if (norders > MAX_ORDERS) norders = MAX_ORDERS;
251 m_nRestartPos = bswapLE16(pmib->repeatpos); 225 m_nRestartPos = pmib->repeatpos;
252 m_nDefaultGlobalVolume = pmib->globalvol; 226 m_nDefaultGlobalVolume = pmib->globalvol;
253 if (m_nDefaultGlobalVolume == 255)
254 m_nDefaultGlobalVolume++;
255 m_nDefaultTempo = pmib->tempo; 227 m_nDefaultTempo = pmib->tempo;
256 m_nDefaultSpeed = pmib->speed; 228 m_nDefaultSpeed = pmib->speed;
257 m_nChannels = 4; 229 m_nChannels = 4;
258 for (i=0; i<32; i++) 230 for (i=0; i<32; i++)
259 { 231 {
288 { 260 {
289 if (dwPos+18 >= dwMemLength) break; 261 if (dwPos+18 >= dwMemLength) break;
290 pmpd = (MDLPATTERNDATA *)(lpStream + dwPos); 262 pmpd = (MDLPATTERNDATA *)(lpStream + dwPos);
291 if (pmpd->channels > 32) break; 263 if (pmpd->channels > 32) break;
292 PatternSize[i] = pmpd->lastrow+1; 264 PatternSize[i] = pmpd->lastrow+1;
293 PatternAllocSize[i] = pmpd->lastrow+1;
294 if (m_nChannels < pmpd->channels) m_nChannels = pmpd->channels; 265 if (m_nChannels < pmpd->channels) m_nChannels = pmpd->channels;
295 dwPos += 18 + 2*pmpd->channels; 266 dwPos += 18 + 2*pmpd->channels;
296 for (j=0; j<pmpd->channels; j++) 267 for (j=0; j<pmpd->channels; j++)
297 { 268 {
298 patterntracks[i*32+j] = bswapLE16(pmpd->data[j]); 269 patterntracks[i*32+j] = pmpd->data[j];
299 } 270 }
300 } 271 }
301 break; 272 break;
302 // TR: Track Data 273 // TR: Track Data
303 case 0x5254: 274 case 0x5254:
304 if (dwTrackPos) break; 275 if (dwTrackPos) break;
305 ntracks = *((WORD *)(lpStream+dwMemPos)); 276 ntracks = *((WORD *)(lpStream+dwMemPos));
306 ntracks = bswapLE16(ntracks);
307 dwTrackPos = dwMemPos+2; 277 dwTrackPos = dwMemPos+2;
308 break; 278 break;
309 // II: Instruments 279 // II: Instruments
310 case 0x4949: 280 case 0x4949:
311 ninstruments = lpStream[dwMemPos]; 281 ninstruments = lpStream[dwMemPos];
320 UINT note = 12; 290 UINT note = 12;
321 if ((Headers[nins] = new INSTRUMENTHEADER) == NULL) break; 291 if ((Headers[nins] = new INSTRUMENTHEADER) == NULL) break;
322 INSTRUMENTHEADER *penv = Headers[nins]; 292 INSTRUMENTHEADER *penv = Headers[nins];
323 memset(penv, 0, sizeof(INSTRUMENTHEADER)); 293 memset(penv, 0, sizeof(INSTRUMENTHEADER));
324 memcpy(penv->name, lpStream+dwPos+2, 32); 294 memcpy(penv->name, lpStream+dwPos+2, 32);
325 penv->nGlobalVol = 128; 295 penv->nGlobalVol = 64;
326 penv->nPPC = 5*12; 296 penv->nPPC = 5*12;
327 for (j=0; j<lpStream[dwPos+1]; j++) 297 for (j=0; j<lpStream[dwPos+1]; j++)
328 { 298 {
329 const BYTE *ps = lpStream+dwPos+34+14*j; 299 const BYTE *ps = lpStream+dwPos+34+14*j;
330 while ((note < (UINT)(ps[1]+12)) && (note < 120)) 300 while ((note < (UINT)(ps[1]+12)) && (note < 120))
393 if (m_nSamples < nins) m_nSamples = nins; 363 if (m_nSamples < nins) m_nSamples = nins;
394 MODINSTRUMENT *pins = &Ins[nins]; 364 MODINSTRUMENT *pins = &Ins[nins];
395 memcpy(m_szNames[nins], lpStream+dwPos+1, 32); 365 memcpy(m_szNames[nins], lpStream+dwPos+1, 32);
396 memcpy(pins->name, lpStream+dwPos+33, 8); 366 memcpy(pins->name, lpStream+dwPos+33, 8);
397 pins->nC4Speed = *((DWORD *)(lpStream+dwPos+41)); 367 pins->nC4Speed = *((DWORD *)(lpStream+dwPos+41));
398 pins->nC4Speed = bswapLE32(pins->nC4Speed);
399 pins->nLength = *((DWORD *)(lpStream+dwPos+45)); 368 pins->nLength = *((DWORD *)(lpStream+dwPos+45));
400 pins->nLength = bswapLE32(pins->nLength);
401 pins->nLoopStart = *((DWORD *)(lpStream+dwPos+49)); 369 pins->nLoopStart = *((DWORD *)(lpStream+dwPos+49));
402 pins->nLoopStart = bswapLE32(pins->nLoopStart);
403 pins->nLoopEnd = pins->nLoopStart + *((DWORD *)(lpStream+dwPos+53)); 370 pins->nLoopEnd = pins->nLoopStart + *((DWORD *)(lpStream+dwPos+53));
404 pins->nLoopEnd = bswapLE32(pins->nLoopEnd);
405 if (pins->nLoopEnd > pins->nLoopStart) pins->uFlags |= CHN_LOOP; 371 if (pins->nLoopEnd > pins->nLoopStart) pins->uFlags |= CHN_LOOP;
406 pins->nGlobalVol = 64; 372 pins->nGlobalVol = 64;
407 if (lpStream[dwPos+58] & 0x01) 373 if (lpStream[dwPos+58] & 0x01)
408 { 374 {
409 pins->uFlags |= CHN_16BIT; 375 pins->uFlags |= CHN_16BIT;
426 { 392 {
427 dwPos += ReadSample(pins, flags, (LPSTR)(lpStream+dwPos), dwMemLength - dwPos); 393 dwPos += ReadSample(pins, flags, (LPSTR)(lpStream+dwPos), dwMemLength - dwPos);
428 } else 394 } else
429 { 395 {
430 DWORD dwLen = *((DWORD *)(lpStream+dwPos)); 396 DWORD dwLen = *((DWORD *)(lpStream+dwPos));
431 dwLen = bswapLE32(dwLen);
432 dwPos += 4; 397 dwPos += 4;
433 if ((dwPos+dwLen <= dwMemLength) && (dwLen > 4)) 398 if ((dwPos+dwLen <= dwMemLength) && (dwLen > 4))
434 { 399 {
435 flags = (pins->uFlags & CHN_16BIT) ? RS_MDL16 : RS_MDL8; 400 flags = (pins->uFlags & CHN_16BIT) ? RS_MDL16 : RS_MDL8;
436 ReadSample(pins, flags, (LPSTR)(lpStream+dwPos), dwLen); 401 ReadSample(pins, flags, (LPSTR)(lpStream+dwPos), dwLen);
464 { 429 {
465 LPCBYTE pve = pvolenv; 430 LPCBYTE pve = pvolenv;
466 for (UINT nve=0; nve<nvolenv; nve++, pve+=33) if (pve[0]+1 == insvolenv[iIns]) 431 for (UINT nve=0; nve<nvolenv; nve++, pve+=33) if (pve[0]+1 == insvolenv[iIns])
467 { 432 {
468 WORD vtick = 1; 433 WORD vtick = 1;
469 penv->VolEnv.nNodes = 15; 434 penv->nVolEnv = 15;
470 for (UINT iv=0; iv<15; iv++) 435 for (UINT iv=0; iv<15; iv++)
471 { 436 {
472 if (iv) vtick += pve[iv*2+1]; 437 if (iv) vtick += pve[iv*2+1];
473 penv->VolEnv.Ticks[iv] = vtick; 438 penv->VolPoints[iv] = vtick;
474 penv->VolEnv.Values[iv] = pve[iv*2+2]; 439 penv->VolEnv[iv] = pve[iv*2+2];
475 if (!pve[iv*2+1]) 440 if (!pve[iv*2+1])
476 { 441 {
477 penv->VolEnv.nNodes = iv+1; 442 penv->nVolEnv = iv+1;
478 break; 443 break;
479 } 444 }
480 } 445 }
481 penv->VolEnv.nSustainStart = penv->VolEnv.nSustainEnd = pve[31] & 0x0F; 446 penv->nVolSustainBegin = penv->nVolSustainEnd = pve[31] & 0x0F;
482 if (pve[31] & 0x10) penv->dwFlags |= ENV_VOLSUSTAIN; 447 if (pve[31] & 0x10) penv->dwFlags |= ENV_VOLSUSTAIN;
483 if (pve[31] & 0x20) penv->dwFlags |= ENV_VOLLOOP; 448 if (pve[31] & 0x20) penv->dwFlags |= ENV_VOLLOOP;
484 penv->VolEnv.nLoopStart = pve[32] & 0x0F; 449 penv->nVolLoopStart = pve[32] & 0x0F;
485 penv->VolEnv.nLoopEnd = pve[32] >> 4; 450 penv->nVolLoopEnd = pve[32] >> 4;
486 } 451 }
487 } 452 }
488 // Setup panning envelope 453 // Setup panning envelope
489 if ((npanenv) && (ppanenv) && (inspanenv[iIns])) 454 if ((npanenv) && (ppanenv) && (inspanenv[iIns]))
490 { 455 {
491 LPCBYTE ppe = ppanenv; 456 LPCBYTE ppe = ppanenv;
492 for (UINT npe=0; npe<npanenv; npe++, ppe+=33) if (ppe[0]+1 == inspanenv[iIns]) 457 for (UINT npe=0; npe<npanenv; npe++, ppe+=33) if (ppe[0]+1 == inspanenv[iIns])
493 { 458 {
494 WORD vtick = 1; 459 WORD vtick = 1;
495 penv->PanEnv.nNodes = 15; 460 penv->nPanEnv = 15;
496 for (UINT iv=0; iv<15; iv++) 461 for (UINT iv=0; iv<15; iv++)
497 { 462 {
498 if (iv) vtick += ppe[iv*2+1]; 463 if (iv) vtick += ppe[iv*2+1];
499 penv->PanEnv.Ticks[iv] = vtick; 464 penv->PanPoints[iv] = vtick;
500 penv->PanEnv.Values[iv] = ppe[iv*2+2]; 465 penv->PanEnv[iv] = ppe[iv*2+2];
501 if (!ppe[iv*2+1]) 466 if (!ppe[iv*2+1])
502 { 467 {
503 penv->PanEnv.nNodes = iv+1; 468 penv->nPanEnv = iv+1;
504 break; 469 break;
505 } 470 }
506 } 471 }
507 if (ppe[31] & 0x10) penv->dwFlags |= ENV_PANSUSTAIN; 472 if (ppe[31] & 0x10) penv->dwFlags |= ENV_PANSUSTAIN;
508 if (ppe[31] & 0x20) penv->dwFlags |= ENV_PANLOOP; 473 if (ppe[31] & 0x20) penv->dwFlags |= ENV_PANLOOP;
509 penv->PanEnv.nLoopStart = ppe[32] & 0x0F; 474 penv->nPanLoopStart = ppe[32] & 0x0F;
510 penv->PanEnv.nLoopEnd = ppe[32] >> 4; 475 penv->nPanLoopEnd = ppe[32] >> 4;
511 } 476 }
512 } 477 }
513 } 478 }
514 m_dwSongFlags |= SONG_LINEARSLIDES; 479 m_dwSongFlags |= SONG_LINEARSLIDES;
515 m_nType = MOD_TYPE_MDL; 480 m_nType = MOD_TYPE_MDL;