Ver Fonte

slide up and down

SG há 3 anos atrás
pai
commit
dfbedebe3c
1 ficheiros alterados com 58 adições e 51 exclusões
  1. 58 51
      zero_tracker.c

+ 58 - 51
zero_tracker.c

@@ -9,7 +9,7 @@
  * FEDCBA98 76543210
  * nnnnnnee eedddddd
  * -------- --------
- * nnnnnn            = [0] do nothing, [1..60] note number, [61] note kill, [62..63] not used
+ * nnnnnn            = [0] do nothing, [1..60] note number, [61] note off, [62..63] not used
  *       ee ee       = [0..F] effect 
  *            111222 = [0..63] or [0..7, 0..7] effect data 
  */
@@ -76,9 +76,11 @@ typedef uint16_t NoteRecord;
 #define NOTE_A6 58
 #define NOTE_As6 59
 #define NOTE_B6 60
-#define NOTE_KILL 63
+#define NOTE_OFF 63
 
-#define EFFECT_ARPEGGIO 0
+#define EFFECT_ARPEGGIO 0x00
+#define EFFECT_SLIDE_UP 0x01
+#define EFFECT_SLIDE_DOWN 0x02
 
 #define EFFECT_DATA_NONE 0
 
@@ -150,17 +152,17 @@ NoteRow _row = {
             RECORD_MAKE(NOTE_E4, 0, 0),
             RECORD_MAKE(NOTE_C3, 0, 0),
             RECORD_MAKE(NOTE_E4, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_E5, 0, 0),
             RECORD_MAKE(NOTE_E5, 0, 0),
             RECORD_MAKE(NOTE_E5, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_D5, 0, 0),
             RECORD_MAKE(NOTE_C3, 0, 0),
@@ -170,7 +172,7 @@ NoteRow _row = {
             RECORD_MAKE(NOTE_C5, 0, 0),
             RECORD_MAKE(NOTE_C3, 0, 0),
             RECORD_MAKE(NOTE_C5, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(0, 0, 0),
@@ -180,7 +182,7 @@ NoteRow _row = {
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_B4, 0, 0),
             RECORD_MAKE(NOTE_D3, 0, 0),
@@ -190,17 +192,17 @@ NoteRow _row = {
             RECORD_MAKE(NOTE_E4, 0, 0),
             RECORD_MAKE(NOTE_D3, 0, 0),
             RECORD_MAKE(NOTE_E4, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_E5, 0, 0),
             RECORD_MAKE(NOTE_E5, 0, 0),
             RECORD_MAKE(NOTE_E5, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_D5, 0, 0),
             RECORD_MAKE(NOTE_D3, 0, 0),
@@ -210,7 +212,7 @@ NoteRow _row = {
             RECORD_MAKE(NOTE_C5, 0, 0),
             RECORD_MAKE(NOTE_D3, 0, 0),
             RECORD_MAKE(NOTE_C5, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(0, 0, 0),
@@ -220,7 +222,7 @@ NoteRow _row = {
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
             RECORD_MAKE(NOTE_A4, 0, 0),
-            RECORD_MAKE(NOTE_KILL, 0, 0),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
         },
 };
 
@@ -228,81 +230,81 @@ NoteRow row = {
     .notes =
         {
             //
-            RECORD_MAKE(NOTE_A4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            //
-            RECORD_MAKE(NOTE_KILL, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
+            RECORD_MAKE(NOTE_C4, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
+            RECORD_MAKE(NOTE_C4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
+            //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
-            RECORD_MAKE(NOTE_A4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            //
-            RECORD_MAKE(NOTE_KILL, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
+            RECORD_MAKE(NOTE_C4, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
+            RECORD_MAKE(NOTE_C4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
+            //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
-            RECORD_MAKE(NOTE_A4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            //
-            RECORD_MAKE(NOTE_KILL, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
+            RECORD_MAKE(NOTE_C4, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
+            RECORD_MAKE(NOTE_D4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
+            //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
-            RECORD_MAKE(NOTE_A4, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 7)),
-            //
-            RECORD_MAKE(NOTE_KILL, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
-            RECORD_MAKE(0, 0, 0),
+            RECORD_MAKE(NOTE_C4, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(0, EFFECT_SLIDE_DOWN, 0x3F),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
             //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             //
+            RECORD_MAKE(NOTE_A3, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(0, EFFECT_ARPEGGIO, EFFECT_DATA_2(3, 5)),
+            RECORD_MAKE(NOTE_OFF, 0, 0),
+            //
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
             RECORD_MAKE(0, 0, 0),
@@ -324,15 +326,20 @@ void tracker_interrupt_body() {
 
     // load frequency from note at tick 0
     if(tick_counter == 0) {
-        if(note == NOTE_KILL) {
+        if(note == NOTE_OFF) {
             note_play = false;
-        } else if((note > 0) && (note < NOTE_KILL)) {
+        } else if((note > 0) && (note < NOTE_OFF)) {
             note_play = true;
             note_frequency = note_to_freq(note);
         }
     }
 
     if(note_play) {
+        if((effect == EFFECT_SLIDE_UP || effect == EFFECT_SLIDE_DOWN) &&
+           data != EFFECT_DATA_NONE) {
+            note_frequency += (effect == EFFECT_SLIDE_UP ? 1 : -1) * data;
+        }
+
         float frequency = note_frequency;
 
         // apply arpeggio effect