HISE Logo Forum
    • Categories
    • Register
    • Login

    Some basic questions

    Scheduled Pinned Locked Moved Scripting
    74 Posts 4 Posters 21.8k 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.
    • d.healeyD
      d.healey
      last edited by

      :D this is great! I wish I had more time to play around with this... soon!

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

      1 Reply Last reply Reply Quote 0
      • M
        MIDIculous
        last edited by

        I agree that this feature has to be done. I've been looking a long time for this and it is very rare with mixed results. For synth leads and bass sounds it is invaluable. I do know it is possible as Korg, Roland, and especially Ensoniq keyboards can do this great with samples, but it is an invaluable feature.

        @d.healey:

        Yes, coming up with an alternative way to accomplish the same tasks in HISE sounds good. I've been trying to think of some more specific examples where I use event IDs:

        My main use for them at the moment is for a artificial legato and glide/portamento feature which relies on cross fading two notes and changing their pitches over time (in a loop). So that as the two notes cross fade their tunings also overlap until the note that fades out is tuned to the new note's starting tuning, and the new note's destination tuning is whatever key has been played - kind of hard to explain but this was used in the famous SIPS and WIPS KSP scripts to achieve a musical sounding legato effect.

        In my true legato scripts I always turn off the old note before playing a new one (to prevent hanging notes) and some instruments I've worked on have same note legato transitions and the intervals are mapped to the same keys as the sustain notes (but in different groups) so I could end up with three samples triggering for one note but I only want to hear a max of two at a time (during cross fades) so I need to be able to turn the old ones off using their ID - if there are release samples too then things get more complex.

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

          Hi, it seems you've made great progress with HISE since I last checked in! What's the latest with multi-mic sample sets?

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

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

            Sorry for the late response, it got a bit quiet around here :)

            Multimic samples are implemented, here is a blog post that describes the procedure:

            http://hise.audio/blog/posts/handling-multi-channel-samples

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

              Thanks, it looks pretty comprehensive. I'll have to test it out

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

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

                Can the individual samples of a multi-mic sample have their start position offset?

                What I'm thinking of here is if I record an instrument with close, stage, and far mics, they are going to be offset slightly with the mics farthest away the most delayed. When all mics are active this is fine but if, lets say, all the mics except the far mics are purged then there could be a noticeable delay between pressing the key and the start of the sample. So in this situation is might be nice for the user to be able to shift the start position of the sample.

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

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

                  I don't think this is practical. Moving the sample start means resetting all preload buffers (the beginning of the sample that resides in memory until the hard drive can fetch the rest).

                  If you really care about this delay, you could remove a fixed amount from the far sample (so that it is "in sync" with the close mic) and introduce a artificial delay using the delay FX, which can be altered on the fly.

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

                    Ah that sounds like a workable solution

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

                    1 Reply Last reply Reply Quote 0
                    • LevitanusL
                      Levitanus
                      last edited by

                      What is about globals? I mean are they global for unique plugin or for any plugin in the project?
                      Generally, in the any future would be grate to have both separately, but now I need only to know :)

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

                        Globals are only accessible in one plugin. Making shared stuff across different plugins in a DAW is a source of constant trouble so I wouldn't bother with this...

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

                          Might be possible in the HISE player though, no?

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

                          1 Reply Last reply Reply Quote 0
                          • LevitanusL
                            Levitanus
                            last edited by

                            i'm trying to understand some basic concepts and can't assume, where I'm wrong here:
                            Here I'm trying to implement waitting, and expect that note would be delayed by 1 second but it isn't at all...

                            <?xml version="1.0" encoding="UTF-8"?>
                            
                            <Processor Type="ScriptProcessor" ID="Script Processor6" Bypassed="1" Script="Globals.interval = 2;&#13;&#10;Globals.attack = false;&#13;&#10;Globals.legato = false;&#13;&#10;Globals.glissando = false;&#13;&#10;Globals.sus = false;&#13;&#10;&#13;&#10;var note = 0;&#13;&#10;var velocity = 0;&#13;&#10;&#13;&#10;var newnote = 0;&#13;&#10;var lastnote = 0;&#13;&#10;var i = 0;&#13;&#10;var prev_note = 0;&#13;&#10;var temp = 0;&#13;&#10;var rel_off = 0;&#13;&#10;var fading = 0;&#13;&#10;var fade_id = 0;&#13;&#10;var exit = 0;&#13;&#10;&#13;&#10;var wait = {&#13;&#10;&#9;ms:0,&#13;&#10;&#9;start:1,&#10;};function onNoteOn()&#10;{&#13;&#10;&#9;note = Message.getNoteNumber();&#13;&#10;&#9;velocity = Message.getVelocity();&#13;&#10;&#9;&#13;&#10;&#9;//if (lastnote = 0){&#13;&#10;&#9;&#9;//Globals.attack = 1;&#13;&#10;&#9;&#9;//Globals.sus = 1;&#10;&#9;//}else {&#13;&#10;&#9;&#10;&#9;//};&#13;&#10;&#9;Message.ignoreEvent(true);&#13;&#10;&#9;wait.start = 1;&#13;&#10;&#9;wait.ms = 1000;&#10;}&#10;function onNoteOff()&#10;{&#10;&#9;note = Message.getNoteNumber();&#10;}&#10;function onController()&#10;{&#10;&#9;&#10;}&#10;function onTimer()&#10;{&#10;&#9;if (wait.ms != 0){&#13;&#10;&#9;&#9;if (wait.start == 1){&#13;&#10;&#9;&#9;&#9;wait.ms = Engine.getSamplesForMilliSeconds(wait.ms);&#13;&#10;&#9;&#9;&#9;wait.start = 0;&#10;&#9;&#9;}&#13;&#10;&#9;&#9;if (wait.ms == 1){&#13;&#10;&#9;&#9;&#9;Synth.playNote(note, velocity);&#10;&#9;&#9;}&#13;&#10;&#9;&#9;wait.ms -= 1;&#10;&#9;};&#10;};&#10;function onControl(number, value)&#10;{&#10;&#9;&#10;}&#10;">
                              <EditorStates BodyShown="1" Visible="1" Solo="0" contentShown="0" onInitOpen="0"
                                            onNoteOnOpen="0" onNoteOffOpen="0" onControllerOpen="0" onTimerOpen="1"
                                            onControlOpen="0"/>
                              <ChildProcessors/>
                              <Content/>
                            </Processor>
                            
                            1 Reply Last reply Reply Quote 0
                            • d.healeyD
                              d.healey
                              last edited by d.healey

                              Well I'm not 100% sure what you're trying to do but you can't use the timer without starting it :) If you just want to delay note ons you might find what you need in my humaniser script - http://forum.hise.audio/topic/151/humaniser

                              Message.delayEvent(Engine.getSamplesForMilliSeconds(randNoteOnDelay));

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

                              1 Reply Last reply Reply Quote 1
                              • LevitanusL
                                Levitanus
                                last edited by

                                just want to delay note

                                no, it's just smple visible action for debugging)))

                                use the timer without starting it

                                ahhh))) Thakns

                                1 Reply Last reply Reply Quote 0
                                • LevitanusL
                                  Levitanus
                                  last edited by

                                  what the difference between playNote and addNoteOn?

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

                                    addNoteOn is more specialised, but internally they are the same.

                                    1 Reply Last reply Reply Quote 1
                                    • LevitanusL
                                      Levitanus
                                      last edited by

                                      agggr, I can't get it....
                                      I have pretty simple on my taste task - take the attack sample (~0.7 sec), and sustain momentary, but sustain at -120dB then on last 0.3 sec of attack fade sus to 0dB. But it seems to me that callbacks on one event are executed consecutive, including to onNoteOff my wait function from onNoteOo, which using the timer callback.
                                      I feel that it's not working like kontakt, and there should be way to implement such a thing, but any other thoughts bring me to the table envelopes with per-note changing the attack time and moving points (for avoide stretch of the fade area itself withtin changing attack time), that seems to me too complicated and unrelieble (more than, I can't get how to edit points on the specific attack table) :)
                                      I feel myself so stupid....

                                      1 Reply Last reply Reply Quote 0
                                      • LevitanusL
                                        Levitanus
                                        last edited by Levitanus

                                        function onNoteOn()
                                        {
                                        	note = Message.getNoteNumber();
                                        	velocity = Message.getVelocity();
                                        	
                                        	//if (lastnote = 0){
                                        		//Globals.attack = 1;
                                        		//Globals.sus = 1;
                                        	//}else {
                                        	
                                        	//};
                                        	Message.ignoreEvent(true);
                                        	wait.start = 1;
                                        	wait.ms = 10;
                                        	Synth.startTimer(0.004);
                                        }
                                        function onTimer()
                                        {
                                        	if (wait.ms != 0){
                                        		if (wait.start == 1){
                                        			wait.start = 0;
                                        		}
                                        		if (wait.ms == 1){
                                        			Synth.playNote(note, velocity);
                                        		}
                                        		wait.ms -= 1;
                                        	};
                                        };
                                        

                                        P.S. It's just debugging code for understanding how things are working, but even here I'm confused)))

                                        P.P.S.

                                        take the attack sample (~0.7 sec), and sustain momentary

                                        Why this way? From my experience momentary taking two samples produces less bugs and less code, than moving sustain noteOn in time

                                        1 Reply Last reply Reply Quote 0
                                        • LevitanusL
                                          Levitanus
                                          last edited by

                                          Well, Now I'm almost sure about logic and syntax, but while loop terminates.

                                          var wait = 0;
                                          const var timer = Engine.createTimerObject();
                                          
                                          
                                          timer.callback = function()
                                          {	
                                          	wait = wait - 1;
                                          	if (wait == 0){
                                          		timer.stopTimer;
                                          	}
                                          };
                                          
                                          function onNoteOn()
                                          {
                                          	note = Message.getNoteNumber();
                                          	velocity = Message.getVelocity();
                                          	Message.ignoreEvent(true);
                                          	wait = 2;
                                          	timer.startTimer(150); // in milliseconds
                                          	while (wait > 0){
                                          		
                                          	}
                                          	Synth.playNote(note, velocity);
                                          }
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • d.healeyD
                                            d.healey
                                            last edited by

                                            I'm still not really sure what the purpose of this is but this should help:

                                            <?xml version="1.0" encoding="UTF-8"?>
                                            
                                            <Processor Type="SynthChain" ID="Master Chain" Bypassed="0" Gain="1" Balance="0"
                                                       VoiceLimit="128" KillFadeTime="20" IconColour="0" packageName=""
                                                       views="32.rk1bzA.....B.........LUYtQFL..+O..........." currentView="-1">
                                              <EditorStates BodyShown="0" Visible="1" Solo="0" Folded="0"/>
                                              <ChildProcessors>
                                                <Processor Type="MidiProcessorChain" ID="Midi Processor" Bypassed="0">
                                                  <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                  <ChildProcessors/>
                                                </Processor>
                                                <Processor Type="ModulatorChain" ID="GainModulation" Bypassed="0" Intensity="1">
                                                  <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                  <ChildProcessors/>
                                                </Processor>
                                                <Processor Type="ModulatorChain" ID="PitchModulation" Bypassed="1" Intensity="0">
                                                  <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                  <ChildProcessors/>
                                                </Processor>
                                                <Processor Type="EffectChain" ID="FX" Bypassed="0">
                                                  <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                  <ChildProcessors/>
                                                </Processor>
                                                <Processor Type="SineSynth" ID="Sine Wave Generator" Bypassed="0" Gain="0.25"
                                                           Balance="0" VoiceLimit="128" KillFadeTime="20" IconColour="0"
                                                           OctaveTranspose="0" SemiTones="0" UseFreqRatio="0" CoarseFreqRatio="1"
                                                           FineFreqRatio="0" SaturationAmount="0">
                                                  <EditorStates BodyShown="1" Visible="1" Solo="0" GainModulationShown="1"/>
                                                  <ChildProcessors>
                                                    <Processor Type="MidiProcessorChain" ID="Midi Processor" Bypassed="0">
                                                      <EditorStates BodyShown="1" Visible="1" Solo="0" Folded="0"/>
                                                      <ChildProcessors>
                                                        <Processor Type="ScriptProcessor" ID="Time Delay" Bypassed="0" Script="reg id;&#13;&#10;reg note;&#13;&#10;reg velo;&#13;&#10;&#13;&#10;reg waitTime = 0.5; //ms&#13;&#10;reg timePassed;function onNoteOn()&#10;{&#13;&#10;&#9;Message.ignoreEvent(true);&#13;&#10;&#9;&#10;&#9;note = Message.getNoteNumber();&#13;&#10;&#9;velo = Message.getVelocity();&#13;&#10;&#9;&#13;&#10;&#9;timePassed = 0;&#13;&#10;&#9;Synth.startTimer(0.05);&#10;}&#10;function onNoteOff()&#10;{&#13;&#10;&#9;Synth.noteOffByEventId(id);&#10;}&#10;function onController()&#10;{&#10;&#9;&#10;}&#10;function onTimer()&#10;{&#13;&#10;&#9;timePassed = timePassed + 0.05;&#10;&#9;&#13;&#10;&#9;if (timePassed &gt;= waitTime)&#13;&#10;&#9;{&#13;&#10;&#9;&#9;id = Synth.playNote(note, velo);&#13;&#10;&#9;&#9;Synth.stopTimer();&#10;&#9;}&#9;&#10;}&#10;function onControl(number, value)&#10;{&#10;&#9;&#10;}&#10;">
                                                          <EditorStates BodyShown="1" Visible="1" Solo="0" contentShown="1" onInitOpen="0"
                                                                        onNoteOnOpen="0" onNoteOffOpen="0" onControllerOpen="0" onTimerOpen="1"
                                                                        onControlOpen="0"/>
                                                          <ChildProcessors/>
                                                          <Content/>
                                                        </Processor>
                                                      </ChildProcessors>
                                                    </Processor>
                                                    <Processor Type="ModulatorChain" ID="GainModulation" Bypassed="0" Intensity="1">
                                                      <EditorStates BodyShown="1" Visible="0" Solo="0"/>
                                                      <ChildProcessors>
                                                        <Processor Type="SimpleEnvelope" ID="DefaultEnvelope" Bypassed="0" Intensity="1"
                                                                   Attack="5" Release="10" LinearMode="1">
                                                          <EditorStates BodyShown="1" Visible="1" Solo="0"/>
                                                          <ChildProcessors>
                                                            <Processor Type="ModulatorChain" ID="Attack Time Modulation" Bypassed="0"
                                                                       Intensity="1">
                                                              <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                              <ChildProcessors/>
                                                            </Processor>
                                                          </ChildProcessors>
                                                        </Processor>
                                                      </ChildProcessors>
                                                    </Processor>
                                                    <Processor Type="ModulatorChain" ID="PitchModulation" Bypassed="0" Intensity="0">
                                                      <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                      <ChildProcessors/>
                                                    </Processor>
                                                    <Processor Type="EffectChain" ID="FX" Bypassed="0">
                                                      <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                      <ChildProcessors/>
                                                    </Processor>
                                                  </ChildProcessors>
                                                  <RoutingMatrix NumSourceChannels="2" Channel0="0" Send0="-1" Channel1="1" Send1="-1"/>
                                                </Processor>
                                              </ChildProcessors>
                                              <RoutingMatrix NumSourceChannels="2" Channel0="0" Send0="-1" Channel1="1" Send1="-1"/>
                                              <macro_controls>
                                                <macro name="Macro 1" value="0" midi_cc="-1"/>
                                                <macro name="Macro 2" value="0" midi_cc="-1"/>
                                                <macro name="Macro 3" value="0" midi_cc="-1"/>
                                                <macro name="Macro 4" value="0" midi_cc="-1"/>
                                                <macro name="Macro 5" value="0" midi_cc="-1"/>
                                                <macro name="Macro 6" value="0" midi_cc="-1"/>
                                                <macro name="Macro 7" value="0" midi_cc="-1"/>
                                                <macro name="Macro 8" value="0" midi_cc="-1"/>
                                              </macro_controls>
                                              <MidiAutomation/>
                                            </Processor>
                                            
                                            

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

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

                                            23

                                            Online

                                            1.8k

                                            Users

                                            12.1k

                                            Topics

                                            105.0k

                                            Posts