HISE Logo Forum
    • Categories
    • Register
    • Login

    Active notes check/Voice distribution

    Scheduled Pinned Locked Moved General Questions
    10 Posts 3 Posters 632 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.
    • A
      audiolyf
      last edited by audiolyf

      Is there any way to check exactly how many notes are being played?

      I'm experimenting with triggering multiple single-voiced synths and need to find the best way to distribute the notes across them.

      My hacky solution now KINDA works but quickly messes up the voice count, especially if you play it quicker than... Really slow.

      I have a global in the interface script (I know, globals are the devil, don't remember why):

      global activeNotes = 0;
      

      And one script processor for each synth:

      onInit
       reg eventId1 = -99;
       reg note = -99;
      
      onNoteOn
      function onNoteOn()
      {
      	Message.ignoreEvent(true);
      	
      	if (activeNotes == 0) //== 1, 2, 3 etc. for other script processors
      	{
      		note = Message.getNoteNumber();
      		eventId1 = Synth.playNote(note, 127);
      		activeNotes = activeNotes + 1;
      	}	
      }
      
      onNoteOff
      function onNoteOff()
      {
      	if(Message.getNoteNumber() == note && Synth.isSustainPedalDown() == false)
      	{
      		Synth.noteOffByEventId(eventId1);
      		eventId1 = -99;
      		note = -99;
      
      		activeNotes = activeNotes - 1;	
      	}
      	
      }
      

      Like I said it kinda works but loses count if you play multiple notes in rapid succession.

      So if synth1 is already taking care of the first active note, synth2 plays the next one. Is there a more solid way to approach this?

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

        Also, my solution sucks right now because it's not keeping track of which synths are free to play.. Synth1 will only play if no notes are playing, Synth2 will only play if one note is playing etc.

        1 Reply Last reply Reply Quote 0
        • d.healeyD
          d.healey
          last edited by

          Is there any way to check exactly how many notes are being played?

          What's wrong with Synth.getNumPressedKeys()?

          Libre Wave - Freedom respecting instruments and effects
          My Patreon - HISE tutorials
          YouTube Channel - Public HISE tutorials

          A 1 Reply Last reply Reply Quote 0
          • A
            audiolyf @d.healey
            last edited by

            @d-healey Nothing wrong with it, I didn't know it existed :) I'm realizing it doesn't help with my problem of managing the voice distribution though.

            d.healeyD 1 Reply Last reply Reply Quote 0
            • d.healeyD
              d.healey @audiolyf
              last edited by

              @audiolyf Just so I understand. If you have 3 synths and you play a 3 note chord you want one note per synth? What about if you play 4 notes?

              Libre Wave - Freedom respecting instruments and effects
              My Patreon - HISE tutorials
              YouTube Channel - Public HISE tutorials

              A 1 Reply Last reply Reply Quote 0
              • A
                audiolyf @d.healey
                last edited by

                @d-healey Right now I have 6 synths, and that's a good question. Do you drop off the first note played, the last note played, or the note closest to the last note played...

                I managed to solve it in another way by adding MIDI channel filters to each channel and managing the rest from the interface script. Maybe not the prettiest solution but it works!

                onInit
                reg voice1play = -99;
                reg voice2play = -99;
                reg voice3play = -99;
                reg voice4play = -99;
                reg voice5play = -99;
                reg voice6play = -99;
                
                reg note = -99;
                reg lastNote = -99;
                reg lastVoice = -99;
                
                reg eventId0 = -99;
                reg eventId1 = -99;
                reg eventId2 = -99;
                reg eventId3 = -99;
                reg eventId4 = -99;
                reg eventId5 = -99;
                
                function onNoteOn()
                {
                	Message.ignoreEvent(true);
                	note = Message.getNoteNumber();
                	
                	if(!Synth.isArtificialEventActive(eventId0) && Synth.getNumPressedKeys() < 7)
                	{
                		eventId0 = Synth.playNoteWithStartOffset(1, note, 127, 0);
                		voice1play = note;
                		lastVoice = 1;
                		Console.print(Synth.isArtificialEventActive(eventId0));
                	}
                	else if(!Synth.isArtificialEventActive(eventId1) && Synth.getNumPressedKeys() < 7)
                	{
                		eventId1 = Synth.playNoteWithStartOffset(2, note, 127, 0);
                		voice2play = note;
                		lastVoice = 2;
                	}
                	else if(!Synth.isArtificialEventActive(eventId2) && Synth.getNumPressedKeys() < 7)
                	{
                		eventId2 = Synth.playNoteWithStartOffset(3, note, 127, 0);
                		voice3play = note;
                		lastVoice = 3;
                	}
                	else if(!Synth.isArtificialEventActive(eventId3) && Synth.getNumPressedKeys() < 7)
                	{
                		eventId3 = Synth.playNoteWithStartOffset(4, note, 127, 0);
                		voice4play = note;
                		lastVoice = 4;
                	}
                	else if(!Synth.isArtificialEventActive(eventId4) && Synth.getNumPressedKeys() < 7)
                	{
                		eventId4 = Synth.playNoteWithStartOffset(5, note, 127, 0);
                		voice5play = note;
                		lastVoice = 5;
                	}
                	else if(!Synth.isArtificialEventActive(eventId5) && Synth.getNumPressedKeys() < 7)
                	{
                		eventId5 = Synth.playNoteWithStartOffset(6, note, 127, 0);
                		voice6play = note;
                		lastVoice = 6;
                	}	
                }
                
                function onNoteOff()
                {
                	if(Message.getNoteNumber() == voice1play)
                	{
                		Synth.noteOffByEventId(eventId0);
                		voice1play = -99;
                	}
                	if(Message.getNoteNumber() == voice2play)
                	{
                		Synth.noteOffByEventId(eventId1);
                		voice2play = -99;
                	}
                	if(Message.getNoteNumber() == voice3play)
                	{
                		Synth.noteOffByEventId(eventId2);
                		voice3play = -99;
                	}
                	if(Message.getNoteNumber() == voice4play)
                	{
                		Synth.noteOffByEventId(eventId3);
                		voice4play = -99;
                	}
                	if(Message.getNoteNumber() == voice5play)
                	{
                		Synth.noteOffByEventId(eventId4);
                		voice5play = -99;
                	}
                	if(Message.getNoteNumber() == voice6play)
                	{
                		Synth.noteOffByEventId(eventId5);
                		voice6play = -99;
                	}
                	
                	note = -99;
                
                1 Reply Last reply Reply Quote 0
                • d.healeyD
                  d.healey
                  last edited by

                  If you use arrays and switch statements you'll greatly simplify that code.

                  Libre Wave - Freedom respecting instruments and effects
                  My Patreon - HISE tutorials
                  YouTube Channel - Public HISE tutorials

                  A 1 Reply Last reply Reply Quote 1
                  • A
                    audiolyf @d.healey
                    last edited by

                    @d-healey Care to give a quick example? :)

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

                      @audiolyf A simple solution is to use a midiList which is made for this kind of stuff:

                      HiseSnippet 1405.3oc6Y0sTaaDEVx1hfMszj1j1dUm8h1YrGHDKSZZmgICFv1odBF7fHjdGyhzZ6cPZWWoUP8zoyza5aSeFZ4QnOB8QH20KaOqjLR1QPbbCzB09BFsmeV8c9+fcaWtIwyi6pnle+A8IJpumlw.ln2V8vTlRyZJpKp0B6IHtnPRaNnO1yiXonpl8YRBp4yonn7SC9nee8Mw1XlIIhTvmC3TSx1TGpHlZ6pOmZa2.aQ1m5jP5GWsoImsE2l6C3IqVYk9XyiwcI6fkhkQSQct5VTA20PfEDOE0baxsFXzieJKT9CndzirIxC5JFvEERtA21RhX4yJa0iZa0dnc6onndm1wdgrgdg6q0hZQOmdr23tALPwZjzenlYT3kcD3oeQvKEHol.R4Bgz8zLLco8Ewbj3YAslLH3zACt8jPITVkL+RFss3fDLwJN3iIMbgCmqQwmTt7xH3OkVq.HkG2lrhoMA6VDHTn.DL7DnSvtnVaidJpNqKkAB3R.qS5E1l5IjRFK2Nad3A61bq5Ff3qtVAWRWjMj7rgP3ROxWPrBRG.lkWqiOyTP4LDmsCWP1kUrTgenP9zEOEpKsD5KR79VBouVg7Ex2Z6U7HhCv19jhs.2Dj8rRWhP9J1w24HBXZKm10UJT6HMfq.B4LFwtX5x9iEPia.c5DZAobG.n59F.UoRSN7endnvO5QHZGz.tO5TLSfDbD19T7.Ojm.6JPmRE8PmD3A0KjGjrXPkcv846z1kHyUdNYfWwRnmBgjRExm+hhViYvxTJWtssDORadL1xx5z4DoXQVfwrLjz.V54BB45iV.M2jU.YFlgmPPNqIiJ1sOI5bbG.8TJ2ThJQfmdQyZXAVVAFQCjqOwUPkvQsF4DviDVOlWqFw6XAuOzP60JVg1DbKearXzdGxFlQL.+wHErxhRlGULHte3qVe7FJ4tX+Q4T62kp0Ngv8dZsoBydoi2LofWvqcUi2n1yuuV8NcHlhXvlSqw2do8hemCkECgxBZFPWwfJq.f7wAmQuDeBA8LBi3Jcp5WzXS3yDO1r+DO1bWSA7522Ey75y8F4hMHNz84LoGIl3K7fACjuaOYTNI8s3X2TY8p0a.FYp5XfE9tAoKa3v8YhQROxNwwjjk2iV0jP9TFbl6pZV9Dh02vpFpuN79.snwDMn1vb4njnVMq0DEw.ExYzjnw8kS8tFwM+TyF0dFdRDfsEi14vvlZAPiZIgqYHpBmGoDzAOYPVYBtjBZN8IFxoTSm9yK0uNyZn1Zp2UQ4ZrOb1IqYxaHAH+PLZPc5aC1yIDaXXS.F+PX5RGrusXH0Qi9s3Ld+dbF0LoqaOBL4taWhaRrmpAAy3gUqiob+p6QfE+R1q3yqtMTiicA+DYJ8Eu8K4lZ75S0BgKR12Cc6X9Y1+eN+bOtufx51BCIpeOT2BMQLfwVljnVcdxZ4Lxl.gmKKOGN2hYEb3ufOQL0kmUiXpOjYRy8ACmQKGGGOi9AAm6vcc9uxHZ8DYs+1X7pj7sViH7YmK9Ye1OuvYgjFQJo40.LuDW67UGRrRRhswL8jZBmG4lZICSwGqyvPP2f.Vi0tdlfwJ8cIK4Z6a6QdI0RzKw89GIHWII4uA6ZAwEyq4sDl616VBUtQrkP0YaIbkrkPkYaILaKgaS+W1WdEJLc5lSj9SzfIlUPAgaz+9w6q4UwlOzybGsc3TugcuBddB1A6r+z9We2uC1ruNh+IKZr5MgEMle1hFWMKZr5rEMtMsnQlYecDWUy.uNdGNXSW9glgcpj4xyGPAraVvOcddsVxyH8y6PoUdkxJNv7lCMMkt6GB9mz0oxTnypSgNOdJz4KmBcdxTnyWME570WpNxQ8a3K3Ngkh.g10C9kGUUC+NVBx5U9av6D+3.
                      

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

                      A 1 Reply Last reply Reply Quote 2
                      • A
                        audiolyf @ustk
                        last edited by

                        @ustk Certainly much leaner, thanks for that!

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

                        35

                        Online

                        1.7k

                        Users

                        11.7k

                        Topics

                        102.0k

                        Posts