
# ---------- ADVANCED OPTIONS ------------

# This file contains several sections; you will have to
# scroll down to see all of them.  Each section starts with
# a header between lines of dashes    ---- like this ----

# ------- Options for learning multiple languages ---------

# otherLanguages below is a list of auxiliary languages
# (other than your first and second languages)
# that you want to learn some phrases in.
# The same abbreviations are used as with
# the 1st-language/2nd-language settings.

otherLanguages = ["cant","ko","jp"]

# Note 1: Unfortunately the GUI screens cannot yet show
# the auxiliary languages, unless you temporarily
# change your first/second languages and
# change them back again afterwards.  But they
# will be used in lessons if you have suitable words
# in your collection.
# No harm is done by including your firstLanguage and
# secondLanguage in the otherLanguages list as well,
# which can be useful if you frequently need to change.

# Note 2: For each auxiliary language you learn,
# you will need to tell Gradint how to say the
# name of that language.  For example, you can put
# files cant_en.txt, cant_zh.wav and cant_cant.wav in
# the prompts directory, to tell Gradint
# how to say the name of the "cant" language in en, zh or cant
# (you don't need all of them, but should at least
# have one in your first or second language).
# Some have been supplied already, but if
# you add new languages you'll need to do this.

# possible_otherLanguages (below) is a list of POSSIBLE
# auxiliary languages.  This should list all the auxiliary
# languages for which you have prompt files in the prompts
# directory, even if you don't want to learn them.  For
# example if you have cant_en.wav as described above, and
# later remove "cant" from otherLanguages to temporarily
# disable that language, you need to ensure that "cant" is
# in possible_otherLanguages, otherwise gradint will not be
# able to tell the difference between cant_en.wav and an
# ordinary English prompt and might use it wrongly.

possible_otherLanguages = ["cant","ko","jp","en","zh",
                           "zhy","zh-yue"]

# You can also fill in otherFirstLanguages below
# (using the same ["item","item"] format) to
# specify which of the otherLanguages you want to
# be treated as auxiliary "first" languages.
# For example, if your first language is Cantonese
# and you are learning English, but you also speak
# good Mandarin and have some Mandarin-to-English recordings,
# then it makes sense to set your first language
# to "cant", second to "en", and otherFirstLanguages=["zh"]
# and Gradint will then know that both Cantonese->English
# and Mandarin->English are acceptable
# (whereas if you just set otherLanguages=["zh"] then
# you'll get Cantonese->English and Cantonese->Mandarin)

otherFirstLanguages = []

# You can also add lines in vocab.txt that say
# "SET LANGUAGE" followed by a list of abbreviations
# separated by spaces, so for example you can say:
# SET LANGUAGE zh en ko
# phrase1 in zh = phrase1 in en = phrase1 in ko
# phrase2 in zh = phrase2 in en = phrase2 in ko
# etc (SET LANGUAGE applies to all subsequent lines up to
# the next SET LANGUAGE, and the default is your second
# language followed by your first language).

# If you want a prompt word to be in the same language as
# the target word, use for example "set language zh zh"
# where the 2nd column is the prompt phrase and the 1st
# column is the target word.

# ---- Speech synthesis options ------------

# eSpeak (if available) will be preferred for the following languages
# (for other languages it's used only if there is no other voice)
# (set this to "" if you don't want to prefer eSpeak for any language)

prefer_espeak = "en"

# eSpeak is bundled with the Windows and Mac versions of Gradint
# and can be downloaded at http://espeak.sourceforge.net/
# Any of eSpeak's languages can be used as long as you use the
# same language abbreviations as eSpeak does, e.g. "en" for English,
# "zh" for Zhongwen (Mandarin).
#    - You can improve eSpeak's English by installing
#    Festival's dictionary and using lexconvert to convert
#    it, see https://ssb22.user.srcf.net/lexconvert/
#    (this has already been done in the bundled version).
#    - eSpeak is not very natural-sounding, but it is very
#    clear and accurate in English and some other languages

# WINDOWS VOICES: Gradint can use Microsoft SAPI 5, which is
# included with Windows XP+ and can be added to earlier versions.
# You can choose which SAPI voices to use here:

sapiVoices = {
# Add them in this format but without the # at the beginning:
    # "language abbrev" : ("full voice name", rate),
# 
# For example, for Windows 10 voices (if both English and
# Chinese are installed) you can have:
    # "en" : ("Microsoft Hazel Desktop", 16000),
    # "zh" : ("Microsoft Huihui Desktop", 16000),
    # "zhy"     : ("Microsoft Tracy Desktop", 16000),
    # "zhy-yue" : ("Microsoft Tracy Desktop", 16000),
    # "cant"    : ("Microsoft Tracy Desktop", 16000),
# (make sure to set prefer_espeak="" if you want the MS English voice)
# 
# Or if you have "ScanSoft Mei-Ling_Full_22kHz"
# (which reads most Chinese hanzi quite well, but can't read
# pinyin and sometimes glitches so be careful), you can have
    # "zh" : ("ScanSoft Mei-Ling_Full_22kHz", 22050),
# 
# or if you have Loquendo Lisheng (which has prosody reminiscent
# of an Italian-Chinese bilingual, and can pronounce pinyin
# with tone numbers as long as you add punctuation at the end)
# you can have
    # "zh" : ("Lisheng", 16000),
# 
# or for Ekho Cantonese you can have:
    # "zhy"     : ("Ekho Cantonese", 8000), # or 16000 for v4.5+
    # "zhy-yue" : ("Ekho Cantonese", 8000), # ditto
    # "cant"    : ("Ekho Cantonese", 8000), # ditto
# 
# or if you have other voices in other languages, you can
# use them too.  Note that FULL voice names must be used,
# exactly as they are shown in the Control Panel under Speech.
# (You may set 'rate' to 0 for the default of 44100.)
# Note: if you set an "en" voice here, and eSpeak is also
# on the system, remember to remove 'en' from "prefer_espeak" above.
# If you don't set an "en" voice but "en" is not in prefer_espeak,
# then the voice set in Control Panel will be used for English.
# If you have Neospeech Lily then that will be used for Chinese ('zh') unless
# overridden here (although Lily is not always accurate).
# (can use pinyin with tone numbers, 5 for neutral tone, v or u: for u-umlaut
#  and if possible put spaces between meaningful words; can also use hanzi)
}

