Mercurial > hg > dmlib
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); |