kartik-venugopal / aural-player

An audio player for macOS, inspired by Winamp.
MIT License
732 stars 43 forks source link

Should the MatrixReverb Audio Unit appear in the AU list? #42

Closed cesss closed 1 year ago

cesss commented 1 year ago

I don't know if it's because I'm using High Sierra, or because the MatrixReverb AU doesn't meet the requirements to be listed in the AU selector, so that's why I'm asking.

Btw, I'll be moving from High Sierra to Monterey this week or the next, so, don't worry, I don't have a special interest in using it on HS, just wondering if I'll see the MatrixReverb AU when I update to Monterey (moreover, your builtin reverb engine is quite good, it's fine for me even if MatrixReverb AU is not available).

kartik-venugopal commented 1 year ago

Hi, that's a good question. Let me do some investigation and get back to you on this.

FYI, the only 2 requirements for an AU to be supported by Aural are that:

1 - It needs to be a real-time audio processing unit. 2 - It needs to provide a graphical interface (i.e. knobs, sliders, etc), which Aural can then present to the user.

In theory, reverb should of course be supported. So, I'm not sure why this is not the case. I will take a look.

kartik-venugopal commented 1 year ago

Ok, I did my investigation and it's clear why AUMatrixReverb is not currently supported - it does not provide a graphical interface. It is a real-time processing unit, so the component type is not a problem.

Now, this problem can be overcome, but it will require a fair amount of work. Aural will need to examine the parameters of the audio unit (MatrixReverb in this case) and dynamically generate a user interface for it - i.e. knobs and sliders. This can be challenging to implement, but I will think about it.

BTW, here is the list of all such components that are real-time processing units but do NOT provide a UI:

AUMatrixReverb AURogerBeep AUReverb2 AUSampleDelay AUSoundFieldPanner HRTFPanner AUSphericalHeadPanner AUVectorPanner

I will need to generate a UI like this (this is probably from some other audio app out there):

17659

cesss commented 1 year ago

Oh, it's surprising that MatrixReverb cannot create automatically the GUI by itself! Are you sure it doesn't? The old Vox player (when it was freeware) supported it, and the GUI looked standard Cocoa while the rest of the Vox GUI had a more custom look.

Look at this screenshot (just took it on my MBP). Do you mean Vox creates manually the GUI, and that it's not automatic?

vox-matrixreverb
cesss commented 1 year ago

Anyway, your reverb engine sounds very nice, so don't worry. Only that MatrixReverb is cool, but I wouldn't say it's a must have.

kartik-venugopal commented 1 year ago

Yes, that screenshot indicates that VOX player probably created their own UI to support MatrixReverb. Currently, the way Aural Player works with AUs is that it requests a UI from the AU, and only if the AU has its own built-in UI, it then presents it within the app.

Look at the below image of AUGraphicEQ (which does have a UI, provided by Apple, the manufacturer) - the part within the red rectangle is the built-in UI provided by the AU. The window that contains it is provided by Aural. So Aural hosts the AU's UI.

AU

Now, as I said earlier, there are quite a few AUs that don't have UIs, so if I wanted to support all of them, I could do that in 2 ways: 1 - Dynamically generate a UI based on the AU's parameters (this would be the easier and more future-proof approach), OR 2 - Develop a tailored UI for each of those AUs ... this would require a lot of work, as you can imagine, and also if Apple added any new AUs in the future, I would have to go back and add more custom UIs.

My proposed solution would be #1 - Aural would read the parameters of the AU (eg. MatrixReverb), and dynamically generate an interface for it. Solution #2 would require too much work.

I can give it a shot. It would be an interesting challenge to dynamically generate a UI.

Hope this makes sense.

cesss commented 1 year ago

Yes, it does make sense, and I agree that #1 is a better approach (and more correct, because if an AU changes the parameters in the future, approach #1 is safe but #2 would be unsafe). Anyway, before taking this challenging path, take a look at how others do it. It seems Audacity supports Audio Units, and it's open source. I don't now if AUMatrixReverb works with Audacity, never tried, but, if it works, given that the source is available, it would be interesting to take a look at how it does it.

kartik-venugopal commented 1 year ago

I have a working solution using approach #1. It still needs a little more polishing and testing and then I should be able to release it in a couple of days, but I tested it with MatrixReverb, and functionally it works very well, although the UI of course is not going to be as good as a custom-made view since it is a generic dynamically generated view.

There is a slider for each AU parameter and a drop down menu of factory presets to choose from.

auControls auPresets
kartik-venugopal commented 1 year ago

Implemented in release v3.9.0. Try it out and let me know if it works for you.

I'm not sure how or even if it will work on High Sierra, but try it out on Monterrey.

cesss commented 1 year ago

Wow!!! That's great, even with the presets in the GUI!!! Aural is my favourite player for Mac!! As I expected I cannot test it in High Sierra because for some reason AU effects are not found in HS in recent Aural releases (they are found in 3.3.1, but not in 3.7.0 nor newer).

I already installed Monterrey in the Mac Mini I have as media player in the living room, and hopefully my daily work MBP will be updated before the weekend. I'll tell you how it works, but I expect it to be great 😄

cesss commented 1 year ago

BTW, it's very welcome that you have your own builtin reverb code, because I never like to depend on a specific vendor for that... who can't say Apple won't remove AUMatrixReverb at some point?

cesss commented 1 year ago

It works but there's something strange with the GUI. Look:

Captura de Pantalla 2022-09-29 a las 18 17 03

Apart from the strange look, it does work fine. I'm testing with a 2018MBP, just updated to Monterey 12.6

kartik-venugopal commented 1 year ago

Ah ok, I know what the problem is. Will release a fix tonight.

kartik-venugopal commented 1 year ago

Fixed in v3.9.1. Try it out and let me know :)