sapiSpeeds = {
# Here you can change the speeds of SAPI voices.  Speed ranges from
# -10 (slowest) to +10 (fastest).  For example, to slow down the
# English SAPI voice and speed up the Chinese, you can have
# "en": -5, "zh": +3   (but without the # at the beginning)
}

# MAC OS X VOICES: you can set which voices to use here (if you set
# more than one voice for a language then the first available one is
# used; if you don't set a voice for a language then the first detected
# voice supporting that language is used, unless there's only English
# voices on the system in which case the one set in System Preferences
# is used).  Non-English voices might not work on older OS X versions.

# Note: if you want the "en" voice to be used, and eSpeak is also
# on the system, remember to remove 'en' from "prefer_espeak" above.

macVoices = {
"en":"Emily Daniel Alex Vicki",
"zh":"Ting-Ting Tingting", # OS 10.7+, can read hanzi, pinyin+tone numbers (5 for neutral) and English
"cant":"Sin-Ji", # OS 10.7+
"jp":"Kyoko", # OS 10.7+ ("ja" will auto-detect, but we're adding the alias "jp")
"ind":"Damayanti", # OS 10.7+ ("id" will auto-detect: we're adding "ind")
}

# For Mandarin Chinese, you can also use Yali Cheng's syllables
#   (see instructions on website) - recommended.
#   Language abbreviation must be 'zh'; text should use Hanyu Pinyin with
#   a tone number after each syllable and v or u: for u-umlaut
#   (and if possible put spaces between meaningful words but
#   not between syllables within a word).  You can also include hanzi
#   if eSpeak is present.
# There are also Cantonese syllables you can download similarly.

# For Cantonese you can also use Cameron Wong's Ekho program if installed
# (language abbreviation 'cant' or 'zh-yue' or 'zhy')
# You can set Ekho's speed from -50 to +100 (percent, default 0) here:
ekho_speed_delta = 0
# (Note: If this is not 0, Ekho will be preferred over partials.)

# ANDROID: set the language of your system's default voice
# (the SL4A module that Gradint uses can't find out for you)
# - normally "en", but some China-modified Android phones
# should set this to "zh" and avoid using pinyin (however I
# have not been able to actually test if SL4A can correctly
# pass a Unicode string to their synths, so perhaps it should
# be set to None and ensure you have recorded prompts)
systemVoice = "en"

# OTHER ENGLISH SYNTHESIZERS (language abbreviation must be "en"):
#
#    - Festival Lite on Windows (if all else fails) :
#      put flite.exe in the gradint folder
#
#    - GNU/Linux: install Festival, or flite for US accent
#
#    - S60: the phone's built-in speech can be used
#
#    - RISC OS: if for some reason you can't install eSpeak
#      as mentioned above, you can instead install an older
#      version of Jonathan Duddington's !Speak, or the even
#      older "Speech!" utility.  These can be used only for
#      playing in real-time, not for generating files.
#
#    - ChatterboxTTS: do: pip install chatterbox-tts
#      (Python 3 required, and brings in lots of neural dependencies
#      - likely too slow for real-time use)

# OTHER MULTI-LANGUAGE SYNTHESISERS:
#
# Piper voices are experimentally supported on GNU/Linux.
# (Although Piper uses eSpeak, its Chinese voice may not read pinyin.)
# Setup: pip install piper-tts
# if you have an NVidia/CUDA GPU, also pip install onnxruntime-gpu
# Download voices: be in the gradint directory (or piper subdirectory) and do
# python3 -m piper.download_voices en_GB-cori-high zh_CN-huayan-medium
# (see https://rhasspy.github.io/piper-samples/ for voice names)
# Older setup: Download binaries and voices from
# https://github.com/rhasspy/piper/tree/4147f9629e88d3c1d4915a127f2d843f98347303
# and put them in the gradint directory (or piper subdirectory)
#
# Coqui voices are experimentally supported on GNU/Linux.
# Setup: pip install coqui-tts[server,zh,ja,ko]
# Then download the voices you want, e.g.:
# from TTS.api import TTS;langs = {}
# for m in TTS().list_models(): langs.setdefault(m.split('/')[1].split('-')[0],[]).append(m)
# 
# TTS(langs["zh"][0])
# TTS('tts_models/en/jenny/jenny')
# (If any model crashes during download, be sure to delete the
# result from ~/.local/share/tts before running Gradint.  For
# example vocoder_models--ja--kokoro--hifigan_v1 may crash.
# I did say support for these voices is experimental.)
# Gradint detects voices that have been downloaded
# (but prefer_espeak overrides this).  The Chinese
# voice does NOT support pinyin.
#
# Gemini voices are experimentally supported on some platforms.
# Needs Gemini API key: they have a free-tier quota, but as of
# October 2025 it's just 3 queries a minute and 15 a day
# (10 a minute 100 a day if connected to a billing account)
# see https://ai.google.dev/gemini-api/docs/rate-limits
# so you might prefer to send a single comma-separated list of
# words to read and cut up the wav file it returns.
# And their language detection is automatic, which means it
# might not work for very short phrases and you might not be
# able to specify e.g. Mandarin vs Cantonese, so it's limited.
# Setup: pip install google-genai, put the API key into an
# environment variable called GEMINI_API_KEY
# (or set os.environ["GEMINI_API_KEY"] from here)
# and optionally set GEMINI_VOICES to a comma-separated list
# of voice names to use (randomly selected)

# You can also set extra_speech to a list of
# (language prefix, command), for example:
# extra_speech=[ ("la","say-latvian"),("de","say-german") ]
# This will take priority over other speech systems.
# The commands must be available and must take a text string
# on the command line.  You will not be able to use these
# when the output is going to a sound file.
# YOU DO NOT NEED TO SET THIS if your speech synthesizer is
# supported by default.

extra_speech = []

# If you have speech software which can take a text string
# and output it to a file, you can list that here.  Each
# element of the list should be of the form:
# ("la","command with %s for text","resulting filename")
# (generally best to use wav, but mp3 is also supported on
#  some systems; see note at end of samples/README)
# The %s argument will already be quoted for the shell if applicable.

extra_speech_tofile = []

