FoF Lyric Converter 2.40b (100% success rate)

A collection of helpful posts
This topic is 1 year and 1 week old. Instead of replying, please begin a new topic, or search for another related topic that may be more suitable.
Jpop fanatic
Posts: 5544
Joined: April 20th, 2008
Location: Megumi Island
Reputation: 43

FoF Lyric Converter 2.40b (100% success rate)

Postby raynebc » Tue Dec 23, 2008 2:36 am

This is a command line program to convert to and from different lyric formats, including that used by Rock Band charts. From EOF 1.63 onward, the import functionality is built-into the chart editor for added convenience. If you use prefer to use Feedback or if you want to have more granular control over the lyric conversion, you can use the command line program instead.

Download version 2.40b here (Windows 9x or newer, or a 32 bit DOS based OS): ...

Mac platform (v2.39), build provided by NewCreature is here:

Download source using your favorite SVN client, for building in your OS of choice:

Code: Select all

svn checkout

Note: From version 1.89 on, do not use the -forcemidipitch parameter because its use is no longer necessary and has been removed.

Version 2.40b
*Improved UltraStar export so that if a lyric is pitchless, it is stored as a positive number instead of a negative number.
*Improved Ultrastar import to properly handle lyrics that have a negative timestamp but a large enough gap parameter to make them positive.
*Minor improvement to Rocksmith lyric detection by adding another criterion to identify such a file if the <xml> header tag is missing.
*Added handling for a rare problem that can affect the lyric import of MIDI based files. This problem occurs when a MIDI file does not properly define a 0 byte length for the last end of track event, and subsequently the file would fail to parse. Such MIDI files may even technically be violating the MIDI standard.
*Added a check to UltraStar lyric import to handle an invalid lyric duration of 0.
*Fixed a bug where timing conversion could malfunction on a MIDI that defines time signature changes in tracks other than the tempo track.
*Added support for importing line breaks in Rocksmith formatted lyrics and exporting line breaks in Rocksmith 2014 format.
*Improved the noplus logic so that a lyric's duration extends to the end of a pitch shift instead of simply having the shift's duration added. Previously, the distance between the start of the pitch shift and the end of the previous lyric was not taken into account.
*Fixed a bug where the nolyrics parameter couldn't be specified without FoFLC reporting a usage error.
*Fixed a bug with Rocksmith imports where a numerical field larger than 10 digits long or a lyric longer than 100 characters would cause a buffer overflow.
*Fixed various memory leaks that could occur when parsing errors are encountered.
*Improved UltraStar import to skip the Byte Order Mark (BOM, a Unicode encoding mechanism) if one is present at the beginning of the imported file. Previously the presence of the BOM would cause the import to fail.
*Improved LRC/ELRC import to allow the hundredths timing field to contain a third digit, in which case it will be interpreted as defining the field in milliseconds.

