Jump to content

DjStiky

Member
  • Posts

    77
  • Joined

  • Last visited

Personal Information

  • Mac
    MacBook Pro M3 Max

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

DjStiky's Achievements

Apprentice

Apprentice (3/14)

  • Reacting Well Rare
  • First Post Rare
  • Collaborator Rare
  • Conversation Starter Rare
  • Week One Done

Recent Badges

4

Reputation

  1. I could use automation to time it correctly then, would still accomplish what I need. Thanks David!
  2. This is awesome. I have to try it to see if it would work in step recording mode. Thanks @David Nahmani!
  3. That's logical. Now that I think of it, I guess I could also run a midi cable from Midi Thru of my external synth back into my interface. To avoid unwanted loopback, I might be able to filter outgoing messages from my synth to only the types I want with one of these, which I have.
  4. Hi everyone, Was wondering if there's a way where when I use a button inside the scripter plugin to trigger CC or any other MIDI information, to have that information inserted in a midi region as an event, lets say in step recording mode. I am using my script along with the External Instrument plugin. Right now it just sends it out from the midi port. Would ideally like to do both at the same time. Thanks
  5. Small update: 1) Removed the numberOfSteps I mentioned for the "Patches" menu 2) Reverted the midi channel selection to a menu instead of linear 3) Removed the function for calling SendMIDI when receiving specified Note On message So fun! 😀 // Create PC and CC objects, as well mChannel variable; const pc = new ProgramChange(); const cc = new ControlChange(); // Reuse a single instance for all CCs var mChannel = []; let midiChannel = 1; // Set MIDI CC number to control the Patches menu const ccNum = 1; // Bank string const bank = 'Korg PA4X - Factory Piano Bank'; // Spacer String const spacer = ' '; // Patches array const Patches = [ { patchName: 'Concert Grand', program: 0, msb: 121, lsb: 13 }, { patchName: 'Italian Piano', program: 0, msb: 121, lsb: 16 }, { patchName: 'Jazz Piano', program: 0, msb: 121, lsb: 5 }, { patchName: 'Italian Jazz P.', program: 0, msb: 121, lsb: 18 }, { patchName: 'Live Piano', program: 1, msb: 121, lsb: 6 }, { patchName: 'Rock Piano', program: 0, msb: 121, lsb: 8 }, { patchName: 'Pop Upright', program: 0, msb: 121, lsb: 14 }, { patchName: 'M1 Piano', program: 2, msb: 121, lsb: 2 }, { patchName: 'Pop Grand', program: 0, msb: 121, lsb: 12 }, { patchName: 'It. Piano', program: 0, msb: 121, lsb: 17 }, { patchName: 'Classic Piano', program: 0, msb: 121, lsb: 4 }, { patchName: 'Warm Grand', program: 0, msb: 121, lsb: 10 }, { patchName: 'Bright Piano', program: 1, msb: 121, lsb: 5 }, { patchName: 'It. Grand & Stack', program: 2, msb: 121, lsb: 13 }, { patchName: 'G.Piano Stack 1', program: 2, msb: 121, lsb: 8 }, { patchName: 'G.Piano Stack 2', program: 2, msb: 121, lsb: 9 }, { patchName: 'Honky-Tonk', program: 3, msb: 121, lsb: 2 }, { patchName: 'Ragtime Piano', program: 3, msb: 121, lsb: 3 }, { patchName: 'E. Grand Piano', program: 2, msb: 121, lsb: 12 }, { patchName: 'Grand&MovingPad', program: 0, msb: 121, lsb: 9 }, { patchName: 'Grand & Strings', program: 0, msb: 121, lsb: 7 }, { patchName: 'Midi Grand & Pad', program: 1, msb: 121, lsb: 4 }, { patchName: 'Harpsichord 1', program: 6, msb: 121, lsb: 7 }, { patchName: 'Harpsichord 8+4', program: 6, msb: 121, lsb: 8 }, { patchName: 'ClassicClav1 DNC', program: 7, msb: 121, lsb: 7 }, { patchName: 'ClassicClav2 DNC', program: 7, msb: 121, lsb: 8 }, { patchName: 'Piano Layers', program: 2, msb: 121, lsb: 6 }, { patchName: 'Grand & FM Stack', program: 2, msb: 121, lsb: 7 }, { patchName: 'Piano & Vibes', program: 0, msb: 121, lsb: 6 }, { patchName: 'Grand Piano Demo', program: 0, msb: 121, lsb: 11 }, { patchName: 'Grand Piano', program: 0, msb: 121, lsb: 3 }, { patchName: 'Upright Piano', program: 0, msb: 121, lsb: 15 }, ]; var PluginParameters = [ { name: bank, type: 'text', }, { name: 'Patches', type: 'menu', valueStrings: Patches.map((patch) => patch.patchName), // Get patch names from Patches array defaultValue: 0, }, { name: 'Volume', type: 'linear', defaultValue: 100, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: 'Pan', type: 'linear', defaultValue: 64, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: 'Master FX1 Send', type: 'linear', defaultValue: 40, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: 'Master FX2 Send', type: 'linear', defaultValue: 0, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: spacer, type: 'text', }, { name: 'MIDI Channel', type: 'menu', valueStrings: Array.from({ length: 16 }, (_, i) => (i + 1).toString()), // Menu options 1-16 defaultValue: 1, }, { name: 'Send MIDI', type: 'momentary', }, ]; // Send the currently selected MIDI values function SendMIDI() { const midiChannel = GetParameter('MIDI Channel') +1; const selectedPatch = Patches[GetParameter('Patches')]; cc.number = 0; cc.value = selectedPatch.msb; cc.channel = midiChannel; cc.send(); cc.number = 32; cc.value = selectedPatch.lsb; cc.channel = midiChannel; cc.send(); pc.number = selectedPatch.program; pc.channel = midiChannel; pc.send(); cc.number = 7; cc.value = GetParameter('Volume'); cc.channel = midiChannel; cc.send(); cc.number = 10; cc.value = GetParameter('Pan'); cc.channel = midiChannel; cc.send(); cc.number = 91; cc.value = GetParameter('Master FX1 Send'); cc.channel = midiChannel; cc.send(); cc.number = 93; cc.value = GetParameter('Master FX2 Send'); cc.channel = midiChannel; cc.send(); } // Send Program Change and Bank Select MSB/LSB when selecting a patch from the menu function ParameterChanged(param, value) { const selectedPatch = Patches[GetParameter('Patches')]; if (param === 7) { // Set the MIDI channel without output midiChannel = value +1; } else if (param === 1) { // Send MIDI data if the Patches menu is changed cc.number = 0; cc.value = selectedPatch.msb; cc.channel = midiChannel; cc.send(); cc.number = 32; cc.value = selectedPatch.lsb; cc.send(); pc.number = selectedPatch.program; pc.channel = midiChannel; pc.send(); } else if (param === 2) { // Send MIDI data for Volume cc.number = 7; cc.value = value; cc.channel = midiChannel; cc.send(); } else if (param === 3) { // Send MIDI data for Pan cc.number = 10; cc.value = value; cc.channel = midiChannel; cc.send(); } else if (param === 4) { // Send MIDI data for Master FX1 Send cc.number = 91; cc.value = value; cc.channel = midiChannel; cc.send(); } else if (param === 5) { // Send MIDI data for Master FX2 Send cc.number = 93; cc.value = value; cc.channel = midiChannel; cc.send(); } else { // Call SendMIDI when clicking the button SendMIDI(); } } // Handle MIDI messages, control menu with a CC, and call SendMIDI when receiving specified Note On message function HandleMIDI(e) { if (e instanceof ControlChange && e.number === ccNum) { SetParameter(1, e.value); } else { e.send(); } } Next challenge, converting the patch tables in the Korg PDF manual to the patch array format so I can paste in scripter 😅. So far a manual process, takes forever lol.
  6. This is perfect! Thanks @Jordi Torres! Side question out of curiosity: What does the "numberOfSteps: 4" do in the Patches menu? Kind of confused since it's a manual selection from a dropdown menu.
  7. Lmao 😆. I swear this is my first attempt at modifying any code for anything. But great to finally start understanding concepts like variables, constants, functions, etc.. This is all new to me lol.
  8. Hey guys, Here is a script that our friend @Jordi Torres helped me put together, to which I added some extra CC controls. In the end, there are a bunch of parameters that can be controlled, along with a "Send MIDI" button. The way the script works now is as soon as any one parameter is modified, it will send all of the parameters. I wanted to know and see if you could help me modify this so that only that single parameter gets sent when modified, except for the "Send MIDI" button which should send all of the parameters. Here is the code: // Create PC and Bank Select (MSB/LSB) objects; const pc = new ProgramChange(); const bs = new ControlChange(); const cc7 = new ControlChange(); const cc10 = new ControlChange(); const cc91 = new ControlChange(); const cc93 = new ControlChange(); // Set MIDI CC number to control the Patches menu const ccNum = 1; // Bank string const bank = "Korg PA4X - Factory Piano Bank"; // Spacer String const spacer = " "; //Patches array var Patches = [ { patch: "Concert Grand", program: 0, msb: 121, lsb: 13 }, { patch: "Italian Piano", program: 0, msb: 121, lsb: 16 }, { patch: "Jazz Piano", program: 0, msb: 121, lsb: 5 }, { patch: "Italian Jazz P.", program: 0, msb: 121, lsb: 18 }, { patch: "Live Piano", program: 1, msb: 121, lsb: 6 }, { patch: "Rock Piano", program: 0, msb: 121, lsb: 8 }, { patch: "Pop Upright", program: 0, msb: 121, lsb: 14 }, { patch: "M1 Piano", program: 2, msb: 121, lsb: 2 }, { patch: "Pop Grand", program: 0, msb: 121, lsb: 12 }, { patch: "It. Piano", program: 0, msb: 121, lsb: 17 }, { patch: "Classic Piano", program: 0, msb: 121, lsb: 4 }, { patch: "Warm Grand", program: 0, msb: 121, lsb: 10 }, { patch: "Bright Piano", program: 1, msb: 121, lsb: 5 }, { patch: "It. Grand & Stack", program: 2, msb: 121, lsb: 13 }, { patch: "G.Piano Stack 1", program: 2, msb: 121, lsb: 8 }, { patch: "G.Piano Stack 2", program: 2, msb: 121, lsb: 9 }, { patch: "Honky-Tonk", program: 3, msb: 121, lsb: 2 }, { patch: "Ragtime Piano", program: 3, msb: 121, lsb: 3 }, { patch: "E. Grand Piano", program: 2, msb: 121, lsb: 12 }, { patch: "Grand&MovingPad", program: 0, msb: 121, lsb: 9 }, { patch: "Grand & Strings", program: 0, msb: 121, lsb: 7 }, { patch: "Midi Grand & Pad", program: 1, msb: 121, lsb: 4 }, { patch: "Harpsichord 1", program: 6, msb: 121, lsb: 7 }, { patch: "Harpsichord 8+4", program: 6, msb: 121, lsb: 8 }, { patch: "ClassicClav1 DNC", program: 7, msb: 121, lsb: 7 }, { patch: "ClassicClav2 DNC", program: 7, msb: 121, lsb: 8 }, { patch: "Piano Layers", program: 2, msb: 121, lsb: 6 }, { patch: "Grand & FM Stack", program: 2, msb: 121, lsb: 7 }, { patch: "Piano & Vibes", program: 0, msb: 121, lsb: 6 }, { patch: "Grand Piano Demo", program: 0, msb: 121, lsb: 11 }, { patch: "Grand Piano", program: 0, msb: 121, lsb: 3 }, { patch: "Upright Piano", program: 0, msb: 121, lsb: 15 } ]; // Create menus and author label var PluginParameters = [{ name: bank, type: 'text', }, { name: 'Patches', type: 'menu', valueStrings: [ 'Concert Grand', 'Italian Piano', 'Jazz Piano', 'Italian Jazz P', 'Live Piano', 'Rock Piano', 'Pop Upright', 'M1 Piano', 'Pop Grand', 'It. Piano', 'Classic Piano', 'Warm Grand', 'Bright Piano', 'It.Grand & Stack', 'G.Piano Stack 1', 'G.Piano Stack 2', 'Honky-Tonk', 'Ragtime Piano', 'E. Grand Piano', 'Grand&MovingPad', 'Grand & Strings', 'Midi Grand & Pad', 'Harpsichord 1', 'Harpsichord 8+4', 'ClassicClav1 DNC', 'ClassicClav2 DNC', 'Piano Layers', 'Grand & FM Stack', 'Piano & Vibes', 'Grand Piano Demo', 'Grand Piano', 'Upright Piano', ], defaultValue: 0, numberOfSteps: 4, }, { name: 'Volume', type: 'linear', defaultValue: 100, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: 'Pan', type: 'linear', defaultValue: 64, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: 'Master FX1 Send', type: 'linear', defaultValue: 40, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: 'Master FX2 Send', type: 'linear', defaultValue: 0, // Set the default value as needed minValue: 0, maxValue: 127, numberOfSteps: 127, }, { name: spacer, type: 'text', }, { name: 'MIDI Channel', type: 'linear', defaultValue: 1, minValue: 1, maxValue: 16, numberOfSteps: 15, }, { name: "Send MIDI", type: "momentary" }, ]; // Send Program Change and Bank Select MSB/LSB when selecting a patch from the menu function ParameterChanged(param, value) { // MIDI Channel variable const midiChannel = GetParameter('MIDI Channel'); // Bank Select MSB bs.number = 0; bs.value = Patches[GetParameter('Patches')].msb; bs.channel = midiChannel; bs.send(); // Bank Select LSB bs.number = 32; bs.value = Patches[GetParameter('Patches')].lsb; bs.send(); // Program Change pc.number = Patches[GetParameter('Patches')].program; pc.channel = midiChannel; pc.send(); cc7.number = 7; // CC7 (Channel Volume) cc7.value = GetParameter('Volume'); cc7.channel = midiChannel; cc7.send(); cc10.number = 10; // CC10 (Pan) cc10.value = GetParameter('Pan'); cc10.channel = midiChannel; cc10.send(); cc91.number = 91; // CC12 (MFX1) cc91.value = GetParameter('Master FX1 Send'); cc91.channel = midiChannel; cc91.send(); cc93.number = 93; // CC93 (MFX2) cc93.value = GetParameter('Master FX2 Send'); cc93.channel = midiChannel; cc93.send(); } // Handle MIDI messages, control menu with a CC, and send MIDI on button press function HandleMIDI(e) { if (e instanceof ControlChange && e.number === ccNum) { SetParameter(0, e.value); } else if (e instanceof NoteOn && e.number == 64 && e.value == 127) { // Note: Change the button number (64) to the desired MIDI note number SendMIDI(); } else { e.send(); } } // Send the currently selected MIDI values function SendMIDI() { var midichannel = GetParameter("MIDI Channel") + 1; msb.number = 0; msb.value = Patches[GetParameter("Patches")].msb; msb.channel = midichannel; msb.send(); lsb.number = 32; lsb.value = Patches[GetParameter("Patches")].lsb; lsb.channel = midichannel; lsb.send(); pc.number = Patches[GetParameter("Patches")].program; pc.channel = midichannel; pc.send(); cc7.number = 7; // CC7 (Volume) cc7.value = GetParameter('Volume'); cc7.channel = midiChannel; cc7.send(); cc10.number = 10; // CC10 (Pan) cc10.value = GetParameter('Pan'); cc10.channel = midiChannel; cc10.send(); cc91.number = 91; // CC12 (MFX1) cc91.value = GetParameter('MFX1'); cc91.channel = midiChannel; cc91.send(); cc93.number = 93; // CC93 (MFX2) cc93.value = GetParameter('MFX2'); cc93.channel = midiChannel; cc93.send(); } // Let MIDI messages pass through, control menu with a CC function HandleMIDI(e) { if (e instanceof ControlChange && e.number === ccNum) { SetParameter(0, e.value); } else { e.send(); } }
  9. I ended up just adding a button to send the current selected values, which clicking only takes an extra second after loading the project 🙂 { name: "Send MIDI", type: "momentary" } // Handle momentary button press function HandleMIDI(e) { if (e instanceof ControlChange && e.number == ccNum) { SetParameter(0, e.value); } else if (e instanceof NoteOn && e.number == 64 && e.value == 127) { // Note: Change the button number (64) to the desired MIDI note number SendMIDI(); } e.send(); } // Send the currently selected MIDI values function SendMIDI() { var midichannel = GetParameter("MIDI Channel") + 1; msb.number = 0; msb.value = Patches[GetParameter("Patches")].msb; msb.channel = midichannel; msb.send(); lsb.number = 32; lsb.value = Patches[GetParameter("Patches")].lsb; lsb.channel = midichannel; lsb.send(); pc.number = Patches[GetParameter("Patches")].program; pc.channel = midichannel; pc.send(); } Thanks for the effort guys, really appreciate it!
  10. Thanks @Jordi Torres! Your script has been very helpful for my projects, so really appreciate it! If you ever want to take a crack at further enhancements, let me know. I have an idea that would prevent me from having different copies of this for each category of patches, and prevent having multiple tracks/instances for each midi channel. In theory, it would work this way: - 1 instance where the GUI would have 16 sections (1 for each midi channel) - Each of the 16 section would have 2 dropdown menus. First dropdown would choose "category" of patches, second dropdown would have the patch list for the chosen category. This way, different Program Change and Bank Select MSB/LSB values would be sent to each of all the 16 midi channels from the same instance, all in 1 scripter plugin. Example: Channel 1: Piano category and Concert Grand patch Channel 2: Guitar category and Nylon Guitar patch and so on... However, I'm not familiar with coding and not sure how feasible this would be. Thanks again!
  11. Thank you @Dewdman42! this worked but kind of... 🤔 var done = false; function ProcessMIDI() { if(!done) { // GetParameters and send over midi done = true; } } However not always. It only works if I have one track with my script. I think it has to do with having multiple tracks with scripter and this script. Doesn't work if I have a different tracks for each of the 16 midi channels, all having this script loaded. This is what my script currently looks like for one of my categories of patches, and I have a different copy for each category of patches (not sure if I commented the new code correctly), however I wish I could have 1 script that combines all categories and patches for each of the 16 channels. GUI would have lets say 16 "Category" menus (1 for each midi channel), each having a sub menu with patches for that category: //Create PC, MSB and LSB objects; var pc = new ProgramChange(); var msb = new ControlChange(); var lsb = new ControlChange(); //Set MIDI CC number to control the Patches menu var ccNum = 1; //Author string var author = "Factory Piano"; //MIDI Channel strings array var mChannel = []; //Patches array var Patches = [ { patch: "Concert Grand", program: 0, msb: 121, lsb: 13 }, { patch: "Italian Piano", program: 0, msb: 121, lsb: 16 }, { patch: "Jazz Piano", program: 0, msb: 121, lsb: 5 }, { patch: "Italian Jazz P.", program: 0, msb: 121, lsb: 18 }, { patch: "Live Piano", program: 1, msb: 121, lsb: 6 }, { patch: "Rock Piano", program: 0, msb: 121, lsb: 8 }, { patch: "Pop Upright", program: 0, msb: 121, lsb: 14 }, { patch: "M1 Piano", program: 2, msb: 121, lsb: 2 }, { patch: "Pop Grand", program: 0, msb: 121, lsb: 12 }, { patch: "It. Piano", program: 0, msb: 121, lsb: 17 }, { patch: "Classic Piano", program: 0, msb: 121, lsb: 4 }, { patch: "Warm Grand", program: 0, msb: 121, lsb: 10 }, { patch: "Bright Piano", program: 1, msb: 121, lsb: 5 }, { patch: "It. Grand & Stack", program: 2, msb: 121, lsb: 13 }, { patch: "G.Piano Stack 1", program: 2, msb: 121, lsb: 8 }, { patch: "G.Piano Stack 2", program: 2, msb: 121, lsb: 9 }, { patch: "Honky-Tonk", program: 3, msb: 121, lsb: 2 }, { patch: "Ragtime Piano", program: 3, msb: 121, lsb: 3 }, { patch: "E. Grand Piano", program: 2, msb: 121, lsb: 12 }, { patch: "Grand&MovingPad", program: 0, msb: 121, lsb: 9 }, { patch: "Grand & Strings", program: 0, msb: 121, lsb: 7 }, { patch: "Midi Grand & Pad", program: 1, msb: 121, lsb: 4 }, { patch: "Harpsichord 1", program: 6, msb: 121, lsb: 7 }, { patch: "Harpsichord 8+4", program: 6, msb: 121, lsb: 8 }, { patch: "ClassicClav1 DNC", program: 7, msb: 121, lsb: 7 }, { patch: "ClassicClav2 DNC", program: 7, msb: 121, lsb: 8 }, { patch: "Piano Layers", program: 2, msb: 121, lsb: 6 }, { patch: "Grand & FM Stack", program: 2, msb: 121, lsb: 7 }, { patch: "Piano & Vibes", program: 0, msb: 121, lsb: 6 }, { patch: "Grand Piano Demo", program: 0, msb: 121, lsb: 11 }, { patch: "Grand Piano", program: 0, msb: 121, lsb: 3 }, { patch: "Upright Piano", program: 0, msb: 121, lsb: 15 } ]; //ProcessMIDI Default State (Used for sending values on script or project load) var done = false; //Populate MIDI Channels array for (var i = 0; i < 16; i++) { mChannel[i] = String(i + 1); } //Create menus and author label var PluginParameters = [{ name: "Patches", type: "menu", valueStrings: [ "Concert Grand", "Italian Piano", "Jazz Piano", "Italian Jazz P", "Live Piano", "Rock Piano", "Pop Upright", "M1 Piano", "Pop Grand", "It. Piano", "Classic Piano", "Warm Grand", "Bright Piano", "It.Grand & Stack", "G.Piano Stack 1", "G.Piano Stack 2", "Honky-Tonk", "Ragtime Piano", "E. Grand Piano", "Grand&MovingPad", "Grand & Strings", "Midi Grand & Pad", "Harpsichord 1", "Harpsichord 8+4", "ClassicClav1 DNC", "ClassicClav2 DNC", "Piano Layers", "Grand & FM Stack", "Piano & Vibes", "Grand Piano Demo", "Grand Piano", "Upright Piano" ], defaultValue: 0, numberOfSteps: 4 }, { name: "MIDI Channel", type: "menu", valueStrings: mChannel, defaultValue: 1 }, { name: author, type: "text" }]; //Send Program Change and Bank Select MSB/LSB when selecting a patch from the menu function ParameterChanged(param, value) { //MIDI Channel variable var midichannel = GetParameter("MIDI Channel") + 1; msb.number = 0; msb.value = Patches[GetParameter("Patches")].msb; msb.channel = midichannel; msb.send(); lsb.number = 32; lsb.value = Patches[GetParameter("Patches")].lsb; lsb.channel = midichannel; lsb.send(); pc.number = Patches[GetParameter("Patches")].program; pc.channel = midichannel; pc.send(); } //Send Program Change and Bank Select MSB/LSB when script or project loads function ProcessMIDI() { if(!done) { // GetParameters and send over midi done = true; } } //Let MIDI messages pass through, control menu with a CC function HandleMIDI(e) { if (e instanceof ControlChange && e.number == ccNum) { SetParameter(0, e.value); } e.send(); } All this because Logic doesn't let us sort banks and programs for MIDI instruments in the order we want. 😅 The "Multi-Instrument" object in the Environment is very limited, with a limited number of patches and not being able to apply different LSB, MSB and PC values per patch in any order.
  12. Hi there, I have a script I use along with the External Device instrument which has 2 dropdown menus: First menu allows me to choose a patch name from a list, and it sends MSB,LSB and PC values to midi out so that my synth loads the specific patch. Second menu allows me to choose which midi channel it affects (1 to 16). When I load a project that has this, these values do not get sent, however they are remembered on the GUI. They will only get sent if I open the GUI and make a new selection. Is there a way to send existing selection values on project load? Thanks!
  13. Hi Guys, Was wondering if anyone could create a script where you could do the following: - Select 1 or many notes from C to B (Would affect said notes on all octaves) - Set a pitch bend value for each of the selected notes - Send the note plus pitch bend value whenever that note(s) is/are played on a keyboard and then reset pitch bend when note is released. If it's simpler, you could also just list all the notes from C to B and then a pitchbend value next to each The reason I'm asking this is so I can have microtuning with legato or portamento instruments in Kontakt. Right now, combining both the built in portamento and microtuning scripts in Kontakt together doesn't work, conflict with each other and sounds weird. Thanks!
  14. This method works for me. Thanks again Jordi!
  15. Jordi, quick question. Is there a way for this script to also send the midi data when loading a saved project without necessarily having to switch patches back and forth?
×
×
  • Create New...