# Another thing you can do is to selectively override the
# speech synthesis of certain words.  To do this, set
# synthCache (below) to a directory, and in that directory
# put the words you want to selectively override, with
# filenames of the form text_languagename.wav
# (e.g. hello_en.wav) in lower case.  gradint will use these
# files whenever possible, and will fall back to using
# speech synthesis.  (If a speech synthesizer is not
# available then gradint will leave out any words that are
# not covered by the files in the cache - this might be
# useful if you want to synthesize words on one machine and
# run gradint on another, see samples/utils/cache-synth.py.)
# ('utils' is called 'advanced utilities' on Win/Mac.)  If the
# text contains characters that your operating system will
# not allow in filenames, then you can make a TRANS.TBL file
# inside the synthCache directory (the first word of each
# line is the real filename and the rest of the line is the
# filename that you want gradint to see).
# On RISC OS, try not to include spaces in any of the real
# filenames, because RISC OS Python can't always cope.

synthCache = ""

# mp3 is also supported in synth-cache on some systems, but
# see the section "IMPORTANT NOTES ABOUT MP3" in
# samples/README.txt.  mp3-encoding the existing
# synth-cache files without adjusting TRANS.TBL is ok.

# If you are using eSpeak, you can use SSML for emphasis
# and for embedding another language in a sentence
# e.g. <voice name="en">some English</voice>
# but note that in vocab.txt this can only be done in
# the LAST column, otherwise the '=' will be treated as
# a column separator.  (So you need to use a 'set language'
# command to put the columns into an appropriate order
# so you can put the SSML commands in the last one.)

# If you set synthCache_test_mode below to 1, then the files
# in the synthCache directory will still be used but they
# will be interleaved with calls to the synth (if
# available).  You can use this to compare a new synth with
# the one you used to make the cache.  (It can also be set
# to a list of search terms that gradint should try to avoid
# sending to the new synth, and if the Python 're' library
# is present then they can be regular expressions.)

synthCache_test_mode = 0

# If you want to do the reverse, i.e. use a synth (or partials,
# see below) by default but sometimes substitute synthCache words
# for comparison, then add a _ character at the start of their
# filenames (or TRANS.TBL entries), e.g. _someWord_en.mp3
# - Gradint will use these files more sporadically.

# The GUI has functions for managing the cache which appear when
# you enter or select a cached word.  "Reject from cache" means
# rename it to __rejected_<word> (where 'word' is the word) which
# you can truncate or delete later.  There are also cache-related
# utilities in the utils directory.

# If you set justSynthesize (below, or on the command line -
# see end of this file for notes about the command line),
# gradint will not run normally but will JUST synthesize the
# words you specify in the language you specify.  This may
# be useful for setting up reminder scripts etc using the
# synthesizers and sound devices that you have already got
# working for gradint.  (Audio reminders in your second
# language are good practice.)  The first word should be the
# language abbreviation; the rest should be the text
# (e.g. "en Hello there" or "zh da4jia1 hao3") You can use
# the '#' character as a separator for a list, and numbers
# can be used for pauses (in seconds), e.g.
# "en Time's up in one minute.#60#en Time's up."
# (i.e. say "Time's up in one minute" in English, wait 60
# seconds, and say "Time's up" in English).  If the number
# is negative then the time is counted from the START
# (rather than the end) of the previous speech, which may
# help in situations where greater accuracy is important.
# You can also specify a pathname to a file to
# be played, e.g. "en starting#/path/to/somefile.wav#en finished"
# (.mp3 is also supported on some systems - see note in samples/README.txt)
# as long as there are no spaces in the pathname.
# You can add shell commands by starting with "sh: "
# e.g. "en starting command#sh: command#en command finished"
# (commands are assumed to take 0 time for scheduling purposes;
# if they take longer then subsequent delays are cut to make up).
# You can also specify R to repeat the speech continuously
# until interrupted, e.g. 'en critical error#5#R'.  Otherwise,
# if you add a * character to the end of the string of text
# then gradint will also run normally after doing this (but with
# waitBeforeStart = 0).  Note: If you need to put the
# reminder words into synthCache then try using
# samples/utils/cache-synth.py after listing them in vocab.txt with no
# prompts (if they have no prompts and are not marked as
# poetry then they will not be used in the lesson but will
# still be generated by samples/utils/cache-synth.py).
# If you set justSynthesize to "-" (a single hyphen)
# then Gradint will enter a simple loop that asks for
# words to synthesize from the terminal (this is the
# default when the collection is empty and no GUI can run).
# Note: If using justSynthesize="-" on Unix,
#    gradint "justSynthesize='-'" < <(command)
# is easier to interrupt with Ctrl-C than
#    command | gradint "justSynthesize='-'"

justSynthesize = ""

# If you're using Neospeech Lily (which I don't
# recommend because it can be inaccurate about tones etc)
# then you can set its location here if you've
# installed it to somewhere other than the default:
# note you need to put \\ for every \
lily_file = "C:\\Program Files\\NeoSpeech\\Lily16\\data-common\\userdict\\userdict_chi.csv"
# (the version sold in Asia might have it
# somewhere under C:\Program Files\VW\VT\Lily\M16-SAPI5\lib\
# but I don't know exactly)

# If you want to use SAPI under WINE in GNU/Linux
# then you can set ptts_program:
ptts_program = None
# (hint: run winecfg and set Windows version to Millenium (ME)
# before installing speechsdk51.exe and the voices; you
# can change home directory before running WINE if you want.)
# example: ptts_program="HOME=$HOME/sapi wine ptts.exe"
# (you will need to get ptts.exe, e.g. from Windows Gradint)
# Note: Depending on your WINE version, you might find it
# works only for English.  See samples/utils/synth-batchconvert-helper.py
# for an alternative.

# ---- Speech synthesis from "partials" ---

# You can set partialsDirectory below.  This is
# used for concatenative speech synthesis using your own
# speech units.  (If a word or phrase cannot be built from
# your own units, Gradint will fall back to another speech
# synthesizer.)

partialsDirectory = "partials"

# If that directory exists, it should contain a subdirectory
# for each language you want to do concatenative synthesis
# in.  Each of those should contain other subdirectories,
# one for each "voice".  For example, partials/zh/voice1
# (Gradint will choose the first voice that has the
# necessary units for the phrase it is trying to say).
# Each voice directory should contain files named like
# syllable-s.wav or syllable-m.wav or syllable-e.wav
# where s, m or e denote whether the syllable was taken
# from the start, middle or end of a phrase (which affects
# voicing).  You can also put more than one syllable in a
# file if you wish.  i/m/f (initial/mid/final) are acceptable
# aliases for s/m/e.  The s/m/e can also be followed by a
# number or other text so as to have multiple versions of
# each (but currently only one of these will be used).
# If no "-" is present, "-m" is currently assumed.
# You can cut the syllable from the recording using
# Audacity or a similar tool; try to make sure that there
# is no silence or other noise either side of it.
# MP3 files are also acceptable (see note at end of samples
# readme file), but beware that the MP3 encoder will add
# extra silence at the start (and possibly end) of the file
# and this will be noticable when the units are concatenated.