cesss commented 1 year ago

It works perfect now!!!

By the way, as a bonus, here's a violet color scheme I created (feel free to do with it whatever you like, modify it or whatever):


          "name" : "violet",
          "player" : {
            "sliderBackgroundColor" : {
              "alpha" : 1,
              "blue" : 0.32600000000000001,
              "colorSpace" : 1,
              "green" : 0.32600000000000001,
              "red" : 0.32600000000000001
            },
            "sliderBackgroundGradientAmount" : 36,
            "sliderBackgroundGradientType" : "darken",
            "sliderForegroundColor" : {
              "alpha" : 1,
              "blue" : 0.74530836152289193,
              "colorSpace" : 1,
              "green" : 0.47528126977420443,
              "red" : 0.63938116984143445
            },
            "sliderForegroundGradientAmount" : 60,
            "sliderForegroundGradientType" : "brighten",
            "sliderKnobColor" : {
              "alpha" : 1,
              "blue" : 0.74625962447625982,
              "colorSpace" : 1,
              "green" : 0.45679565346280815,
              "red" : 0.59378796071734918
            },
            "sliderKnobColorSameAsForeground" : true,
            "sliderLoopSegmentColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.59999999999999998
            },
            "sliderValueTextColor" : {
              "alpha" : 1,
              "blue" : 0.86212759067357514,
              "colorSpace" : 1,
              "green" : 0.86212759067357514,
              "red" : 0.86212759067357514
            },
            "trackInfoPrimaryTextColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 1,
              "red" : 1
            },
            "trackInfoSecondaryTextColor" : {
              "alpha" : 1,
              "blue" : 0.87225143341202815,
              "colorSpace" : 1,
              "green" : 0.67498121782777443,
              "red" : 0.6483050712319024
            },
            "trackInfoTertiaryTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.55000000000000004
            }
          },
          "playlist" : {
            "groupDisclosureTriangleColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.59999999999999998
            },
            "groupIconColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.34999999999999998
            },
            "groupNameSelectedTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.55000000000000004
            },
            "groupNameTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.40000000000000002
            },
            "indexDurationSelectedTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.5
            },
            "indexDurationTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.29999999999999999
            },
            "playingTrackIconColor" : {
              "alpha" : 1,
              "blue" : 0.78912717628973139,
              "colorSpace" : 1,
              "green" : 0.48900558404529992,
              "red" : 0.60937124909105023
            },
            "selectionBoxColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0
            },
            "summaryInfoColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.5
            },
            "trackNameSelectedTextColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 1,
              "red" : 1
            },
            "trackNameTextColor" : {
              "alpha" : 1,
              "blue" : 0.75825777202072531,
              "colorSpace" : 1,
              "green" : 0.57732497803174421,
              "red" : 0.67172325790714893
            }
          }
