GSoC 2022 – Work Product – Creating Fundamental Ruler and Waveform Display Options

Hello everyone! Now that Google Summer of Code 2022 has wrapped up, I’d like to present the work that I have done over the summer. I would also like to take the time to thank Audacity for giving me this opportunity that has made me much more aware of, and competent in, open-source development. Please use this link if you would like to return to my first blog post and read about the project from the beginning.

Code changes

You can view the final state of my work for GSoC on this pull request.

Project summary

I have met most of the goals originally proposed, with the structure of the Rulers updated for increased flexibility and the vertical Linear dB Waveform ruler and Beats & Measures timer having been created. Here is a summary of the changes made for this project:

  • Ruler Restructuring
    • The RulerFormat and RulerUpdater classes, as well as their large number of subclasses, were created by extracting and reformatting existing code into polymorphic objects.
    • The SetUpdater and SetFormat functions were created to support this polymorphism for the Ruler, replacing the SetLog and SetCustom functions which restricted the ruler to messier switch statements.
    • The SetUpdaterData and SetFormatData functions were created on the Ruler to allow for data of any type to be passed to the ruler. This replaces the SetUseZoomInfo function as well as other functions which control ZoomInfo, and open up the doors for much more flexible data passing.
    • Restructured Ruler structs like TickSizes, and added the ability to set minorMinor ticks (the smallest tick size) using TickSizes. This gives increased flexibility to updaters that rely on this, like the default LinearUpdater.
  • Linear dB Ruler
    • A new ruler option was created for the Waveform ruler, which can be accessed through the right-click menu as well as preferences dialogue.
    • This utilizes the new CustomUpdaterValue updater, which allows the specific necessary dB values for a linear dB ruler to be passed to the ruler creation function.
    • Code was written to generate these values and update the ruler as necessary, as well as make it responsive to a variety of decibel ranges and track sizes.
  • Beats & Measures Ruler
    • A new ruler format, BeatsFormat, was created, which relies on the new ability to pass in data to a ruler format.
    • A new option for the time ruler was created which utilizes BeatsFormat to display time based on user-defined beats per minute and time signature. This data can be set in the preferences dialogue.
    • A new format in the bottom time panel was made which displays bars and beats, and lets users snap to beats when selecting on their track.

I’d also like to go over some planned future changes, as I intend to continue working on this project:

  • Perform general cleanup of code, including comments and variable name changes for both new and legacy code.
  • Add the ability to pass customizable sizes for each different kind of tick.
  • Improve the cleanliness and visual appeal of the user interface, especially the vertical linear dB ruler.
  • Add a panel for setting the data on the beats & measures ruler without going into the preferences menu.

I’d like to especially thank my mentor Paul Licameli, as well as the support from everyone on the Audacity team, including but not limited to Dmitry Vedenko, Peter Sampson, and Peter Jonas. I hope that my work can lead to many new and useful development for Audacity’s user interface in the future.

Enhanced Ruler – GSoC 2022 Week 10

Hello everyone! A few fantastically productive days on the project later, I have a lot to show off! Check out these screenshots of the in-progress beats & measures ruler!

60 bpm, 4/4 time signature
100 bpm, 6/8 time signature

Accomplished this week:

  • Added ability to switch between Beats & Measures and Minutes & Seconds rulers.
  • Completely abstracted RulerFormat so custom data can be passed into it.
  • Created BeatsFormat for the Beats & Measures ruler so a custom tempo and time signature can be passed in.
  • Created algorithms to map the time ruler to beats given the tempo and time signature.

To accomplish this upcoming week:

  • Add tempo and time signature selection to the bottom panel.
  • Add beats display to the bottom panel.
  • Add an option to default to the Beats & Measures ruler in the Preferences menu.
  • Improve the look of the beats & measures ruler.

Enhanced Ruler – GSoC 2022 Week 9

Hi everyone! Writing from Greece this week, doing a bit of travel for my last week of the summer! I’ve finished off the polymorphic ruler changes for a bit to do the beats-and-measures ruler. You can see the current final state of the polymorphic ruler here!

Accomplished this week:

  • Made final changes towards polymorphic ruler; evaluated future changes, went back through commit history to fix issues, etc.
  • Created equivalency function for updaters and implemented invalidation.

To accomplish this upcoming week:

  • Create beats and measures ruler (follow the progress on this branch!)

Enhanced Ruler – GSoC 2022 Week 8

Hi everyone! Not too much to update on. Current goal is to wrap up the last few changes necessary to call the updater changes done, then move on to the new time ruler.