# In the language 'zh', gradint will re-write 3rd tones
# appropriately (if specified as pinyin with tone numbers)
# and will avoid using this method for any phrases that
# contain two or more consecutive tone 1's as this can be
# particularly poor-sounding when using this method,
# unless you've pitch-calibrated your files, in which
# case you can add a file called !calibrated to the voice
# directory to let gradint know consecutive tone 1's are OK.
# One way to pitch-calibrate the tone 1's is to download
# praat from www.praat.org and use a script like this:
# (works in praat v5.0.2, NOT v5.1.29)
# for N in *1*.wav; do echo "Read from file... $N"; echo "Change gender... 75.0 600.0 1.0 250 1.0 1.0"; echo "nowarn Write to WAV file... $N"; echo "Remove"; done > temp.praat ; praat temp.praat
# replacing 250 with the frequency of an average tone 1
# (don't worry about the function being called "change gender"; the
# parameters here are set to change the pitch but not the gender)
# (you can check your frequency guess by choosing a typical
# syllable and doing something like
# play syllable.wav ; play syllable.wav synth sine 250
# and revise the number up or down until the synth sounds
# at the same pitch as the syllable.  For female voices it
# could be anything from about 180 to 300+, male voices lower.)
# (If you have over 1000 files to normalise then you may need
# to modify that command to run praat separately on each file
# rather than on all the files at once.)
# You may want to do a similar thing to raise the pitch of tone 5
# (the "neutral tone" or qingshen) - if you save the higher-pitched
# versions as tone 6, Gradint will use these when a tone 5 follows a
# tone 3, or when ma5 follows tone 3, 4 or 5.
# (Lowering/shortening/softening tone 1 may work better than raising tone 5)

# Note: On Windows/Mac, Gradint can have trouble concatenating the partials
# quickly enough even if they are in WAV format.  You can create a file
# partials/header.wav (containing a wav header that specifies the sample
# rate and an unknown length) and all the other files should be *.raw and
# are raw data that is added to the end of this header.wav.
# You can also put a header.wav in an individual voice directory
# if its *.raw files have a different sample rate from those of
# the other voices (but still put a default header.wav in partials).
# If you don't like having so many *.raw files in a directory
# then you can also do (in a Unix evironment such as OSX or Cygwin) :
# wc -c *.raw | grep -v total$ | sed -e 's/^ *//' > audiodata.dat && cat *.raw >> audiodata.dat && rm *.raw

# You can also store syllables using UTF-8 filenames, but some systems may
# have difficulty storing all of these (especially for Korean); therefore
# you can use Unicode escaping in filenames, e.g. _ud79d for Unicode D79D
# (equivalent to UTF-8 sequence ED 9E 9D).  Example conversion command:
# for N in *; do cp "$N" "/path/to/fat/$(python2 -c "print repr('$N'.decode('utf-8'))[2:-1].replace(r'\\u','_u')")";done

# When using partials, you can change the length of pause
# between phrases by changing the following (in seconds) :
betweenPhrasePause = 0.3
# (Note it might pause for longer than that when playing in
# real-time on certain systems)

# You can also set partials_are_sporadic to 1, if you
# want partials to be used more sporadically, instead of at
# every opportunity.  This might be useful if you have a
# fluent-but-sometimes-unclear synthesizer and
# clear-but-not-fluent partials and you wish to mostly use the
# synthesizer but introduce partials as a secondary thing to check it
# (a bit like the inverse of sporadic synthCache and synthCache_test_mode).
partials_are_sporadic = 0

# Another function is to have multiple variants of a voice,
# for example yali and yali-low.  If you use hyphen and suffix
# like -low, Gradint will offer that option in the GUI.  You can
# set a default in voiceOption below (blank is normal, or set to "-low" etc)
voiceOption = ""

# On Unix-like systems (that support pipes) there is also an option
# to specify external programs to preprocess all input to espeak for
# a specified language.  For example if you've used Annotator Generator
# to generate a Chinese-to-pinyin program that's better than espeak
# then you can use this.
espeak_preprocessors={
    # for example:
    # "zh":"./annotate --raw",
    # "zhy":"./annotate --seg",
}

# ------- GUI "preset collections" buttons ---------

# If you are giving gradint to your students then you might
# want to bundle it with a pre-made vocabulary collection.
# If this collection is large then it might be good to let
# the student choose which sections to learn first.
# You can have them do that within the GUI:
# 1.  Put each section in its own directory (as recorded words or .txt
# files).  Name each directory with a name that ends with exclude_from_scan
# (default "_disabled"), e.g. unit1words_disabled, extraWords_disabled, etc.
# 2.  If any words are to be added to vocab.txt by a section, then create
# a file add-to-vocab.txt in that directory, with the contents (you'd better
# include a SET LANGUAGE command).  (You don't have to do this; you could
# just have sampled words and/or words in .txt files.)
# 3.  If any files are to be added to the student's prompts directory, these
# can be placed in an add-to-prompts subdirectory of each section (useful if
# the student already has a gradint installation and you're adding more presets).
# Similarly, if any language abbreviations are to be added to the student's
# otherLanguages and possible_otherLanguages variables, these can be listed
# in a file called add-to-languages.txt (separated by spaces) in each section.
# 4.  Create a file short-description.txt for each section.  This should be
# very short because it will be displayed on a button in the GUI.
# 5. Optionally create long-description.txt for some sections.  This will be
# displayed in a yes/no box asking the user to confirm their addition.
# 6. Put all those _disabled directories into the user's samplesDirectory (or
# drag into the recorded words folder and restart gradint).  You can also
# put them in the directory above, to avoid confusing any users who open
# "recorded words".
# (If you're a developer and have downloaded the Gradint build environment,
# you can make a version of Gradint's installation files that bundles your
# presets, by placing the _disabled directories into Gradint's build
# directory before typing "make".)

# If you just want to disable one of your samples subdirectories, you
# may simply rename the directory to something ending with exclude_from_scan
# (default "_disabled") and DON'T add short-description.txt.

max_extra_buttons = 12
# - this setting limits the number of "add pre-made collection" buttons that
# are displayed on the screen at one time.  Set it to 0 to disable this feature.

# ---- Website options ---

mp3web = ""
mp3webName = ""

