]> git.cworth.org Git - mnemon/blobdiff - mnemon.c
Add a new repeat option
[mnemon] / mnemon.c
index 054e21cb59494210f1eccfb6b236482beb6ca92f..c334f22d7ef0915289fd9ed20f229fe9b700bd42 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
@@ -64,7 +64,8 @@ typedef enum {
 typedef enum {
     CHALLENGE_TYPE_TEXT,
     CHALLENGE_TYPE_IMAGE,
-    CHALLENGE_TYPE_AUDIO
+    CHALLENGE_TYPE_AUDIO,
+    CHALLENGE_TYPE_MIDI
 } challenge_type_t;
 
 typedef struct _category {
@@ -80,6 +81,8 @@ typedef struct _category {
     int bin_zero_head;
     /* Support challenges of non-text types (image, audio, etc.) */
     challenge_type_t challenge_type;
+    /* Whether to repeat afterwards (for a little extra reinforcement) */
+    bool_t repeat;
 } category_t;
 
 typedef struct _mnemon {
@@ -208,6 +211,7 @@ category_init (category_t *category,
     category->time_limit = 0.0;
     category->bin_zero_head = 0;
     category->challenge_type = CHALLENGE_TYPE_TEXT;
+    category->repeat = 0;
 }
 
 static void
@@ -288,9 +292,14 @@ category_print (category_t *category,
     case CHALLENGE_TYPE_AUDIO:
        fprintf (file, "audio");
        break;
+    case CHALLENGE_TYPE_MIDI:
+       fprintf (file, "midi");
+       break;
     }
     fprintf (file, "\n\n");
 
+    fprintf (file, "repeat = %d\n\n", category->repeat);
+
     for (i = 0; i < category->num_items; i++) {
        item = &category->items[i];
        if (i != 0)
@@ -654,11 +663,18 @@ mnemon_load_category (mnemon_t            *mnemon,
                category->challenge_type = CHALLENGE_TYPE_IMAGE;
            } else if (strcmp (value, "audio") == 0) {
                category->challenge_type = CHALLENGE_TYPE_AUDIO;
+           } else if (strcmp (value, "midi") == 0) {
+               category->challenge_type = CHALLENGE_TYPE_MIDI;
            } else {
                fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n",
                         value, path, line_count);
                exit (1);
            }
+       } else if (strcmp (name, "repeat") == 0) {
+           if (strcmp (value, "0") == 0) 
+               category->repeat = 0;
+           else
+               category->repeat = 1;
        } else {
            fprintf (stderr, "Unknown option %s at %s:%d\n",
                     name, path, line_count);
@@ -1041,6 +1057,7 @@ mnemon_handle_command (mnemon_t           *mnemon,
     const char *arg;
     int len;
     switch (command[0]) {
+       /* 'h' for histogram */
        case 'h':
        {
            char *category = NULL;
@@ -1059,6 +1076,12 @@ mnemon_handle_command (mnemon_t          *mnemon,
            mnemon_print_histogram (mnemon, category, length);
        }
        break;
+       /* 'r' for repeat */
+        case 'r':
+       {
+           /* Nothing necessary for repeating. */
+       }
+       break;
         default:
            printf ("Unknown command: %s\n", command);
            break;
@@ -1182,6 +1205,9 @@ mnemon_show_challenge (mnemon_t *mnemon,
     case CHALLENGE_TYPE_AUDIO:
        program = "play";
        break;
+    case CHALLENGE_TYPE_MIDI:
+       program = "timidity -Os";
+       break;
     }
 
     xasprintf (&command, "%s %s/%s >/dev/null 2>&1 &",
@@ -1291,10 +1317,12 @@ mnemon_do_challenges (mnemon_t *mnemon)
        free (response);
 
        /* Replay audio challenges for reinforcement. */
-       if (category->challenge_type == CHALLENGE_TYPE_AUDIO) {
+       if (category->repeat)
+       {
            mnemon_show_challenge (mnemon, category->challenge_type,
                                   item->challenge);
-           sleep (1);
+           printf ("%s\n", item->challenge);
+           sleep (2);
        }
     } while (mnemon->to_introduce ||
             mnemon->unlearned ||