Drum Mapping- user defined
-
@jssrecording There is no MIDI out from HISE, only audio. So you'll only record in your DAW the key that you press.
-
@d-healey Okay thanks David! Will probably do some refactoring with my sample structure layout.
-
Here was my solution to custom midi mapping
HiseSnippet 1836.3oc4X0sSabDEdWLaRX.GkzzH0dS0VSu.ZAhW9IglnnXv1PoI.VwDZkpqRW1cLdD6Ni0tiIPiPpR8cnW1mkbQe.5iPeDxaP6Yl8e7ZhcRHsREYALmYNy7c9Nyb9wM7XVXeelmh5D6cZWrh5TZMOkx6TsiIgprUME0qqssoOG6oGHZ8S6Z56isUTUKroPf5DiqH+40OZcSGSpENQjhx9LhE9IDWBOQZiJOl33rgoMdOhapUubksrXzpLGVO.OEzJqz0z5HyCw6XJV1XZJpWotMgy7ZxM4XeE0wWmYeZyNrWPCV+9DexANXw.CklvFEHdClis.wBoJU6PbraDY29JJpZMRXgBArvGqsMwlDKOgMtgbB8DMRyGpicQvyHM7JmK7JmG7TSAuwCf2M0ZZ4Q5xSlQfsI01hBNp1lfKHMrBVqh5qzpxfEP4K3ZdDdCOXPrByrT4xyouX4xy9f18nVbBipyn6v33coyLK5knIPmgzO+Tsam6bhiwi43f8xcZgW26hTbFZO2CvdyoeroSOb7BAyOK+pMX9Ms62JvpSsPFcKJguaWLcPWJTBoJf+KDhJ31GWx92Nj8WqmMg8clGiay7bUH1haGYjYnHMfzuG7LoGhA76A9CM0XI0o1hw+zennzl3DdgeZsp2u0y7wd9sr64yedqZX+i3rts7oldXiEdg4wA3TBtBAf6FgfqJy8.15rSj3ZRsng8AoW+nQcKV77aw0pn7rspYxMEWVC4MfK6h83DgaRsF9XHJPvU2IzBsBIw51kQErr5UGYp8jzz5ooG7BhMuSrfW4UoClbXmTAfHU5F4p2xV7XWt05Ogw5p2vw7Trm3JQB3PCI0l.o+xtRBjpzrhq4IB+6TvnLG8sB2xj.JFPPOOv8CuKEK.Ii2HdroP3XWfM+LspnpSipgpMMpNZCzFSi1Ds4zn0PqMMZ8HiWS8qgyJxv0T+BEkLlzjCoqNEKSSYR+RyJilcLkzN10hC9uHK4S0leQz7FnxHCzhnkPKiVAcWz8Pqpvwm.XrXBNl2PIjBmLwAqotbFarjL4ReAKgP1L6dNl7rwwEIuBm.B9jIfoHpH0mvOM8yj24f64FlYHg6M0ZP3VcxGuikCdgmhW13MLUYQs5sais3IfcbsM992u4EeSP4VQPQ9PV7NFGjRL2m1CtDl+bXKgo6PWBCTMkE31xDwU5K2yCJtgPOL8QIfYcpIvE1oE+TFiKCAjpDplltccBxj.aelUiOFRYjcG1XjRp3J3jfrSgu5DIlb.vkIykiDswItTKLzdYigu5mwurJNqvvAu2kBxxKpXNElM1uqooCWa74PAOd5QA7eLkcf9C0ipYyz1VHYlRomuzbkmCJYqH5N2Q+G91l6tSFs+whnHs8woRICk94JV742K8WVDoqWxkXa6favfHJPjlR2Wedi4DS.SAMBzsI4mwfvRFKTtTjb3ZBHxXojE1qcahPVo30.E135yAKdKWnldwTv0PcabaydNbce3sP7RcHziv16wj5WDcVjEdm7Lwhn94tr7VTZjD6ErUiUFD0M7zVBkEX+KFY.xLbBzWsEs5zsn0fOvep2htA7A9uMgOveVC9.+Y8Aaj4XfAYQuHSLXE.5DU02uQFL8vYlwaUFC0nOCc9EaQm2nEsbKJ7aXvRsnK2htRK5caQuWK5p4ahwPoHhPA2NNocfHF3YcsgWr5yXEU8RTeAEQuL.Eo87eiHbhGPNQBV3PLeew5mYV840MdPVUBN+XklIQ14zaV8uzXwGHvoP8zWAErWvBOGF9p9NgYkavYxeGw8vwDWWVpaVyJ11vJyqZ53b.jsXlrThX2F7tD53Fx8Y.M8QZCTBD4BdvJNBwT6H6MCHkO+gYogD9Z1.RJz6H4qv8fbHk4gqer.kbudxiVL+YWT2kCV4+k56D89puyHxNRRYkXSOsnD6JsTo4jyxRDMjs0F1120CyV0zg.WUkcBbcszd3y222pUFtVGS0CyaYymY5d3Rn6yqLrLvIQ09bZz+DkQDFqAYDCJXZhq7qQUd0+o7l3H4Y7aoOiv8bpvsb3ZDbXO4Lbq7rmSs+ydxrm8fac6CWCXu8EvMVi99ZOApgHJntN8XrCb4QhwOBtsHqNIRZ1x21lQYc6vnDqrkeC03b3gXuzXOWCZMNGBFmUWGroeltOdBjSzz67cPboVLat9qOQK.t5hvN5+mpw4qF.aj19fSxRb5B.e63g5wliwaFsPMo6YJgShOXKv86wy1QUMrE4.rSVGS+cc+V6Xdu7MCT3+mey.Ok0iCcVusI7RTDQCJYoIzPtEFPBkhcDe0wpiIBNGLtbTvtlXpsbveC+DNogXrZ3jFQS9A4LbMs7XO2JHCo3w50jR.6lJ6keBssEi0i+RcEbCz8F44VVBxddCEk70XwQVikFYMVdj0XkQVi6NxZbuQViUu.MDoNWqGm4F7zCDzntrVDU03uGG0BJ+il.K1k
-
@d-healey Hey David. I was wondering if you could please give me nudge here. I managed to get your basic code going (by removing "Ignore events" line from OnNoteOn).
What I am trying to accomplish is to have a note transposed to a user-defined note. I added a Combobox with ID ComboBoxKickMidi. The combobox contains a list of notes that can be selected (C0, C#0...).This is the jambalaya code I came up with which, to my surprise, is not working
OnInit
const var map = Engine.createMidiList(); //Add another line for each note you want to remap map.setValue(KickNumber, 36); //Set kick value const var KickNote = Content.getComponent("ComboBoxKickMidi"); // Declare combobox
OnNoteOn
function onNoteOn() { local KickNumber = Message.getNoteNumber() + 1; if(KickNumber == KickNote.getValue()) { Message.setNoteNumber(map.getValue(Message.getNoteNumber())); } }
The error message I get with regards to map.SetValue line:
Interface:! Line 1217, column 13: API call with undefined parameter 0
What do I need to change to get this going?
Thank you!
-
Line 1217, column 13:
This implies you haven't posted all of the code... I have no idea what that error is referring to because I don't know what's on Line 1217.
-
@d-healey The line in question is this one:
map.setValue(KickNumber, 36); //Set kick value
When removed, all other lines compile OK.
-
@gorangrooves What is KickNumber?
-
@d-healey If you look at the OnNoteOn section, I introduced it there. It is supposed to be a numerical value that is calculated from a note that user selects (ex. User selects C0, it gets turned into midi note 36).
-
@gorangrooves said in Drum Mapping- user defined:
local KickNumber = Message.getNoteNumber() + 1;
I'm currently making a video on this exact subject!
A local variable only exists between the
{}
where it's declared. It is local to the code block. So you can't access that variable anywhere else. You need to declare your script-wide variables in on init. -
@d-healey I understand. Thank you. So, I would use this in OnInit?
var KickNumber = Message.getNoteNumber() + 1;
-
@gorangrooves
Message.getNoteNumber();
only works inon note on
andon note off
.You need to create a variable in on init. Something like this
reg kickNumber
You should use a reg variable because it is more efficient for variables that will be accessed in real-time callbacks such as on note.
Then inside on note you will save the note number in that variable.
function onNoteOn() { kickNumber = Message.getNoteNumber() + 1; }
This -
map.setValue(KickNumber, 36);
- won't work in on init though because kickNumber will be undefined.
So you'd probably need to set it in on note. But if you're doing that then there's probably no point in using themap
variable at all. You might as well just useMessage.setNoteNumber(36);
I would think. -
@d-healey Thank you for the explanation. I will play with and report back.
-
@d-healey So, I managed to get this working, to my great surprise :) It is all thanks to you! I have another challenge to solve with this.
Here is the code I currently have:
OnInit
const var map = Engine.createMidiList(); reg KickNumber; const var KickKey = Content.getComponent("ComboBoxKickMidi"); // Declare combobox reg SnareNumber; const var SnareKey = Content.getComponent("ComboBoxSnareMidi"); // Declare combobox
OnNoteOn
function onNoteOn() { //----kick mapping---------- KickNumber = Message.getNoteNumber() + 1; if(KickNumber == KickKey.getValue()) { Message.setNoteNumber(36); } //----snare mapping---------- SnareNumber = Message.getNoteNumber() + 1; if(SnareNumber == SnareKey.getValue()) { Message.setNoteNumber(38); } }
Here is what is happening now...
By default, the Kick is C1 and snare D1. If I set the Kick to B0, the kick will sound when pressing either B0 or C1.
However, if I now set the snare to C1 (kick's default note), then all 3 notes (B0, C1, D1) will now trigger the snare!The ideal scenario would be that once a note is set for an instrument, it would only play on that set note and the default note would now be freely available for another instrument to use. In the above example, B0 should trigger kick, C1 should trigger snare and no note will sound on D1.
Is this achievable and if so, any idea of how I would go about it?
Thank you!
-
@gorangrooves this is pretty simple isnt it?
on init:
reg KickLocation = 36; //where the kick actually is reg KickTrigger = 54; //the note that triggers a kick reg SnareLocation = 38; //where the snare actually is reg SnareTrigger = 56; // the note that triggers a snare
on note on:
if (Message.getNoteNumber() == KickTrigger) { Message.setNoteNumber(KickLocation); }; if (Message.getNoteNumber() == SnareTrigger) { Message.setNoteNumber(SnareLocation); };
Or did I mis-understand your requirement?
-
@Lindon Thanks. I think your solution will achieve the same result that I currently have, but without the ability for a user to pick a note. What I am trying to do is use a combobox within the interface to pick a note that should trigger a particular instrument (kick, snare etc.). I got the basic function for that working.
The challenge now is to refine it to do this:
By default, the Kick is C1 and snare D1. If I set the Kick to B0, the kick will sound when pressing either B0 or C1.
However, if I now set the snare to C1 (kick's default note), then all 3 notes (B0, C1, D1) will now trigger the snare!The ideal scenario would be that once a note is set for an instrument, it would only play on that set note and the default note would now be freely available for another instrument to use. In the above example, B0 should trigger kick, C1 should trigger snare and no note will sound on D1.
-
@gorangrooves then just add a call back for the combobox that sets the trigger value..
inline function onmyKickComboBoxControl(component, value) { KickTrigger = value; }; Content.getComponent("myKickComboBox").setControlCallback(onmyKickComboBoxControl);
-
@Lindon Thank you!
I tried it, but unfortunately, it still produces exactly the same results. The issue still remains that a user-selected note is in addition to the default note for a particular instrument. So, if default note for kick is C1 and user select E0, now we have the kick sounding when pressing either E0 or C1. It doesn't free up the original kick default note to used by another instrument.
The issue gets more complicated when we introduce a second note. Lets say we have the snare by default at D1. If a user selects snare note now to be C1 (default note of the kick), now there is no kick sound! Snare is heard when pressing either E0, C1 or D1.
How do we go about having a user select a note for each instrument and that note being the sole note which triggers a particular instrument?
-
Updated code:
On Init
Engine.createMidiList(); //kick inline function onComboBoxKickMidiControl(component, value) { reg KickTrigger = value; }; Content.getComponent("ComboBoxKickMidi").setControlCallback(onComboBoxKickMidiControl); //snare inline function onComboBoxSnareMidiControl(component, value) { reg SnareTrigger = value; }; Content.getComponent("ComboBoxSnareMidi").setControlCallback(onComboBoxSnareMidiControl);
On Note On
//----kick mapping---------- if (Message.getNoteNumber() +1 == KickTrigger) { Message.setNoteNumber(36); }; //----snare mapping---------- if (Message.getNoteNumber() +1 == SnareTrigger) { Message.setNoteNumber(38); }
-
@gorangrooves why are you adding 1 to the Message.getNoteNumber()??
Actually thinking a bit about it a combo box is probably not a good way to select a midi note number, try a knob instead...
-
@Lindon Adding +1 is necessary for the values to present a correct note. Without it, the resulting note is a semitone lower. C gets played as B, so with +1, it becomes C. Not sure why it is. Maybe a 0 gets counted, but it doesn't have any note...
I don't think a knob would be a better option, to be honest. How would you display 127 notes in a circle? Selection of a note is not an issue, but rather how to properly process it later.