# If you use a website that lets you download
# MP3 or WAV pronunciations of words, you can use this from
# within the Gradint GUI by setting the above like this:
# mp3web = "http://www.example.com/search/$Word/$Lang"
# mp3webName = "Example"
# ($Word is replaced by the word to look for, and
# $Lang by the language code)

# Also you need to tell Gradint where to look for your browser's
# downloaded files.  The following directories will be tried:

downloadsDirs = ["../Downloads","..\\Desktop"]

# If you then tell Gradint to use an MP3 file you have downloaded,
# Gradint will store it in the synth cache (see below).

# If you set downloadsDirs = []
# then Gradint will not check for downloaded files, but will just
# point the browser to the site.  This might be useful for situations
# when you just want to check if words are there or not.

# ---- Options for outputting lessons to sound files and adding comments ------

# Sometimes it is useful to get gradint to output a lesson
# to a sound file instead of playing it directly, for
# example if you want to listen to it on a mobile device.
# To do this without using the GUI, change the value of
# outputFile (below) to a filename, e.g. outputFile = "myfile.mp3"

outputFile = ""

# Depending on the extension you specify, you will need a
# copy of LAME (for MP3), TooLame (for MP2), oggenc (for
# OGG), neroAacEnc or faac (for AAC) or speexenc (for SPX).
# On Windows put the .exe in the gradint folder; on other systems
# put the binary in either the gradint folder or the PATH.
# You will also need "sox" (you may already have this).

# The Gradint GUI will offer to export to files of any
# type that it can find encoders for, plus WAV.  So for
# example if it finds lame, it will give an MP3 option.
# On Windows it can use Windows Media Encoder to make WMA,
# if you installed this before Microsoft withdrew it in 2010.
# On Mac it can make AAC files using afconvert (10.5+ should have this).

# In each case Gradint uses encoding parameters that have been
# found to give good compression without sacrificing too
# much quality for a language-learning application.

# You can also specify .wav, .cdr, .au, etc (only sox is required)
# but it will be very large.  .wav might be your best option if you
# want to use a non-commandline music compressor.  .cdr is useful
# for making old-style audio CDs.

# gradint can also output to .sh (shell-script) files,
# which, when run, produce wav audio on their standard
# output for redirecting to an audio encoder or player.
# These shell-script files store each sample only once and
# without changing its rate, which means they can be
# generated very quickly even on a machine with no
# floating-point processor such as an NAS device.  They do
# however require sox and floating point at runtime, because
# the pipe to stdout means they all need to be converted to
# one rate, but if you're piping to an audio encoder then
# you probably need more floating-point for that anyway.
compress_SH = False
# - set that to True to make the .sh file smaller at the
# expense of quality.  (Does not include (g)zip compression;
# you can do that separately.)

# If you specify no extension then gradint will output raw
# samples.  If outputFile is "-" then gradint will send the
# raw samples to the standard output for use in a pipe.
# (You still need sox even for raw samples.)  Additionally,
# you can specify "-" as a filename followed by any of the
# above extentions, in which case gradint will write to its
# standard output in the format appropriate for that extention.

# If you want to append silence to the end of the output
# (useful if there's going to be another track) then you can
# set the number of seconds of silence here:

outputFile_appendSilence = 0
if outputFile.endswith("cdr"): outputFile_appendSilence = 5

# If writing an early lesson to tape for a beginner, it is
# possible that the long gaps will cause the beginner to
# think that the tape has finished, even with the "longpause"
# message in place.  So the following variable sets the
# minimum length of silence to be replaced by beeps every few
# seconds.  It is effective only for outputFile (not for
# playing lessons in real time)

beepThreshold = 20

# You can set the following to "file.wav" for file.wav to be
# included as an announcement at the start and end
# respectively.  NB the time taken by this file will be
# subtracted from the lesson time.
# (.mp3 is also supported on some systems - see note in samples/README)

startAnnouncement = None
endAnnouncement = None

# If you want to put additional comments into spare
# graduated-interval gaps on the first lesson, you can set
# the following variable to ['comment1.wav','comment2.wav',...]
# (.mp3 is also supported on some systems - see note in samples/README)
# commentsToAdd will be added first, in order, then
# orderlessCommentsToAdd will be added after.
# (Warning!  If the comments can't fit, program will crash.)

commentsToAdd = None
orderlessCommentsToAdd = None

# See also the readme file in the samples directory
# for how to add introductory comments to specific words etc.

# ------- Options for changing the type of lesson ---------

# Maximum length of each lesson, in seconds.
# Longer than 30 minutes is not recommended.  Shorter may be OK
# but if you set it less than 5 or 10 minutes then you may
# have to adjust some of the other parameters and it may not
# work very well.

maxLenOfLesson = 30*60

# The following variable controls whether or not gradint will
# save your progress.  If you set it to 0 then the progress
# will not be saved.  This might be useful for testing.

saveProgress = 1

# Set ask_teacherMode (below) to 1 to enable a rather
# experimental "teacher assistant mode" designed to help
# language teachers to use graduated-interval timings
# in a class.  Instead of playing the lesson, Gradint
# will tell you when each word is due, and you can choose
# whether to say it yourself or have the computer say it.
# Gradint can adapt to some timing fluctuations, but quick
# reactions are usually needed.  However Gradint does
# display the next word in advance and give a countdown.
# It's probably better to use keyboard shortcuts or a
# touch screen, not a mouse.

ask_teacherMode = 0

# The following settings control various things such as the
# maximum number of new words introduced in each lesson,
# etc.  You shouldn't normally have to change any of this
# unless you have very special requirements.
# Note: a maximum of -1 means no maximum.

maxNewWords = 5
maxReviseBeforeNewWords = 3
newInitialNumToTry = 5 # try to repeat a new word 5x
recentInitialNumToTry = 3 # and recently-learned one 3x
newWordsTryAtLeast = 3 # if a new word won't fit 3x,
        # exclude it (leave it till a future lesson)
