New hotfix is up. Changes are as follows:
*Fixed a bug with MIDI export where lyrics containing Unicode characters would be written incompletely.
*Updated GH3/GHA import to interpret the HOPO threshold as a fraction of a quarter note length instead of a fraction of a beat length, since FCPREMIX suggests this is how Guitar Hero handles it.
*Corrected Guitar Hero import to reflect that notes that start at the end of a slider (tap) phrase do not have that status applied to them.
*Added logic so that the main menu is rendered correctly when x2 zoom is in use.
*Fixed a bug with Feedback import where if events were defined out of chronological order, they may not import correctly.
*Removed the previous change to 3D render logic regarding crazy note tails. Resolving this superficial problem causes too much of a performance hit on track difficulties with several thousand notes.
*Improved the trill, tremolo and slider remove functions to only create one undo state when used on multiple selected applicable notes.
*Fixed the GH import logic that prompts for which type of star power phrase to import when both normal and battle phrases are present.
*Fixed a bug where seeking to the chart or audio end during playback could result in the seek position exceeding the end position of the audio.
*Fixed a bug with GPA import where time signatures on beats synced to precede 0 seconds would be incorrectly applied to the beats that are kept.
*Improved GH import to be able to read sections from GH3 format chart files.
*Added a "File>Import>Guitar Hero sections" function to import just the section names from a Guitar Hero file (ie. *.pak.ngc) into the active project. Each imported section is assigned to the beat immediately at or before the section's timestamp.
*Corrected the GH import logic's ability to read the section names from one file and the section instances (ie. timestamps) from the main chart file. This seems necessary for GHA charts, where if you extract the chart's text.qb.ngc file from the game disc's qb.pak.ngc file, you can provide that text.qb.ngc to EOF when it offers to load the section names from a different file.
*Changed the 2D rendering of cymbals in the piano roll to work around Apple's changes to OS X (at least as far back as High Sierra) which broke the ability to draw filled triangles.
*Added CTRL+Space and CTRL+SHIFT+Space playback shortcuts to the Mac build, since the CMD+Space shortcut that had been assigned invokes the Operating System's search feature.
*Fixed the handling of the optional background image so that it is retained when importing a file via command line or when changing the program window size.
*Fixed a bug that could cause pro guitar notes to 3D render with the wrong size (ie. reflecting wrong hammer on or pull off status).
*Added a "Track>Offset" function that will move the track's contents (excluding text events) forward or backward a specific number of milliseconds, such as to correct the sync of lyrics after lyric import. It's been said that Guitar Hero Smash Hits automatically offsets the lyric timings by some amount of milliseconds from how they're defined in the chart file, so offsetting the vocal track after importing a GHSH chart appears necessary.
*Fixed a bug with GH import that would prevent sections from being loaded from a few specific songs due to their inclusion of hex strings of multiple opposing section definition methods.
*Corrected MIDI import to better handle open notes that overlap other notes.
*Changed the MIDI export of crazy open strum notes to end the open strum Sysex marker 1 delta tick after it begins instead of extending it across the entire open note, to improve compatibility with Clone Hero.
*Fixed a bug where accent drum note status was not correctly applied when using "Paste from difficulty", "Paste from catalog" or "Clone from track".
*Fixed a bug where accent drum note status was not correctly retained when vertically reflecting notes.
*Corrected the behavior of the Note>Drum>Accent>Toggle and Clear functions, which weren't actually toggling or clearing those statuses.
*Changed the Note>Drum>Accent>Toggle and Clear functions so they don't force the status to match on notes outside the active track difficulty.
*Added the ability to define ghost status for drum notes (which is used in some Guitar Hero charts), for potential future use in Strikeline and Phase Shift, which will render with a white background in the piano roll at the letter 'G' below the note at the bottom of the piano roll. Ghost status is applied appropriately by Guitar Hero import for Warriors of Rock chart files. When the MIDI is exported during save, a "drum_ghost_threshold = 1" INI tag is written to reflect that the velocity value of 1 is being used to define ghost gems. The G menu accelerator in the Note>Drum menu was re-assigned to the new Ghost submenu, since "Toggle G cymbal+tom" already has a keyboard shortcut. If a drum gem is defined as having both accent AND ghost status at the same time, it will export to MIDI as a ghost gem, as this is the conflict resolution observed in at least one Guitar Hero chart that does this.
*Added a "Prefer MIDI friendly grid snaps" preference that is enabled by default which causes the "Highlight non grid snapped notes" and "Repair grid snap" functions to only honor grid snap sizes that will quantize properly when saved to MIDI. For example: In 4/4 meter, 480 ticks is divisible by 4 so 1/4 beat works well. However 480 ticks is not divisible by 25, so 1/25 beat can't be written so that many consecutive 1/25 beat notes are equal distances from each other.
*Changed the length threshold for drum rolls in GH import to 160ms based on the in-game behavior of some charts.
*Improved MIDI export so that if a note is within 1ms of a quantized MIDI timing, it is exported at that quantized position, reducing timing problems introduced by math rounding limitations depending on the tempo map.
*Added some fault tolerance to the project save logic (also applies to creating undo/redo state) so that if the file can't be opened for writing (ie. if it was blocked by the OS or antivirus), EOF will delay 1ms and retry to open the file up to 4 more times in case the interference ends and EOF can then write the file.
*Corrected the behavior of the track cloning functions to correctly reflect the sharing of the phrases between the normal and Phase Shift drum tracks.
*Improved the auto adjust logic to update the timing of Phase Shift drum track phrases even if that track is currently reflecting the normal drum track's phrases (the phrasing is being shared).
*Added logic to rebuild the program window before prompting to exit (by pressing Esc or clicking the close button at the top right of the EOF program window), in case the display stopped rendering properly due to use of Remote Desktop or the computer going to sleep/hibernation. The close button click should be able to be detected as long as a dialog window wasn't left open, but in case a dialog was left open, you should be able to press Esc a couple times to close the dialogs and trigger the display to be redrawn.
*Improved Queen Bee import to be able to import a text file that defines a time signature or star power phrase. Queen Bee exports one such definition per file.
*Added a "File>Import>Queen Bee (multi)" function that has you browse for a Queen Bee format array.txt file and imports all .txt files in that file's folder.
*Added a "Don't auto edit new lyrics" preference that suppresses the prompt to provide lyric text when a new lyric is placed in the vocal track.