kartik-venugopal commented 1 year ago

Hehe, are you a programmer too, dude ?

kartik-venugopal commented 1 year ago

BTW, your JSON snippet is missing a couple of elements ... look for "effects" and "general" ... that will complete the color scheme definition. ... they are sorted alphabetically, so Effects and General will appear above Name.

cesss commented 1 year ago

Not sure, let me copy the full "ui" section of the json:


  "ui" : {
    "appMode" : "windowed",
    "colorSchemes" : {
      "systemScheme" : {
        "effects" : {
          "activeUnitStateColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 0.66515750545251118,
            "red" : 0.81795129096561547
          },
          "bypassedUnitStateColor" : {
            "alpha" : 1,
            "blue" : 0.45929808937823835,
            "colorSpace" : 1,
            "green" : 0.40762739695391947,
            "red" : 0.42750321397807672
          },
          "functionCaptionTextColor" : {
            "alpha" : 1,
            "blue" : 0.57941222901171352,
            "colorSpace" : 1,
            "green" : 0.57941222901171352,
            "red" : 0.57941222901171352
          },
          "functionValueTextColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.69999999999999996
          },
          "sliderBackgroundColor" : {
            "alpha" : 1,
            "blue" : 0.37754820773638587,
            "colorSpace" : 1,
            "green" : 0.33459812614870932,
            "red" : 0.3609149703600194
          },
          "sliderBackgroundGradientAmount" : 36,
          "sliderBackgroundGradientType" : "darken",
          "sliderForegroundGradientAmount" : 60,
          "sliderForegroundGradientType" : "brighten",
          "sliderKnobColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 0.66364472516304296,
            "red" : 0.88099162413001209
          },
          "sliderKnobColorSameAsForeground" : false,
          "sliderTickColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0
          },
          "suppressedUnitStateColor" : {
            "alpha" : 1,
            "blue" : 0.46392601728439331,
            "colorSpace" : 1,
            "green" : 0.26305405136835519,
            "red" : 0.41267246394885321
          }
        },
        "general" : {
          "appLogoColor" : {
            "alpha" : 1,
            "blue" : 0.7676489637305699,
            "colorSpace" : 1,
            "green" : 0.417030950281988,
            "red" : 0.566571845315891
          },
          "backgroundColor" : {
            "alpha" : 1,
            "blue" : 0.17094397668393779,
            "colorSpace" : 1,
            "green" : 0,
            "red" : 0.16334369207107097
          },
          "buttonMenuTextColor" : {
            "alpha" : 1,
            "blue" : 0.53483241580310881,
            "colorSpace" : 1,
            "green" : 0.53483241580310881,
            "red" : 0.53483241580310881
          },
          "functionButtonColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 1,
            "red" : 1
          },
          "mainCaptionTextColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 1,
            "red" : 1
          },
          "selectedTabButtonColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 0.44590838978359904,
            "red" : 0.69574909583309319
          },
          "selectedTabButtonTextColor" : {
            "alpha" : 1,
            "blue" : 0.97572847861199707,
            "colorSpace" : 1,
            "green" : 0.97774532765713373,
            "red" : 1
          },
          "tabButtonTextColor" : {
            "alpha" : 1,
            "blue" : 0.67562338678948008,
            "colorSpace" : 1,
            "green" : 0.56504592074080362,
            "red" : 0.54822043012561261
          },
          "textButtonMenuColor" : {
            "alpha" : 1,
            "blue" : 0.35416855450738893,
            "colorSpace" : 1,
            "green" : 0.35416855450738893,
            "red" : 0.35416855450738893
          },
          "toggleButtonOffStateColor" : {
            "alpha" : 1,
            "blue" : 0.5,
            "colorSpace" : 1,
            "green" : 0.5,
            "red" : 0.5
          }
        },
        "name" : "Black attack (default)",
        "player" : {
          "sliderBackgroundColor" : {
            "alpha" : 1,
            "blue" : 0.32600000000000001,
            "colorSpace" : 1,
            "green" : 0.32600000000000001,
            "red" : 0.32600000000000001
          },
          "sliderBackgroundGradientAmount" : 36,
          "sliderBackgroundGradientType" : "darken",
          "sliderForegroundColor" : {
            "alpha" : 1,
            "blue" : 0.74530836152289193,
            "colorSpace" : 1,
            "green" : 0.47528126977420443,
            "red" : 0.63938116984143445
          },
          "sliderForegroundGradientAmount" : 60,
          "sliderForegroundGradientType" : "brighten",
          "sliderKnobColor" : {
            "alpha" : 1,
            "blue" : 0.74625962447625982,
            "colorSpace" : 1,
            "green" : 0.45679565346280815,
            "red" : 0.59378796071734918
          },
          "sliderKnobColorSameAsForeground" : true,
          "sliderLoopSegmentColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.59999999999999998
          },
          "sliderValueTextColor" : {
            "alpha" : 1,
            "blue" : 0.86212759067357514,
            "colorSpace" : 1,
            "green" : 0.86212759067357514,
            "red" : 0.86212759067357514
          },
          "trackInfoPrimaryTextColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 1,
            "red" : 1
          },
          "trackInfoSecondaryTextColor" : {
            "alpha" : 1,
            "blue" : 0.87225143341202815,
            "colorSpace" : 1,
            "green" : 0.67498121782777443,
            "red" : 0.6483050712319024
          },
          "trackInfoTertiaryTextColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.55000000000000004
          }
        },
        "playlist" : {
          "groupDisclosureTriangleColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.59999999999999998
          },
          "groupIconColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.34999999999999998
          },
          "groupNameSelectedTextColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.55000000000000004
          },
          "groupNameTextColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.40000000000000002
          },
          "indexDurationSelectedTextColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.5
          },
          "indexDurationTextColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.29999999999999999
          },
          "playingTrackIconColor" : {
            "alpha" : 1,
            "blue" : 0.78912717628973139,
            "colorSpace" : 1,
            "green" : 0.48900558404529992,
            "red" : 0.60937124909105023
          },
          "selectionBoxColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0
          },
          "summaryInfoColor" : {
            "alpha" : 1,
            "colorSpace" : 0,
            "white" : 0.5
          },
          "trackNameSelectedTextColor" : {
            "alpha" : 1,
            "blue" : 1,
            "colorSpace" : 1,
            "green" : 1,
            "red" : 1
          },
          "trackNameTextColor" : {
            "alpha" : 1,
            "blue" : 0.75825777202072531,
            "colorSpace" : 1,
            "green" : 0.57732497803174421,
            "red" : 0.67172325790714893
          }
        }
      },
      "userSchemes" : [
        {
          "effects" : {
            "activeUnitStateColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 0.66515750545251118,
              "red" : 0.81795129096561547
            },
            "bypassedUnitStateColor" : {
              "alpha" : 1,
              "blue" : 0.45929808937823835,
              "colorSpace" : 1,
              "green" : 0.40762739695391947,
              "red" : 0.42750321397807672
            },
            "functionCaptionTextColor" : {
              "alpha" : 1,
              "blue" : 0.57941222901171352,
              "colorSpace" : 1,
              "green" : 0.57941222901171352,
              "red" : 0.57941222901171352
            },
            "functionValueTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.69999999999999996
            },
            "sliderBackgroundColor" : {
              "alpha" : 1,
              "blue" : 0.37754820773638587,
              "colorSpace" : 1,
              "green" : 0.33459812614870932,
              "red" : 0.3609149703600194
            },
            "sliderBackgroundGradientAmount" : 36,
            "sliderBackgroundGradientType" : "darken",
            "sliderForegroundGradientAmount" : 60,
            "sliderForegroundGradientType" : "brighten",
            "sliderKnobColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 0.66364472516304296,
              "red" : 0.88099162413001209
            },
            "sliderKnobColorSameAsForeground" : false,
            "sliderTickColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0
            },
            "suppressedUnitStateColor" : {
              "alpha" : 1,
              "blue" : 0.46392601728439331,
              "colorSpace" : 1,
              "green" : 0.26305405136835519,
              "red" : 0.41267246394885321
            }
          },
          "general" : {
            "appLogoColor" : {
              "alpha" : 1,
              "blue" : 0.7676489637305699,
              "colorSpace" : 1,
              "green" : 0.417030950281988,
              "red" : 0.566571845315891
            },
            "backgroundColor" : {
              "alpha" : 1,
              "blue" : 0.17094397668393779,
              "colorSpace" : 1,
              "green" : 0,
              "red" : 0.16334369207107097
            },
            "buttonMenuTextColor" : {
              "alpha" : 1,
              "blue" : 0.53483241580310881,
              "colorSpace" : 1,
              "green" : 0.53483241580310881,
              "red" : 0.53483241580310881
            },
            "functionButtonColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 1,
              "red" : 1
            },
            "mainCaptionTextColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 1,
              "red" : 1
            },
            "selectedTabButtonColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 0.44590838978359904,
              "red" : 0.69574909583309319
            },
            "selectedTabButtonTextColor" : {
              "alpha" : 1,
              "blue" : 0.97572847861199707,
              "colorSpace" : 1,
              "green" : 0.97774532765713373,
              "red" : 1
            },
            "tabButtonTextColor" : {
              "alpha" : 1,
              "blue" : 0.67562338678948008,
              "colorSpace" : 1,
              "green" : 0.56504592074080362,
              "red" : 0.54822043012561261
            },
            "textButtonMenuColor" : {
              "alpha" : 1,
              "blue" : 0.35416855450738893,
              "colorSpace" : 1,
              "green" : 0.35416855450738893,
              "red" : 0.35416855450738893
            },
            "toggleButtonOffStateColor" : {
              "alpha" : 1,
              "blue" : 0.5,
              "colorSpace" : 1,
              "green" : 0.5,
              "red" : 0.5
            }
          },
          "name" : "violet",
          "player" : {
            "sliderBackgroundColor" : {
              "alpha" : 1,
              "blue" : 0.32600000000000001,
              "colorSpace" : 1,
              "green" : 0.32600000000000001,
              "red" : 0.32600000000000001
            },
            "sliderBackgroundGradientAmount" : 36,
            "sliderBackgroundGradientType" : "darken",
            "sliderForegroundColor" : {
              "alpha" : 1,
              "blue" : 0.74530836152289193,
              "colorSpace" : 1,
              "green" : 0.47528126977420443,
              "red" : 0.63938116984143445
            },
            "sliderForegroundGradientAmount" : 60,
            "sliderForegroundGradientType" : "brighten",
            "sliderKnobColor" : {
              "alpha" : 1,
              "blue" : 0.74625962447625982,
              "colorSpace" : 1,
              "green" : 0.45679565346280815,
              "red" : 0.59378796071734918
            },
            "sliderKnobColorSameAsForeground" : true,
            "sliderLoopSegmentColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.59999999999999998
            },
            "sliderValueTextColor" : {
              "alpha" : 1,
              "blue" : 0.86212759067357514,
              "colorSpace" : 1,
              "green" : 0.86212759067357514,
              "red" : 0.86212759067357514
            },
            "trackInfoPrimaryTextColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 1,
              "red" : 1
            },
            "trackInfoSecondaryTextColor" : {
              "alpha" : 1,
              "blue" : 0.87225143341202815,
              "colorSpace" : 1,
              "green" : 0.67498121782777443,
              "red" : 0.6483050712319024
            },
            "trackInfoTertiaryTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.55000000000000004
            }
          },
          "playlist" : {
            "groupDisclosureTriangleColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.59999999999999998
            },
            "groupIconColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.34999999999999998
            },
            "groupNameSelectedTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.55000000000000004
            },
            "groupNameTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.40000000000000002
            },
            "indexDurationSelectedTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.5
            },
            "indexDurationTextColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.29999999999999999
            },
            "playingTrackIconColor" : {
              "alpha" : 1,
              "blue" : 0.78912717628973139,
              "colorSpace" : 1,
              "green" : 0.48900558404529992,
              "red" : 0.60937124909105023
            },
            "selectionBoxColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0
            },
            "summaryInfoColor" : {
              "alpha" : 1,
              "colorSpace" : 0,
              "white" : 0.5
            },
            "trackNameSelectedTextColor" : {
              "alpha" : 1,
              "blue" : 1,
              "colorSpace" : 1,
              "green" : 1,
              "red" : 1
            },
            "trackNameTextColor" : {
              "alpha" : 1,
              "blue" : 0.75825777202072531,
              "colorSpace" : 1,
              "green" : 0.57732497803174421,
              "red" : 0.67172325790714893
            }
          }
        }
      ]
    },
    "controlBarPlayer" : {
      "cornerRadius" : 3,
      "seekPositionDisplayType" : "timeElapsed",
      "showSeekPosition" : true,
      "trackInfoScrollingEnabled" : true
    },
    "fontSchemes" : {
      "systemScheme" : {
        "effects" : {
          "auRowTextYOffset" : 1,
          "filterChartSize" : 9,
          "masterUnitFunctionSize" : 14,
          "unitCaptionSize" : 18,
          "unitFunctionSize" : 11
        },
        "headingFontName" : "AlegreyaSansSC-Regular",
        "name" : "Standard",
        "player" : {
          "artistAlbumSize" : 13,
          "chapterTitleSize" : 11,
          "feedbackTextSize" : 9,
          "titleSize" : 15,
          "trackTimesSize" : 11
        },
        "playlist" : {
          "chaptersListCaptionSize" : 16,
          "chaptersListHeaderSize" : 15,
          "chaptersListSearchSize" : 12,
          "groupTextSize" : 12.5,
          "groupTextYOffset" : -1,
          "summarySize" : 12.5,
          "tabButtonTextSize" : 14,
          "trackTextSize" : 12,
          "trackTextYOffset" : -1
        },
        "textFontName" : "Exo-Medium"
      },
      "userSchemes" : [

      ]
    },
    "menuBarPlayer" : {
      "showAlbum" : true,
      "showAlbumArt" : true,
      "showArtist" : true,
      "showCurrentChapter" : true
    },
    "player" : {
      "showAlbum" : true,
      "showAlbumArt" : true,
      "showArtist" : true,
      "showControls" : true,
      "showCurrentChapter" : true,
      "showPlayingTrackFunctions" : true,
      "showTimeElapsedRemaining" : true,
      "showTrackInfo" : true,
      "timeElapsedDisplayType" : "formatted",
      "timeRemainingDisplayType" : "formatted",
      "viewType" : "defaultView"
    },
    "playlist" : {
      "view" : "tracks"
    },
    "themes" : {
      "userThemes" : [

      ]
    },
    "visualizer" : {
      "options" : {
        "highAmplitudeColor" : {
          "alpha" : 1,
          "blue" : 0,
          "colorSpace" : 1,
          "green" : 0,
          "red" : 1
        },
        "lowAmplitudeColor" : {
          "alpha" : 1,
          "blue" : 1,
          "colorSpace" : 1,
          "green" : 0,
          "red" : 0
        }
      },
      "type" : "spectrogram"
    },
    "windowAppearance" : {
      "cornerRadius" : 3
    },
    "windowLayout" : {
      "effectsWindowOrigin" : {
        "x" : 441,
        "y" : 482
      },
      "mainWindowOrigin" : {
        "x" : 441,
        "y" : 712
      },
      "playlistWindowFrame" : {
        "origin" : {
          "x" : 441,
          "y" : 142
        },
        "size" : {
          "height" : 340,
          "width" : 530
        }
      },
      "showEffects" : true,
      "showPlaylist" : true,
      "userLayouts" : [

      ]
    }
  }
}
cesss commented 1 year ago