knownThreshold = 5 # after which it won't repeat so much
reallyKnownThreshold = 10 # after which never added before new words
meaningTestThreshold = 20 # or 0; if >= this then 50% chance of "what meaning" test
randomDropThreshold = 14 # after which drop some words even if they can fit
randomDropLevel = 0.67 # fraction of above that is dropped
randomDropThreshold2 = 35 # (or set to the same as above)
randomDropLevel2 = 0.97
seedless = 0 # set this to 1 to make all "random" choices
# reproducible (on the same installation), in case you
# need to reproduce the same Gradint run exactly
shuffleConstant = 2.0 # Used to control how much the number
# of repetitions matters when it is high.  Higher values of
# this constant mean it doesn't matter so much and samples
# that have been repeated a lot will get shuffled more.
transitionPromptThreshold = 10 # after repeating a prompt
# this many times, begin transition to target-language prompt
advancedPromptThreshold = 20 # ONLY use target-language prompt
transitionPromptThreshold2 = 2 # for 3rd, 4th etc languages
advancedPromptThreshold2 = 5
veryExperiencedThreshold = 1000 # total repetitions until fewer prompts are used
limit_words = max(1,int(maxNewWords * 0.4)) # num words to
# include from limited directories.  Done separately for
# EACH limited directory, but limits deeper in the tree are
# "masked" by higher-level limits (this behaviour may change
# in future)

# If you set logFile (below) to anything other than None, gradint
# will try to create a log containing the time at which each
# word is played.  This can be useful if you have a separate
# way of logging the time at which you had some trouble
# (make sure to synchronize with the computer's clock first).
# (When writing to an output file, the times are in minutes and
# seconds from the start of the file, but when playing in
# real-time, actual clock time can be logged.)
# (Note: Following the log while listening to the lesson
# may distract you from the audio.  It can however be useful if
# you need to check something afterwards, especially if you are
# going over lots of very old words.)

logFile = "log.txt"

# You can set the default number of seconds that the lesson will be
# interrupted when you press "Brief interrupt".  Don't make this too
# big, though - Gradint will DROP any graduated-interval sequences that
# cannot properly fit in as a result of the delay.  (Progress update
# will reflect this.)  The same thing will happen if Gradint is
# delayed for other reasons, like Unix process signalling (Ctrl-Z stuff).

briefInterruptLength = 10

# ------- Where to find files and directories ---------

# Normally these settings are OK but in some circumstances
# you might need to change them.

vocabFile = "vocab.txt"      # for synthesized words
samplesDirectory = "samples" # for recorded words
promptsDirectory = "samples"+os.sep+"prompts" # for prompts

# (note: if you change samplesDirectory, promptsDirectory will NOT
# automatically change with it.  This is so that with samples/utils/email-lesson.sh
# you can set samplesDirectory to some subset of your collection and still
# have the main promptsDirectory.)

progressFile = "progress.txt"
progressFileBackup = "progress.bak" # or None
pickledProgressFile = "progress.bin"
# (pickledProgressFile is used only on platforms that support it.  It is
# quicker and takes less memory to load.  The text progressFile is still there
# and will be used if manually updated, i.e. time stamp newer than pickledProgressFile.)

gui_output_directory = "output"
# You can also set that to a LIST of directories, e.g.
# gui_output_directory = ["/path/to/MP3/player", "output"]
# in which case the first directory that EXISTS will be used
# (or the last one on the list if all else fail).
# Useful if the directory to your MP3 player only appears when
# it's plugged in for example.  With GNU/Linux automounters
# set "/media/*" as one of the directories, and it will expand to
# whatever removable device is mounted IF there is only one.

# See README.txt in the samples directory for what these mean:
limit_filename = "!limit"   # do not specify an extension
intro_filename = "_intro"   # ditto
poetry_filename = "!poetry" # ditto
variants_filename = "!variants" # ditto
exclude_from_scan = "_disabled"
exclude_from_coverage = "z_try_again" # not counted in "covered .. of .."

userNameFile="username.txt"
# userNameFile stores the user's name in the GUI (which has limited support
# for multiple students, e.g. for a single-user machine in use by a family).
# Set it to "" to disable this feature.

import_recordings_from = [r"\My Documents", r"\Storage Card\My Documents", r"\Ramdisk\My Documents"]
# This is really for Windows Mobile, but can also be adapted
# for other platforms.  If you leave Recording1.wav, Recording2.wav
# etc in any of the above directories, Gradint will offer to "import"
# them when you make a lesson.  Record the second-language words
# into odd-numbered files, and their first-language meanings
# into even numbered files.
# This can be useful to catch words with the Notes app on a PocketPC
# (which saves its recordings to \My Documents by default).

# ------- GUI translation (localisation) dictionary --------

