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,