From: <sag...@us...> - 2011-10-02 13:31:49
|
Revision: 1074 http://modplug.svn.sourceforge.net/modplug/?rev=1074&view=rev Author: saga-games Date: 2011-10-02 13:31:42 +0000 (Sun, 02 Oct 2011) Log Message: ----------- [Imp] Mod Conversion: When converting XM to S3M/IT and there is pxx and Cxx in the same MODCOMMAND, the commands are swapped. [Mod] XM: Changed volcol panning import/export to use the full 0...64 range for more correct panning Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/modcommand.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-01 23:06:51 UTC (rev 1073) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-10-02 13:31:42 UTC (rev 1074) @@ -3136,16 +3136,8 @@ switch(gVolCmdInfo[ndx].dwVolCmd) { case VOLCMD_VOLUME: - *prangeMax = 64; - break; - case VOLCMD_PANNING: *prangeMax = 64; - if (m_SndFile.GetType() & MOD_TYPE_XM) - { - *prangeMin = 2; // 0*4+2 - *prangeMax = 62; // 15*4+2 - } break; default: Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2011-10-01 23:06:51 UTC (rev 1073) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2011-10-02 13:31:42 UTC (rev 1074) @@ -204,7 +204,7 @@ // B0-BF: Vibrato case 0xB0: p->volcmd = VOLCMD_VIBRATODEPTH; break; // C0-CF: Set Panning - case 0xC0: p->volcmd = VOLCMD_PANNING; p->vol = (vol << 2) + 2; break; + case 0xC0: p->volcmd = VOLCMD_PANNING; p->vol = (vol * 64 / 15); break; // D0-DF: Panning Slide Left case 0xD0: p->volcmd = VOLCMD_PANSLIDELEFT; break; // E0-EF: Panning Slide Right @@ -465,10 +465,10 @@ if (pIns->PanEnv.nLoopStart >= pIns->PanEnv.nLoopEnd) pIns->PanEnv.dwFlags &= ~ENV_LOOP; for (UINT ienv=0; ienv<12; ienv++) { - pIns->VolEnv.Ticks[ienv] = (WORD)xmsh.venv[ienv*2]; - pIns->VolEnv.Values[ienv] = (BYTE)xmsh.venv[ienv*2+1]; - pIns->PanEnv.Ticks[ienv] = (WORD)xmsh.penv[ienv*2]; - pIns->PanEnv.Values[ienv] = (BYTE)xmsh.penv[ienv*2+1]; + pIns->VolEnv.Ticks[ienv] = (WORD)xmsh.venv[ienv * 2]; + pIns->VolEnv.Values[ienv] = (BYTE)xmsh.venv[ienv * 2 + 1]; + pIns->PanEnv.Ticks[ienv] = (WORD)xmsh.penv[ienv * 2]; + pIns->PanEnv.Values[ienv] = (BYTE)xmsh.penv[ienv * 2 + 1]; if (ienv > 0) { // libmikmod code says: "Some broken XM editing program will only save the low byte of the position @@ -492,10 +492,10 @@ for (UINT j=0; j<96; j++) { if (xmsh.snum[j] < nsamples) - pIns->Keyboard[j+12] = samplemap[xmsh.snum[j]]; + pIns->Keyboard[j + 12] = samplemap[xmsh.snum[j]]; } // Reading samples - for (UINT ins=0; ins<nsamples; ins++) + for (UINT ins = 0; ins < nsamples; ins++) { if (dwMemPos + max(xmsh.shsize, sizeof(xmss)) > dwMemLength) return true; @@ -611,7 +611,7 @@ bMadeWithModPlug = true; } // Read midi config: "MIDI" - if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4944494D)) + if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream + dwMemPos))) == 0x4944494D)) { UINT len = *((DWORD *)(lpStream+dwMemPos+4)); dwMemPos += 8; @@ -625,7 +625,7 @@ bMadeWithModPlug = true; } // Read pattern names: "PNAM" - if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4d414e50)) + if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream + dwMemPos))) == 0x4d414e50)) { UINT len = *((DWORD *)(lpStream + dwMemPos + 4)); dwMemPos += 8; @@ -642,7 +642,7 @@ bMadeWithModPlug = true; } // Read channel names: "CNAM" - if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4d414e43)) + if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream + dwMemPos))) == 0x4d414e43)) { UINT len = *((DWORD *)(lpStream+dwMemPos+4)); dwMemPos += 8; @@ -651,7 +651,7 @@ UINT n = len / MAX_CHANNELNAME; for (UINT i=0; i<n; i++) { - memcpy(ChnSettings[i].szName, (lpStream+dwMemPos+i*MAX_CHANNELNAME), MAX_CHANNELNAME); + memcpy(ChnSettings[i].szName, (lpStream+dwMemPos + i * MAX_CHANNELNAME), MAX_CHANNELNAME); StringFixer::SetNullTerminator(ChnSettings[i].szName); } dwMemPos += len; @@ -855,7 +855,7 @@ case VOLCMD_FINEVOLUP: vol = 0x90 + (p->vol & 0x0F); break; case VOLCMD_VIBRATOSPEED: vol = 0xA0 + (p->vol & 0x0F); break; case VOLCMD_VIBRATODEPTH: vol = 0xB0 + (p->vol & 0x0F); break; - case VOLCMD_PANNING: vol = 0xC0 + (p->vol >> 2); if (vol > 0xCF) vol = 0xCF; break; + case VOLCMD_PANNING: vol = 0xC0 + (p->vol * 15 / 64); if (vol > 0xCF) vol = 0xCF; break; case VOLCMD_PANSLIDELEFT: vol = 0xD0 + (p->vol & 0x0F); break; case VOLCMD_PANSLIDERIGHT: vol = 0xE0 + (p->vol & 0x0F); break; case VOLCMD_TONEPORTAMENTO: vol = 0xF0 + (p->vol & 0x0F); break; Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-01 23:06:51 UTC (rev 1073) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2011-10-02 13:31:42 UTC (rev 1074) @@ -151,8 +151,15 @@ { m->volcmd = VOLCMD_VOLUME; m->vol = m->param; - if (m->vol > 0x40) m->vol = 0x40; + if(m->vol > 64) m->vol = 64; m->command = m->param = 0; + } else if(m->volcmd == VOLCMD_PANNING) + { + m->SwapEffects(); + m->volcmd = VOLCMD_VOLUME; + if(m->vol > 64) m->vol = 64; + m->command = CMD_S3MCMDEX; + m->param = 0x80 | (m->param * 15 / 64); // XM volcol panning is 4-Bit, so we can use 4-Bit panning here. } break; case CMD_PORTAMENTOUP: @@ -745,7 +752,8 @@ } CHANNELINDEX nScanChnMin = nChn, nScanChnMax = nChn; - MODCOMMAND *p = Patterns[nPat], *m; + MODCOMMAND * const p = Patterns[nPat].GetpModCommand(nRow, nScanChnMin); + MODCOMMAND *m; // Scan all channels if(nChn == CHANNELINDEX_INVALID) @@ -757,9 +765,9 @@ // Scan channel(s) for same effect type - if an effect of the same type is already present, exit. if(!bAllowMultipleEffects) { - for(CHANNELINDEX i = nScanChnMin; i <= nScanChnMax; i++) + m = p; + for(CHANNELINDEX i = nScanChnMin; i <= nScanChnMax; i++, m++) { - m = p + nRow * m_nChannels + i; if(!bIsVolumeEffect && m->command == nEffect) return true; if(bIsVolumeEffect && m->volcmd == nEffect) @@ -768,9 +776,9 @@ } // Easy case: check if there's some space left to put the effect somewhere - for(CHANNELINDEX i = nScanChnMin; i <= nScanChnMax; i++) + m = p; + for(CHANNELINDEX i = nScanChnMin; i <= nScanChnMax; i++, m++) { - m = p + nRow * m_nChannels + i; if(!bIsVolumeEffect && m->command == CMD_NONE) { m->command = nEffect; @@ -791,9 +799,9 @@ // Move some effects that also work in the volume column, so there's place for our new effect. if(!bIsVolumeEffect) { - for(CHANNELINDEX i = nScanChnMin; i <= nScanChnMax; i++) + m = p; + for(CHANNELINDEX i = nScanChnMin; i <= nScanChnMax; i++, m++) { - m = p + nRow * m_nChannels + i; switch(m->command) { case CMD_VOLUME: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |