Drawing Level Meters - Visualizations with JUCE

Поделиться
HTML-код
  • Опубликовано: 7 сен 2024

Комментарии • 106

  • @Table-Top
    @Table-Top Год назад +13

    These are top class tutorials. So informative and well-presented, you have a very good style. Wish you'd do more ; )

    • @akashmurthy
      @akashmurthy  Год назад

      Thanks very much! Wish I'd do more too ;)

  • @LetsSmiley
    @LetsSmiley 7 месяцев назад +1

    I found it so difficult getting into JUCE because all the tutorials seem too confusing and are sometimes outdated while the documentation gives little to no answers.
    Your channel perfectly fills that niche while giving glimpses into best practices and it's actually fun again to work with JUCE.
    Thank you!

    • @akashmurthy
      @akashmurthy  7 месяцев назад

      Thanks so much! I wish I had more motivation and time to make more JUCE related content!

  • @Speechrezz
    @Speechrezz 2 года назад +4

    im surprised this video doesnt have 100x its current views, i learned a lot! appreciate ya

  • @martinstolz8675
    @martinstolz8675 2 года назад +2

    Cool tutorial that actually works, moves along quickly and comes without pointless blahbla. Have seen a lot in a short time to Juce and is also easy to implement with Clion / Cmake. Thank you!

    • @akashmurthy
      @akashmurthy  2 года назад

      Thank you, I'm glad you liked the pacing and content!

  • @patrickosullivan1857
    @patrickosullivan1857 3 года назад

    Very nice touch, that as you talk about the level meters your voice is being measured and displayed in the slides.

  • @RecordingStudio9
    @RecordingStudio9 8 месяцев назад

    Absolute top class tutorial. Thanks.

    • @akashmurthy
      @akashmurthy  8 месяцев назад

      Thanks mate!

    • @RecordingStudio9
      @RecordingStudio9 8 месяцев назад

      @@akashmurthy Learning so much from your channel. These examples are great for modern VU meters. I'm thinking about how would one animate a PNG image of a VU meter needle in an arc corresponding from simple -20db to 3db. Then you can have a background image of some VU and a top masking layer to cover the edges. I'm happy even with a simple vector line method to start with.
      Again, thanks for all the tutorials and your time.

    • @akashmurthy
      @akashmurthy  8 месяцев назад

      @@RecordingStudio9 you can use rotation Affine Transform to achieve that. Give it a shot and experiment with it. If you can't get it to work, write me an email and I can help you out.

  • @iberberoglu
    @iberberoglu 5 месяцев назад

    This video has been incredibly helpful for me as I'm working on a project designing an RMS Compressor for one of my courses at university. I subscribed and turned on notifications immediately. Please keep posting videos about JUCE and audio plugins, they're extremely beneficial. I'm so grateful for such a well-made and explanatory video. Thank you!

    • @akashmurthy
      @akashmurthy  5 месяцев назад

      Thanks so much! I'll try to work on some more JUCE related content soon.

  • @soyboy3274
    @soyboy3274 2 года назад +3

    Great video, especially informative for people who are just getting the hang of juce. Thank you very much for making this tutorial!

  • @ordinarymonster1187
    @ordinarymonster1187 Год назад

    recently I started to learn coding for the purpose that building a plugin with my own preference, and ended up to this video. Surprisingly i just realized that you made the Audio Engineering Fundamental courses that I studied when I started my mixing engineer career. Thanks a lot Akash, for all your amazing videos.

    • @akashmurthy
      @akashmurthy  Год назад +1

      Thanks very much! But I'm not sure which course you mean? Did you mean Digital Audio Fundamentals? I haven't done much besidest that!

    • @ordinarymonster1187
      @ordinarymonster1187 Год назад

      @@akashmurthy yes the digital audio fundamentals, really clearest and easiest to understand through the entire youtube

  • @johnnaeder4244
    @johnnaeder4244 2 года назад

    This tutorial is high quality! This channel needs to be bigger. Great job

  • @mt3m
    @mt3m Год назад

    This video is a lifesaver for a beginner. Thank you!

  • @mexxiano
    @mexxiano 2 года назад

    Dear my friend! Such a beatiful RUclips Channel! It´s a very marbel find this kind of data! Thank you very much! Cheers from Argentina!

    • @akashmurthy
      @akashmurthy  2 года назад

      Thank you very much mate! Cheers

  • @fafa-oz3nt
    @fafa-oz3nt 2 года назад

    Thank you for produce the video, I've just started audio programming, all your videos helped me a lot with understanding concepts and learn skill, can't wait to see more of your works!

    • @akashmurthy
      @akashmurthy  2 года назад

      You're welcome! More coming soon

  • @marius.orehovschi
    @marius.orehovschi 4 месяца назад

    Excellent tutorial, both in content and in form

  • @sangkodeng9054
    @sangkodeng9054 10 месяцев назад

    oh! I really love it!!! thank you for your help. The design concept of this component is great and there are many aspects that can serve as inspiration. I am looking forward to learning more from you about new component designs in JUCE.!I have already subscribed!😍😍😍

    • @akashmurthy
      @akashmurthy  10 месяцев назад

      Awesome, thanks for subscribing! Happy learning!

  • @nicolasnicolas3889
    @nicolasnicolas3889 Год назад +1

    Subbed! Thanks for your videos, they're really helpful, good job! ❤🙏

  • @yousunday
    @yousunday 2 года назад

    Thank you very much, Akash Murthy, for being so helpful to me!

  • @nolanerck
    @nolanerck 7 месяцев назад

    Fantastic tutorial! Thanks so much for putting this together!

    • @akashmurthy
      @akashmurthy  7 месяцев назад

      No worries! Hope it helps..

  • @amber1862
    @amber1862 2 года назад

    Wow, this channel is an absolute gem!

  • @codygilchrist
    @codygilchrist Год назад +2

    I don't think I've ever commented on a youtube video but felt compelled because this is just so well done. Everything you touch on is explained so well, I really hope to see more in this series in the future!
    One question - couldn't you simply use a vector image instead of a raster image for the meter grill to allow for resizing? Or is there some cost or disadvantage of doing it this way?

    • @akashmurthy
      @akashmurthy  Год назад +1

      Hey, thanks so much! I'm stoked that you found the content engaging enough to comment on it!
      Regarding your question, yes, we can definitely use a vector based image to render at any size or aspect ratio. There are no disadvantages or costs associated with doing it that way. But some of the limitations of using a vector image are that you can't have gradients or shadows or anything fancy in it. They need to be flat graphical SVGs.

  • @stupidvideosdie
    @stupidvideosdie 2 года назад

    Thank you for this absolutely wonderful tutorial! Your channel has been so informative and you make everything you teach quite interesting. Keep up the good work!

  • @TomHartleyUK
    @TomHartleyUK Год назад

    Brilliant teaching. Thanks so much.

  • @eldarsadykov
    @eldarsadykov Год назад

    Super nice! Thanks! The format is wonderful.

  • @riccardorosso2795
    @riccardorosso2795 2 года назад +1

    Really great tutorial! Thank you so much!

  • @banxmusic
    @banxmusic 5 месяцев назад +1

    Thanks so much. Very helpful in building my new virtual instrument! Question...if I mute my midi and daw audio, am I still supposed to see these level meter outputs? Is that because I am not controlling the instruments volume through audio processor? Also I noticed in standalone the meters do not work unless I use the previous rmsLevelLeft = Decibels::gainToDecibels syntax (before the smoothing example, horizontal meter)

  • @ffaudio5520
    @ffaudio5520 2 года назад

    Nice tutorial, that should help many beginners. One nitpicking though: You say the AudioProcessor and therefore prepareToPlay, processBlock and releaseResources are running on the audio thread. But it is ONLY the processBlock that is called from the audio thread. It is important to understand, that not the class or Component decides the thread, but where it is called from.

    • @akashmurthy
      @akashmurthy  2 года назад +1

      Hey Daniel, thanks for pointing that out. I think I oversimplified that part. You're totally right in stating that a class and it's methods don't determine which thread they're being run on, only the caller. And it's quite an important fact to hammer home.

  • @projectevernote
    @projectevernote 3 года назад

    Just wanted to say that the knowledge you give away for free is pure gold and I'm so glad I stumbled upon you at this point in time. Have you gone to a Sound Recording school for all this?

    • @akashmurthy
      @akashmurthy  3 года назад +1

      Cheers mate! Glad you find it useful.
      I didn't go to an audio engineering school, but I have a masters in music technology

    • @projectevernote
      @projectevernote 3 года назад

      @@akashmurthy Most of your content was taught there, right? Out of curiosity.

    • @akashmurthy
      @akashmurthy  3 года назад +1

      Not really, most of it is out of books and research. Juce wasn't even covered in the course.

    • @projectevernote
      @projectevernote 3 года назад +1

      @@akashmurthy I see. Hey, thanks a lot man. Keep the great informative content coming!

  • @theyoogle
    @theyoogle Год назад

    Plz make a tutorial on particle generations in JUCE, I need to use the particles in my new plugin. Generating particles on click.

  • @larryseyer
    @larryseyer Год назад

    Excellent tutorial. Thank you!

  • @polypx
    @polypx Год назад

    So well explained, thank you!

  • @rickybrenay6249
    @rickybrenay6249 Год назад

    great video. thank you

  • @youdilab4390
    @youdilab4390 2 года назад

    This is a gem. Thank you.

  • @noahdeetz9470
    @noahdeetz9470 2 года назад

    Very cool tutorial! It looks very polished and well done. What are you using for your visualizations in this youtube video? Like what video editing software?
    Once again! Great tutorial!!

    • @akashmurthy
      @akashmurthy  2 года назад

      Thanks very much mate! The visuals are done using Adobe After Effects. Simple animations really.

  • @Nerthexx
    @Nerthexx 3 года назад +1

    Pretty interesting. I've been interested in learning how to actually write VST plugins, but never got to that. The thing that turned me off of Juce was their licensing. Then I thought that maybe I could use Steinberg's SDK, but nope, it doesn't have VST2 support anymore (which I need since I wanted to use it with OBS). So, still having a dream of writing VSTs and never getting to it, lol.

    • @akashmurthy
      @akashmurthy  3 года назад +1

      Cheers mate! Yea, even the Indie license on Juce can be quite a burden. But I've never been commercially making any plugins, so the freebie one suits me just fine.
      I think you should still be able to find the older SDKs that compile to VST2. But like you said, VST2 is long gone, and it'll lose support for DAWs going forward as well. Does OBS only handle VST2? That's a shame if it does.

    • @Nerthexx
      @Nerthexx 3 года назад

      @@akashmurthy Sadly, yes, OBS only supports VST2 plugins. I came across several independent VST2 implementations while searching a while ago, but haven't yet considered trying them out, since they are so low-level, that I would need to understand a lot about sound processing, which is why I stumbled upon this channel in the first place :)

  • @haowu3319
    @haowu3319 5 месяцев назад

    Thanks for the great tutorial! I watched the first half of the video and have a question regarding the thread. You set the rmsValue variables of the processor in the processBlock function and retrieve the rmsValue in the timerCallback function. What happens if you are retrieving the rmsValue while the rmsValue variable is being updated?

    • @akashmurthy
      @akashmurthy  5 месяцев назад

      Hello there. Great question! In this case, the true answer is undefinited behaviour. If it's a large block of data being modified in one thread and read in another, then the read state could be something completely different than the old or new state. But for simple primitives like int and float, the value that you read will either end up being the previous state or the next state.
      For the sake of intent and consistency, rmsValue should definitely have been an std::atomic instead.

  • @VasaMusic438
    @VasaMusic438 Год назад

    great video!!!! thank you !!

  • @Beatsbasteln
    @Beatsbasteln 3 года назад +1

    i did not know the paintOverChildren method yet. does it have a better performance than normal paint or why is it good to have them seperated? and yeah, the format of the video was really cool. i liked how you started with an easy example and then went to harder ones with each component you wrote to show ways to progress through these kinds of things

    • @akashmurthy
      @akashmurthy  3 года назад +1

      Hey thanks for the question! paintOverChildren() is generally used if your component has other child components, and graphics need to be painted on top of those components.
      For example, let's say your class has a couple of sliders. When rendering this class, the order of execution is something like: paint(), resized(), paintOverChildren(). Ofcource, I'm oversimplifying this, but generally, if you need to paint over those sliders, you'll have to do it within paintOverChildren(). If you do it within paint(), the graphics are always rendered underneath the sliders.
      In the case of the level meter, it doesn't matter where you draw the image, either at the end of paint() or in paintOverChildren(), since the LevelMeter class doesn't have any child components, it just has other graphic elements.
      And thanks a lot for your feedback and checking it out!

    • @Beatsbasteln
      @Beatsbasteln 3 года назад

      @@akashmurthy i see. that seems really useful indeed. i personally always handled this kinda stuff until now by just managing the sequence in which i add components to their parents, but i'll keep it in mind in case i run into a situation that is a bit trickier to solve

  • @officialhush
    @officialhush 3 года назад

    This was extremely helpful thank you so much!

  • @1NightInParisOfficial
    @1NightInParisOfficial Год назад

    is there a way to see the changes you are making in code realtime? Like a side plugin window thats realtime updating as you code? Thx

  • @brdane
    @brdane Год назад

    Amazing video and it helped me greatly understand the JUCE framework much more! Thank you! I had a question, with the getRMSLevel() function returning a float between 0.0 and 1.0, does that imply that 1.000 means your audio is clipping, whereas 0.999 is not?

    • @akashmurthy
      @akashmurthy  Год назад

      Great! Glad to know.
      Not really, no. Think about the RMS as average. So, there can be many samples that individually go over 1.0, and at these points the signal is definitely said to be "digitally clipping". But average of the signal during that time can stay below 1.0. Ideally, for a well mixed audio signal, the RMS will never go anywhere near 1.

    • @brdane
      @brdane Год назад

      @@akashmurthy Alright, great knowledge. So for clip detection, I assume I would want to scan an entire block for anything over 1.0?

    • @akashmurthy
      @akashmurthy  Год назад

      @@brdane Absolutely. That's what digital peak meters do.
      There's another metric called True Peak. Two samples might be below 1 but very close to 1. There is a possibility that the continuous signal that passes through these 2 sample points might go beyond 1. So, based on this principle, to calculate the true peak of a signal, the signal is oversampled and then scanned to see if any sample goes over 1. This is a bit complicated, and little reward for high performance overhead.

    • @brdane
      @brdane Год назад

      @@akashmurthy I suppose if someone is very nit-picky with fear of peak, that would be a suitable application.

  • @projectultralocrian8528
    @projectultralocrian8528 Год назад

    Excellent and informative tutorial, thank you so much. I am still new to C++ and audio programming, so just one question for clarification: at 50:54 you say that for efficiency we move the bulbs into the vector instead of copying them. Do I understand correctly, that, in addition to being more efficient, here we actually need to move them, as unique_pointers are not copyable (just like Juce components, which in addition are non-movable as well). Thanks again!

    • @akashmurthy
      @akashmurthy  Год назад

      Hey, thanks a lot! You are absolutely right, I'm not sure why I said that it's for efficiency. It's a compilation error to not use std::move, since the copy constructor of unique_ptr is deleted. A better way of doing this and not using the move semantics is to use emplace_back on C++ 17 and above. You can get a unique_ptr reference returned to you. Something like:
      auto& bulb = bulbs.emplace_back(std::make_unique(...))
      And then you can do whatever you want with the pointer.
      addAndMakeVisible(bulb.get())
      This gets rid of the ugly R-value casting that we need to do with std::move.

    • @MrPolgt
      @MrPolgt Год назад

      @@akashmurthy great, thank you again. I have learned tons from your tutorials.

  • @linuxuser1234
    @linuxuser1234 2 года назад

    @Akash Murthy can you do a tutorial on creating a soundboard type of slider that has gradient lights on the side when the slider increase it goes from green to red or in vice versa

  • @thareeqroshan
    @thareeqroshan 3 года назад +1

    Really good and informative tutorial. Was about to start writing some level meter classes for my application so this comes at a great time. Is that resharper you are using to generate those missing functions when inheriting ? If so do you know any free alternatives or native functionalities in VS to do so ? Im quite new to coding in C++.

    • @akashmurthy
      @akashmurthy  3 года назад

      I am using Resharper, that's right!
      I don't know any alternatives I'm afraid. I love the Jetbrains keyboard layout and it's intellisense, it's much better than that of VS19. So for me, it was a no brainer to buy Resharper.
      If you are a student, or if you know anyone who's a student and can borrow their ID, Jetbrains makes all their products freely available to students.

  • @facundoarceo1573
    @facundoarceo1573 Год назад

    Hey Akash, how are you? I followed the entire guide and it worked wonders, great job!
    Now, I'm trying to create a typical analog meter that uses a needle to measure gain reduction (typical compressor meter) but can't figure out how to do it. I assume it must be almost identical to this with just some slight variations, but I'm just getting started with C++ and JUCE and it's a bit confusing.
    Do you have any plans on making such a guide at some point? That would be awesome!
    Thanks!

    • @akashmurthy
      @akashmurthy  Год назад

      Thanks a lot! Glad you found it useful.
      What part of the an analog meter do you have trouble with, the gain reduction measurement or drawing the needle?
      I do plan to do a VU meter tutorial at some point of time, but if you want a quick reference on how to do this, then checkout an open source compressor repo on github. Just google search for "CTAGDRC juce" and you should be able to find it. In it, the author implements a VU meter style Gain reduction meter. You can refer to the code on how to build something like that. Good luck.

  • @rahilsiraj3507
    @rahilsiraj3507 Год назад

    Hey! Lovely tutorial, but i was wondering why you didnt walk us through the circular level meter and its implementation? Im thinking of implementing it in a project but dont understand how i would do so. Would greatly appreciate your help!

    • @akashmurthy
      @akashmurthy  Год назад

      Thanks!
      The video would've taken quite a lot longer if I explained the circular meter as well. And the use cases for a circular meter for measuring level isn't widespread, it's more of an aesthetic choice. If you need the source code, it's available. Give it a shot. If you are stuck, reach out.

  • @trardac
    @trardac 3 года назад

    I appreciate this tutorial. Will you do such applications without using juce, so only Steinberg's vst sdk?

    • @akashmurthy
      @akashmurthy  3 года назад +1

      Thanks mate, but I don't think this video was meant to be anything about plugin development, but rather about strategies on drawing level meters, which would theoretically apply to any GUI framework, irrespective of tool or language.
      Also, I understand there are advantages working with the VST SDK directly, but Juce is quite good at abstracting away a lot of the complexity, and it's just a better and more popular framework for audio development. Especially for tutorials like this, where I try to eliminate as much complexity as possible.

  • @janhroch2909
    @janhroch2909 2 года назад

    perfect, thank you!!!!

  • @mr.shredder5430
    @mr.shredder5430 3 месяца назад

    i notice that you have an audio couse on udemy, do you beginner course for this specific framework?

    • @akashmurthy
      @akashmurthy  3 месяца назад

      Hey there, sorry no, I don't have such a course. I've been meaning to do it for so long, but just don't have much time for it.

  • @albertgrigorian3303
    @albertgrigorian3303 2 года назад

    great work!! is there a change for a VU meter turorial?

    • @akashmurthy
      @akashmurthy  2 года назад

      Thanks! Sure, I'll make a VU meter one at some point of time.

  • @jamescuttsmusicjcm5013
    @jamescuttsmusicjcm5013 Год назад

    People call it a Gui (as in Gooey) because it has a Gooey centre :D.

  • @leeoiou7295
    @leeoiou7295 2 года назад

    thank you for your work bro. Can I apply your techniques to video programming? It is so difficult to get resources on that

    • @akashmurthy
      @akashmurthy  2 года назад

      You're welcome!
      And I'm not sure if you can or not. I've never tried video programming, so I wouldn't be the right person to answer that.
      When you say video programming though, do you mean programmatic generation of pixels? Like drawing? Then yes, you can. Are you talking about videos similar the the ones from the RUclips channel 'the code train' ?

    • @leeoiou7295
      @leeoiou7295 2 года назад

      @@akashmurthy Thank you for your reply. By video programming i meant generating a video file with bytes. We know that an array of bytes can be made into image, I am struggling to make an array of images into a video. I don't even understand how videos really work on a low level.

    • @akashmurthy
      @akashmurthy  2 года назад

      @@leeoiou7295 oh alright. I'm not very sure mate. You'll have to do some digging.
      For images, I'd say PPM format is quite simple. It's a simple header file followed by raw 24bit RGB data.
      For videos, things get a little more complicated. You really need to look for a lossless, uncompressed format. Any type of compression involves using complicated math, or just using libraries to achieve it.

  • @rosshoyt2030
    @rosshoyt2030 2 года назад

    Would you call this a VU meter? Or just Level meter.