Version 2.39
*Some code cleanup.
*Added support for detecting, importing and exporting Rocksmith format lyrics.
*Minor improvements to MIDI parse logging and added a warning if no input track is specified during KAR import.
*Updated the MIDI format exports' logic so that if a default tempo track is created, it is given a track name based on the input song's title (otherwise "Tempo map" if there's no song title defined). This may be necessary for some programs that use MIDI files.
*Added handling for improperly formatted MIDIs that don't formally end MIDI tracks, or which include data after the end of a track, either of which would cause such a MIDI to not parse fully during lyric import.

Version 2.38
*Added support for detecting and importing JamBand format lyrics.
*Improved memory handling, including correcting a crash in the ID3v2 tag parsing that could occur during a parsing failure.
*Fixed a bug where export would fail if the input lyrics contained pitches but the first lyric was pitchless/freestyle.

Version 2.37
*Added support for detecting and importing Guitar Praise format XML lyrics.
*Corrected some memory leaks.
*Corrected a crash that could occur during KAR import.
*Corrected Vrhythm import for EOF integration.

Version 2.36
*Improved debug logging for MIDI import
*Corrected the handling of Time Signature changes that weren't at the start of the imported MIDI

Version 2.35
*Added support for importing/exporting SRT subtitle format
*Corrected grouping logic regarding the tracking of lyric durations
*Altered ID3 import logic to support all revisions of ID3v2 tags

Version 2.34
*Changed the program executable's name to "foflc"
*Fixed a bug with the MIDI import's lyric overlap correction that would cause a lyric that overlapped into a new line phrase to be discarded
*Corrected the grouping behavior of pitch shifts, which now inherit the grouping of the lyric before them
*Altered the linker options for the program, as it seems that some GCC library wasn't being linked into the executable, resulting in a dll dependency
*Eliminated remaining use of calloc() in favor of guaranteed methods to initialize data to a value of 0
*Fixed a minor optimization warning given by GCC regarding some debug logging code
*Changed the import logic to not lengthen lyrics that precede a pitch shift unless the converter is being used outside of EOF
*Added logic so that vocal percussion notes can be loaded and passed to EOF

Version 2.33
*Fixed a bug with the detection logic that could cause a crash during program completion if lyric detection was used and the input file had no lyrics
*Fixed a bug with ID3v1 tag creation that could write the wrong information into the tag fields
*Optimized ID3 output by using buffered copying for the MP3
*Added another song tag that will be used for import and export: Year. Currently, only the MIDI (song.ini) and ID3 formats routinely define this
*Optimized ID3 frame exclusion logic (excluding frames whose info. is defined in input file, or frames specified with nosrctag)
*Added additional logic so that the use of nosrctag as a wildcard will omit the ID3v1 tag contents from the source MP3
*Restored the ability to use the track "PART VOCALS" for vocal rhythm, since the detection logic now bases detection on more than the track name
*Lessened the use of calloc() to initialize allocated memory, as this could possibly cause a malfunction with some (currently unidentified) compilers or platforms that don't use all bits clear to represent 0 for some data types
*Made adjustments and a makefile for building in Windows, Mac and Linux

Version 2.32
*Updated to GCC 4.5.0 and made minor changes to resolve compiler warnings
*Fixed a bug with ID3 parsing that wouldn't accept a frame that extended all the way to the end of the tag (ie. if it had no padding)
*Fixed a bug with the debug MIDI logging that displayed the realtime stamps of MIDI events incorrectly
*Fixed a bug with MIDI parsing that would likely have prevented a RIFF MIDI import from succeeding
*Fixed a bug with pitched lyric import that wouldn't allow note names A-1, A#-1 or B-1 to be imported
*Fixed a bug with the notenames handling that would cause pitch names for notes in octave -1 (pitches 0 through 11) to be written incorrectly (vrhythm export)
*Fixed a bug with the previous command line optimizations that would cause the program to try to load vocal rhythm from the pitched lyrics file instead of the MIDI file
*Fixed a file I/O error during ID3 import where the input file would be closed more than once if lyrics weren't found, resulting in the program detecting an error and aborting
*The syntax help output now displays the program version
*Added parameter checking to make sure nofstyle is only usable for MIDI export
*When the requested import fails, the detected format(s) of the input file are displayed
*Added the ability to automatically detect the import format if it is not specified
*File detection is now skipped unless detection is requested, if automatically detecting the input format or if the requested import fails
*Improved ELRC detection. Even if the first lyric line in an LRC file has only one timestamp, other lines will be checked for the presence of multiple timestamps (ELRC)
*Added some more variable checking and ensured that all variables are now properly initialized, which should help prevent undiscovered bugs
*Consolidated debug output for MPEG frame parsing
*Added more error checking for each export format
*Added ability to import lyrics from a Rock Band Audition (RBA) file. This container format includes a Rock Band style MIDI, and can be imported as "midi" format
*Improved validation of text information ID3v2 frames
*Added ability to read and write ID3v1 tag information

Version 2.31
*Improved Rock Band MIDI detection, which now recognizes that whitespace in lyrics indicates KAR lyrics, because Rock Band lyrics don't use whitespace
*Sped up MIDI parsing by separating the statistics tracking used for lyric detection from the regular MIDI import code
*Corrected handling for a corrupted MIDI header that specifies fewer tracks than are defined in the file
*Removed some duplicated logic in the command line parsing code
*Added error checking for "rewind" file I/O operations
*Added the -nofstyle parameter to prevent the addition of freestyle characters during MIDI export

Version 2.3
*Fixed memory leaks in UltraStar and ID3 imports
*Corrected program behavior to not create an empty output file during ID3 export if the source MP3 doesn't exist
*Added logic to track a lyric's overdrive and freestyle status separately. Lyrics that import as both freestyle AND overdrive will export as such whenever possible (pitched lyrics or MIDI).
*Added string parsing optimizations
*Extreme file I/O optimizations for MIDI/ID3 import/export
*Implemented running status logic for MIDI/Vrhythm export that reduces filesize of the output MIDI track (and any track rewritten to remove vrhythm notes) by about 2 bytes per lyric and 2 more bytes per lyric/overdrive phrase (typical size reduction is around 10-20%)
*Added the id3tag parameter, allowing the contents of a file's ID3 tag to be displayed
*Added the nosrctag parameter, allowing all ID3 content or event just specific frames IDs to be omitted from the source file when the output file is created
*Removed = from the default filter list and disallowed it from being filtered, as this is intended to be a forced hyphen
*Added ability to load song tag information (artist, title, album) during ID3 import
*Fixed logic errors in the noplus parameter handling
*Fixed logic errors in duplicate tag import handling
*Added logic to export song tag information from the input file during ID3 export
*Added logic to allow the input MP3 to be assumed as the source MP3 during ID3 export if the source MP3 is not given

Version 2.2
*Added additional logic to parse an extended ID3 header if present in the input MP3 file during ID3 import
*Corrected the import of ID3 lyrics that use MPEG timing
*Added support for exporting ID3 lyrics to an MPEG audio file (ie. MP3)
*Improved debug output
*Corrected some logic that could cause a crash when importing bizarre lyrics, such as if multiple lines' worth of lyrics shared the same timestamp
*Improved command line parameter validation
*Added logic to add durations to lyrics that have other lyrics group onto them during ID3 import

Version 2.1
*Changed logic so that equal signs in lyrics are exported regardless of the use of nohyphens, as they are intended to be visible hyphens
*Improved error logging of damaged MIDI files
*Added ability to parse "RIFF MIDI" (AKA RMIDI, RMI) files, which are regular MIDI files with an additional header
*Added ability to detect and import synchronized lyrics from the ID3 tag of an MP3 file

Version 2.01
*Fixed the behavior of the -quick parameter
*Corrected the logging to show the results of the lyric detection if verbose/debugging logging is enabled
*Added logic to correct problems with an imported MIDI that has overlapping line phrases, a formatting error that plagued just under 5% of all RB MIDIs.
*Allowed an imported MIDI/KAR file to violate the KAR standard by having a note's pitch at a different MIDI timing than its lyric. So far, the only MIDI that seems to violate this is "Kasabian - Shoot The Runner"
*Fixed a few memory leaks introduced by the new lyric detection logic
*Fixed a potential wild free that could occur in one of the string manipulation functions
*Fixed the logic for the updated -nohyphens usage where it wouldn't be accepted without a number unless nohyphens was the last parameter

Version 2.0
*Improved parameter conflict detection
*Improved readme file
*Added the -notenames parameter, allowing the exported pitched lyric file to be written in note names instead of numbers (ie. A#7 instead of 106)
*Reorganized program for inclusion in EOF
*Corrected grouping logic for KAR import
*Removed the extra "#newline" markup that was at the end of script export if -marklines was specified
*Pitchless formats (Script, VL, LRC and Soft Karaoke) are now stored internally as having no defined pitch instead of a generic pitch
*Fixed relative UltraStar import logic
*Fixed a bug with the UltraStar trailing whitespace logic that could cause grouping status to be lost
*Added logic to better allow pitch shift lyrics to be converted to "~" when hyphens weren't suppressed during UltraStar export
*Added the -relative parameter, allowing export of UltraStar lyrics in relative timing instead of absolute timing
*Fixed a bug that would cause the program to crash if exporting to a MIDI format, using a source MIDI, when the import file was not a MIDI based format
*Fixed a minor memory leak that could occur if importing a non MIDI based file and exporting to Vrhythm
*Removed "PART VOCALS" as a usable vocal rhythm track to ensure accuracy of lyric detection
*Added lyric format detection logic whose findings are given with verbose or debugging output. If a lyric import is failing, you can use either of the logging features to see if you are specifying the correct import format for the given file.
*Corrected logic that handles the conversion between MIDI pitch numbering (Pitch 24 is note C1) and UltraStar pitch numbering (Pitch 0 is note C1)
*Rewrote pitch range validation to run only when the output format is MIDI, as only Rock Band MIDIs have a defined requirement of a vocal pitch range of [36,84]. Any vocal pitches outside of this range have their octave changed to correct the issue.
*Added logic to allow pitchless, durationless MIDI vocals (Lyric events with no Note On and Off) to be imported, also allowing them to be exported to MIDI (without vocal pitch notes, if the nopitch parameter is defined), UltraStar (as freestyle) and Vrhythm (as freestyle)
*Added the -nopitch parameter, which will cause imported pitchless lyrics (ie. VL, Script, LRC, Soft Karaoke, freestyle Pitched Lyric entries) to export to MIDI with no fake vocal notes, which also means that the affected lyrics will have no lyric durations
*Improved the MIDI lyric error recovery logic's handling of corrected endings of lyric phrases
*Corrected the program's logic regarding calculation of lyric line durations
*Fixed logic errors with the combined use of nohyphens and noplus
*Added support for exporting to Soft Karaoke format
*Added more error handling and statistic tracking (lyric count) in MIDI parsing code
*Added support for exporting to (unofficial) KAR format, which Rock Band's MIDI format was derived from
*Removed some unused MIDI logic
*Fixed a bug with the nohyphens logic, which would automatically remove hyphens that were inserted if "-nohyphens 2" was used to suppress the pre-existing hyphens in the imported lyrics
*The -nohyphens parameter has been altered to allow it to be used without specifying a number after it, in which case "-nohyphens 3" is assumed, removing existing trailing hyphens and suppressing the automatic insertion of hyphens
*Made various code optimizations
*Fixed a bug in the KAR/MIDI import logic that could cause lyrics to lose their overdrive status
*Used Splint, Yasca and RATS security analysis tools to add some minor hardening to the source code
*Added more error checking
*Added the -detect parameter, which will detect and list the lyric format(s) of the specified file instead of performing a lyric import or export
*Added logic to perform correction for malformed RB MIDIs that have empty lyric phrases (ie. Queen - "We Will Rock You")
*Fixed a logic error that could cause the program to abort due to supposed invalid running status events, even if they were valid

Version 1.96
*Corrected a bug that could produce unpredictable results when importing a relative timed UltraStar file that has a line break before the first lyric
*Added the -nolyrics parameter, allowing vocal pitches to be imported from a MIDI or KAR track that has no lyrics. Exported lyrics use asterisks where lyrics would be but retain note pitches and timings.
*Added the ability to supply just the vrhythm track identifier instead of a pitched lyric file, allowing you to import a vrhythm file without lyrics and export back to vrhythm to create a pitched lyric file with the correct number of entries.
*Fixed a missing pointer assignment in the pitched lyric line break logic, which may have eventually allowed a crash to occur
*Increased error checking that occurs after lyric import
*Added new logic to exclude the imported vocal track from export to avoid duplicate vocal tracks when converting to and from MIDI based formats (vrhythm import is excluded from this logic)
*Added logic to correctly import MIDIs having the vocal track end in vocal phrases that have no lyrics defined (ie. tambourine sections)
*Due to errors in several Rock Band Network MIDIs, logic was altered to disregard lyric events that begin with an open bracket ( [ )

Version 1.95
*Corrected a bug in the new source MIDI import logic that would import tracks from the input file instead of the source file
*Corrected a bug in the new source MIDI import logic that would cause the program to abort instead of process the file
*Corrected a false alarm that would claim that imported pitched lyrics had the wrong number of entries if the file ends in a blank line, even though all entries were properly loaded
*Corrected a bug that would cause duplicate track names if the source MIDI contained a track named the same as the one created to export vocal rhythm to
*Improved verbose output
*If exporting to a MIDI based format without merging with tracks from an existing source file, the created MIDI explicitly defines a tempo of 120BPM instead of using it implicitly
*Fixed the handling of the MIDI delay for MIDI based export format
*Fixed a minor memory leak that would occur if an input MIDI track name was specified
*Added the -outtrack parameter, allowing the destination track name for MIDI based exports to be specified
*Added logic to allow the -bpm parameter to specify the tempo used during MIDI based export if no source MIDI is given
*Based on Harmonix's documentation, I have altered program logic to recognize the expected range of pitches to be 36 to 84 (inclusive)

Version 1.94
*Finished removing previous KAR import logic
*Improved efficiency of MIDI and Vrhythm export code
*Added logic to disable appending a hyphen to a lyric if the following lyric is just a pitch shift (+ character), regardless of nohyphens setting
*Added additional error checking to ensure all lyrics processed during MIDI/KAR import are handled completely
*Fixed a logic error that could cause the program to abort itself at the end if the input or source MIDI file did not explicitly set a tempo
*Made the source MIDI file optional for MIDI and Vrhythm export. If not used, the exported file uses a default tempo of 120BPM
*Added a source file offset for the optional source file given during MIDI based file export (ie. MIDI, Vrhythm)
*Added whitespace logic allowing either leading OR trailing whitespace to separate whole words during UltraStar import

Version 1.93
*Added support for exporting to Vocal Rhythm format
*Added support for writing flat note notation for Vrhythm import
*Added handling for lyrics that end in a forward slash (ie. in Rock Band Beatles MIDIs) to cause a line break to occur
*Corrected the grouping behavior of lyrics ending in "=", which are supposed to group with the next lyric in addition to representing a visible hyphen in the lyric
*Added strong handling for incorrectly nested notes in KAR files
*Improved error handling for remaining file I/O (file open/read/write/close/flush)
*Combined new KAR import logic with RB MIDI import logic for simplification
*Corrected byte ordering when writing files, should maintain ability to work on little endian platforms like Mac
*Fixed grouping logic for pitched lyric import
*Cleaned up some unused code
*Consolidated memory allocation error checking
*Fixed a bug that could prevent a successful MIDI export if not importing vocal rhythm
*Improved memory management of import functions and corrected most/all memory leaks
*Fixed various format->format specific logic errors

Version 1.92
*Added support for importing KAR files
*Added support for unofficial MIDI meta event 0x21 (Set MIDI port), as some non completely MIDI-compliant files may use this
*Added logic to account for running status MIDI events when vocal rhythm notes are ommitted during MIDI export
*Corrected a MIDI parsing flaw that would cause Sysex events to be misread
*Corrected a logic flaw that would export to VL format incorrectly if a lyric duration was less than 10ms

Version 1.91
*Consolidated error checking for MIDI writing code
*Added logic to prevent creation of an empty MIDI track during a vocal rhythm to MIDI export if the track exported had vocal rhythm notes removed
*Added more error checking for file I/O
*Fixed a minor logic error that could cause the incorrect syntax handling to abort the program before displaying more appropriate information
*Added logic to properly use zeros to pad timestamps to mm:ss.xx format during LRC export
*Added support for simple LRC export
*Significantly consolidated and improved tag loading code
*Significantly consolidated file I/O error checking
*Added logic to accept note names (ie. C-1 or G#8) in addition to pitch numbers in pitched lyric files (vocal rhythm import)

Version 1.9
*Added support for exporting to extended LRC format
*During a vocal rhythm to MIDI conversion, the vocal rhythm notes are now removed from the exported MIDI. All other notes retain their original timing
*Added handling for empty line phrases during pitched lyric import, allowing the first line of lyrics to contain overdrive
*Fixed a minor logic flaw caused by importing empty lyric lines in LRC format
*Added error checking for almost all file I/O operations
*Improved specificity and consistency for error messages, such as failed memory allocation, file I/O and MIDI file errors
*Added leniency for UltraStar import, which now allows import for text files that are missing one or more important tags
*Fixed a crash bug that could happen when using vocal rhythm import on MIDIs that had one or more track names missing

Version 1.89
*Fixed a bug that would cause the program to crash if importing a pitched lyric file that ends in a phrase marker (hyphen). This is now allowed, but a warning is given
*Moved some verbose output to the debug output option, and improved verbose output
*Added logic to warn if the given output filename doesn't have the appropriate extension
*Removed the requirement to use an undocumented parameter to export MIDI with correct pitches, as FoFiX 3.120 has fixed bugs that would have prevented custom vocal charts from working correctly
*Fixed a previous over-zealous commenting-out that broke the ability to load the artist tag during UltraStar import
*Added additional error output. If a text input file (script, UltraStar, pitched lyric) has invalid number fields, the line containing the first error will be given
*Fixed a logic flaw causing the source MIDI to be processed twice if converting from Vocal Rhythm to MIDI
*Fixed overdrive and freestyle logic for pitched vocal import
*Added logic to remove trailing whitespace from lyrics during pitched lyric import
*As per Harmonix's documentation, I have added logic to interpret '^' as a freestyle indicator and '=' as a hyphen character during MIDI import.
*Updated readme file

Version 1.88
*Significantly consolidated tag storing code
*Fixed a conditional crash bug that could occur if a MIDI track had no defined name
*Consolidated text file pre-parsing code
*Added logic to exit with error if imported LRC file is empty
*Added more error checking
*Added a debug logging parameter, and offloaded some of the verbose output to it
*Added logic to correct line durations if imported lyrics have timing overlap errors (ie. LRC)

Version 1.87
*Redesigned grouping and hyphen handling code, grouping should now work for all formats
*Changed how lyric line durations are tracked to prevent incorrect values
*MIDI export now supports writing overdrive phrases
*Corrected program behavior when no lyrics were imported from a MIDI
*Added ability to load lyrics from any specified MIDI track name
*Fixed a bug with noplus that could cause the Lyrics to be corrupted and the program to abort

Version 1.86
*Improved verbose output
*Added additional command line parameter validation
*Added pitch range validation for MIDI import
*Added logic to prevent double hyphens for partial words during UltraStar import
*Added logic to append pound characters to freestyle/pitchless lyrics during MIDI export
*Fixed memory leaks in Vocal Rhythm and MIDI import code
*Fixed potential crash-inducing code in pitched lyric import code
*Fixed grouping logic for Vocal Rhythm import

Version 1.85
*Added a new hybrid input method: Vocal Rhythm
*Corrected logic that caused some import files to open as binary instead of text, even though it didn't seem to be causing problems
*Added additional logic to perform better handling of improperly-formatted MIDIs that would cause false detection overlapping lyrics ("Take it on the run")
*Now allows an imported UltraStar file to contain an explicit GAP of 0, as some editors may set it so
*Corrected a bug that would prematurely de-allocate a VL text entry, causing the program to abort when importing a VL file

Version 1.84
*Fixed a logic error in automatic duration extending for + lyrics that could cause an integer overflow
*Fixed minor memory leaks in LRC, VL and MIDI import code
*Improved verbose output for MIDI import
*Fixed a logic error causing the input MIDI to be parsed twice if the input and output formats were both MIDI
*Enabled quick MIDI import if exporting MIDI lyrics and not importing MIDI lyrics, as the instrument tracks wouldn't need to be parsed
*Fixed a bug with UltraStar export that could cause a crash if the last lyric in a line ends with a hyphen
*Corrected grouping logic for UltraStar import to prevent incorrect grouping detection of the first lyric in a line
*Corrected grouping logic for UltraStar export to prevent the corruption of timestamps for grouped lyrics
*Improved grouping logic for UltraStar export to use rounding to prevent unnecessary lyric grouping
*Added logic to LRC import preventing hyphen appending to a line's last lyric piece if it doesn't end in whitespace

Version 1.83
*Added capability to import LRC and extended LRC format
*Corrected a very minor conditional memory leak caused if a tag was not recognized during UltraStar import
*Added duplicate tag checking for all import formats and improved verbose output for tag loading
*Added more error-checking and verbose output to the lyric handling code
*Improved the verbose output of lyric handling functions
*Added logic to UltraStar import so that partial words correctly have hyphens inserted unless suppressed by nohyphens
*Added logic so that a lyric of "-" is not completely truncated by the nohyphens feature
*Added pitch scaling logic when converting from UltraStar to MIDI that keeps relative pitch values wherever possible
*Added logic so that the duration of a lyric is extended to reach a pitch shift (+ lyric) if one follows it
*Added logic so that an imported UltraStar file's tempo is assumed if a tempo isn't manually supplied by command line

Version 1.82
*Fixed a bug during VL import that could improperly detect an end of lyric line
*Fixed a bug where lyric pieces included one character more than they should during VL import
*Improved the verbose output of VL and MIDI import
*Improved UltraStar import to handle lines that are blank or begin with multiple whitespace characters
*Improved error handling to correct lyric overlapping or durations of 0 between lines of lyrics
*Fixed a bug where exported UltraStar pitches were modified if the import format was also UltraStar (lol)

Version 1.81
*Fixed a bug where the last line of an imported UltraStar file would not have all available error handling performed.
*Added failover handling to automatically correct overlapping lyrics pieces (within a line) for lyric import
*Added handling to automatically correct lyrics pieces (within a line) with a duration of 0 for any lyric import
*Fixed a bug where UltraStar lyrics were exported as freestyle if the import format was also UltraStar (lol)
*Added rounding logic to UltraStar import and export, for added accuracy
*Added marklines parameter to enable exporting to script format with end of line information preserved
*Added script import logic to recognize end of line information when available
*Separated regular syntax output and help output from each other, offering a help parameter to see the latter
*Fixed a bug that prevented the offset and startstamp parameters from working correctly for VL import
*Added logic to convert ~ lyrics back to + for Ultrastar import

Version 1.8
*Added capability to import UltraStar format
*Rewrote all lyric import/export functions to simplify program logic
*Improved verbose output readability
*Cleaned up source code and eliminated compiler warnings
*Corrected all memory leaks, as verified by MemWatch
*Rewrote nohyphens logic so that it works correctly. Nohypens 2 will now allow automatically-inserted hyphens from the input file (currently, VL is the only format to utilize this functionality) to be kept.
*Corrected handling of the offset during MIDI import (when automatically loaded from song.ini)
*Fixed a logic error in that during VL export, the written offset should be 0 because all timestamps are absolute and not relative
*Fixed a logic error that could cause a crash if the incorrect amount of parameters were supplied to the program
*Fixed a logic error that could cause durations in VL export to be 10 ms shorter than they should be if there was no delay between two lyric pieces
*Corrected the handling of the offset value during VL import

Version 1.7
*Added capability to export to VL format
*Fixed a bug that caused incorrect note timing when the brute parameter is used

Version 1.63
*Added ability to load tag information from song.ini if it exists in the same directory as the input MIDI file (-offset will override any delay found in song.ini)
*Replaced all single precision floating point variables with double precision floating point
*Added a brute parameter that checks all tempos from 200-400bpm in increments of .01 to find the most accurate tempo for ustar export.
*Fixed a bug with UltraStar export that would cause the program to abort when exporting all-freestyle songs

Version 1.62
*Fixed a type-casting omission that would cause accented characters to induce a logic error that detects overlapping lyrics (ie. "Finley - Tutto E' Possibile")
*Added handling for Meta events embedded within a running status (ie. "The Hand That Feeds")
*All abnormal program termination messages now use the term "aborting" to help search output when run in batch
*Fixed a bug where a custom tempo is not written to UltraStar format correctly if it contained 0's

Version 1.61
*Added a startstamp parameter to allow the timestamp of the first lyric to be defined manually, keeping the relative timing for all other lyrics the same
*For UltraStar export, the first word after a line change no longer has a leading space
*Added support for recognizing overdrive lyrics in RB MIDIs and saving them as Golden Notes during UltraStar export
*Added UltraStar export logic to write the tempo in the expected #,# format instead of #.#
*Added UltraStar logic to prevent lyrics from having a duration of 0 quarter beats
*Added UltraStar logic to export + lyric pieces as ~ and corrected lyric spacing
*Added improved handling of trailing whitespace and multiple filtered characters on lyric pieces
*Improved freestyle detection: Pitched lyrics are detected as freestyle if the lyric has a # character or if there are no pitch changes throughout the entire set of lyrics.
*Rock Band's lowest pitch value for note C (#36) is mapped to a neutral note C value for UltraStar (#0)

Version 1.6
*Added a quick parameter to skip processing for tracks besides PART VOCALS. My 1.8GHz computer can now process lyrics for all 277 decrypted Rock Band MIDIs and create script.txt lyrics for all those that contain lyrics in less than 1.5 minutes.
*Added capability to export to UltraStar format (with or without pitch)
*Added a bpm parameter to allow the estimated tempo to be overridden used when exporting to UltraStar
*Cleaned up the code a little

Version 1.55
*Added handling for emtpy Meta Event strings (ie. "Papa Roach- Time Is Running Out")
*Added a definable filter feature to allow removal of pitch characters like #, ^, % and =
*Cleaned up the code a little
*Documented the verbose parameter, and increased its use throughout the program.

Version 1.54
*Cleaned up code to eliminate compiler warnings
*Corrected a buffer overflow that didn't crash, but could cause unexpected behavior.
*Added value checking to prevent some implementations of atol() from crashing, such as the GCC implementation
*Added code to release all allocated memory upon completion. 0 memory leaks as validated by MemWatch.

Version 1.53
*Added logic to handle incorrectly started lines of lyrics, such as in "Maps"
*Added logic to handle incorrectly started pieces of lyrics, such as in "In Bloom"
*Added support for interpreting text events as lyrics as long as the events don't begin with an open bracket

Version 1.52
*Corrected a bug that could cause track 0 to not be exported to MIDI

Version 1.51:
*Compiled the program in Visual C++ 2008 to produce a Win32 executable program for added performance
*Cleaned up code to reduce data type conversions, and casted the intentional conversions
*Fixed an incorrect pointer dereference that could potentially cause the program to be terminated by the OS

Version 1.5:
*Added support for importing script.txt files
*Added logic to treat Note On events with a velocity of 0 as Note Off events
*Added logic to ignore incorrectly nested Note events in PART VOCALS, such as in "Welcome Home"
*Added logic to handle incorrectly terminated lines of lyrics, such as in "Welcome Home"
*Added logic to handle incorrectly defined Note events that precede Lyric events, such as in "Welcome Home"
*Song tag information such as Artist, Song Title, Offset, etc. is now embedded in exported MIDI files

Version 1.4:
*Added support for exporting to MIDI
*Added offset, nohyphens, noplus and grouping command line parameters
*Fixed logic error regarding the handling of + lyric events
*Fixed various bugs
*Rebuilt the command line parameter parsing to be flexible and specific regarding incorrect syntax
*Added more specific command line parameter errors and more verbose syntax output
*Added additional validation of lyric timestamps to prevent overlapping and enforce ascending chronological order
*Added checking so that if no lyrics are found in the input file, the program indicates as such and does not open any files for writing

Currently supports:
*Importing/exporting FretsonFire script.txt (subtitle) style lyrics
*Importing/exporting Rock Band/FretsonFire scrolling MIDI lyrics (even if lyrics are defined with Text events)
*Importing/exporting VividLyric Editor's VL format
*Importing/exporting UltraStar format (relative and absolute timing)
*Importing/exporting LRC and Extended LRC format
*Importing/exporting Vocal Rhythm format
*Importing KAR MIDI format (even when lyrics are omitted) and Soft Karaoke format
*Exporting to KAR format and Soft Karaoke format
*Importing/exporting synchronized lyrics defined in an MP3 file's ID3 tag
*Importing/exporting SRT subtitles
*Various time offsetting controls to help sync to your chart
*Various controls for altering how vocal modifier characters, hyphens, etc. are displayed
*Various controls for automatically combining partial words to build whole words, and combining words to build entire lines
*Auto detection for the formats in the specified lyric file

Any of the tags (artist, offset, etc) from VL, song.ini (for MIDI import) or script.txt files are read and used. If the -offset command line parameter is used, it overrides any offset defined in the input file itself.

Intro to syntax:
The syntax conventions used by programmers throughout the world can be a little confusing, but here's a quick primer:
-Parameters must be separated by white space (such as a space) when passed to a program
-Parameters in curly braces { } indicate that the parameter is required.
-Parameters separated by pipe symbols | indicate that either of the parameters may be used
-Parameters that are bolded must be typed verbatim as listed in the syntax
-Parameters that are not bolded must be typed to reflect the correct value (such as a file name or a user-specified number)

Open a command window from which to run the program to have the benefit of seeing the syntax message or any errors that are reported upon termination of the program. Syntax is as follows:

foflc.exe [-offset #] [-nohyphens {1 | 2 | 3}] [-noplus] [-marklines] [-nolyrics]
[-grouping {word | line}] [-verbose | debug] [-filter [...]] [-quick] [-startstamp #]
[-bpm #] [-brute] [-help] [-srcoffset #] [-intrack "TRACKNAME"] [-outtrack "TRACKNAME"]
[-notenames] [-relative] [-nopitch] [-nosrctag [...]] [-nofstyle]
{ {-detect infname} | {-id3tag infname} |
{{-in [FORMAT] infname (lyrics | vrhythm ID)} {-out FORMAT [srcmidi] outfname (lyrics) (vrhythm ID)}} }

The parameters may be in any order, but must be separated by whitespace and must begin with a hyphen. FORMAT is vl, script, midi, ustar, lrc, elrc, vrhythm, kar, skar, id3, srt, xml or jb, and specifies the format for the input and output files.

Please read the included readme file for details about how to export Rock Band charts into UltraStar format, as it also requires processing of the audio files. Here's a screen cap of Coheed and Cambria's song "Welcome Home" exported and opened in UltraStar Deluxe:
And here's a zip file to get the song and lyrics for "Welcome Home" immediately usable in UltraStar if you want to try it out:
You can download UltraStar Deluxe (my favorite variant of UltraStar) for free HERE. With this new functionality, you can sing Rock Band songs in the free UltraStar Deluxe PC game. The recommended basic syntax for converting RB lyrics to UltraStar format is:

Code: Select all

FoFLyricConvert -in midi notes-unedited.mid -nohyphens 2 -filter -brute -out ustar songname.txt

*Do note that 64 of the "notes.mid" files from decrypted Rock Band DLC songs do not have lyrics, but all but 2 RB "notes-unedited.mid" files have lyrics, so it's recommended to import those instead. For a collection thread of UltraStar conversions, check out this thread:

Using the converter's ability to import UltraStar files, you can use existing synced lyrics to add to your chart. Remember, if you use somebody else's UltraStar text file to add scrolling lyrics to your chart, you should credit the original author of that text file.

*If a source MIDI file is provided during an export to a MIDI based format, the resulting output MIDI file will contain all instrument tracks from the source MIDI file and will also contain the newly-created vocal track containing the lyrics. Also note that to get proper scrolling lyrics, your input lyrics should be word-synced or syllable-synced. If you only have line-synced lyrics (a typical script.txt file), the entire line will scroll by when the first word of each line is sung, instead of scrolling word for word.

A very detailed description of the syntax and usage of each command line parameter and lyric format is included in the readme.txt file.

Download Vivid Lyrics Editor HERE.

An example of the granularity of control this program offers is to convert lyrics for a song I made in VividLyrics Editor so that they are synced with a chart I made in EOF. Supposing I had copied the FoF Lyric Converter to the root of my C volume, I could open a command line, change to the directory that contains my lyrics and EOF chart and enter the following command:

Code: Select all

c:\FoFLyricConvert.exe -in vl myfile.vl -out midi notes.mid chartwithlyrics.mid -offset 145 -nohyphens 1

This uses my delay= value in song.ini (145 ms delay) and offsets all lyrics in the VL file so that the resulting scrolling lyrics are perfectly synced with my chart. Update: If there is a song.ini file in the same folder as the input MIDI file, the delay will automatically be read and used.

Another example is how I can convert the scrolling lyrics in "Still Alive" into subtitle style lyrics:

Code: Select all

c:\FoFLyricConvert.exe -in midi notes.mid -out script script.txt -nohyphens 2 -grouping line

(Show the spoiler to see what the script.txt file would look like)

Spoiler:5003 753 text This was a triumph
8766 1854 text I'm making a note here HUGE SUCCESS
13805 3533 text It's hard to overstate my satisfaction
20998 924 text Aperture Science
24770 1988 text We do what we must because we can
30030 2489 text For the good of all of us
33312 1158 text Except the ones who are dead
35537 2629 text But there's no sense crying over every mistake
39528 2790 text You just keep on trying 'till you run out of cake
43530 2934 text And the science gets done and you make a neat gun
47523 2474 text For the people who are still alive
56729 1509 text I'm not even angry
61019 2623 text I'm being so sincere right now
65972 4209 text Even though you broke my heart and killed me
72786 1244 text And tore me to pieces
76769 1994 text And threw every piece into a fire
82005 2248 text As they burned it hurt because
85326 1299 text I was so happy for you
87465 3191 text Now these points of data make a beautiful line
91533 3093 text And we're out of beta we're releasing on time
95488 3146 text So I'm GLaD I got burned think of all the things we learned
99527 2625 text For the people who are still alive
108977 1378 text Go ahead and leave me
112755 2049 text I think I'd prefer to stay inside
118012 3430 text Maybe you'll find someone else to help you
124998 1253 text Maybe Black Mesa
134004 2404 text Anyway this cake is great
137246 1166 text It's so delicious and moist
139518 3020 text Look at me still talking when there's science to do
143546 2957 text When I look out there it makes me GLaD I'm not you
147479 2857 text I've experiments to run there is research to be done
151506 2587 text On the people who are still alive
155526 2044 text And believe me I am still alive
159289 2118 text I'm doing science and I'm still alive
163258 2166 text I feel fantastic and I'm still alive
167497 2048 text While you're dying I'll be still alive
171270 2253 text And when you're dead I will be still alive
175260 1639 text Still alive still alive

Demo 1- Converting from MIDI to Script (subtitle) style lyrics (AVI file, Xvid format)

Some quick notes:
*In Windows, bring up the command window by opening the Start menu, selecting Run, typing cmd and hitting enter.
*In the command window, you can use TAB to auto-complete a file/folder name, so I only had to type c:\fof and hit TAB to complete the name of the program. Copying the program to c:\ provides an easy way to access the program no matter which directory you command window is in.
*cd is the change directory command, which changes the current working directory for the command window. This is similar to browsing to another folder through Windows' graphical interface.
*The command window remembers the "current directory" for each drive you have, so in my video, I had to type f: ENTER to change to my flash drive, which has the MIDI file I'm converting.
*With the command window at the directory that has the file I want to convert, I can easily run the program by specifying the parameters to import the MIDI file in this folder (-in midi notes.mid) and specifying the parameters to export the lyrics in script format (-out script script.txt). The program knows where notes.mid is because the command window is in the folder that contains it. The script.txt file is automatically saved in the current directory of the command window, but I could just as easily have saved it elsewhere by putting a folder path in front of the filename (such as -out script "c:\fof\mychart\script.txt").

Practice with the program, you can then try using other parameters. A good exercise would be to apply line grouping, so that the output lyrics are line by line instead of per syllable (since I made the input lyrics as per-syllable lyrics).

Some quick conversion tutorials:
Using Vocal Rhythm format:
Using UltraStar format:

To do: Switch to using double floating point data types to store timestamps and durations more accurately than rounded to the nearest millisecond.

I have tested the program very heavily, but if you find any bugs, please report them here. Also drop some comments if you like the program or if you have ideas for how it can be improved (besides a GUI). Some Rock Band midis were ripped to not include the lyrics, and the program will say so if that's the case during import. Your best bet is to use the notes-unedited.mid files, as there are only 2 of them among all decrypted Rock Band charts that actually do not have lyrics in them. Some Rock Band midis that had been ripped to use with FretsonFire may have various logic errors (such as ending lines before lyrics are defined, having multiple note events at the same time as a lyric event, etc). I have worked to add the capability to correct all problems that are found in the ripped MIDIs.

Testing success rate: 100% success rate (58/58 RB1 charts, 200/200 RB1 DLC charts, 84/84 RB2 and 178/178 RB2 DLC unedited MIDIs were able to have the lyrics parsed and converted to subtitle style lyrics). That's 520 Rock Band song lyrics, both as a proof of concept and an example of this program's capabilities when being run in a batch file (yet another benefit of it being a command line program):

There are only two Rock Band charts that have no lyrics in notes.mid or notes-unedited.mid, both are RB2 DLC:
"Rush - YYZ"
"Yngwie Malmsteen - Caprici Di Diablo"

Edit: With the release of a complete set of MIDI files that have been ripped since the encryption change for DLC (267 charts), I was able to convert all of them after a minor logic change. 7 of the MIDIs had no lyrics at all, but here are the 260 new script files for anybody that's interested:

Edit: With the release of 45 Rock Band Beatles charts, I was able to convert all of them (3 of them were incorrectly ripped and are missing lyrics). The script files are here if anybody is interested:

Edit: I tested 45 charts from Guitar Hero: Smash Hits, and I was able to convert all of them. The script files are here if anybody is interested:

Edit: I tested 45 charts from Lego Rock Band, and I was able to convert all of them. The script files are here if anybody is interested:

Edit: I tested 140 charts from Rock Band Network, and I was able to convert all of them (5 had no lyrics). The script files are here if anybody is interested:

Edit: I tested all 1202 Rock Band charts I had, 1179 of which had lyrics. After some corrections to the program, 100% of them converted. Here are the script files:

Edit: I tested the 50 charts from Rock Band Green Day, and I was able to convert all of them. The script files are here if anybody is interested:
Last edited by raynebc on Tue Jan 19, 2016 6:25 pm, edited 149 times in total.
Mr. Fansonfire
User avatar
Posts: 1600
Joined: November 2nd, 2008
Reputation: 0

Re: FoF Lyric Converter 1.3

Postby lordhardware » Tue Dec 23, 2008 3:34 am

ive tried using it but am a little confused... the console flashes and then closes... i did a print screen when it was open and it displayes this message

FoFLyricConvert.exe -in (put in right parameters so it will convert your file) blah blah.... but however i put them in i get the same message... a little help please?
"Check Your Hardware: Modern Hits" 11/20
"Check Your Hardware: Australian Anthems" 4/20
"Check Your Hardware: Alternative" 4/20
"Check Your Hardware: Classic Beats" 2/20
"Check Your Hardware: Electronic" 2/10
"Check Your Hardware: Rap" 1/10
User avatar
Posts: 1291
Joined: June 15th, 2008
Location: United Kingdom
Reputation: 0

Re: FoF Lyric Converter 1.3

Postby Nathaniel607 » Tue Dec 23, 2008 11:17 am

Doesn't work for me either...
Jpop fanatic
Posts: 5544
Joined: April 20th, 2008
Location: Megumi Island
Reputation: 43

Re: FoF Lyric Converter 1.3

Postby raynebc » Tue Dec 23, 2008 11:26 am

You guys have to follow the correct syntax. Since this is a command line program (old school I know), it's easiest to bring up a command window before you run it, that way if it reports an error or incorrect syntax, you can see it. The console flashing the message and closing is behavior of the Operating System and not my program. The program strictly enforces the order in which the parameters are accepted (version 1.4 does not have this requirement), for example you could do this:

FoFLyricConvert -in VL mylyrics.vl -out script script.txt

Change mylyrics.vl to the full or relative path (relative to the converter program) of your input file. You could also stash the converter program at the root of a drive (like C:), and run it with a full path while passing it input and output files in the current directory. So say I want to convert a MIDI file to script.txt, and the MIDI file is in a song folder such as c:\fof\data\songs\mysong, what I like to do is copy the address of the folder to the clipboard, open up a command window (Start>Run>type cmd and hit enter), change to the directory that has your song by typing cd followed by a space, pasting the address from the clipboard (right click on the command window and select paste) and hitting enter. The current directory is now the folder that has the song you're interested in converting lyrics for. Then just run the converter program from its full path and you can give the input and output files as relative paths, such as:

c:\FoFLyricConvert -in MIDI notes.mid -out script script.txt

I didn't mention this yet, but this was compiled for the Windows platform, however the code should be portable and just take a recompile for Linux, etc.
Last edited by raynebc on Tue Dec 30, 2008 12:59 am, edited 1 time in total.
Jpop fanatic
Posts: 5544
Joined: April 20th, 2008
Location: Megumi Island
Reputation: 43

Re: FoF Lyric Converter 1.3

Postby raynebc » Fri Dec 26, 2008 11:43 pm

My latest test build supports an offset of a specified number of milliseconds to alter the position of lyrics, so after creating the lyrics in a program like VividLyrics Editor, just convert and pass your chart's delay value to it. I also got MIDI lyric exporting to work, take a look at my first scrolling lyric chart:


The next release will be much better with command line parameters, it can accept them in a flexible order.
User avatar
Posts: 364
Joined: June 9th, 2007
Location: Zzyzx Freeway
Reputation: 0

Re: FoF Lyric Converter 1.3

Postby Super_Crazy_Dude » Sat Dec 27, 2008 12:47 am

Wowowowwo AMAZING!! Nice :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:
Disciple of Puppetz
User avatar
B-47 Unknown
Posts: 278
Joined: September 28th, 2007
Location: United States of America
Reputation: 0

Re: FoF Lyric Converter 1.3

Postby B-47 Unknown » Sat Dec 27, 2008 2:25 pm

I can't seem to get the syntax right. Command line interfaces have never been my thing
anyway. However, being able to convert straight from the VL format would circumvent a
lot of the problems I have while making lyrics. Even though I can't use it now, I hope you
continue development. Maybe I'll try again once the new year comes around.
All of my songs can be found at My song thread.
The latest.. Megadeth - 44 Minutes
Jpop fanatic
Posts: 5544
Joined: April 20th, 2008
Location: Megumi Island
Reputation: 43

Re: FoF Lyric Converter 1.3

Postby raynebc » Sat Dec 27, 2008 3:01 pm

To convert from a VL file, the syntax is:

FoFLyricConvert -in VL mylyrics.vl -out script script.txt

This version of the program wants the parameters in that order (Version 1.4 has no requirement on parameter order), just change "mylyrics.vl" to the filename of your VL file. You can provide a full path to the VL file, but it is best to put quotes around the input file path so you can avoid problems with spaces in folder or file names. If you're really stuck, you can always PM me a VL file and I'll convert it for you.

Your concerns about converting VL files to LRC to be able to get them into script.txt were exactly my concerns and was why I began this project.
Last edited by raynebc on Tue Dec 30, 2008 1:01 am, edited 1 time in total.
Blue Heaven!
User avatar
Posts: 3991
Joined: December 12th, 2007
Location: Australia
Reputation: 5

Re: FoF Lyric Converter 1.4

Postby death_au » Mon Dec 29, 2008 3:01 am

raynebc wrote:Updated from version 1.3 to 1.4. Lots of good changes, and scrolling lyric support for the masses!

Can you export to an existing MIDI without destroying the current tracks (guitar, etc)? Or do you export to a new MIDI and then put a song into it by opening it up in something else?
Blue Heaven!
User avatar
Posts: 3991
Joined: December 12th, 2007
Location: Australia
Reputation: 5

Re: FoF Lyric Converter 1.4

Postby death_au » Mon Dec 29, 2008 4:54 pm

...but if my input source is a vl file, then how will i get the tracks in the output midi.
I apologise, I haven't actually downloaded it to read the midi... I guess I should do that before asking more stupid questions.
User avatar
Posts: 716
Joined: November 23rd, 2006
Location: Murray, KY
Reputation: 3

Re: FoF Lyric Converter 1.4

Postby NewCreature » Mon Dec 29, 2008 5:03 pm

When the output format is set to "midi" you specify the ".mid" file with the music tracks and another ".mid" which will have the converted lyrics as well as the tracks from the first file.
"Stop putting so much stock in all of this stuff, live your life for those that you love." - Relient K
EOF - A Song Editor for Frets On Fire
Blue Heaven!
User avatar
Posts: 3991
Joined: December 12th, 2007
Location: Australia
Reputation: 5

Re: FoF Lyric Converter 1.4

Postby death_au » Mon Dec 29, 2008 5:21 pm

lol. I read the command line syntax from the first post and it didn't say anything about that, but the example right below that answered my question. Silly me for not reading properly...
Thanks NewCreature. If you hadn't have told me I probably still wouldn't have noticed.
Oh, and thanks raynebc because now I understand what you meant it makes sense.
Jpop fanatic
Posts: 5544
Joined: April 20th, 2008
Location: Megumi Island
Reputation: 43

Re: FoF Lyric Converter 1.4

Postby raynebc » Mon Dec 29, 2008 6:13 pm

I'd be happy to post more example syntax, if anybody has any specific scenarios they are interested in.

I found out why "Welcome Home" is having problems being parsed. The MIDI is nesting note events:

I don't know if the original RB MIDI was like this, but it could have been a mistake during the conversion to allow its use in FretsonFire. I'm going to have to code a workaround to ignore nested notes, don't know how difficult it will be.

Edit 2:
I added handling for incorrectly nested notes, but I found yet another error in the MIDI for "Welcome Home." It ends a line of lyrics before the end of a word in that line was defined:

I was able to work around that issue, but there's even a third error in the same MIDI. It has Note On events for lyrics even before the lyric event is defined:

Whoever ripped and prepared this MIDI must have screwed this up big time. I'll continue to try to work around the deficiencies of these MIDI errors. Once the program can gracefully fix all the mistakes in the source MIDI and produce a clean lyric file, I'll release a new version.

Edit 3:
Even before I could address the third type of mistake in the MIDI file, I found a fourth. The MIDI provides multiple Note On events that start at the same time as a piece of lyric, but each of the Note On events has a different duration:

Since it is now impossible to know which of the note numbers is the correct one to use, I have to pick one until somebody who knows about it for sure can provide more information.

Return to “Tutorials and Tools”

Who is online

Users browsing this forum: No registered users and 2 guests