Mercurial > hg > dmlib
diff tools/xm2jss.c @ 2303:dcf1016f3d27
Implement new (horizontal raw element) pattern storage mode for JSSMOD. Bump
JSSMOD format version.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 08 Jul 2019 10:06:18 +0300 |
parents | 6c3c3355007d |
children | 36edd316184a |
line wrap: on
line diff
--- a/tools/xm2jss.c Mon Jul 08 08:58:31 2019 +0300 +++ b/tools/xm2jss.c Mon Jul 08 10:06:18 2019 +0300 @@ -40,6 +40,7 @@ "Compressed horizontal (similar to XM modules)", "Raw vertical", "Compressed vertical", + "Raw horizontal for each element", "Raw vertical for each element", }; @@ -392,16 +393,72 @@ } -#define JSFOREACHNOTE1 \ - for (channel = 0; channel < pattern->nchannels; channel++) \ - for (row = 0; row < pattern->nrows; row++) { \ +#define JSFOREACHNOTE1 \ + for (channel = 0; channel < pattern->nchannels; channel++) \ + for (row = 0; row < pattern->nrows; row++) { \ const JSSNote *pnote = jssGetNotePtr(pattern, channel, row); \ if (pnote != NULL) { #define JSFOREACHNOTE2 } } -static int jssConvertPatternRawElem( +static int jssConvertPatternRawElemVert( + Uint8 *patBuf, const size_t patBufSize, + size_t *patSize, const JSSPattern *pattern) +{ + Uint8 tmp; + int row, channel; + *patSize = 0; + + JSFOREACHNOTE1; + if (pnote->note == jsetNotSet) + tmp = 0; + else + if (pnote->note == jsetNoteOff) + tmp = 127; + else + tmp = pnote->note + 1; + + if (tmp > 0x7f) + JSSERROR(DMERR_BOUNDS, DMERR_BOUNDS, "Note value out of bounds %d > 0x7f.\n", tmp); + + JSPUTBYTE(tmp); + JSFOREACHNOTE2; + + JSFOREACHNOTE1; + JSCONVPUT(pnote->instrument, "Instrument"); + JSFOREACHNOTE2; + + JSFOREACHNOTE1; + JSCONVPUT(pnote->volume, "Volume"); + JSFOREACHNOTE2; + + JSFOREACHNOTE1; + JSCONVPUT(pnote->effect, "Effect"); + JSFOREACHNOTE2; + + JSFOREACHNOTE1; + tmp = (pnote->param != jsetNotSet) ? pnote->param : 0; + JSPUTBYTE(tmp); + JSFOREACHNOTE2; + + return DMERR_OK; +} + +#undef JSFOREACHNOTE1 +#undef JSFOREACHNOTE2 + + +#define JSFOREACHNOTE1 \ + for (row = 0; row < pattern->nrows; row++) \ + for (channel = 0; channel < pattern->nchannels; channel++) { \ + const JSSNote *pnote = jssGetNotePtr(pattern, channel, row); \ + if (pnote != NULL) { + +#define JSFOREACHNOTE2 } } + + +static int jssConvertPatternRawElemHoriz( Uint8 *patBuf, const size_t patBufSize, size_t *patSize, const JSSPattern *pattern) { @@ -610,8 +667,11 @@ case PATMODE_COMP_VERT: ret = jssConvertPatternCompVert(patBuf, patBufSize, &dataSize, pattern); break; - case PATMODE_RAW_ELEM: - ret = jssConvertPatternRawElem(patBuf, patBufSize, &dataSize, pattern); + case PATMODE_RAW_ELEM_HORIZ: + ret = jssConvertPatternRawElemHoriz(patBuf, patBufSize, &dataSize, pattern); + break; + case PATMODE_RAW_ELEM_VERT: + ret = jssConvertPatternRawElemVert(patBuf, patBufSize, &dataSize, pattern); break; default: JSSERROR(DMERR_INVALID_DATA, DMERR_INVALID_DATA,