HISE Logo Forum
    • Categories
    • Register
    • Login

    vuuuu meter.... vu meter? vu meter master?

    Scheduled Pinned Locked Moved General Questions
    54 Posts 11 Posters 4.9k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • NatanN
      Natan @Christoph Hart
      last edited by

      @Christoph-Hart said in vuuuu meter.... vu meter? vu meter master?:

      I'll take a look, but it might indeed be possible that the signal chain in the FX processing mode does not pick up the levels of the master container properly.

      @Christoph-Hart Thanks Christoph, So Is There Any Workaround, Like Connecting The VU Meter To A Simple Gain MOdule, Or Something Like That?!

      I Need This Really Bad To Get My FX Plugin Done :(

      DimitrisSPD 1 Reply Last reply Reply Quote 1
      • DimitrisSPD
        DimitrisSP @Natan
        last edited by DimitrisSP

        @Natanr Try this...I send you a small test project with a filmstrip (107 frames) connected to a Simple Gain Module LevelMeterTest.zip

        Then you can replace the filmstrip image with your's and adjust the code and number of frames according to your filmstrip image โ˜บ

        NatanN A 3 Replies Last reply Reply Quote 2
        • NatanN
          Natan @DimitrisSP
          last edited by

          @DimitrisSP
          Oh Thanks Man ๐Ÿ‘ Will Do It Right Now ๐Ÿ™Œ๐Ÿ™Œ

          DimitrisSPD 1 Reply Last reply Reply Quote 1
          • DimitrisSPD
            DimitrisSP @Natan
            last edited by

            @Natanr Happy that i helped!

            lalalandsynthL 1 Reply Last reply Reply Quote 1
            • NatanN
              Natan @DimitrisSP
              last edited by

              @DimitrisSP Ha Ha ๐Ÿ™Œ๐Ÿ™Œ๐Ÿ™Œ๐Ÿ™Œ Yes Man This One One Works ๐Ÿ’ฏ Thank You โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ

              1 Reply Last reply Reply Quote 2
              • lalalandsynthL
                lalalandsynth @DimitrisSP
                last edited by lalalandsynth

                @DimitrisSP Testing this , what is that levelMeterLock ?

                Also , any thoughts on how to change this to a mono meter , that is , see both channels on one meter ?

                https://lalalandaudio.com/

                https://lalalandsynth.com/

                https://www.facebook.com/lalalandsynth

                https://www.facebook.com/lalalandsynth

                LindonL NatanN 2 Replies Last reply Reply Quote 1
                • LindonL
                  Lindon @lalalandsynth
                  last edited by

                  @lalalandsynth said in vuuuu meter.... vu meter? vu meter master?:

                  @DimitrisSP Testing this , what is that levelMeterLock ?

                  Also , any thoughts on how to change this to a mono meter , that is , see both channels on one meter ?

                  take the input values , sum them and divide by 2....

                  HISE Development for hire.
                  www.channelrobot.com

                  1 Reply Last reply Reply Quote 2
                  • NatanN
                    Natan @lalalandsynth
                    last edited by

                    @lalalandsynth said in vuuuu meter.... vu meter? vu meter master?:

                    what is that levelMeterLock?

                    Since This Made By Sliders, You Need To Place An Empty / Transparent PNG Over The VU Sliders To Avoid Mouse Click / Drags.

                    1 Reply Last reply Reply Quote 2
                    • DimitrisSPD
                      DimitrisSP
                      last edited by DimitrisSP

                      @lalalandsynth Sorry for been late to answer...I just now entered in the forum!
                      In order to have a mono functionality use only one LevelMeter...
                      Delete ''LevelMeterR'' and rename "LevelMeterL" to "LevelMeter"
                      Very correctly as @Lindon said ...sum the Left and Right values and divide them by 2...

                      Use this snippet

                      HiseSnippet 1611.3oc4Y0saaaCEVJNZHwcYqcnCXWRTzKb1ZSrS+YannKNw+T3sjZiXu1kcSJiDsMWjHEjnSSVP.1qQuauF6t7nrGg9FrcHojEsqiqgQawxp.BfIO+vuyGO7viTZEwcIww7HK6k6bZHwx9ScZeJSzuReLkY0npk80c1gbLweWhfD0gDKr19zPbbLwyx1N2SjZYu7hVpmWu41XeLykjMkk0y3TWxNz.pHa1Vk+IpuecrGoCMvP66WtgKmUg6yG.HJmSQqPr6Q3djmhkpsfik8mTyiJ3QsEXAI1xdws4dm1tO+kLs9OiFSOzmHGTxpM3H8z049dRDKm0pRepuWqzHO1xx1oUFOjSyC2zYWpGc37l7gT.JyBS9vdgoAuRlvq3rCOaC3snFd2vosaDMTjIQhsq4zfAaScwvVfIrz5Zsvm63TgCZvDqEfOhTOBFLzhBOrXw6fdPwhq9nUxuRdXiHVfNFGgx1+QOFkZeOhnBOHjyfAEtUlJ25xsdGt6QyfGjp8FdoElcolBxdC8aSCB8IxzyRfcpTZoU051k3BlXHNwz0WuJwEeJZOXiyzQUqUYq8OXus5TC7Sw0996knckAQQvpidF1e.Idk7RccGDoBCklESTTlgGgpf88ODxkMcs.zqFqGkQVyMh.qqR0lG9aRHJQkXsXhPMYp4E5Nf4JnbVgUWI+YR2qBsgn.kQ4fyKXDlJNSiYk3BkV8all3hqtJZczFOBgjdU+25q2hfOBYtjZQxEMDDktv6hA5N.eRA0D2QCHYDoUGgncQExL3GFxbqpEiPmk9CjIqNzjGkJ9b8OH9wjoY5W+XiMxwMV9H2qzgHjFPODLAx0NlDECbsd969t7AoIhz3JIK.1CRV8357H49RcrKTMovP5QucXtizlHL1JdGCSIPGhS0gSYFoZ4JXBnj+NWeTBRaE3Hchag6AkSRSZQb1S4BRSH6M+Y4WN+44QiKpa2IJSdvOh66CNbRh0K0TLr.aPvgjn6.Yp.1GpHTNcz50NWd8ZyqSb00gLTjyZvnhlgD1kUE2Jo3ETOOWBpfeITUy+rjp4s8odjHKpm7d3LR2Rg5rqI2+BqYvClWbKqoNtWd8lyhWbbfxqiaJ77yMphEX4kSIwEDqgjHAURi1UIGC25qupZYmpj3iD7PUfmT0Ff2rE5mX1cvoYCtc4tT+fXAXai.nCAKajyYs1q4OVqRmCp2bmp016biz1PVOKHGnsT+3gd4hes7Kodh9Yt85k6Sn85m0qxKdQ4.ydb1+BntlISDKHgso+dJ67mu5U+0lwC51kdhj7PdaaEP877Is3wTYRoQ7bgGoKdfu9.k4RDCIVcHmH1lehNgKf6kvjpxCxjogD4RydFfAvKMcx71SgLkt5RHTHoZLBciIPnlnO+aIyy.xMMf7eTsbX5gqFfxq3XbYFz0XDzvH.UonkcR6JcZaj6WVyw5U8x1xj8t9F8hAcDx8F3iEi1lnDJIBj9vreLYOWLv2mZRbuW5cbVg6MbZQEt8mLdWXB3EN4+9FuIchuhitqsLvtnS8e4Cba2KM7siFllofxn4cW9qFYYUk3iGg+d9nGT1u7Dd4oFxdPDs393nwY+biFx4lsatlPXt3LmhHCIzUlT5uvQQ4Wk.rJk3pCfutrV4+Af6d7ABJqG7VGQpaceJbuDePjKAfJiAcSCyYufrEL83hxwR.0lv7TC9G3IQXI4X6DgkREZRI2TSIWy443iIpWFRwFeoZbWdT.5IDFIRxUkdW70RBm4uVRSWA.gNQXVbHOlTxzyiIaiQqMIFvFUc8TinkL7f2KIvPukJmN4FlSBoEi3LX7HdZWpwMu+8l0XXXSuMAhFulwtPvJ4NSlp0.3E7TmNJYZX1zaXN830FWb1pMdk9iD8gqujbyFbeKWntbJF02eVCtnyGdAhgUtUMFmN6nGi1ky3g84LpqYN0dD3zeudjQxalX.skPfglgGNyMKuGwmfiIlMDuC7B43nc08cOObQoYmKl190W4ngKRd1G8+i9Iy8QY+jy9ITn73GI2p9gXMBvtQ7Cb0epC4QukTy.wMS8eUXYmckiQkR+JGNNEWqn7U.oG35JyNtKvOS1lMlCat2bXy8mCadvbXyCmCa914vluap1Hu6bqABdfN+GlnUM0Wax1V2pf5nf0+h9zF.s
                      

                      And as @Natanr said very correctly if you will not use an invisible image like "levelMeterLock" on top of the LevelMeter you will have problems with Mouse Click / Drags.๐Ÿ‘

                      1 Reply Last reply Reply Quote 2
                      • ?
                        A Former User
                        last edited by

                        Its all in the algorithm....maybe a few guys here could help you out.

                        1 Reply Last reply Reply Quote 0
                        • A
                          andioak @DimitrisSP
                          last edited by andioak

                          @DimitrisSP @Natanr @yall

                          Thanks a lot @DimitrisSP for the vu-meter. I modified it a bit to make whole integers from your png of 107 strips and set it to -100 to +6 dbFS. Also added peak values in labels for both L, R and highest of the two.

                          Here is that project (scriptnode 2020-08-20): LevelMeterTest--andioak-peak-values.zip

                          @Christoph-Hart Is there a pan-law compensation built into the Simple Gain module/plugin? To compensate for the increased value from the other channel? The values I get are steep when I pan towards one way, but it might be my programming here. (and my gain is +1, but at Left 40:ish i get around 5-6 db over the center peak, thatยดs about what pan law should compensate for...) (and the gif below is 7fps :) )

                          Here it is:
                          levelmetertest-andioak-mod-peak-vals.gif

                          Script of this thing:

                          Content.makeFrontInterface(600, 500);
                          
                          const var LevelMeterL = Content.getComponent("LevelMeterL");
                          const var LevelMeterR = Content.getComponent("LevelMeterR");
                          const var LevelMeterLock = Content.getComponent("LevelMeterLock");
                          
                          // show values as well, via label with whole integer db values.
                          const var Label_MeterValue = Content.getComponent("Label_MeterValue"); // the peak of the strongest channel. 
                          const var Label_MeterValue_L = Content.getComponent("Label_MeterValue_L");
                          const var Label_MeterValue_R = Content.getComponent("Label_MeterValue_R");
                          
                          
                          
                          // ------------
                          
                          const var Pan = Content.getComponent("Pan");
                          
                          const var SimpleGain1 = Synth.getEffect("SimpleGain1");
                          
                          //Decay Rate
                          const var DECAY_RATE = 0.93;
                          
                          //Current Values
                          var curLevelL = 0.0;
                          var curLevelR = 0.0;
                          var curLevelM = 0.0;
                          
                          //Timer Callback
                          const var t = Engine.createTimerObject();
                          
                          t.setTimerCallback(function()
                          {
                          //Synth Values
                            var LevelL = SimpleGain1.getCurrentLevel(1);  
                            var LevelR = SimpleGain1.getCurrentLevel(0);
                            
                          //Peak Synth Values  
                            var peakLevelL = Math.max(LevelL, LevelL);  
                            var peakLevelR = Math.max(LevelR, LevelR);
                            
                            var peakLevelMax = Math.max(LevelL, LevelR);
                          
                          //Kick Left  
                          //-----------------------------------------------------------------------------  
                            if (peakLevelL > curLevelL)
                              {
                                curLevelL = peakLevelL;
                              }
                            else
                              {
                                curLevelL *= DECAY_RATE;
                              }
                          
                          //Kick Right  
                          //-----------------------------------------------------------------------------     
                            if (peakLevelR > curLevelR)
                              {
                                curLevelR = peakLevelR;
                              }
                            else
                              {
                                curLevelR *= DECAY_RATE;
                              }
                              
                          //Kick Max peak for mono out or label with max peak for strongest channel.
                          //-----------------------------------------------------------------------------     
                            if (peakLevelMax > curLevelM)
                              {
                                curLevelM = peakLevelMax;
                              }
                            else
                              {
                                curLevelM *= DECAY_RATE;
                              }
                          
                            
                          //Decibel Conversion  
                          //-----------------------------------------------------------------------------   
                            LevelL = Engine.getDecibelsForGainFactor(curLevelL);  
                            LevelR = Engine.getDecibelsForGainFactor(curLevelR);
                            var LevelMax = Engine.getDecibelsForGainFactor(curLevelM);
                            
                          //Set Values  
                          //----------------------------------------------------------------------------
                            LevelMeterL.setValue(LevelL);  
                            LevelMeterR.setValue(LevelR);
                            
                            Label_MeterValue.set("text", (LevelMax >= -99) ? Math.round(LevelMax) : -100); // use Math.round (round up) for all except minimum value, -100. 
                            Label_MeterValue_L.set("text", (LevelL >= -99) ? Math.round(LevelL) : -100);
                            Label_MeterValue_R.set("text", (LevelR >= -99) ? Math.round(LevelR) : -100); 
                            
                          });
                          
                          t.startTimer(30);
                          

                          UPDATE: this code does what itยดs supposed to, but using labels to be updated by a timer seems to crash hise and the output plugins/standalone exported instruments. Read here about it.

                          ustkU 1 Reply Last reply Reply Quote 1
                          • ustkU
                            ustk @andioak
                            last edited by

                            @andioak Apparently there's a 3db compensation law but not sure...

                            
                            float BalanceCalculator::getGainFactorForBalance(float balanceValue, bool calculateLeftChannel)
                            {
                            	if (balanceValue == 0.0f) return 1.0f;
                            
                            	const float balance = jlimit(-1.0f, 1.0f, balanceValue / 100.0f);
                            
                            	float panValue = (float_Pi * (balance + 1.0f)) * 0.25f;
                            
                            	return 1.41421356237309504880f * (calculateLeftChannel ? cosf(panValue) : sinf(panValue));
                            }
                            
                            void BalanceCalculator::processBuffer(AudioSampleBuffer &stereoBuffer, float *panValues, int startSample, int numSamples)
                            {
                            	FloatVectorOperations::multiply(panValues + startSample, float_Pi * 0.5f, numSamples);
                            
                            	stereoBuffer.applyGain(1.4142f); // +3dB for equal power...
                            
                            	float *l = stereoBuffer.getWritePointer(0, startSample);
                            	float *r = stereoBuffer.getWritePointer(1, startSample);
                            
                            	while (--numSamples >= 0)
                            	{
                            		*l++ *= cosf(*panValues) * 1.4142f;
                            		*r++ *= sinf(*panValues);
                            
                            		panValues++;
                            	}
                            }
                            

                            Can't help pressing F5 in the forum...

                            A 1 Reply Last reply Reply Quote 0
                            • A
                              andioak @ustk
                              last edited by andioak

                              @ustk thanks. whoah.. math is beyond my scope atm, but pan law I thought would remove the 3db. Not add it as suggested there. I got that wrong though, as pan law is the opposite.

                              1 Reply Last reply Reply Quote 0
                              • First post
                                Last post

                              30

                              Online

                              1.8k

                              Users

                              12.1k

                              Topics

                              105.6k

                              Posts