# The format of this is:
# {"en phrase A":{"laX":u"language X translation", "laY":"language Y translation", ...}, "en phrase B":{...}, ...}
# UTF-8 encoding should be used.
# You can specify alternative scripts for one language with variation numbers (e.g. zh=Simplified Chinese zh2=Traditional Chinese)
# in which case you should set an @variants option listing their names
# e.g. "@variants-zh":[u"simplified",u"traditional"]
# Known bug: After pressing "Change languages", Gradint has to be restarted for *all* GUI messages to update.
# (Note: These translations will NOT be used on versions of Mac OS that might have TkInter Unicode display problems.)
GUI_translations={
"@variants-zh":[u"简体字",u"繁體字"],
"Word in %s":{"zh":u"%s"},
"Meaning in %s":{"zh":u"%s意思"},
"en":{"zh":u"英文"},
"zh":{"zh":u"汉语","zh2":u"漢語"},
"cant":{"zh":u"粵語","zh2":u"廣東話"},
"Your first language":{"zh":u"母语","zh2":u"母語"},
"second":{"zh":u"学习的语言","zh2":u"學習的語言"},
"Change languages":{"zh":u"选择其他语言","zh2":u"選擇其他語言"},
"Cancel lesson":{"zh":u"退出"},
"Cancel selection":{"zh":u"取消"},
"Clear input boxes":{"zh":u"取消"}, # for now
"Manage word list":{"zh":u"管理词汇表","zh2":u"管理詞彙表"},
"Create word list":{"zh":u"创造词汇表","zh2":u"創造詞彙表"},
"words in":{"zh":u"词, 用","zh2":u"詞, 用"},
"new words in":{"zh":u"新词, 用","zh2":u"新詞, 用"},
"mins":{"zh":u"分钟","zh2":u"分鐘"},
"Start lesson":{"zh":u"开始","zh2":u"開始"},
"Quit":{"zh":u"关闭","zh2":"關閉"},
"Back to main menu":{"zh":u"回主选单","zh2":u"回主選單"},
"Delete non-hanzi":{"zh":u"除字非汉字","zh2":u"除字非漢字"},
"Speak":{"zh":u"发音","zh2":u"發音"},
"Add to %s":{"zh":u"添加到%s"},
"vocab.txt":{"zh":u"词汇表","zh2":u"詞彙表"},
"Recorded words":{"zh":u"录音词汇","zh2":u"錄音詞彙"},
"To":{"zh":u"转到","zh2":"轉到"},
"Make":{"zh":u"做"},
"Speaker":{"zh":u"扬声器","zh2":u"揚聲器"},
"Change or delete item":{"zh":u"更换/删除","zh2":u"更換/刪除"},
"You have not changed the test boxes.  Do you want to delete %s?":{"zh":u"你还没编辑了。你想删除%s吗?","zh2":u"你還沒編輯了。你想刪除%s嗎?"},
"Restore":{"zh":u"归还","zh2":u"歸還"},
"Hear this lesson again?":{"zh":u"再次听那个课吗?","zh2":u"再次聽那個課嗎?"},
"Start this lesson again?":{"zh":u"再次开始这个课吗?","zh2":u"再次開始這個課嗎?"},
"You have %d words in your collection":{"zh":u"你的汇编有%d词","zh2":u"你的彙編有%d詞"},
"%d new words + %d old words":{"zh":u"%d新词而%d旧词","zh2":u"%d新詞而%d舊詞"},
"minutes":{"zh":u"分钟","zh2":u"分鐘"},
"seconds":{"zh":u"秒"},
"Today's lesson teaches %d new words\nand revises %d old words\n\nPlaying time: %d %s %d %s":{"zh":u"今天我们学%d新词而复习%d旧词\n需要%d%s%d%s","zh2":u"今天我們學%d新詞而複習%d舊詞\n需要%d%s%d%s"},
"Today we will learn %d words\nThis will require %d %s %d %s\nFollow the spoken instructions carefully":{"zh":u"今天我们学%d新词, 需要%d%s%d%s\n请仔细听从口头指示","zh2":u"今天我們學%d新詞, 需要%d%s%d%s\n請仔細聽從口頭指示"},
"Family mode (multiple user)":{"zh":u"加别的学生(家人等)","zh2":u"加別的學生(家人等)"},
"Add new name":{"zh":u"加名字"},
"Students":{"zh":u"学生","zh2":u"學生"},
"Brief interrupt":{"zh":u"短时暂停","zh2":"短時暫停"},
"Resume":{"zh":u"恢复","zh2":u"恢復"},
"Emergency brief interrupt":{"zh":u"紧急的短打岔","zh2":u"緊急的短打岔"},
"Resuming...":{"zh":u"正在恢复...","zh2":u"正在恢復..."},
"Big print":{"zh":u"大号字体","zh2":u"大號字體"},
"Compressing, please wait":{"zh":u"正在压缩...","zh2":u"正在壓縮..."},
"All recordings have been compressed to MP3.  Do you also want to make a ZIP file for sending as email?":{"zh":u"所有录音都压缩成为MP3了。 你也想做一个ZIP文件所以能随email附上吗?","zh2":u"所有錄音都壓縮成為MP3了。 你也想做一個ZIP文件所以能隨email附上嗎?"},
"Compress all":{"zh":u"压缩这些文件","zh2":u"壓縮這些文件"},
"Play":{"zh":u"播放"},
"Synthesize":{"zh":u"用机器声音","zh2":u"用機器聲音"},
"(synth'd)":{"zh":u"(机器声音)","zh2":u"(機器聲音)"},
"Re-record":{"zh":u"重新录音","zh2":u"重新錄音"},
"(empty)":{"zh":u"(空白)"},
"Record":{"zh":u"录音","zh2":u"錄音"},
"Add more words":{"zh":u"添加词汇","zh2":u"添加詞彙"},
"New folder":{"zh":u"新文件夹","zh2":"新文件夾"},
"Stop":{"zh":u"停止"},
"Action of spacebar during recording":{"zh":u"空格键在录音的时候的功能","zh2":u"空格鍵在錄音的時候的功能"},
"move down":{"zh":u"进步下面"},
"move along":{"zh":u"进步右边","zh2":u"進步右邊"},
"stop":{"zh":u"停止"},
"(Up)":{"zh":u"(返回)"},
"Record from %s":{"zh":u"从%s做录音","zh2":u"從%s做錄音"},
"Record from file":{"zh":u"切已录音的文件","zh2":u"切已錄音的文件"},
"It has been %d days since your last Gradint lesson.  Please try to have one every day.":{"zh":u"你没做Gradint的课%d天了。请试试天天做。","zh2":u"你沒做Gradint的課%d天了。請試試天天做。"},
"It has been %d days since you installed Gradint and you haven't had a lesson yet.  Please try to have one every day.":{"zh":u"%d天前安装了Gradint但还没做课。请试试天天做。","zh2":u"%d天前安裝了Gradint但還沒做課。請試試天天做。"},
"Error: maximum number of new words must be an integer":{"zh":u"误差: 新词界限不是整数","zh2":u"誤差: 新詞界限不是整數"},
"Error: minutes must be a number":{"zh":u"误差: 分钟界限不是号码","zh2":"誤差: 分鐘界限不是號碼"},
"%s new words is a lot to remember at once.  Reduce to 5?":{"zh":u"一天记得%s新词是很多。我减少到5好吗?","zh2":"一天記得%s新詞是很多。我減少到5好嗎?"},
"More than 30 minutes is rarely more helpful.  Reduce to 30?":{"zh":u"超过30分钟很少有帮助。我减少到30好吗?","zh2":"超過30分鐘很少有幫助。我減少到30好嗎?"},
"Less than 20 minutes can be a rush.  Increase to 20?":{"zh":u"缺乏20分钟可以太赶紧了。我增长到20好吗?","zh2":"缺乏20分鐘可以太趕緊了。我增長到20好嗎?"},
"Proceed anyway?":{"zh":u"反正继续?","zh2":"反正繼續"},
"Just speak a word":{"zh":u"使用机器声音说一词","zh2":u"使用機器聲音說一詞"},
"Add word to my vocab":{"zh":u"把词加到词汇表","zh2":u"把詞加到詞彙表"},
"Make lesson from vocab":{"zh":u"做课","zh2":u"做課"},
"Make lesson":{"zh":u"做课","zh2":u"做課"},
"Record word(s) with mic":{"zh":u"从麦克风录音词语","zh2":u"從麥克風錄音詞語"},
    }

# scriptVariants optionally maps language abbreviation to default script
# variant number starting from 0; you don't have to fill this in to get the
# 1st one as default; may be overridden in settings.txt
scriptVariants = {}

