HISE Logo Forum
    • Categories
    • Register
    • Login

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

    Scheduled Pinned Locked Moved General Questions
    54 Posts 11 Posters 4.4k 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 @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

                          36

                          Online

                          1.7k

                          Users

                          11.9k

                          Topics

                          103.5k

                          Posts