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!
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);
@ustk said in Is there a way to drag and drop data from one panel to another?:
@d-healey Finally I found a way, it was a bit mind bending...
HiseSnippet 2210.3oc2X0saajaEdFaOYiUVWzTTTzK4pKRkaEzJ4ejSZP6ZaY6MBM1QvRwsEAAAzyPIwpQjSIorr5hEnW1Whd29fz2f9dzq1GfBzdNblQynDIGagjftUFvXH44P9wuyO7P1RI8YZsT43VnyjHli6m60dhvzuQeJW3z7HG2M7NZj+fi35nP5DmCmDQ0ZVfiq6peMJh65q4X+88e0gzPpvmk0kiyERtO647gbSVus1+2wCCOgFv5vGlS5c1uouTzPFJGAvYUupNQT+AzdrynnXq347Lptui6uzq5t0Yr81taP.c6sCpWu9Sd7S14I0ncqtC8xZ0exNasyda838553duiC3FopsgZXZG20NTFLoce4XQ7BbAWyuLjgMp4zFV43tOQFFfaQrWmF84gAsR4IsiiqWqLVa0XV6m5cJOfOs+L16GaGfjoQdBzckYg2py.uZ4gW0bvaNPxMGjVKFROzqsuhGYxFAwyC7ZJLLUWJXmxCkXYcV46tuWCIHgvTYHc.6DEzXpFkpWsZYxtUqt4S2n.HlVFxp3GxnpRa9zBE.qm1PthpHQhPM42PdU5T0iYZHGFIEPiREaQErvZE2rbAx676FzXq6rFaem0Xm6rF6dm0ndwMeMvVE5JUjRQDtvRWaV3aJrdTk.pgVQyB6BzWDpcy.faIe4WR9Si.xkRBFMb3DBJ1Tw4h9LE2.ZTr3SKrN1ulYZAtflykiLbAqT2QBeCWJJ0ayBqCKz58pzEBBOHLrT0q6l7Crg3.AJ53CB48DrfNrqAT293mexulTj7qHl9bcFDKSdU0xUKWqd0x6V80kIE8gMohETbQSTyyd1wm2ryaOWI32Nc6tn46ag+8s.qALApIYHanTw0LMzjQhPhE9hZH8oZxkLlf3Gx8GvBHRQAEqGQCoU7YsDgH2m2WEU8H.GcTTgtKScXCfIOVzC3sJ9JFDZdnRRC7oZHLnz2.F6h7fhvlXNZVD8EJRU8zf.upnepouHraXWge7ZqDFZrDws.wFhiAyYGbu0mJBBS1YHCQLIK.rwLiw8lco0jQZtnmUrgxQZPXEsWwjoDSiByXss1Zup0pW.4uBElCjqPMFpe+Nxo9omhy0wHZ0kPWS.6MPtTSdD4YxqXJb2LzZVr1iwLhfADsYrjDxAVRvTZzuVpB.LajfuaudgronGAbr4f.6ThA3KlIcOAlP63PRehANfX9XNH34IqTohAHd7u7MCwOl5oOk6KSrLuM.i2kTx1pRh2ADNr9TOCvtOUKafDr45iaXjkoBIfqD+EX2wMbLqsEr9xnIVoExDpPRP6g0p7xHBnGqLr88oXuV+2ThhLFhCA8LvvDeZXHn8kSxn.6xYmasjLtOvdJFjwcVCe43f.E6JNzLatYWyMf4CIYJ.rwPr.i.Kdx5fYfPEya.Hk.NB2nVAQ4GIrVwz0ZyJUpDSjb8QrtPTRPooL3ljG8nrHMxWjiPSR7Ls8am6ZpVYIXd5LxqXQXJsR1rK4sYH.s3.SSj3nC7EfSvCjDuchiifbChegIN8.rUBJSBjXGCXLHQLjdUIgIypkI1vbo03xAxR.ovrNjn+t0q.3TKkgDxBbROhAEMwx7UqAmedW8W+hYcXwyBnfI1XfHJiB5bpiUp6VfjY2mikpAw9Lvw.Zd.KKWo0HtHVLlBKjBMvK3Log8BQIKlfzvj2dntcm6X3ofJI3qol6vX8epaRwRhQCujoJCIpCGwlJHTiyrEN4s3BmxWWme7gx4DTJZBAxuHhIVT0dNImjCe8xlnAFq1JoOPtHlxvQH3dDD74yhq8ZcuiX5AFYDTA5zzpv2F6najVYFZHb3P8W22KtlHmqyJG92t+jrF+w8GyCL8y5HX+9Ldu9l7h3bGVpsxsT+0AeTWpsyuql7Qco1YQD3+H7C8Rs6hHvO7KU8EQf2xk5cua.bqDYvnPpY1qpfWnKY.HLbl6Gf2APn4lI4uv2Gr6ubag3C8ZwM98mOFWYNXDBV+Xfwja8sg2wc6x7MY.bMuS9CeBthmW75WHwiAVSbw87N45Zyr5mMZXxE2ObDfTElpzcEXujbcO2+lWVV2H7.VEqirEHeIn3inP14.pgBWBk9CZy+Kr2MUcTLnNDknjOT3JVC2xjQ+d2Zdp1MalhuxSuSovYiPbiGvAssGy0HAcobPR6pXazSoMSDXa7efeICVCa6lLXszAyclvYPIsvorVCTx2NteFZM9bOskjeSWvnbAv8n6p6m4UsB7mCbyK4XLG.OwQFrV19ZICmD0WJ39XWwRjB8CfC3wDFw3+YTcGJOD87aORCGgE7BQaPX6SvfddmICfut2ITefXmzhhIJdnGdHH3txTU7m51NCVybfPFN9wWlQ.bdSellXpqQ7EXrORC30AiiDRJ.h8M6103LCT1viJngSzrJ3PyaUiU58sbHGExtN8r42xg+s6AZ2Dpz45D+mVTErTFVZDd544NN4.+87hXzAyh9G.DohUwNv7vdhNuGvu1xC9Z2D3yxP1wVauUfEIsM0B1BRbtRr6PS8E3nv8Dbt.CTQmLmCkxACoVm8kpVn7YP+QwC9.u1fqn8EGsNh+LaaxumdEi70XEyX9+ZK7UG+m+8+0s8UGit0u53K7MvxaqiORpmYhayFx6.mZqy24K0rSTr+74Hcmu+FRpZtC88e0Ivlbt5zlZFor1szX8bmjs5M8Xl0VxGybs+m6wL+AP8JybX75oXrMGikOVbEKDhErX7m.N+coiBMo8Nqu7oRgLMYelg9bFbzUudX3dF1m6F5.7oaFj0yf8O293.YNs+6ua+mCNaT0o1zYKEWT6N+1yy0d8y8hgKAC.I+vsNyU++55L+jT+zmh0XH0WIeiebYmne58s8.6ag8.508NEaSp4bU7IbY1xgPVt236O6T8NJt0xp31Kqh6rrJt6xpX8kUw8VVEe76WQ7PnCFYjCiCMgpcZcrsZDW2iETvK2FQ37eAPxYXrF
Sorry for taking so long to get back to this!
This is a good solution :)
I ended up doing something similar and this one uses alt/option drag to copy:
HiseSnippet 1420.3ocuWs0aaaCElJIpqxaEaEXuOV+Pg8lgqsa5kzfflFmjsf0jZTmVrgggBZJZKtHSJHQmTig.rexCX+.1NGJIKIWmrhft4GRLO23GO28fXMWjjniIN0Ncdjf37EtCmqLA8CXRE4n8INei6ohDiTMgNfoDgz8iYSnLkO7EcDsGYu4QrjDgOwwY8uGUxwaCh8ye978XgLEWTPhPdqVxEuTNUZJnNX2eTFFdHyWbpbZIo2b2i3ZUecndF.v0c6PhX7yXSDmvPwVyk7Crj.hy25x4atk3oi68jN81R7H+MG0qaGVuNas0SDrG0gOZKAq23Q7NDmacfuzniGZXFQBwYi8z9yGFnuPkdAuUlHGEJvCcICgaNk7g5Pe7IhTI8Cjg9Cx8bIDvJCJ7iqm5G+Z2ik9xEzK7mekkAsPixNPm0pBu0q.utkgWmRvaEPxoDj1HER20cHOVFYJ3f34ycORYDwiYPbpLTRkkr1ecK29ZPBko8T1YhCigCKznwi6zoEE9SysqU6AOfBf1PGMmxBMOPGYjZE0GxWlfoOii0Sol.A0.4M5X5Hsw.ThrYUFskEWfVNkVsZPvGLmMsKgtCMGFSDlWDF1WOMRqfyIMpaEoNfgyYwz9gxnQZVrO.owv8zHhJUYVoYseulGfSoRZrWnOyvn5Q+lfannvBFOH658hZibaaeS6Pq4Ap5YDu27L5LkuXrTI7aAj317yRDq4c41n1IBy.HpadsdFT+HZLdlhitjFSZBFyCTEQx3O.GArDJilZ1VzYIfGKfYvKOPlTfo1oRPu2NEWM84zI38lVyzXkJzj9rJBk9uj1ShEyAWnm2j1igxQ.0fU8eMfHlZRnH0Xfu+kZNKbOjaRiNMaQepUoq9oftrJOCPtkQFJSkGB3gr9auUgzQgPa.6sBrg7qKdQnbBnzofUVkkaQuJrWGS3hE90sV6RHx0LOz0nNKLTeQe3uifqKoNHMj1QKHrPzi0vqKmdQXVbNX7Rg5DnNlV+6pS4vi.x0tHPnJWoHSnQwBr9CjGyjSkCQl0TsAY2GZE.A4LKrCsdeczbn5pukPcHzVv5Dc7TVXFmsyyeVfWK8Foh2hl6auHPZDsncatsWFrWpVFRLijhDrhkmWokETSQoUn6eeZELuHdtn5DPX0PUVD.uxXQnfkfMMvDpoHbov0yxZVji.rgwByk0AwJAFvAeKGrR7RxkA06khNfL+LnrYY3hDphNL6r.6.6hCqJuktTwJcmx8k.9YBDKhvVDMZlQrr6YgQKkadYo9r1BMroUdSUbpb4tp0Ra58Kc90pcx..l1Gq9oGL7zN0gtX4MwxSCfBp.CzQPn7v6LyP8tVC08pMDN9TECyxDXMk8U.exqTfX6IZi3UpF19y0trFcYViGuRd3HgXcXnHdkrw0IhuNEanlMcj.R+OmENSrPPXjY04vtW8b3xqIvSmPURPs5HXTyqhDpqZ4AR1XM3au4n8AuKN7NiFHWjH1HQH3ru3bX0ozQ4dt6KRNCh4fUWLHj37YFK26jOnGiZDILN+1t1u2k79EaW8Gms67hUs94cuP5aBJHH2MPfgtxhTsgHw4KcqzPDeJezPo2UAE3v+yP4gWET1c1mDn7gahA6.p8mExLUWLDWeNiAjkVYaLbiKUhzLu750Kus3FebaKd8Ky9wB265NPZ3AqFuqsB7B40+Wi2rcuui6AiGCqeT.1MbO7mt1Es+z.kzM8lbLyDKgbJ2SlMcHzEjK.jnvNn.Mm0vZ9zycvynmYnP4aO72vmLlcwyNYL6lyjLkwi0uim1+B2z+1VJ.lT1eUjm6w3YZWhsmVY++T3Gd7NNupo9.E6cSU7g2TE27lp3itoJ93aphO4lp3S+2UD+cguXFL8NsbhPNdvA1ABNNGnXP1nMyk7O.m+4iUB
@d-healey said in Is there a component to make the collapsible panes in HISE?:
@VirtualVirgin
What do you mean by overwriting? When I load your script I see two panels created.Oh I see the UI is massive, I needed to scroll along. You might want to reduce that a lot, I don't know anyone with a 10000px wide monitor.
HAHAHA! Sorry, just an extra "0" by mistake.
@jBam said in Midi Controller VST built in HISE... thoughts??:
Seems promising in terms of basics (HISE can send midi out). So does that mean I can link a parameter to a midi out function and have it send ANY midi message like Cc, rpn, nrpn, sysex... or is it Cc only??
So as it stands, HISE built apps or plugins can only send note on/off (with velocity), CC, pitch bend, aftertouch and MPE.
Other messages such as program change, MIDI Clock, MTC, MMC and SysEx are not supported at the moment.
I added a feature request here to make additions to support all message types:
https://forum.hise.audio/topic/11665/fr-support-for-all-midi-message-types?_=1740115136462
@d-healey Thank you!
I'll watch this in a bit.
There are two methods I see that accept a custom sort function as a parameter input:
'''
ScriptedViewport.setTableSortFunction(var sortFunction)
'''
and
'''
Engine.sortWithFunction(var arrayToSort, var sortFunction)
'''
What format is expected? I am not sure how to use these.
I am currently working with the Viewport which has a table mode.
I am trying to use
'''
ScriptedViewport.setTableSortFunction(var sortFunction)
'''
and in the Docs it says:
"Sets a custom function that can be used in order to sort the table if the user clicks on a column header."
I have a snippet here with a sort function, but I can't seem to get it do do anything.
Clicking on the header gives me no feedback and does not seem to trigger anything
(the Console is set to print "Sorting triggered...").
HiseSnippet 1162.3ocsV0uaZbDDeOatzBsUpopO.q3eJtkRNv1w108CyG10nFhQAG2FEEEsb2BrwG6htcOSPQ9couI8UpuAsybe.mApsqU68GHlY9M6N6Ly9a1tAJWtVqBHVENe1DNw5Ss6MSZF0bDSHIsaQr9J6y4ZiPNjdgfOchJvPYZ54r99b5.U.sGnArRZLaBSq4dDKqM+YzYq74HQe+4O0f4yjt7EpHjKTBW9yDiElEZ6dzuH78Og4wOWLNC5cNpsqR1T4qBg.cSaGxDl6krg7myPXaXSNkoGQr9ZaW2cNfu+fZ64T6.9td6zuVUGVMmCNXONaWG29GvY0Fz20gX8ni8DFUPOCyv0vh1P4Mq2H0TY7FbgPKfSHJTkzC14X0jliD9dcSyZZBwJW2E4vMiygeocGgmXt9E4xOOx.cgGYSZVabagT0+EgjUlPJWbH8X6dtAhIlEVv34SraKM7fALn1jMThwR13OxY2TAHjlJiYWxOI.Dl6Qom53TlB+r0gEJ.0GsgdEKfhcKwcG+.M04gbSS03IJIHTpXZeT0hnmywWQyi+SGkGuPoOTHewNg9FAT2CGKQkE+N5.lulWFLcJGZSBNkKFNx.52tFp7EpoKoANIJe+yjsBXCScuv0qeeAuawLrBkdcg7enX71RqCdUrYwxzTEM.E6bc4kgzZIHauJj5KAo1pPZrDjp.j2r9nMFkFiVLU0tUTfltV3YGq7nxy4u2DoniP9qBOyHP49NEfkdEGabObrbgqiiom7DZyPsQMlpQVgAgRWiPIKj9GpajUjf3jDUkBTSqWlB+1XKX2ovG1yHg6w0g9Ez5qWbHdSEi5Ypo7flLMuDrkYw2HFei6BezOPinVAIuIABrCLgyhZBDCGxC3dUpTIpYDwJFPKEGPee7FsEMfaBCjzus5gKg3GWBQBfDImCgTEllpq0hgRpYDedVhZTQxWkbYXMU3aj3VMWlTBhuq4x786CjhqqQIwTozstz6zJ4Y8eG20rEMoJrTBxDsnpHLPi.8afTEdkOimv1GcOB9lelTxmqL7yjkvhad3vSW1zfAq0FRTfWT4Aq0LNNH31brjLbbedPYn6vOjOGHP+cSN0Gc+3Tci4sx.TIaKElylvSjOQ46gbk3+WkAljP7gbwIQH.0DwD+EILwbuTdPhvCohmSKRhNDYGVRdYajYJc4fUF1sIbnIFOTVs3WACSiI5ya2hquznlDgMgykX8Q26M+8K13WczrrBSQJ.hks0uChih3YSkvt3tJs.qJuJ6jexpihfgfJuPel4lSFw2LjX.VjaLNBG4HgEeV1Ud4wk49mKsNYJs2Qg6dFtO1tqv3NZ8w6FqIdgR2+2waxiO9L6iGL.tftHXyYexucquz3+lP4EpPjTsCCXUglH6mGBzUgAtbHRjRtuFaV1.ubDK6fxXloGW5EI7WvWhwpnrUhwpoFIiYv7725FekBepyGGoAhIYzSAya2Akoq4NzX3kWu008lK0JNV6g531OTG24g53tOTGe5C0w8dnNt+c6H9v35gvHt3qSDRmtGGw4YYcrDmFE04R9awj9kJC
The tableCallback is printing interactions with the table, but it does not react when the header is clicked.
Has anyone used this feature who could enlighten me on what to do?
I have a look up table that I need to browse in a similar fashion to a standard file browser, where there are column headers with sort functions (ascending/descending and alphabetical) and rows are populated with multiple data types for each entry.
I don't need to edit any of the data via the table, just browse via search, filter and sort methods.
Is the Viewport using "setTableMode()" the way to go, or is that mostly designed for editing data sets?
As in
inline function doSomething(parameter1, parameter2)
then if you write
doSomething(10)
It could carry on and work without that explicit input of the 2nd parameter?
I noticed there are methods in the API that work like this (where some parameters are optional) and wondering if this is possible for the inline functions.
When I test this:
inline function doSomething(parameter1, parameter2)
{
return parameter1;
}
const testDS = doSomething(10);
Console.print(testDS);
I get:
Inline function call doSomething: parameter amount mismatch: 1 (Expected: 2)
@d-healey
I'm not sure which "it" you meant, so I tried all combinations:
"row" (+) i: panel
"row" + (i): panel
("row") + i: panel
("row" + i): panel
("row" + i: panel)
"row" + i: (panel)
"row" + i(:) panel
All of those throw an error
@d-healey
I've tried this:
rack.setValue
({
"row" + i: panel,
});
but it says:
Found '+' when expecting ':'
I have some panel data that was being set like this in a loop:
rack.data["row" + i] = panel;
and
rack.data.rows[i] = panel;
and instead I am trying to save this in the panel's value
I am using:
rack.setValue(
{
["row" + i]: panel,
"rows"[i]: panel
});
but I am just getting errors from this such as:
'''
Found '[' when expecting identifier
'''
I've been fiddling around with the syntax to try to get it work, but I just can't seem to get it.