~~~~~~~~~~~~~ Freedom Platform - dsPic 2D Graphics & Audio Library Platform ~~~~~~~~~~~~~
dsPic Graphic Platform with Music Player, Vector Mapping GPS, Talking Astronomy Clock,
Graphic Calendar, and Tetrabrick game. Copyright (c) 2016 - 2018 Brek Martin.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GNU Notice:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Microchip Notice:
This project uses heavily modified versions of Microchip’s Memory Disk Drive File
System, and Image Decoder Libraries. This software component is not GNU code, and
it’s use with this project requires agreement to a license in an extra document
included with this package (see page 1, section 2 “Software License Grant”).
The following is to state that:
The included Microchip library source code contains it’s original documentation.
The included Microchip library source code is heavily modified for this project.
The included Microchip library derived source code is intended for sole use with
Microchip products, as this project makes use of dsPic hardware peripherals.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VLSI Solutions Notice:
VLSI Solutions have given explicit permission for anyone to distribute software for
their chips, so long as the hardware project design includes one of their chips.
Full source code for the Spectrum Analyser and Pitch Shifter for VS1003b decoder can
be found on VLSI Solutions website. This implementation makes things appear seamless,
but these two programs are loaded to, and executed on the VS1003b decoder chip itself.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Contributors:
Remaining software components by authors other than the project author are listed here.
More details regarding contributions to this project can be found throughout the source.
Sunrise and Sunset calculator functions are condensed version of those by Jarmo Lammi.
Moonrise and Moonset times BASIC routines appeared in Sky & Telescope magazine July 1989,
presumably originally written for the Commodore C-64. Ported to C in 2008 by Brek Martin.
Moon percentage illumination calculator function is based on Moontool by John Walker.
Forest fire floodfill function by Brek Martin uses fifo queue functions by Adam Davis.
Likeness of the classic Amiga "Hand Holding Disk" inspired by a graphic by Sheryl Knowles.
The following authors of audio samples wish to be credited for their contributions:
Blop by Mark DiAngelo, Tiny Button by Mike Koenig, Switch by Adam_N.
The project uses a part of Dinging Interface Sounds by Robinhood76.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Further Disclaimer:
GPS positioning should not be relied upon exlusive of other navigational aids,
such as observing landmarks, direction of the Sun, using a compass, etc.
The author accepts no responsibility for injury, death, or any losses due to
GPS malfunction, map, program, or documentation errors, device malfunction,
or any potential risk associated with using this project software or hardware.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Introduction:
Two seperate long term goals on my mind for several years, have been to build,
and write software for, a vector mapping GPS unit, and an MP3 player, starting
from scratch. I had already written a vector mapping GPS program, and also MP3
player GIUs for various platforms, but still, I anticipated that it would be a
rewarding experience to build the hardware devices to also run my own software,
and become purpose designed devices. I never envisioned however, that these two
devices would both end up being one single device performing both tasks well.
This may or may not be a typical “open source” project, in that it does contain some
proprietry software components. The only distinction made for the project, was that
any included source or binary was publically available, and free to use as intended.
The two main objectives of this project have been to get as much functionality
as possible out of a reasonably cheap microcontroller, and other cheap hardware.
This is a 2D graphics and audio library for Microchip dsPic33FJ128GP802 serially
connected through a shift register to a KS0108 graphics LCD, joystick, SD Card,
VLSI Solutions VS1003b audio codec decoder IC, and UBlox NEO-6M GPS module.
At the time of software release, no hardware schematic is available, or produced.
Hardware construction details are provided as a series of YouTube videos for now,
but a schematic and PCB design should be on the way.
The distribution software presents a menu of five main programs originally written
with demonstrating the underlying library in mind. This document is to explain the
use of the platform, included programs, as well as some operational explaination.
This platform and demo software release is intended for other programmers and/or
electronics enthusiasts, and software may still require modification to suit one’s
particular purpose. It is not intended as a typical domestic commercial product,
but the included demo programs are highly developed, and contain many features,
some of which would take considerable use to discover. The demo programs provide
examples of how to access the graphics library, audio, and other library features.
Most of the included demo programs have options that are configurable by means of
an SD card configuration file. Notes are provided in the example configuration file.
There are 25 option configurable by adjusting the values for fields in this file.
Some options are program specific, while others are global, and affect all programs.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
General Platform:
The software expects a FAT16/FAT32 formatted SDSC, SDHC, or SDXC Card containing:
A root directory named “ROM”, containing the correct rom file “FREEDOM.ROM”,
optionally, a CONFIG folder containing the config.txt configuration file,
a root directory named MUSIC, containing MP3 audio files,
a root directory named MAPS, containing GPS vector map files of correct format,
and a root directory called GPX, for loading and saving of GPS track log files.
Very old MMC type cards may also work with this software, however some sub 1Gb
capacities may have their total capacity, and card type reported incorrectly.
Old cards may require the card speed configuration file option be set negative.
The FAT12 file system suitable for some very low capacity cards is not supported.
Both SDSC and SDHC cards are supported, providing capacities of 2Gb, or 32Gb.
Larger SDXC cards can be formatted with FAT32, and also incidentally work well.
A folder containing the basic directory structure, and some free sample files
should be included with this distribution package for setting up your SD card.
The config.txt file can be edited with Windows Notepad or MacOS TextEdit.
Most commonly used program data such as fonts and menu samples, are stored in the
microcontroller program memory, while video, voice samples and other data is loaded
from the SD card ROM file as needed by programs. The SD card ROM file also contains
executable code for the vs1003b chip, and is required for the demo programs to work.
The Vector GPS program requires at least one map file to operate, and some free map
files are included in this package. Details of how to produce new maps should be
included with a future release. A map converter program has been written in C for
XCode, to convert maps from an existing format, to a suitable format for use with
this program, but still needs to be ported to a suitable platform for distribution.
Although removing SD Cards during program operation is not recommended, the software
handles removal and re-insertion by exiting to the menu or resuming for some programs.
The MP3 Player and Vector GPS programs should both auto resume as if nothing happened,
but in reality, this is not always the case. Hardware intended for allowing cards to
be removed and re-inserted in use, should contain power down circuitry at the socket.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MP3 Player:
With an SD Card containing MP3 audio files in a root folder named “MUSIC” inserted in
the unit, select “MP3 Player” from the menu, and select the first track to play from
the file browser. Although strictly speaking, due to program memory constraints, the
file browser only supports 8.3 filenames, but can also search id3 tags to produce a
list of track titles. The player will display artist and track information extracted
from id3 tags of various formats. The player will start playing from the selected track,
and continue from there, starting again automatically once all tracks are played.
Subfolders within the MUSIC folder are not supported. It should be possible to access
up to 32000 files in the MUSIC folder, or the most files that the file system allows.
Clicking the spectrum analyser window will activate one of many full screen graphic
spectrum displays. Clicking the screen will cycle through all options before returning
to the regular player screen. The player screen has buttons that can also be clicked
including track skip, and play/pause. The bass boost “BB” button is for earphones.
The stop button simply exits the MP3 Player program, and returns to the main menu,
or the file browser when the software is configured as an exclusive MP3 Player.
The joystick control “JC” button will toggle a mode that allows easier control of
volume and track skip than the button controls. When the “JC” button is flashing,
tracks can be skipped by moving the joystick left and right, and the volume can be
adjusted by moving the joystick up and down. Pressing the button again while the “JC”
button is flashing will disable this mode, and return to the normal on screen buttons.
The MP3 Player program has a shuffle mode which can be enabled in the configuration file.
With shuffle mode enabled, the MP3 Player shuffles the file order each time the program
is started, the file browser is never seen, and track skip buttons will move through the
shuffled order of mp3 files. Shuffle mode will only access up to the first 3500 files.
The MP3 Player has a covershow feature that when enabled, displays album artwork that
is extracted from id3 tags within mp3 files in either greyscale, or solid monochrome.
The covershow feature can be enabled/disabled, and configured in the configuration file.
Support for id3 tags include primarily the format of those contained in files extracted
with a fruit company music library program. When extracting mp3 files, do not select the
option to convert id3 tags for other music players. Limited Unicode support is implemented
for fruit company extracted files. Unicode characters will be converted to standard ASCII.
The player also supports id3 tag version 1, and has limited support for id3 version 2.
If a particular variety of id3 tags cause an issue, it should be possible to edit and save
the tags in Windows 7, or a with one of many free specialised id3 tag editor programs.
When adding information to an mp3 file with an id3 tag editor, it is important to add
images only in JPEG format, and to add it after entering artist and title information.
A hidden runtime configuration menu can be used to override SD card configuration file
settings for a single session. To open the menu, hold the joystick left from powerup,
until the menu is displayed. Some switches appear on the screen that can be used to
adjust settings. Pressing fire exits this menu. These settings will be forgotten when the
unit is next powered off. With the Pitch Shifter feature enabled, Pressing the “PC” button
in the MP3 Player will activate the Pitch Shifter. Move the joystick left and right,
or up and down to alter the music pitch (without affecting tempo), or to alter tempo
(without affecting pitch). Playing at a fast tempo requires more bandwidth and CPU time,
and may require a higher clock setting in the SD card configuration file to play well.
The MP3 Player program can be exited by pressing the on-screen stop button.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Vector GPS:
Full documentation for the Vector GPS program may be included in a future release,
as there is not yet any method of converting map files for use with this program.
Some of the map files that have been demonstrated in YouTube videos are commercial,
and cannot be distributed, but some free map tiles are included in this distribution.
It may be possible to make use of the track logging feature with the blank map file.
The Vector GPS program is a fully functional vector mapping GPS with support for both
topographic and road maps, and boasts many features including a map sniffer, which
can display the closest point of interest, and hiking trail or road, to your location.
This is intended to direct the user to the nearest landmark or trail if they are lost.
The program displays maps north up in map browse mode, and rotating track up display
while in GPS mode. Map display supports solid and dotted lines, rotating line labels,
point of interest labels, graphic icons, and limited support for flood filled polygons.
The Vector GPS program is written with hiking in mind, but has some features of a
vehicular unit, such as a large speedometer display for driving with a road map.
One major feature of a commercial GPS unit which this program lacks, is path finding.
It has not only been a battle with program memory, but also sourcing suitable data.
Commercial GPS units intended for hiking generally don’t use a path finding feature.
The Vector GPS program starts the file browser when it is started from the main menu.
When a suitable map file is selected, a map description is displayed. This description
is a feature of the map file format, which provides a longer string than the filename.
The program begins it’s first map render here, and defaults to map browse mode with GPS
powered off, Logging is off by default unless a track log file was loaded for appending.
When a GPS map is first rendered, it is centered to a default location defined in the
map file. This default position could be a notable mountain peak, or city post office.
The program has an on-screen button display that can be used to control it’s features.
The Vector GPS program has a track logging feature, capable of displaying the track log,
and saving a gpx log file to the SD card for later viewing with other mapping programs.
Track logging works solely with RAM until the log is saved, and for that reason, any log
is limited to 926 points capacity. Track logging is suspended while in map browse mode.
Track log save to SD card is automatic on exit, and can be disabled by write protecting
the SD card (for sockets with a switch), or by deleting the GPX folder from the SD card.
If a previously saved track log file is found in the GPX folder, that has the same,
or the previous date, relating to the current date, when the Vector GPS program starts,
the most recent file will be read into track log memory and appended with any new track
log data, and will then also be saved on exit. The current date must have first been
acquired from GPS to compare the current date with the date of previous track log files.
The date could be acquired prior to starting Vector GPS, using the Astro Time program.
When the program opens a previous track log file for appending, it also tries to open
the map file originally used to create the first part of the track log file.
There are two track logging interval settings, which are by default, depending on the
map type, selected automatically. For street maps, a point will be logged no more than
once every second (or longer depending on map render time), and for topographic maps,
no more than once per minute. This provides over 15 hours of hiking time, or at least
15 minutes of driving time. Setting the log interval value in the SD card configuration
file to 1, will force the lower resolution track log setting for all map types.
Both of the total capacity times are calculated assuming a map will render each second.
In terms of practical use, these times are minimums that will probably be longer.
A locale setting in the SD Card configuration file will determine whether the Vector GPS
program displays the speed and track distance in kilometers (or kmph), or miles (or mph).
If the program is in GPS mode, moving the joystick left exits to map browse mode.
The GPS program is exited by clicking the “EXIT” button while in map browse mode.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Astro Time:
The Astro Time, or “Local Astronomy Clock”, is a time of day and date clock that
derives information from GPS and the local time zone offset is provided by the user
in the configuration file. It also calculates and displays the local time of Sunrise,
Sunset, moonrise, moonset, moon percentage illumination, and phase of the moon.
The local time zone offset as read from the config.txt file will be displayed for
a breif moment in the time window, upon starting the program from the main menu.
The program acquires the time and date from the GPS module before being displayed,
and then displays the time and date on a rolling odometer style clock, and a simulated
analogue clock face. The displayed time and date have local time zone offset applied.
Astro Time can announce the time of day with a voice by moving the joystick to the right.
Both time and date must be acquired from GPS before the time announcement feature works.
A locale setting in the SD Card configuration file determines the format that Astro Time
will display the date. Options are DD/MM/YY (Australia), or MM/DD/YY (USA).
This version of Astro Time only supports positive or negative integer timezone offsets.
To exit the Astro Time program, move the joystick to the left.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tetrabrick:
Tetrabrick is a version of a classic falling tetromino game, which needs no introduction.
This version aims to be true to the World Championship version, but has arbitrary timing
for the game speed, and scoring is not standard. More points are awarded for clearing
multiple rows simultaneously. The shape randomiser is based on standard versions.
To exit the Tetrabrick game, hold the fire button, which is otherwise unused in the game.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Calendar:
The Calendar program provides dynamically generated graphic table format calendar screens
for a month at a time. The joystick can be used to scroll sideways through previous or
future months and years. If another program has used the GPS to acquire a time and date,
the current date will be highlighted in a flashing inverted indicator box.
The calendar function truly accommodates leap years, and can search far into the future.
To exit the Calendar program, press the fire button.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
File Browser:
The file browser can be activated by either the Vector GPS, or MP3 Player programs,
and provides a method of selecting data or media files to load for use with a program.
The file browser only supports 8.3 filenames (ie. “ABCDEFGH.EXT”) to save program memory.
This limitation is overcome by extracting information from the files themselves to print.
For MP3 files, the browser tries to extract track titles for display, and for all Vector
GPS map files, the browser extracts the description string which is biult into map files.
When browsing files, the scroll bar can be clicked to quickly scroll up or down through
large groups of files. Accurate scrolling can be done by moving the joystick up and down.
For this implementation, clicking on a file name will exit the browser, and then enter
the program that opened the file browser, and continue to load the file that was selected.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Configuration File:
An SD Card configuration file provides a mechanism for applying personal settings that
are either global, and apply to all demo programs, or options for single demo programs.
The SD Card configuration file should be inside a root directory named “CONFIG”, and be
named “config.txt”. If no configuration file is found, a warning screen will be displayed,
and default settings will be applied to all configurable options. It is best to include
a configuration file, if for no other reason than to avoid this warning message.
All options defined within the configuration file must exist within the first 4076 bytes
of the file. The configuration file may be longer, but only a set size is scannned by
the function that extracts user settings from it. The example configuration file that
will be included with this distribution leaves little room for adding anything to it.
There are two particular settings in the configuration file, that if set incorrectly for
particular hardware, could prevent the device working. If SPI_SPEED is set to 1, but the
hardware SPI bus can not handle the higher speed communication, the MP3 Player will not
work at all, even though menu and other sound might work fine. If the CARD_SPEED setting
is too high for a particular SD Card, or for the particular hardware SPI bus, the device
will show an error message, and fail to start. It is best to start from zero with this
setting, and for each SD Card, increase the value to the maximum speed the card handles.
The configuration file parser understands C comments “//“, and will skip commented lines.
Commented lines may include otherwise valid settings, or notes about settings that might
otherwise slow down the parser. It is flexible with spaces between definitions and values.
The example SD Card configuration file included with this distribution provides brief
notes relating to each configurable option.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Serial Port:
The hardware project has a spare pin used as an output serial port if enabled with an
option in the configuration file. Features can use the serial port at different speeds.
It is best for speed, to disable this feature completely if you don’t plan on using it.
Option 1 - Track Artist & Title Info. 1200 baud 8N1.
The MP3 Player program will output track artist and title information, and a new line,
whenever a new track starts playing. If you leave a terminal program running this way,
and walk away, you should come back to a list of the tracks that played.
If an id3 tag could not be interpreted, the file name will be output instead.
THe baud rate is reduced for this option so that a slower microcontroller could interpret
the data at it’s end, and do something with it, and also because little data is sent.
Option 2 - Spectrum Analyser Data Mode. 9600 baud 8N1.
This feature supports an external, serially connected spectrum analyser display for the
MP3 Player. Data is transmitted in packets of eleven bytes, where the first byte is 0xFF,
to allow for receiving software controlling an external display to synchronise to the
beginning of frames, and the following ten bytes are the spectrum data values in order
from the lowest frequency component to the highest. There is no checksum, but receiving
software could check that the spectrum values are all less than 32, and then reasonably
conclude that the received frame was valid, since the values should all be 0-31.
In practical application, the values appear to be often lower than their maximums,
and receiving software that controls higher resolution displays may have to multiply
these values to achieve a proper display.
Option 3 - Display Debug Output Mode.
This value is reserved. Setting this option has exactly the same effect as Option 5.
Option 4 - Display Frame Counter.
This is not a serial mode at all, but is set in the serial congiguration option.
It’s a performance measurement tool that counts from 0-99, and displays the count
as fast as the screen draws in any program or menu. This mode does not calculate
frame rates, but they can be calculated using a video camera, and slow playback.
Option 5 - Display Debug Output Mode.
This is not a serial mode either, but is also set in the serial configuration option.
This setting outputs debug error codes as a serial debug output mode would, but output
is to a display window instead of the serial port. Error codes are displayed live.
Option 6 - Piezo Speaker Support.
This mode supports connection of a piezo speaker to the spare debug pin, in cases where
the hardware device does not have a vs1003b audio decoder chip, or if the device is to
be used without headphones (particularly the Vector GPS program). If this option is set,
simple beep sounds will be made in the main menu, for the low battery warning message,
at device startup, and for every button push in the Vector GPS program. The piezo will
also click while scrolling files in the file browser, and beep when a file is selected.
Other demo programs also support piezo clicks and beeps to some extent. This was made a
debug option to prevent piezo speaker support being enabled simultaneously with a serial
mode, because the speaker output would interfere with serial comms on the same port pin.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Software Developers:
This project source is distributed in the hope that it will be useful to the open
source community, but only the graphics and audio library functions are written in
a manner that is supposed to be understood, and recycled easily by others.
All demo programs aim for some speed to size comprimise, and are written with a result
in mind. The Tetrabrick game, although written quite formally, deals directly with
memory, and might be difficult to modify for that reason instead. Tetrabrick would
probably be the easiest program to replace, while maintaining the rest of the programs.
When the device boots, a function samples noise from the VS1003b line input, whether
an audio source is connected or not. It is intended for use generating master random
seeds for use by demo programs such as Tetrabrick, and the MP3 Player shuffle function.
It may not be documented what was done with the VS1003b line input pin in hardware,
but if you are afraid to leave the pin floating, it could be tied low with a very high
value carbon resistor, or to an actual noise source via an appropriate resistor voltage
divider. The project source code could also be adjusted to use the real mic input.
The project 2D graphics library supports a fixed width 7x5 pixel font, and a variable
width 8x7 font. Printing functions are comprehensive for variable width text printing,
including string measurement and screen centering for variable width font text strings.
Both fonts fully support all standard printable ASCII characters through the use of the
provided graphics library string printing functions. Lower case characters, although
fully supported by graphics library functions, are never used in this project, except
to print “km” or “mi” speed units, or when the mixed case configuration option is set.
The Vector GPS program converts all map strings to upper case for better readability.
This project was compiled in MPLAB-X IDE v4.05, with XC16 Compiler v1.34, which are both
the current software versions at the time of this distribution, with advanced optimisation
settings that are only available with a lisenced MPLAB-X Pro upgrade. To compile with a
free version, some source code would have to be removed. There are very few words left in
the dsPic program memory, but not to worry, if it comes to fixing a bug, space can easily
be made by removing some verbose text error messages, where a numeric error code would do.
Most of the software testing was done using dsPic33FJ128GP802 silicon revision A4.
The project was developed largely on a Mac, and may contain artifact journal files.
It appears the compiler doesn’t know when the project uses too much global RAM.
It compiles without any warnings, even though something breaks at execution time.
The first thing to stop working if too much RAM is used appears to be the Covershow
feature of the MP3 Player, presumably because the image decoder sources compile last.
The distrubution is compiled to make as much RAM as possible available for GPS track
log capacity. Nothing else in the project needs the main RAM array to be so large.
Aside from track logging, the highest locations are used for the file browser titles.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Contact Email: bushprogrammer@gmail.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~