Keep in mind that I created the violet scheme while using Aural in High Sierra, with older versions, so maybe there might be some corruption or incorrect stuff in the json.

cesss commented 1 year ago

BTW, yes, I'm a programmer. Started with the Speccy in the 80s. My language is C (object oriented, but C, because I got fed up with every new C++ standard declaring that the previous standard was bad practices, so after more than a decade of C++, I went back to C). It's possible (and very nice) to write object oriented C, although then all the C++ fans throw tomatoes at you, but I can live with that 😆

kartik-venugopal commented 1 year ago

Cool, thanks ... I will try it out :)

Oh wow, the 80s ! I did some C but was mostly a back-end Java programmer. This project started out of nowhere one summer afternoon when I was unemployed, bored, and wanted a Winamp-like player on Mac. Had never heard of Swift and knew nothing about audio ... the rest is history.

C is awesome ... but pointer / memory management, man ... have you tried Swift ? If not, try it ... it's like chocolate ... once you put it in your mouth, it's so sweet you cannot get enough of it !

Say, can I ask you which audio formats your collection consists of ? You did mention MP4 (AAC), but the reason I'm asking is ... I want to make sure my FFmpeg integration works ... so it's always nice to hear feedback from users that non-native formats work well on Aural (Ex. Vorbis, Opus, FLAC, APE, etc) =.

