HISE Logo Forum
    • Categories
    • Register
    • Login

    Change panorama position of a noteOn Message

    Scheduled Pinned Locked Moved Feature Requests
    25 Posts 5 Posters 1.3k 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.
    • ulrikU
      ulrik @Frankbeat
      last edited by

      @Frankbeat you don't need the timer, it's just there for the visual meters in this example.

      Hise Develop branch
      MacOs 15.3.1, Xcode 16.2
      http://musikboden.se

      FrankbeatF 1 Reply Last reply Reply Quote 1
      • FrankbeatF
        Frankbeat @ulrik
        last edited by Frankbeat

        @ulrik If I want to apply the same panorama settings to a Sampler2, would this be a more complex operation?
        I have tried to just duplicate the setSoundProperty call like:

        	    Sampler1.setSoundProperty(i, Sampler1.Pan, pan);
        	    Sampler2.setSoundProperty(i, Sampler2.Pan, pan);
        
        

        But that doesn't work. It makes the knob have no effect anymore.

        Using HISE from the develop branch (Feb '23)

        ulrikU 1 Reply Last reply Reply Quote 0
        • ulrikU
          ulrik @Frankbeat
          last edited by

          @Frankbeat with the same knob?
          Can I see your code?

          Hise Develop branch
          MacOs 15.3.1, Xcode 16.2
          http://musikboden.se

          FrankbeatF 1 Reply Last reply Reply Quote 0
          • FrankbeatF
            Frankbeat @ulrik
            last edited by Frankbeat

            @ulrik Yes, both with the same knob. Here is the function (script references for Sampler1 and Sampler2 are given, but not shown here):

            const spreadKnb=Content.getComponent('spread');
            inline function onSpreadKnb(component, value) {
            	Sampler1.selectSounds('');
            	local NumSelected = Sampler1.getNumSelectedSounds();
            	local sampleRoots = [];
            	for (r = 0; r < NumSelected; r++) sampleRoots.push(Sampler1.getSoundProperty(Sampler1.Root, r));
            	sampleRoots.sort();
            
            	local lowestNote = sampleRoots[0];
            	local highestNote = sampleRoots[sampleRoots.length - 1];
            	
            	local range = highestNote - lowestNote;
            	local centerNote = lowestNote + range/2;
            	
            	local step = 150 / range;
            	
            //	Note numbers of both maps are:
            //	45,46,47,48,49,50,51,   52,   53,54,55,56,57,58,59];
            	
            	//	Spread from the center and out
            	for (i = 0; i < 59; i++) {
            	    pan = (-(52-sampleRoots[i])) * value;
            	    Sampler1.setSoundProperty(i, Sampler1.Pan, pan);
            	    Sampler2.setSoundProperty(i, Sampler2.Pan, pan);
            	}
            };	spreadKnb.setControlCallback(onSpreadKnb);
            

            Using HISE from the develop branch (Feb '23)

            ulrikU 1 Reply Last reply Reply Quote 0
            • ulrikU
              ulrik @Frankbeat
              last edited by

              @Frankbeat You can't have the same variables for both samplers, you have to duplicate them and also have a separate for-loop for the Sampler2 samples
              also Sampler2.selectSounds('');

              Hise Develop branch
              MacOs 15.3.1, Xcode 16.2
              http://musikboden.se

              FrankbeatF 1 Reply Last reply Reply Quote 1
              • FrankbeatF
                Frankbeat @ulrik
                last edited by

                @ulrik Alright, now it works… Thank you very much, again!

                Using HISE from the develop branch (Feb '23)

                Christoph HartC 1 Reply Last reply Reply Quote 0
                • Christoph HartC
                  Christoph Hart @Frankbeat
                  last edited by

                  Changing the sample properties like this might lead to a few edge case issues (eg. if you load a sample map in a preset and then change the pan it might cause order-of-initialization issues), also it's a very heavyweight operation so you can't automate it.

                  The stereo FX with scripted voice start modulator solution looks like this:

                  HiseSnippet 1431.3oc2X0saSbDEd1jLoXCkBnnpJ0aFg5ENTvX2BoUBghyeFYAArxF9oWglr6wwixtyrc1wgXPU8l97zWgxiPeDZeC3Mn8Lyt1dcvJXaU.Q8EIdNybly2424bbasJ.RSUZhWo86m.DuKP86KMc2pKWHIs1l3cQ5t7TCnYYj1reBOMEBIddKdOKAuRKQbedy5axi3x.XDIB4IJQ.7.QrvLhZ6F2WDE0jGB6KhKb5a0nUfRtkJR0CwyhzZjDdvQ7CgGxsGaAJwa4cBEFk12vMPJdlMUg886pdgL67OQjJNHBrKpS7wKJiLYqthnv1Cz0TBwi1djluXlluBcWQnXH8QVfK41fMhih1.uENKHUeFfjWAHsTFjtL0OPKRLi1whmySaIQGRGNZpKBkryR7dMcKEd.ooZL+HnoFWLjgJqUq10Y3eV8Nc5ICLBkjojOTYfGIqrZ4WUtT4eoL6za0oyD2yJFsJJBzSbaq2UeVLVQ1K9.Pec1w7ndvvChp+31zkmNaZPlVW3fJYKov7nDHecSUTn0VY+9a6AH4lMquHGg3QMNOwEy8D9QhPPSD3k7Yz6KUGTm3.ewXdxiasM2vGbM3MhRIAzFgUY71FNFyIxbvknaCoGYTItyFmnjV46c92oPOYj.EM5ObwqOrQpou0zrr6fjXQXXDzVkJrl9QL8Wq2QDEmZvquULlhQ7tB8wo.KD5v6EYXoGgA+QB4QP39JWtmANAQ14n9IZfGRRFX3Zgn5Knt77rsPjlv0XJKFxY2bHKj2N.GSsTg8h3lwy2rEVx2vh5hA41HYIpM8KV3YFRBqclIgSKDuLssvDzcxXbgIfQLX38AFyKc84zc5zABLi.3RzlOadqSM8h+hYh+7TegDbua3D9W5VydJ+XfcOPBZqwq9Y7zweNsOcjL0Oc7n.CJ980bYZhJcrK1GhE6iYZoEIhA+M0vOum0aVj9VJtdha8l0ahJ4D4wma5ocgEaDq5IMiEFr339gkltZaimQT37S3gjk9H711+MoUeDy7G642RCvnuHNIB1QdLDgUvcX7JXIaWMxATGOvdWkTkzUIEAE856AXk1CODzEw9DUnMLFromQTVowdPDvKFA+MMd.F4w0ncBlSawr2JxD8WeEMCtLa1H6S2J1K9+5J1i4NoYxuL0GedFTnLsB+B4KYMe13gys4EJS+SMdpHDqwWfvG9XtKQQLw93WiX4LL9048nk0.jgqMCwrCtmt0n2IZ2Tjnh3ZaeD4Mzuvut.EecK0f8IqYY2js4N1cYCZzmG5nT4pY6d0qyvt7wd7KWtPW2ifXkiseskLDNw008MuIqIfYGLSWfIwN9YI4cLxpXIsKpyXShrfHD6rWfOAy5hsRy3LMzAiavWtYFEycQCuBjYSWN1JoUhPnaCmbWkwkgrz.dDvDFKi2nNqZ0pr5kKEoPxH+5XrmUTAqjK5pGBF6nHOzMwPkUY2fs1spVaU1Mc++N3jCVguQRRTemjRcFhxkFbUW6tErb1a6I111qr5.Ns7LzVIAHL0BLMfujKQ8LdX7V1vJrC.yK.Pxp4Tl542AptNqyA.iiPQfpMOk4bdboSUcXKKWanMV0YjwoZ4R4Bsx.n+sr5VM8ZrZUu8cN0jT49TUxocoy1nZy3.YycV9LNh0vQGdOLi0Ed2REGxh5YEV+AeY5Ft5M+A5gS7EuzA4Wsxueu+9k+15wE63kPh4mTLsOsWmNhSbSZMqSlQ1S0yHjGtKGYxhYLIwGaDN.vplRIDkZg+BVqe15ZCTGePF5V7O3m7MqaW6kuY8Aa9AQFw7.s54AYwE15smyQAiPjteAnRzcsqYCm4lRqUsl0MHddPf8IzaTmPlLOe2bvy2OG7bq4fmaOG7r1bvyOLG77imIO1gG1nmQEm8TLRn8Nt7ROucjbrjf6cNx+xakGYp
                  

                  relevant code (you might need to scale the range according to what you want):

                  function onVoiceStart(voiceIndex)
                  {
                  	// Fetch the note position (the Message class will hold a reference to 
                  	// the note on that started the voice) and scale it to -1 ... 1
                  	local normPos = (Message.getNoteNumber() - 64.0) / 64.0;
                  	
                  	// Apply the spread
                  	normPos *= SpreadKnob.getValue();
                  	
                  	// the function needs to return a modulation value between 0 and 1
                  	// that will be applied as constant to the stereo position of the voice.
                  	return (normPos + 1.0) * 0.5;
                  }
                  
                  FrankbeatF ulrikU 2 Replies Last reply Reply Quote 1
                  • FrankbeatF
                    Frankbeat @Christoph Hart
                    last edited by

                    @Christoph-Hart said in Change panorama position of a noteOn Message:

                    Changing the sample properties like this might lead to a few edge case issues (eg. if you load a sample map in a preset and then change the pan it might cause order-of-initialization issues), also it's a very heavyweight operation so you can't automate it.

                    The stereo FX with scripted voice start modulator solution looks like this:

                    HiseSnippet 1431.3oc2X0saSbDEd1jLoXCkBnnpJ0aFg5ENTvX2BoUBghyeFYAArxF9oWglr6wwixtyrc1wgXPU8l97zWgxiPeDZeC3Mn8Lyt1dcvJXaU.Q8EIdNybly2424bbasJ.RSUZhWo86m.DuKP86KMc2pKWHIs1l3cQ5t7TCnYYj1reBOMEBIddKdOKAuRKQbedy5axi3x.XDIB4IJQ.7.QrvLhZ6F2WDE0jGB6KhKb5a0nUfRtkJR0CwyhzZjDdvQ7CgGxsGaAJwa4cBEFk12vMPJdlMUg886pdgL67OQjJNHBrKpS7wKJiLYqthnv1Cz0TBwi1djluXlluBcWQnXH8QVfK41fMhih1.uENKHUeFfjWAHsTFjtL0OPKRLi1whmySaIQGRGNZpKBkryR7dMcKEd.ooZL+HnoFWLjgJqUq10Y3eV8Nc5ICLBkjojOTYfGIqrZ4WUtT4eoL6za0oyD2yJFsJJBzSbaq2UeVLVQ1K9.Pec1w7ndvvChp+31zkmNaZPlVW3fJYKov7nDHecSUTn0VY+9a6AH4lMquHGg3QMNOwEy8D9QhPPSD3k7Yz6KUGTm3.ewXdxiasM2vGbM3MhRIAzFgUY71FNFyIxbvknaCoGYTItyFmnjV46c92oPOYj.EM5ObwqOrQpou0zrr6fjXQXXDzVkJrl9QL8Wq2QDEmZvquULlhQ7tB8wo.KD5v6EYXoGgA+QB4QP39JWtmANAQ14n9IZfGRRFX3Zgn5Knt77rsPjlv0XJKFxY2bHKj2N.GSsTg8h3lwy2rEVx2vh5hA41HYIpM8KV3YFRBqclIgSKDuLssvDzcxXbgIfQLX38AFyKc84zc5zABLi.3RzlOadqSM8h+hYh+7TegDbua3D9W5VydJ+XfcOPBZqwq9Y7zweNsOcjL0Oc7n.CJ980bYZhJcrK1GhE6iYZoEIhA+M0vOum0aVj9VJtdha8l0ahJ4D4wma5ocgEaDq5IMiEFr339gkltZaimQT37S3gjk9H711+MoUeDy7G642RCvnuHNIB1QdLDgUvcX7JXIaWMxATGOvdWkTkzUIEAE856AXk1CODzEw9DUnMLFromQTVowdPDvKFA+MMd.F4w0ncBlSawr2JxD8WeEMCtLa1H6S2J1K9+5J1i4NoYxuL0GedFTnLsB+B4KYMe13gys4EJS+SMdpHDqwWfvG9XtKQQLw93WiX4LL9048nk0.jgqMCwrCtmt0n2IZ2Tjnh3ZaeD4Mzuvut.EecK0f8IqYY2js4N1cYCZzmG5nT4pY6d0qyvt7wd7KWtPW2ifXkiseskLDNw008MuIqIfYGLSWfIwN9YI4cLxpXIsKpyXShrfHD6rWfOAy5hsRy3LMzAiavWtYFEycQCuBjYSWN1JoUhPnaCmbWkwkgrz.dDvDFKi2nNqZ0pr5kKEoPxH+5XrmUTAqjK5pGBF6nHOzMwPkUY2fs1spVaU1Mc++N3jCVguQRRTemjRcFhxkFbUW6tErb1a6I111qr5.Ns7LzVIAHL0BLMfujKQ8LdX7V1vJrC.yK.Pxp4Tl542AptNqyA.iiPQfpMOk4bdboSUcXKKWanMV0YjwoZ4R4Bsx.n+sr5VM8ZrZUu8cN0jT49TUxocoy1nZy3.YycV9LNh0vQGdOLi0Ed2REGxh5YEV+AeY5Ft5M+A5gS7EuzA4Wsxueu+9k+15wE63kPh4mTLsOsWmNhSbSZMqSlQ1S0yHjGtKGYxhYLIwGaDN.vplRIDkZg+BVqe15ZCTGePF5V7O3m7MqaW6kuY8Aa9AQFw7.s54AYwE15smyQAiPjteAnRzcsqYCm4lRqUsl0MHddPf8IzaTmPlLOe2bvy2OG7bq4fmaOG7r1bvyOLG77imIO1gG1nmQEm8TLRn8Nt7ROucjbrjf6cNx+xakGYp
                    

                    relevant code (you might need to scale the range according to what you want):

                    function onVoiceStart(voiceIndex)
                    {
                    	// Fetch the note position (the Message class will hold a reference to 
                    	// the note on that started the voice) and scale it to -1 ... 1
                    	local normPos = (Message.getNoteNumber() - 64.0) / 64.0;
                    	
                    	// Apply the spread
                    	normPos *= SpreadKnob.getValue();
                    	
                    	// the function needs to return a modulation value between 0 and 1
                    	// that will be applied as constant to the stereo position of the voice.
                    	return (normPos + 1.0) * 0.5;
                    }
                    

                    With this solution, does the knob have to be added inside the Script Modulator? So I have to add the same knob to each of my Samplers?

                    Using HISE from the develop branch (Feb '23)

                    Christoph HartC 1 Reply Last reply Reply Quote 0
                    • Christoph HartC
                      Christoph Hart @Frankbeat
                      last edited by

                      Yes and it might make sense to connect it to an external script if you have more than two samplers to keep the redundancy low.

                      ulrikU 1 Reply Last reply Reply Quote 1
                      • ulrikU
                        ulrik @Christoph Hart
                        last edited by

                        @Christoph-Hart this seems to be a better way, and cleaner!

                        Hise Develop branch
                        MacOs 15.3.1, Xcode 16.2
                        http://musikboden.se

                        1 Reply Last reply Reply Quote 0
                        • ulrikU
                          ulrik @Christoph Hart
                          last edited by

                          @Christoph-Hart And using this way, would it be possible to set up a mixer for just one sampler, gain and pan for each note?

                          Hise Develop branch
                          MacOs 15.3.1, Xcode 16.2
                          http://musikboden.se

                          1 Reply Last reply Reply Quote 0
                          • FrankbeatF
                            Frankbeat
                            last edited by

                            Wow, this works like a charm! Thank you very much!
                            This way, it is even easier to set the right spread amount across the mapping range. I helped myself a little by printing it to console, since you wrote it has to return values between 0 and 1.

                            function onVoiceStart(voiceIndex)
                            {
                            	local normPos = (Message.getNoteNumber() - 45) / 45;
                            	normPos *= spreadKnob.getValue();
                            	local newNormPos=(normPos) * 3.21;
                            	// dev state only: Console.print(newNormPos);
                            	return newNormPos;
                            }
                            

                            The noteNumber 45 is my lowest mapped key here, but I don't know how I came to end up with this modified formula omitting the +1. But not to complain – it works. 😀

                            Using HISE from the develop branch (Feb '23)

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

                            43

                            Online

                            1.7k

                            Users

                            11.7k

                            Topics

                            101.9k

                            Posts