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.
    • 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

                        7

                        Online

                        1.7k

                        Users

                        11.9k

                        Topics

                        103.2k

                        Posts