diff minijss/jloadjss.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 fc58f62f100c
children fd02e78f6fdc
line wrap: on
line diff
--- a/minijss/jloadjss.c	Mon Jul 08 08:58:31 2019 +0300
+++ b/minijss/jloadjss.c	Mon Jul 08 10:06:18 2019 +0300
@@ -13,6 +13,7 @@
 #    define JM_SUP_PATMODE_3 1
 #    define JM_SUP_PATMODE_4 1
 #    define JM_SUP_PATMODE_5 1
+#    define JM_SUP_PATMODE_6 1
 #endif
 
 
@@ -253,6 +254,64 @@
 
     return DMERR_OK;
 }
+
+#undef JSFOREACHNOTE1
+#undef JSFOREACHNOTE2
+#endif
+
+
+#ifdef JM_SUP_PATMODE_6
+
+#undef JSGETBYTE
+#define JSGETBYTE(XV) if (!dmf_read_byte(inFile, XV)) return DMERR_OUT_OF_DATA
+
+#define JSFOREACHNOTE1 \
+    for (int row = 0; row < pattern->nrows; row++) \
+    for (int channel = 0; channel < pattern->nmap; channel++) { \
+        JSSNote *pnote = pattern->data + (pattern->nchannels * row) + pattern->map[channel];
+
+#define JSFOREACHNOTE2 }
+
+
+static int jssGetPatternRawHorizElem(DMResource *inFile, JSSPattern *pattern)
+{
+    Uint8 tmp;
+
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    if (tmp == 0)
+        pnote->note = jsetNotSet;
+    else if (tmp == 127)
+        pnote->note = jsetNoteOff;
+    else
+        pnote->note = tmp - 1;
+    JSFOREACHNOTE2
+
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    pnote->instrument = (tmp > 0) ? tmp - 1 : jsetNotSet;
+    JSFOREACHNOTE2
+
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    pnote->volume = (tmp > 0) ? tmp - 1 : jsetNotSet;
+    JSFOREACHNOTE2
+
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    pnote->effect = (tmp > 0) ? tmp - 1 : jsetNotSet;
+    JSFOREACHNOTE2
+
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    pnote->param = (tmp == 0 && pnote->effect == jsetNotSet) ? jsetNotSet : tmp;
+    JSFOREACHNOTE2
+
+    return DMERR_OK;
+}
+
+#undef JSFOREACHNOTE1
+#undef JSFOREACHNOTE2
 #endif
 
 
@@ -502,10 +561,15 @@
                 break;
 #endif
 #ifdef JM_SUP_PATMODE_5
-            case PATMODE_RAW_ELEM:
+            case PATMODE_RAW_ELEM_VERT:
                 ret = jssGetPatternRawVertElem(inFile, pattern);
                 break;
 #endif
+#ifdef JM_SUP_PATMODE_6
+            case PATMODE_RAW_ELEM_HORIZ:
+                ret = jssGetPatternRawHorizElem(inFile, pattern);
+                break;
+#endif
             default:
                 JSSERROR(DMERR_INVALID_DATA, DMERR_INVALID_DATA,
                 "Unsupported pattern mode %d. Check compilation options.",