Accomplished this week:

  • Created SetUpdaterData function which fixed many bugs as well.
  • Planned out tasks and worked through backlog.
  • Improved structure and definition of Updaters through GeneratedUpdater class

To accomplish this upcoming week:

  • Evaluate structure / privacy of defined data structures.
  • Create equivalency function for updaters so they can be compared (necessary for efficient ruler invalidation)
  • Clean up, simplify, and comment existing code and commit history.

Enhanced Ruler – GSoC 2022 Week 7

Hi everyone, small update this week. I know that I’m a bit off-schedule from making the update every Monday, so the next update will come Tuesday-Wednesday and I will be on-track for the rest of the coding period from there.

Accomplished this week:

  • Fixed issues with Linear Decibel ruler, up to point where design team consultation is needed.
  • Began work on SetUpdaterData and polymorphism.
  • Cleaned up old commits and code.

To accomplish this upcoming week:

  • Finish SetUpdaterData to create Updaters that are truly separate from Rulers using polymorphism.
  • Fix known bugs.
  • Work towards cleaning out the backlog of all changes to the ruler so the bars & meters time ruler can be pursued.

Enhanced Ruler – GSoC 2022 Week 6

Hi everyone! I wanted to withhold this week’s post until the midterm evaluation for Google Summer of Code, which we passed! I’m very excited for the second half of the project 🙂

I want to post a few images to demonstrate how far the project has come!

The dialogue box to change to the Linear Decibel ruler
The Linear Decibel ruler, which uses Custom Ruler infrastructure
The updated preferences menu

Accomplished this week:

  • Developed the Linear Decibel ruler for waveforms.
  • Fleshed out Custom Ruler options.
  • Merged changes from Week 1 that separated units from text on labels into current code.

To accomplish this upcoming week:

  • Fix known issues with Linear Decibel ruler (doesn’t work at non-default decibel ranges)
  • Increase polymorphism of rulers through the create of a SetUpdaterData function that will pass whatever kind of context an updater needs to perform its function. This will reduce the dependence of Updater on Ruler even further.
  • Clean up comments and past Git history, and improve code quality through name-changes and usage of constants.

Enhanced Ruler – GSoC 2022 Week 5

Hello everyone! Sorry for the late post; this week is the biggest yet for the project! Check out the current working branch here!

Accomplished this week:

  • Completely reworked Updater class to be simpler and easier to utilize.
  • Separated Ruler information that is needed by the Updater from that which isn’t.
  • Moved and refined a variety of functions.

To accomplish this upcoming week:

  • Custom rulers will be available by Saturday.
  • A vertical linear dB ruler will be available for testing by Monday!

Enhanced Ruler – GSoC 2022 Week 4

Hi everyone! I’ve made lots of progress in developing infrastructure for both the nonlinear and custom rulers. I’m looking forward to begin testing and showing off the changes I make through these blog posts!

Accomplished this week:

  • Broke the Ruler class into separate Updater files.
  • Substantially rewrote existing ruler code to follow new polymorphic Updater standards.
  • Cleaned up scoping inside Ruler and Updater to be more secure.

To accomplish this upcoming week:

  • Implement invalidation for Updaters with runtime type identification.
  • Debug and test polymorphism.
  • Develop the nonlinear and custom options.

Enhanced Ruler – GSoC 2022 Week 3

Happy 4th of July! Progress has gone smoothly this week. I’ve been making changes to the Ruler.cpp and Ruler.h files; you can follow along at my GitHub fork.

The timeline for the project has changed slightly; I am now targeting to finish the implementation of the nonlinear and custom rulers by the end of the 5th week, with the vertical linear dB waveform ruler taking only the 6th week.

Accomplished this week:

  • Reworked Ruler class to be more easily expanded upon with polymorphism.
  • Fixed various minor issues in code to improve clarity.

To accomplish this upcoming week:

  • Finish implementation of the nonlinear options.

Enhanced Ruler – GSoC 2022 Week 2

Hello again! This week has been a little slower than the last due to personal reasons. Still, progress continues; I’ve began implementing the nonlinear ruler options.

Accomplished this week:

  • Identified issues that could motivate later parts of the project. (Advanced two-tone labelling on rulers. refactoring existing data structures, etc.)
  • Began expansion of nonlinear ruler code. Designing code that will allow any function to be passed by the instance of the ruler, so that tick marks can be placed according to that function.
  • Test options by editing existing ruler instances.

To accomplish this upcoming week:

  • Finish implementation of the nonlinear options.
  • If possible, begin work on custom options.