comparison 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
comparison
equal deleted inserted replaced
2302:7c26b5f86ff7 2303:dcf1016f3d27
38 { 38 {
39 "Raw horizontal", 39 "Raw horizontal",
40 "Compressed horizontal (similar to XM modules)", 40 "Compressed horizontal (similar to XM modules)",
41 "Raw vertical", 41 "Raw vertical",
42 "Compressed vertical", 42 "Compressed vertical",
43 "Raw horizontal for each element",
43 "Raw vertical for each element", 44 "Raw vertical for each element",
44 }; 45 };
45 46
46 47
47 static const DMOptArg optList[] = 48 static const DMOptArg optList[] =
390 391
391 return DMERR_OK; 392 return DMERR_OK;
392 } 393 }
393 394
394 395
395 #define JSFOREACHNOTE1 \ 396 #define JSFOREACHNOTE1 \
396 for (channel = 0; channel < pattern->nchannels; channel++) \ 397 for (channel = 0; channel < pattern->nchannels; channel++) \
397 for (row = 0; row < pattern->nrows; row++) { \ 398 for (row = 0; row < pattern->nrows; row++) { \
398 const JSSNote *pnote = jssGetNotePtr(pattern, channel, row); \ 399 const JSSNote *pnote = jssGetNotePtr(pattern, channel, row); \
399 if (pnote != NULL) { 400 if (pnote != NULL) {
400 401
401 #define JSFOREACHNOTE2 } } 402 #define JSFOREACHNOTE2 } }
402 403
403 404
404 static int jssConvertPatternRawElem( 405 static int jssConvertPatternRawElemVert(
406 Uint8 *patBuf, const size_t patBufSize,
407 size_t *patSize, const JSSPattern *pattern)
408 {
409 Uint8 tmp;
410 int row, channel;
411 *patSize = 0;
412
413 JSFOREACHNOTE1;
414 if (pnote->note == jsetNotSet)
415 tmp = 0;
416 else
417 if (pnote->note == jsetNoteOff)
418 tmp = 127;
419 else
420 tmp = pnote->note + 1;
421
422 if (tmp > 0x7f)
423 JSSERROR(DMERR_BOUNDS, DMERR_BOUNDS, "Note value out of bounds %d > 0x7f.\n", tmp);
424
425 JSPUTBYTE(tmp);
426 JSFOREACHNOTE2;
427
428 JSFOREACHNOTE1;
429 JSCONVPUT(pnote->instrument, "Instrument");
430 JSFOREACHNOTE2;
431
432 JSFOREACHNOTE1;
433 JSCONVPUT(pnote->volume, "Volume");
434 JSFOREACHNOTE2;
435
436 JSFOREACHNOTE1;
437 JSCONVPUT(pnote->effect, "Effect");
438 JSFOREACHNOTE2;
439
440 JSFOREACHNOTE1;
441 tmp = (pnote->param != jsetNotSet) ? pnote->param : 0;
442 JSPUTBYTE(tmp);
443 JSFOREACHNOTE2;
444
445 return DMERR_OK;
446 }
447
448 #undef JSFOREACHNOTE1
449 #undef JSFOREACHNOTE2
450
451
452 #define JSFOREACHNOTE1 \
453 for (row = 0; row < pattern->nrows; row++) \
454 for (channel = 0; channel < pattern->nchannels; channel++) { \
455 const JSSNote *pnote = jssGetNotePtr(pattern, channel, row); \
456 if (pnote != NULL) {
457
458 #define JSFOREACHNOTE2 } }
459
460
461 static int jssConvertPatternRawElemHoriz(
405 Uint8 *patBuf, const size_t patBufSize, 462 Uint8 *patBuf, const size_t patBufSize,
406 size_t *patSize, const JSSPattern *pattern) 463 size_t *patSize, const JSSPattern *pattern)
407 { 464 {
408 Uint8 tmp; 465 Uint8 tmp;
409 int row, channel; 466 int row, channel;
608 ret = jssConvertPatternRawVert(patBuf, patBufSize, &dataSize, pattern); 665 ret = jssConvertPatternRawVert(patBuf, patBufSize, &dataSize, pattern);
609 break; 666 break;
610 case PATMODE_COMP_VERT: 667 case PATMODE_COMP_VERT:
611 ret = jssConvertPatternCompVert(patBuf, patBufSize, &dataSize, pattern); 668 ret = jssConvertPatternCompVert(patBuf, patBufSize, &dataSize, pattern);
612 break; 669 break;
613 case PATMODE_RAW_ELEM: 670 case PATMODE_RAW_ELEM_HORIZ:
614 ret = jssConvertPatternRawElem(patBuf, patBufSize, &dataSize, pattern); 671 ret = jssConvertPatternRawElemHoriz(patBuf, patBufSize, &dataSize, pattern);
672 break;
673 case PATMODE_RAW_ELEM_VERT:
674 ret = jssConvertPatternRawElemVert(patBuf, patBufSize, &dataSize, pattern);
615 break; 675 break;
616 default: 676 default:
617 JSSERROR(DMERR_INVALID_DATA, DMERR_INVALID_DATA, 677 JSSERROR(DMERR_INVALID_DATA, DMERR_INVALID_DATA,
618 "Unsupported pattern conversion mode %d for pattern #%d.\n", 678 "Unsupported pattern conversion mode %d for pattern #%d.\n",
619 patMode, index); 679 patMode, index);