cesss commented 1 year ago

The problem with Swift is that it's not supported in older OSs, and I enjoy being able to build my code in whatever system, even 90s UNICES if needed. If Swift (or Rust) had been written on top of C and used just the C runtime library, I would probably be using them, because that way you could build Swift or Rust in every OS that has a C compiler. But they took the self-host approach, requiring modern OSs. I prefer more compatibility.

Regarding my music collection: MP3 (purchased), and MP4 (downloaded from youtube, so the youtube codec, I believe AAC).

kartik-venugopal commented 1 year ago

Thanks for the feature suggestions and all the feedback. I'm closing this issue since you reported that this feature works.

Feel free to suggest new features or report bugs / issues anytime. Even if I can't always implement someone's wishes, I'm happy to listen and consider it.

Cheers ! Kartik

cesss commented 1 year ago

Thanks a lot for writing such a cool player! Honestly, I don't know what more features to add... I'd say just keep it simple like it is now (I took a look and the winamp GUI --never used it-- and got scared of how complex is that gui... don't do that, keep it simple like it is now).

If I could dream of more features, perhaps I'd say something as a DJ app, but it would be a completely different project that would require a different GUI (so that you could mix several tracks tweaking their speeds independently... I'm not into DJ-ing, but I admit sometimes I'd have the curiosity to mix some tracks 😄 ).

But back to the point, for the moment I cannot imagine more features to add to Aural...