changeset 204:d3a9a3804079

Implement pattern mode 5 in the JMOD jloader.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 07 Oct 2012 13:15:01 +0300
parents bed7457cd8da
children 9622c139cb9f
files jloadjss.c
diffstat 1 files changed, 49 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/jloadjss.c	Sun Oct 07 12:09:44 2012 +0300
+++ b/jloadjss.c	Sun Oct 07 13:15:01 2012 +0300
@@ -48,7 +48,7 @@
 #define JSGETBYTE(XV) if (!jsGetBufByte(buf, bufLeft, XV)) return DMERR_OUT_OF_DATA
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_1) || defined(JM_SUP_PATMODE_3)
+#if defined(JM_SUP_PATMODE_1) || defined(JM_SUP_PATMODE_3)
 static int jssGetConvertedNote(Uint8 **buf, size_t *bufLeft, JSSNote *note)
 {
     Uint8 tmp;
@@ -79,7 +79,7 @@
 #endif
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_2) || defined(JM_SUP_PATMODE_4)
+#if defined(JM_SUP_PATMODE_2) || defined(JM_SUP_PATMODE_4)
 static int jssGetCompressedNote(Uint8 **buf, size_t *bufLeft, JSSNote *note)
 {
     Uint8 packb, tmp;
@@ -150,7 +150,7 @@
 #endif
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_2)
+#ifdef JM_SUP_PATMODE_2
 static int jssGetPatternCompHoriz(Uint8 *buf, size_t *bufLeft, JSSPattern *pattern)
 {
     int row, channel;
@@ -172,7 +172,7 @@
 #endif
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_4)
+#ifdef JM_SUP_PATMODE_4
 static int jssGetPatternCompVert(Uint8 *buf, size_t *bufLeft, JSSPattern *pattern)
 {
     int row, channel;
@@ -194,7 +194,7 @@
 #endif
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_1)
+#ifdef JM_SUP_PATMODE_1
 static int jssGetPatternRawHoriz(Uint8 *buf, size_t *bufLeft, JSSPattern *pattern)
 {
     int row, channel;
@@ -216,7 +216,7 @@
 #endif
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_3)
+#ifdef JM_SUP_PATMODE_3
 static int jssGetPatternRawVert(Uint8 *buf, size_t *bufLeft, JSSPattern *pattern)
 {
     int row, channel;
@@ -238,14 +238,56 @@
 #endif
 
 
-#if defined(JM_SUP_PATMODE_ALL) || defined(JM_SUP_PATMODE_5)
+#ifdef JM_SUP_PATMODE_5
+
+#undef JSGETBYTE
+#define JSGETBYTE(XV) if (!jsGetBufByte(&buf, bufLeft, XV)) return DMERR_OUT_OF_DATA
+
+#define JSFOREACHNOTE1                                                              \
+  for (channel = 0; channel < pattern->nchannels; channel++)                        \
+  for (row = 0; row < pattern->nrows; row++) {                                      \
+      JSSNote *note = pattern->data + (pattern->nchannels * row) + channel;
+
+#define JSFOREACHNOTE2 }
+
 static int jssGetPatternRawVertElem(Uint8 *buf, size_t *bufLeft, JSSPattern *pattern)
 {
     int row, channel;
+    Uint8 tmp;
 
     assert(buf != NULL);
     assert(pattern != NULL);
 
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    if (tmp == 0)
+        note->note = jsetNotSet;
+    else if (tmp == 127)
+        note->note == jsetNoteOff;
+    else
+        note->note = tmp - 1;
+    JSFOREACHNOTE2
+    
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    note->instrument = tmp;
+    JSFOREACHNOTE2
+    
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    note->volume = tmp;
+    JSFOREACHNOTE2
+    
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    note->effect = tmp;
+    JSFOREACHNOTE2
+    
+    JSFOREACHNOTE1
+    JSGETBYTE(&tmp);
+    note->param = tmp;
+    JSFOREACHNOTE2
+
     return DMERR_OK;
 }
 #endif