changeset 223:9fa8e9326d18

Implement effect Rxy - multi retrig note.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 08 Oct 2012 00:20:20 +0300
parents 63be671823d3
children 81f3993412ae
files jssplr.c jssplr.h
diffstat 2 files changed, 42 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/jssplr.c	Mon Oct 08 00:19:59 2012 +0300
+++ b/jssplr.c	Mon Oct 08 00:20:20 2012 +0300
@@ -1044,7 +1044,10 @@
             break;
 
         case 'R':        // Rxy = Multi Retrig note
-            JMPDEBUG("Multi Retrig Note used, UNIMPLEMENTED");
+            if (paramX != 0)
+                chn->lastMultiRetrigParamX = paramX;
+            if (paramY != 0)
+                chn->lastMultiRetrigParamY = paramY;
             break;
 
         case 'T':        // Txy = Tremor
@@ -1335,6 +1338,40 @@
             }
             break;
 
+        case 'R':        // Rxy = Multi Retrig note
+            if (chn->lastMultiRetrigParamY != 0 &&
+                (mp->tick % chn->lastMultiRetrigParamY) == 0)
+            {
+                BOOL change = TRUE;
+                int volume = chn->volume;
+                switch (chn->lastMultiRetrigParamX)
+                {
+                    case 0x1: volume -= 1; break;
+                    case 0x2: volume -= 2; break;
+                    case 0x3: volume -= 4; break;
+                    case 0x4: volume -= 8; break;
+                    case 0x5: volume -= 16; break;
+                    case 0x6: volume  = (volume * 2) / 3; break;
+                    case 0x7: volume /= 2; break;
+
+                    case 0x9: volume += 1; break;
+                    case 0xA: volume += 2; break;
+                    case 0xB: volume += 4; break;
+                    case 0xC: volume += 8; break;
+                    case 0xD: volume += 16; break;
+                    case 0xE: volume  = (volume * 3) / 2; break;
+                    case 0xF: volume *= 2; break;
+                    default: change = FALSE;
+                }
+                jmpTriggerNote(mp, chn, FALSE);
+                if (change)
+                {
+                    chn->volume = dmClamp(volume, mpMinVol, mpMaxVol);
+                    JMPSETNDFLAGS(cdfNewVolume);
+                }
+            }
+            break;
+
         case 'T': // Txy = Tremor
             JMPMAKEPARAM(chn->iLastTremorParam, paramX, paramY)
             paramX++;
--- a/jssplr.h	Mon Oct 08 00:19:59 2012 +0300
+++ b/jssplr.h	Mon Oct 08 00:20:20 2012 +0300
@@ -90,10 +90,11 @@
             iLastTremorParam,
             iTremorCount,
             iLastSampleOffset,
-            iLastRetrigParam,
             iLastVolSlideParam,
-        
-            iRetrigNDFlags,         // For retrig-effect
+
+            lastMultiRetrigParamX,
+            lastMultiRetrigParamY,
+            
             iSaveNDFlags;           // For notedelay-effect
 } JSSPlayerChannel;