# and you can map settings of firstLanguage to a GUI language
# for example if you want "kw" to mean Guilin dialect but want "zh" in GUI
# then you can say "kw":"zh" in here:
GUI_languages = { "cant":"zh", "zhy":"zh", "zh-yue":"zh" }

# Space-saving options if you want a more compact GUI:
GUI_for_editing_only = 0 # if 1, omit controls for making a lesson (just vocab edit)
GUI_omit_settings = 0 # omit change language controls (for use if you don't set them anymore), and advanced.txt
# (change language controls are not omitted when you create a new user before that user's vocab file exists)
GUI_omit_statusline = 0

GUI_always_big_print = 0 # (set to 1 will cause 'big print' button to be auto-pressed when available)

# If you set recorderMode, GUI will go straight into the recorder screen (if tkSnack is available)
recorderMode = 0

# ------- Unix forking, alternative DSPs, lesson saving, etc ---------

# Set the following to 1 ONLY if you are on Unix and have Tk
# and want gradint to spawn to the background:

runInBackground = 0

# Set the following to 0 if you don't want to use the Tk GUI
# even if it is present on the system

useTK = 1

# Set the following to 0 if you want gradint to start
# a lesson without waiting for the user (in which case
# teacher-assistant mode is disabled) :

waitBeforeStart = 1

# If you want, you can call an arbitrary function just
# before the lesson starts:

startFunction = None

# On Unix under OSS (or OSS-emulation), you can set
# oss_sound_device to a different sound device
# (e.g. "/dev/dsp2") or leave it blank to auto-detect.

oss_sound_device = ""

# On Unix (OSS and ALSA) you can limit the volume in the
# soundVolume variable below (1 = normal, 0.05 = 5% of
# normal which for example I needed to use on a Debian NSLU2
# "slug" with a USB soundcard connected to a cheap
# FM-headphones transmitter, because the transmitter was too
# easily overloaded and the lowest setting of the ALSA mixer
# was still too high).

soundVolume = 1

# If you want you can completely override the way Gradint
# tries to play sound on Unix systems by filling in these:
wavPlayer = ""
mp3Player = ""
# If left blank they will be detected automatically.
# For example if your PC has no speakers and you want to send
# all sound to a LAN-attached NSLU2 you can do something like
# wavPlayer = "nc nslu2 8124 -q 0 <"
# mp3Player = "nc nslu2 8125 -q 0 <"
# and set up entries in /etc/inetd.conf on the NSLU2 to run
# appropriate scripts (note that this method does not communicate
# play failures and delays back to Gradint, so it's up to your
# scripts to handle these)
# If soundVolume is not 1, only wavPlayer will be used.

# On non-Windows systems (or on Windows if you are running
# from the Python source) you can here specify a file to
# save the lesson to (in Python pickle format) and re-load
# it later.  saveLesson should be set to the full pathname.
# loadLesson should be set to 1 (either here or on the
# command-line) when you want to re-play the earlier lesson
# (all its samples etc must still be available).
# If loadLesson is set to -1, then the lesson will be
# re-played if and only if the file specified in saveLesson
# was created on the same calendar day.
# Limitation: If the lesson is cut short or interrupted, the *complete* lesson
# will be saved by saveLesson but only the *partial* progress will be saved
# to progressFile.  If you then use loadLesson and play it completely,
# Gradint is not currently able to reflect this fact in progressFile (and
# probably wouldn't be able to if progressFile has since been changed anyway).
# This limitation should not cause any trouble in practice.
# Note: If running from Python source on Windows, delete all
# .pyd files because you may have a different Python version.

saveLesson = ""
loadLesson = 0

# You can also set justSaveLesson (below) to 1 - if you
# do then any lesson that is generated will be saved
# immediately (and the progress updated) without actually
# playing it.  This may be useful if you then want to do
# 2 or more things in parallel with it (e.g. play it and
# convert to another format on slow hardware), but it's up
# to you to ensure that interruptions don't make the
# progress file wrong.

justSaveLesson = 0

# Set compress_progress_file to 1 if you want progressFile
# to be compressed by gzip (you must have gzip on your
# PATH for this to work).  This might help if your
# progressFile is large and is kept on a Flash storage
# device with slow write speed.  (binary progress files and
# saved lessons are also compressed when this is set.)
# If using fusecompress then you might not need this.

compress_progress_file = 0

# Set paranoid_file_management to 1 if you are
# keeping your vocab.txt over an ftpfs mount or something
# (gradint will try to be more careful not to erase it
# if the mount goes wrong).  If you are not using that
# kind of mount then leave it at 0 (it just takes more time).
# (Note: curlftpfs reliability is worse if you use transform_symlinks
# and point gradint to 2 symlinks in the remote filesystem,
# e.g. samples and synth-cache: curlftpfs may confuse them!
# sshfs better, but best setup is sync before/after running)

paranoid_file_management = 0

# If you set once_per_day (below) to 1, gradint will run
# only if progressFile's date stamp does not match the
# current date.  This may be useful for putting gradint in a
# startup script.
# If you set once_per_day to 2, gradint will remain running
# when quit and wait for the next day.  This may be useful
# if the computer is hibernated overnight instead of shut down.
# If you set once_per_day to 3, gradint will do both (i.e. not
# immediately pop up a GUI if already done today + wait after quit).
# Best not set runInBackground when using once_per_day > 1
# (otherwise gradint will fork only when about to start the GUI).

once_per_day = 0

# If you set disable_once_per_day (below) to 1, the above
# once_per_day logic will be disabled even if it's on the command line,
# and Gradint will exit silently if once_per_day is 3 (i.e. run from
# startup).  This can be used for a "disable running at startup" option.
# Set disable_once_per_day to 2 if you want the GUI to ask
# (this is done by the Windows installer).

disable_once_per_day = 0

# Besides altering this file, you can also put assignment
# statements on the command line of gradint.py.  In that
# case runInBackground=0 is assumed and
# progressFileBackup=logFile=None is assumed, unless you
# specify otherwise (on the command line, not here).
# You can also set the Gradint_Extra_Options environment variable
# - leading and trailing semicolons are removed from this so
# you can do things like: export Gradint_Extra_Options="$Gradint_Extra_Options;once_per_day=1"

# Note: Further advanced things are possible by using the
# scripts in the 'samples/utils' directory (for example,
# automatically emailing lessons to students, or creating
# HTML reports). See the README file in 'samples/utils' for details.
# (on Windows and Mac, 'utils' is called 'advanced utilities')

#The three lines below are to help the Emacs editor.
#Local Variables:
#mode: python
#End:
