I just wanted to make a note on how helpful David Healey is in this community, and that his tireless efforts to upgrade everyone’s knowledge are noticed and appreciated!
Thank you, David :)
Happy New Year!
I just wanted to make a note on how helpful David Healey is in this community, and that his tireless efforts to upgrade everyone’s knowledge are noticed and appreciated!
Thank you, David :)
Happy New Year!
Christoph,
First off, I would like to thank you for this amazing development tool for music :)
I am quite happy to be taking the plunge and learning as much about coding in HISE every day since watching and following the David Healey tutorial video: "How to make a synth"
Now, my main goals with HISE involve making MIDI plugins; some to be released as free utilities, and others as a paid product.
In my tests it seems that HISE does not receive or pass (thru) some MIDI message types:
MIDI clock
MTC
MMC
SysEx
etc.
Then there is Program Change, which HISE can accept and use, but not generate or pass (thru).
My concern:
When using HISE to make MIDI plugins, blocking these messages may deny users access to certain features that are needed for the next plugin in the chain (often a VSTi).
Therefore, if I am to produce MIDI plugins I am apprehensive about blocking those messages, and I, myself as a MIDI plugin customer would not be happy if a plugin that I purchased were to deny the passage of those messages to the output stage.
Personally, I do a lot of orchestral template mockups in a system where the articulation switching of VSTis is managed by expression maps (in Dorico, Nuendo, Bidule and Reaper) which are changed via incoming program change messages. Currently, I can't actually use any of my HISE produced MIDI plugins within this system, as without PC messages, it blocks the articulation switching.
In addition, there are many VSTis that can utilize program change messages directly to change patches. Kontakt, Omnisphere and VSL for starters.
And from my observation, it seems that many electronic producers with outboard gear setups require MTC (MIDI time code) and/or MIDI clock to sync devices.
I also have use-cases for plugin designs involving MIDI clock, MTC and SysEx and would love to have access to them for making custom MIDI controller managers.
Given that, I would like to add a feature request of three different levels (sorted from lowest to highest complexity):
Thanks for your time,
Craig
@clevername27 Thank you very much for your time!
You have a lot of incite to provide and I found the instruction as well as conversation to be quite worthwhile. I would certainly sign up again for more!
@d-healey said in HISE Meet Up:
@HISEnberg said in HISE Meet Up:
I don't think you could do spectral morphing in realtime
https://www.zynaptiq.com/morph/
https://web.archive.org/web/20180705061655/http://www.hakenaudio.com/RealTimeMorph/
I find the Kyma to be rather convincing for smooth morphing:
I would love to hear this kind of thing used to interpolate between sample sets for articulations that have capabilities for continuous control of timbre:
bow position, fluttertongue, growl, stick position on percussion etc.
There are a few different algorithms to choose from for morphing on the Kyma, and I don't know the details, but I think these are precomputed FFTs for resynthesis.
I am not sure what is causing this, but sometimes when I open a project/preset I am not getting any MIDI input and when I check the settings the MIDI inputs have been turned off:
Whereas I am certain I have saved it like this:
Yes, you can send MIDI out from button clicks.
I am working on a series of MIDI plugins at the moment.
You need to enable MIDI out in settings:
When using UI components to generate MIDI notes, you need to use Synth.addNoteOn() and Synth.addNoteOff() on the callback to you component.
Here I have pads (made with panels) which play chords when you use a mouse click.
It turns the notes off when the mouse is up.
// mouse callbacks for the pads --
pad.setMouseCallback(function[unitSize](event)
{
var ps = this.data.pitchSet;
var l = ps.length;
if (event.clicked)
{
var velocity = Math.round(event.y / unitSize * 127);
for (k = 0; k < l; k++)
Synth.addNoteOn(1, ps[k], velocity, 0);
}
if (event.mouseUp)
{
for (k = 0; k < l; k++)
Synth.addNoteOff(1, ps[k], 0);
}
});
To get the MIDI to output from the plugin,
as others have said you must use Message.sendToMidiOut();
To make sure it catches everything (and not some intermediate stage of MIDI),
I always place these functions in a script processor and container after all of my other containers:
And place the Message.sendToMidiOut() on each of the three MIDI callbacks:
@HISEnberg said in Let’s Build the “League of Newbies”:
@HISEnberg Done, I created the group chat. I guess anyone else who is interested can post here and we can add them in.
Add me :)
I'll check it out.
@d-healey It needs both ceil and floor to work, so I wrote an inline function to do the job:
inline function roundFix(value)
{
local remainder = Math.fmod(value, 1.0);
local roundedValue;
remainder >= 0.5 ? roundedValue = Math.ceil(value) : roundedValue = Math.floor(value);
return roundedValue;
};
const testRound = roundFix(4.49);
Console.print("test round: " + testRound);
const testRound1 = roundFix(4.5);
Console.print("test round: " + testRound1);
@d-healey said in Is there a method to rotate a path?:
@VirtualVirgin Instead of making a function to rotate a path, why not make a function to create a rotated path. You can pass in the data you would have used to create the initial path.
So based on your suggestion I came up with this and it seems to work:
inline function createRotatedPath(pathArray, angle, area)
{
local rad = Math.toRadians(angle);
local cosA = Math.cos(rad);
local sinA = Math.sin(rad);
local path = Content.createPath();
local rotationCenterX = area[0] + (area[2] * 0.5);
local rotationCenterY = area[1] + (area[3] * 0.5);
for (i = 0; i < pathArray.length; i++)
{
local x = pathArray[i][0];
local y = pathArray[i][1];
local newX = (x - rotationCenterX) * cosA - (y - rotationCenterY) * sinA + rotationCenterX;
local newY = (x - rotationCenterX) * sinA + (y - rotationCenterY) * cosA + rotationCenterY;
if (i == 0)
path.startNewSubPath(newX, newY);
else
path.lineTo(newX, newY);
}
path.closeSubPath();
return path;
}
The pathArray is a 2D array of x,y points
i.e.
[[x,y],[x,y] etc..]
@d-healey I'm imagining that you answered that question before I even submitted it! Lightning fast response.
@CatABC If you want the knob to represent the actual MIDI values and not a normalized value you can set the "min", "max" and "stepSize" of the knob to reflect that:
knb1.set("min", 0);
knb1.set("max", 127);
knb1.set("stepSize", 1);
If you do that you would just get rid of of the "inputValue" variable and use the "ccValue" directly to set the knob value.
@d-healey said in How do I use LAF to draw the dropdown of a comboBox?:
@VirtualVirgin drawPopupMenuItem if I remember correctly
Thanks :) That is the correct draw function.
Do you know how to edit the size of the popupMenu?
I have LAF drawing the front of the comboBox using
.registerFunction("drawComboBox", function(g, obj)
How do I draw the dropdown? Is it a separate draw function?
@d-healey said in Font not changing on comboBox. What am I doing wrong?:
@VirtualVirgin I think it's broken, I always use laf.
Thanks :)
I can't get the font to change from the default font for the comboBox:
I must be missing something obvious.
@d-healey said in Engine.getSamplesForMilliseconds() not working:
@VirtualVirgin
MilliSeconds
Ah! I didn't catch that. Is it two words over the pond?
Snippet:
HiseSnippet 1030.3oc2W80aaaCDmJ1ZnVccXcnXXOJTrGb2JBrh+SSZwPchicmwpSLhRa2CCnfk5jMQjH0HoRm2v9t1OB8avFojcrTqSlqWa.1zS9tiG4Od2u6N5wBNAjRt.Y4b5rD.Y8419yXpo8lhoLzvCQVemce1DJCbm.JebbRDHGvEinQQTIP3r.oqjQSR.E5fYIXoDBPVVUdhweqZUQYeu8wGfivLBrTEB8bNk.OkFSUK0Nt6Oo24A3.3TZbgU2p6P8Y0iGwS0XshcCTBlbFdBbD1rrsrQ+HVN0f116zjzJ3AA6rS685Pvcf8BwggdMCZ0pyt640bObqc6.MZir9r9ATEW3qvJPhrpd.OXl+T9qY4GvyoR5qh.ifGxWex4pGviBLWQiVTuoznfwKBhRDxxd7xPZk7P5crGQCnWneYn8KyL3tzihAPqsJCuJkfmWQ30n.7VAjrJ.op4P5119DAMQszhAO2zdHSAhPrNOUDJ4qEsUSK6db8JXpsiwmACDZgK7ndmFMtua6FMt2itkiiiNaIUtZjufz39Ct4DosuThTcuFF2czGhjGAamHnLU86Z1DWYtGOz8tteewsUubyWXJinnblKmcDWAGypeOm+volye539tlBCWoMyMSvih.wJManihqxw5rz3WAh66dNNJEtXg5Pd47n8kmGKRyH4A5BKjyFxnpiS.1kQ9PyyN5e8rgGhUXSxetN85R.ghZff0gv45RubpPM6CA4YJdht3683IZFJOHMBqJSaME2yMniAk3JF9.SRUyJV7+tb4pqGW9pK0VW3da6wTEY5pw6Vq.u5n1mZ7Nuyvsr6GFBD0RvV0dvOeMzFvN+7cr2mgilIgE0+KD8JggCR0nT3S+8BMjeS2wBMKBd8bVzb02nqUk0FvdWIfQmvSUT1jQXkf9aZLeTZrut8OAzgKFChLESVaYn84xMLxFP3CrfLg+R+M2nmQ1ZtQuEFKlS9h7axMs80MoxFBlET95LY2WfOGbeBv.ggc4cYy559Kz2rty5RV6YcGST5i+TAlIS3xRarODSOkyLQ5kJelT2bF90SLz8h56wwhUZ5sOdf9RtRe7wpTQVcy9w7TlpTcRk0tN4CXDZ0OUiPuVa67uuK4GmR8ZKvnO0LvrO6bHROJHCiekt2eHNMRsPaYd8HNimLkynjhI8S.c83jIfnH1W4EZekR+HskZtS2SfH.Wj.+scepl3gE53DrgwBuO3W+rx702XmCWWSwn6+OltU4+ZS293.kqiAGWGmQLlH3ujj+9RCW9FYZz2aV1+5ol8HirqGJ6MmEyww5thujPJuUumi6roN1bScr0l5X6M0wNapiOXScb2+YGMCs1OUwiyKYQnQi6m8fcKq9LrlwmUcf9a.dn5NcC
@HISEnberg Regarding VST3, Is it only specific MIDI message types that are not working, or is it not outputting any MIDI at all in your host DAW? I have built and tested at least a dozen VST3 plugins with MIDI output now and they are working.
I have encountered trouble at times when testing a VST3 plugin and it does not provide the MIDI out, and in those cases I found that there may be a bug with the "Midi Settings" interfering with build.
To explain, here is a screenshot of my "Midi Settings" when testing with a MIDI controller in HISE:
I have the AKAI MPK mini 3 connected and selected.
Sometimes when opening a HISE project that was configured like this and I have my controller plugged in and available, it is not connected in HISE and appears to be not selected:
I have noticed that if I build the plugin in this state that the resulting VST3 plugin will no longer send MIDI out signals.
The solution has been to get the MIDI controller reconnected and build again.
I am not sure why this would effect the MIDI out of the built plugin, but this has been my experience.
So, it may be something to look into when trying to get MIDI out working for VST3 Instrument build.
How does it work if I see something missing or incorrect in the documentation?
I propose a change on GitHub?
Example-
I am looking at this Snippet for a transport metronome:
HiseSnippet 1721.3oc4WstaaTDEd23rkFWLzhpP7yQQHUGvjZW5MABUGmKsVzjXEmVnRHUMd2isG5tyXlc1jZphD+jGi9XvO4QoOB8MnblYu3cC1oFKZ.AVIVdly4Ly27ctLmoiT3BggBok8JGNdDXY+9NcGyUC2bHkwsZukk8G5bnjxCGIjpCgPkUqwinggfmksco6qUxdkksLed88ZQ8obWXxTVVOVvbgGxBXpIy1o42x782g5AGxBxo8Ma11Uv2T3KhP.Uxot0Hp6ynCf8nZ0Vxwx9Ba6wTBYWEUAgV1K2R3Mt6Pww7X8eLKj0yGzCZX0EWn3o2Q36oQrdVqMGx785jdvCsrrc5LgFJESCW0YWlGKa9IzwkMBHSrHOeXuzYAuF4gW84Gd14f2xwv6JNcckrQpIRzX6RNs4JP1mhtf7vJVWqk9sK3ro.0fqVOf9LXGINHyhp2td8ZjaUu9ZeckxUJe8qSNbHKjf+oFBjvwb2gn9hHbbZ7.YHk64CRxwCYtCIGiNUxHe5XiEAfRqe.P3BjLpTFcsgJxQTIJl7Mjs4CXbXcWIfbUVH1ChWwpYfX2Hznd.gxILtOZAoeD2UwDbbVWZTHPXp3sVFo0wr4zHOl.+Et3dUJeZCE7V3lVsG9UM7.tGbbKpbMRkxunRYB9wW3R8ILODkljg0odd6gGh84UaTib25jOOyJxmQZbiZ3+2oFwvbZ6iMRer2ue+s.jQ.uVi29Hj3a6Uk4oWCixmjbHa2mLVDQbQ9b.f7aD9kfzm5imtgfDpU3LRy4L7GSphldMTDteXpFILpmxGsGS43CH+HSg9WyljRWZ94QsSHGhm.B4WSQFDQQefBPtiDpnXTJYDHYBu0pTFOLgfZeCqsoAiU0XrVBQl4q1ATXX.t9ADeZOvufS+PHXj.YzzHvAfZSANEGGTcUizU0qzDK1SDLS8QYmR6s.9YnuQ5orniHbl5ixVM6bsm3Xxwflikv.VHRnX3n.OmRBxKDQ+rPqPz4Tv+PvHI+dXUrPsGMZjGFrm3AzKdJyZN9ITqwsWKaIqxgiMhWKK9zLTaX0UUvyUqVijpCFYtJoUmcQrW9jX7mtEcYC3TUjDl01HBpQ7zzzjMBY4haCJLIF2PnEDFaa19l6vklbOiclE1ASQvn0IaLR+wqcuAwWGrpNQMQMx8HwSFt9.I.bxWkMVBd4Q.561Bn3tbTLsyh8GDVw7sBUqxpRf9KccmbNSyBVUHyxFEGARIyyTBJjg27oWKInKZJ3XpIFLULZHzWnldB0oIkbEmlBsno7bDCpTNRAqFim1IjROeL9K0uUXIPi6YRfQAHqkq.YR4t0J+hxqT9jxjSKpe+oJSmLIE9lJ3SQr95d4YYXUdTPOPVCyO8ifLEw68JdwpyruXM+89tw414TTvayYp8GA7YccqURAA7WOp8VTEUeCbxbndXQQESCA6sfiv5sw2GuhyVP3yThQHRyphXYWVYjVI415GpKJZwv6jeOGS5p0ymz7ySZNdxf1M6i6XbaO50tOMxWYomqK6my0wzFMOl4oFNYBVyg.avvbMa8fl.RcTC6XWR600K4MZTWWmPeZe6n0wAKDjCqMi9aAqOYJXMFeN15Ixiaq4iUMUkxgzKex+nH8RylQw7vb3726kCmur2BhyWN9Lv4uZWDmoUVQcuf0uX8l3Ny+ScZh86J7h7ophMAq67OQ.l.WnaScGk7PlZb9WF7Noy34EtWwoCC6LY53coofWLk+cMdSdmQEms62GbUS.6xN678myOpvIFKkc1fS8GGBoulHcXiB3oUDhXYwHwW0riDKGhcgDWNLY5K1ztTQvWZ9JbOEt6.QjBu7eWpRxvDGm8hB5hgutl9Y3Xyl5f7kz0uiGWWOVCht.2yL3M3mDgMzisSD1HUXd+yGDeRtjSW7oClF5MjxGaFS9N5Q.49.Gj5HsFy5QwM+A1ql2GEOZteT79tJb6S5pJrvB2EBXGhEeByO4iBwm5A+zA5P+7yuofJmpnWeucvC4TsoqtERSNzFAhHtpPNSo4NP8uviyW9e0ON+7qhYo4CtukT8URwXWVvHeXa9QfO1SiAieT5UMoyVLtdWrE1QCEbladm9AXiyrAC.YdrO0CzFJE1G5jYtZyC.eflO.9Sa9PLviJQdBVPtnw7yEmk+5SbhgKQmLR9uwMck9e4McmKWbbdrGATWo3otwOTRGKeQyL34lmzo3t5wjFVlGOoaxr950sBvJhO00US2eAxOS2lar.17kKfM2bAr4VKfM2dAr4NKfM28LsQeYzFQJQPbpHNQmsMunz1dattObSTu0e.zpy6sH
In that I find that the
Synth.addNoteOn();
returns an event ID of the generated note on:
which I do not see represented in the docs:
and an incomplete reference here that mentions that there is a return at all:
So I am thinking it would be helpful if the documentation could reflect this.
How can I make that change or propose the change?