Some basic questions
-
well. lets try to understand how the timer works.
There's audio thread,which is executed one time per sample, timer function (callback) gets worldclock, or samples from start and is called every amount of samples. If i not mistake...
I don't think KSP behind logic works different. Just need to understand how does it came back to the callback.
I was thinking of null while loop, but it's terminated by too many iterations, i think...
Maybe there's a little bit more elegant solution? I really afraid of making garbage from the timer callback... especcially if some unpredictable usage will be produced -
AAAA) getUptime!
I was confused by the "seconds" word in the API, but it uses ms -
Yeah that confused me too :)
-
emmm.... The same problem with while loop. Even don't know who could expect)))
Well, it seems, the unique timer is the best solution at the moment) -
A key difference to KSP is that there is no wait() instruction. Instead you delay events using
Message.delayEvent()
. The problem with stuck notes can be solved by delaying the note off command with the same amount (it's hardly noticeable on note off commands).-
Don't use the
Engine.createTimerObject()
for audio stuff. This is running in the GUI thread and has absolutely no predictability or accuracy. -
There are scripting callbacks for adding volume fades. Check out
Synth.addVolumeFade()
. -
the
onTimer
callback runs in the audio thread and has sample accuracy.
Thanks for the hint, I'll fix the
getUptime
doc in the API... -
-
Ok, I think, the last question in this direction))
How about JUCE API? Can it work inside the script processor? -
can't find are reg global, and if not, 32 per plugin or 32 per script?
-
32 per namespace:
namespace n1 { reg n1_1 = 1; // ... reg n1_32 = 32; } namespace n2 { reg n2_1 = 1; // ... reg n2_32 = 32; }
-
Very interesting)))
So i can use 32 pieces of
reg atck_var
and 32 of
reg sus_var &And they are global, am i right?
Another question. I placed Synth.noteOffByEventId(atck_id); into timer callback, as well as to the note_off callback. Now, pretty predictable i receive error in console about missing event by timer or by noteOff callback depends on situation. Is it bad? Or I can eat it as usefull information and newer mind?
and more, more questions ))))
When does envelope work? I know that once triggered by the voice KONTAKT envelope works as it was before triggering, even if it has been changed during the note playback.
For example, if I move some points in noteOn, will it "eat" them respectivelly to the current note and not for any other already triggered?
or it will work with all currentely produced samples? Or new values will be produced only with next notes, or with artifically played with a bit of delay?P.S. and.. I have been confused a little by the dates od requests, so can;t understand actual things. Is timer global for the plugin, or local for each script?
-
Well I have almost done the "Hello world", but can't find how to set persistence of wigets... Or they will be saved automatically (as fbx)?
-
Widgets are persistent by default. If you don't want this, you can call
widget.set("saveInPreset", false);
-
Thanks! But I can't get the widget value by simple:
modwheel = Content.addKnob("modwheel", 346, 110);// [JSON modwheel] Content.setPropertiesFromJSON("modwheel", { "max": 127, "stepSize": "1" }); // [/JSON modwheel] modwheel.showControl(false); Globals.MW = modwheel.getValue();
What should be here else?
-
The persistent data is not available in the onInit callback. This happens behind the scenes:
- The persistent widget values are stored.
- The script gets compiled.
- The persistent widget values are restored.
- For all persistent widgets, the
onControl
callback gets executed.
In your case, you need to move the
Globals.MW = modwheel.getValue();
line in the
onControl
callback. -
why Event is not been ignored?
reg note = 0; reg vel = 0; reg newnote = 0; reg lastnote = 0; var i = 0; Globals.pos_interval = 0; Globals.neg_interval; Globals.Attack_length = 600; Globals.Attack_fade = 150; Globals.Release_fade = 200; Globals.Attack = 0; Globals.Legato = 0; Globals.Glissando = 0; function onNoteOn() { if (lastnote == 0) { Globals.Attack = 1; } if (lastnote != 0) { if (Message.getVelocity() < 80) { Globals.Legato = 1; interval = lastnote - Message.getNoteNumber(); Globals.pos_interval = Message.getNoteNumber() - lastnote; Globals.neg_interval = lastnote - Message.getNoteNumber(); if (Globals.pos_interval >0) { Message.setVelocity(Globals.pos_interval); } if (Globals.neg_interval >0) { Message.setVelocity(Globals.neg_interval); } } else { Globals.Glissando = 1; interval = lastnote - Message.getNoteNumber(); Globals.pos_interval = Message.getNoteNumber() - lastnote; Globals.neg_interval = lastnote - Message.getNoteNumber(); if (Globals.pos_interval >0) { Message.setVelocity(Globals.pos_interval); } if (Globals.neg_interval >0) { Message.setVelocity(Globals.neg_interval); } } } lastnote = Message.getNoteNumber(); } function onNoteOff() { Globals.Attack = 0; Globals.Leg = 0; Globals.Glissando = 0; if (Message.getNoteNumber() == lastnote) { lastnote = 0; } } //script perocessor 2 Sampler.enableRoundRobin(false); reg leg_grp = 0; reg vel = 0; reg note= 0; if (Globals.MW > 64) { leg_grp = 1; }else { leg_grp = 2; } function onNoteOn() { note = Message.getNoteNumber(); vel = Message.getVelocity(); Message.ignoreEvent(true); if (Globals.Glissando = 1) { Synth.playNote(note,vel); } }
The problems are:
Globals.Legato and Globals.Glissando are set with every event.
And even with setting them to 0 leg and gliss samplers are played. But shouldn't because of ignoreEvent -
I might be too tired to be thinking striaght but I think you need to ignore the event in your first script too
-
Yes. Events have a natural signal flow so if it gets ignored in the second script, the first script is long gone waiting for the next event...
-
Well, in HISE all works pretty fine. Just couldn't add CC gain modulator to the master container.
But with compilled VST trash: https://www.dropbox.com/s/oa8xbrnxhqx0k7r/Hise Hello World by Levitanus.rar?dl=0Problem A: engine settings button is visible and crushes the host.
Problem B: nothing is sounding, but voices are triggered.Playable keys G3,A3,E4. And CC1
-
CC Modulators can't be added to the master container but you can add them as a global modulator :)
-
but you can add them as a global modulator :)
wah! of course!
-
And what is with compiled VST? Where have I mistaken?