X-Git-Url: https://git.cworth.org/git?p=mnemon;a=blobdiff_plain;f=mnemon.c;h=3dee0347e153c5e2a5c00f93d717f57605fd787d;hp=56a518d8ed752e63c06023d1c884474089346b76;hb=3c887fd06a0a6790db978d13df4cc73f6d5b75b0;hpb=31b5189a8145b2b514d69165997e2e443f52dd52 diff --git a/mnemon.c b/mnemon.c index 56a518d..3dee034 100644 --- a/mnemon.c +++ b/mnemon.c @@ -64,7 +64,9 @@ typedef enum { typedef enum { CHALLENGE_TYPE_TEXT, CHALLENGE_TYPE_IMAGE, - CHALLENGE_TYPE_AUDIO + CHALLENGE_TYPE_AUDIO, + CHALLENGE_TYPE_MIDI, + CHALLENGE_TYPE_TEXT_TO_SPEECH } challenge_type_t; typedef struct _category { @@ -80,6 +82,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 +212,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 +293,17 @@ category_print (category_t *category, case CHALLENGE_TYPE_AUDIO: fprintf (file, "audio"); break; + case CHALLENGE_TYPE_MIDI: + fprintf (file, "midi"); + break; + case CHALLENGE_TYPE_TEXT_TO_SPEECH: + fprintf (file, "text-to-speech"); + 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 +667,20 @@ 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 if (strcmp (value, "text-to-speech") == 0) { + category->challenge_type = CHALLENGE_TYPE_TEXT_TO_SPEECH; } 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); @@ -1100,13 +1122,11 @@ mnemon_handle_response (mnemon_t *mnemon, (time_limit == 0.0 || response_time < time_limit)) { item->score++; - mnemon->to_master--; /* We reserve an item score of 0 for an item that has * never been asked. */ if (item->score == 0) { item->score = 1; mnemon->unlearned--; - mnemon->to_master--; printf ("You got it!"); } else if (item->score < 0) { printf ("Yes---just give me %d more.", @@ -1115,6 +1135,8 @@ mnemon_handle_response (mnemon_t *mnemon, printf ("On your first try, no less!"); } else { printf ("Masterful (%dx).", item->score); + if (mnemon->to_master) + mnemon->to_master--; } } else { if (! correct) @@ -1130,12 +1152,13 @@ mnemon_handle_response (mnemon_t *mnemon, printf (" Oops, you knew that, right? (%dx)\n ", item->score); mnemon->unlearned++; - /* We add three here, (rather than just 2 to track the - * change in the item's score below), as an extra - * penalty. If the user is forgetting stuff learned - * previously, then more time should be spent on mastering - * than learning new items. */ - mnemon->to_master += item->score + 3; + /* We increase to_master here as an extra penalty. If the + * user is forgetting stuff learned previously, then more + * time should be spent on mastering than learning new + * items. Note that we only do this during the initial + * phase while new items are still being introduced. */ + if (mnemon->to_introduce) + mnemon->to_master++; /* We go to -2 to force a little extra reinforcement * when re-learning an item, (otherwise, it will often * get asked again immediately where it is easy to get @@ -1143,7 +1166,6 @@ mnemon_handle_response (mnemon_t *mnemon, item->score = -2; } else { item->score--; - mnemon->to_master++; } } @@ -1189,6 +1211,12 @@ mnemon_show_challenge (mnemon_t *mnemon, case CHALLENGE_TYPE_AUDIO: program = "play"; break; + case CHALLENGE_TYPE_MIDI: + program = "timidity -Os"; + break; + case CHALLENGE_TYPE_TEXT_TO_SPEECH: + program = "mnemon-tts"; + break; } xasprintf (&command, "%s %s/%s >/dev/null 2>&1 &", @@ -1298,10 +1326,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 ||